Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xb5C5fc6d3576ae31B24DC18e5bcb8a4822F13333
Balance 0 ETH
Nonce 1
Code Size 16731 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

16731 bytes
0x60806040526004361061016e5760003560e01c80635c89dfe1116100cb578063a9059cbb1161007f578063db7c4dda11610059578063db7c4dda146103ca578063dd62ed3e146103dd578063f2fde38b1461042357600080fd5b8063a9059cbb1461036a578063af66394d1461038a578063ccec3716146103aa57600080fd5b806378f8484b116100b057806378f8484b1461030d5780638da5cb5b1461032d57806395d89b411461035557600080fd5b80635c89dfe1146102b557806370a08231146102d757600080fd5b806323b872dd1161012257806344ee3a1c1161010757806344ee3a1c1461026d5780634839c8b31461028d578063505f5c08146102a257600080fd5b806323b872dd1461022b578063313ce5671461024b57600080fd5b80630b45260e116101535780630b45260e146101d557806318160ddd146101ec57806320ffb26d1461020b57600080fd5b806306fdde031461017a578063095ea7b3146101a557600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061018f610443565b60405161019c9190612ac6565b60405180910390f35b3480156101b157600080fd5b506101c56101c0366004612b2a565b6104d5565b604051901515815260200161019c565b3480156101e157600080fd5b506101ea6104ec565b005b3480156101f857600080fd5b506016545b60405190815260200161019c565b34801561021757600080fd5b506101ea610226366004612b56565b6106ee565b34801561023757600080fd5b506101c5610246366004612b6f565b6107d3565b34801561025757600080fd5b5060155460405160ff909116815260200161019c565b34801561027957600080fd5b506101ea610288366004612b56565b61087b565b34801561029957600080fd5b506101ea6109b1565b6101ea6102b0366004612bbe565b610be4565b3480156102c157600080fd5b506102ca610e91565b60405161019c9190612bee565b3480156102e357600080fd5b506101fd6102f2366004612cb4565b6001600160a01b031660009081526006602052604090205490565b34801561031957600080fd5b506101ea610328366004612cd8565b610fde565b34801561033957600080fd5b506000546040516001600160a01b03909116815260200161019c565b34801561036157600080fd5b5061018f61118d565b34801561037657600080fd5b506101c5610385366004612b2a565b61119c565b34801561039657600080fd5b506101ea6103a5366004612cfa565b6111a9565b3480156103b657600080fd5b506101ea6103c5366004612cb4565b6113bd565b6101ea6103d8366004612d7c565b61150b565b3480156103e957600080fd5b506101fd6103f8366004612dbe565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561042f57600080fd5b506101ea61043e366004612cb4565b611bbc565b60606017805461045290612dec565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90612dec565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050905090565b60006104e2338484611c88565b5060015b92915050565b6000546001600160a01b0316331461052f5760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105535750602054600160c81b900460ff16155b80156105685750602054600160a01b900460ff165b6105985760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa158015610628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064c9190612e26565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612e3f565b6106ec5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610526565b565b6000546001600160a01b03163314801561070a57506000602254115b80156107165750600081115b6107465760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b80602260008282546107589190612e72565b9091555050602254606410156107955760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610526565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107c891815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561082b5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610526565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610866918691610861908690612e85565b611c88565b610871848484611d0f565b5060019392505050565b6000546001600160a01b031633146108b95760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160c81b900460ff161580156108dd5750602054600160c01b900460ff16155b80156108f25750602054600160a01b900460ff165b6109225760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b42602154620151806109349190612e98565b6014546109419190612e72565b10156109675762015180601454426109599190612e85565b6109639190612eaf565b6021555b80602160008282546109799190612e72565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107c8565b6000546001600160a01b031633146109ef5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160c81b900460ff16158015610a135750602054600160c01b900460ff16155b8015610a285750602054600160a01b900460ff165b610a585760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b42602154603c610a689190612e98565b610a7390603c612e98565b610a7e906018612e98565b601454610a8b9190612e72565b10156106ec5760208054600160c81b60ff60c81b198216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b109190612e26565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb19190612e3f565b610be15760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610526565b50565b6000546001600160a01b031633148015610c085750602054600160c01b900460ff16155b8015610c1e5750602054600160c81b900460ff16155b8015610c385750602054600160a01b900460ff1615156001145b8015610c475750621275008210155b610c775760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b6020546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce49190612e26565b60205460035460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612e3f565b506003546020546001600160a01b0391821691635af06fed913491163385610d878942612e72565b600089610d95576000610da2565b6009546001600160a01b03165b60405160e089901b6001600160e01b03191681526001600160a01b0396871660048201529486166024860152604485019390935260648401919091521515608483015290911660a482015260c40160206040518083038185885af1158015610e0e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e339190612e26565b60028190556020805460ff60c81b1916600160c81b1790556040517f9fc733699b939bbf6d10d904b8bb75429cf5094449a53d601449b6edeb1097a791610e84918690918252602082015260400190565b60405180910390a1505050565b610f2b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610f6a61227a565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b0316331480156110015750602054600160b01b900460ff165b6110315760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b601d54612710836016546110459190612e98565b61104f9190612eaf565b1015801561105f57506127108211155b61108f5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610526565b601e54612710826016546110a39190612e98565b6110ad9190612eaf565b101580156110bd57506127108111155b6110ed5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610526565b612710826016546110fe9190612e98565b6111089190612eaf565b601d556016546127109061111d908390612e98565b6111279190612eaf565b601e556127108214801561113c575080612710145b1561114f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461045290612dec565b60006104e2338484611d0f565b6000546001600160a01b031633146111e75760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b6022541580156111f75750600082115b8015611204575060648211155b6112345760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610526565b6202a3008160200151101580156112515750620d2f008160200151105b6112815760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610526565b6022829055338152604051600090829061129a90612ab9565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f0801580156112d3573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b03908116908216036113d857600080fd5b306001600160a01b038216036113ed57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190612e26565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612e3f565b6115035760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610526565b610be16122da565b6000546001600160a01b031633146115495760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b602054600160a01b900460ff16156115875760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610526565b6001544710156115bd5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610526565b816115d057600e8310156115d057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361163557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561171057506020805460ff60c01b1916600160c01b1790556000611723565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190612e3f565b6117b257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561182c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118509190612ed1565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190612ed1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119479190612ed1565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190612e3f565b611ac25760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610526565b601f546001600160a01b031663f305d71947308460008088611ae542603c612e72565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611b52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b779190612eee565b50506025805460ff1916600190811790915584151590039050611bb257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b03163314611bfa5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610526565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b038316611c9b57600080fd5b6001600160a01b038216611cae57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611d2f57506001600160a01b03821615155b611d3857600080fd5b6001600160a01b038316600090815260066020526040902054811115611d855760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610526565b602054600090600160a01b900460ff168015611daa5750602054600160b01b900460ff165b8015611dcf57506001600160a01b03841660009081526004602052604090205460ff16155b8015611df457506001600160a01b03831660009081526004602052604090205460ff16155b15611e305781601e541015611e305760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610526565b602054600160a01b900460ff168015611e525750602054600160b01b900460ff165b8015611e7757506001600160a01b03831660009081526005602052604090205460ff16155b15611ed657601d546001600160a01b038416600090815260066020526040902054611ea3908490612e72565b1115611ed65760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610526565b6000546001600160a01b03858116911614801590611f0257506000546001600160a01b03848116911614155b8015611f15575060255460ff1615156001145b15611fd8576020546001600160a01b038581169116148015611f455750601f546001600160a01b03848116911614155b15611f8657600a8054906000611f5a83612f1c565b9190505550611f6960016123a2565b6064600e5483611f799190612e98565b611f839190612eaf565b90505b6020546001600160a01b038481169116148015611fac57506001600160a01b0384163014155b15611fd857611fbb60006123a2565b606460115483611fcb9190612e98565b611fd59190612eaf565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff1615801561201557506020546001600160a01b038681169116145b801561202a57506001600160a01b0386163014155b80156120365750600082115b80156120455750601a54600a54115b156120c357601b54821180612080575062015180601454426120679190612e85565b1180156120745750601054155b80156120805750601354155b156120c3576019544311156120c357601c548210156120a7576120a2826125a4565b6120b2565b6120b2601c546125a4565b6120bb47612763565b504360195560015b821561213e57306000908152600660205260409020546120e4908490612e72565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121359087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054612162908590612e85565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390612194908690612e72565b61219e9190612e85565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6121e88688612e85565b60405190815260200160405180910390a38015612272576000612234600860009054906101000a90046001600160a01b0316620186a04760405180602001604052806000815250612a9f565b90508015612270576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff166122945750600090565b600062015180601454426122a89190612e85565b6122b29190612eaf565b90506021548111156122c657600091505090565b806021546122d49190612e85565b91505090565b602054600160a81b900460ff161580156122fd5750602054600160a01b900460ff165b156106ec57478015610be15761231281612763565b6008546040516000916001600160a01b03169047908381818185875af1925050503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b50509050801561239e576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001611181565b5050565b600080600083156123c157600f5492506010549150600e5490506123d1565b6012549250601354915060115490505b81811461259e57600b5460000361247e57600c546014546123f29190612e72565b42106123ff575080612588565b6002600c5461240e9190612eaf565b60145461241b9190612e72565b421061244857600461242d8385612e85565b6124379190612eaf565b6124419083612e72565b9050612588565b6004600c546124579190612eaf565b6014546124649190612e72565b421061247657600261242d8385612e85565b50815b612588565b600b546001036124ba57600d54600a54111561249b57508061249e565b50815b6014546124ad90611c20612e72565b4210612479575080612588565b600b5460020361258557600d54600a5411806124e55750600c546014546124e19190612e72565b4210155b156124f1575080612588565b6002600d546125009190612eaf565b600a54118061252a57506002600c546125199190612eaf565b6014546125269190612e72565b4210155b1561253b57600461242d8385612e85565b6004600d5461254a9190612eaf565b600a54118061257457506004600c546125639190612eaf565b6014546125709190612e72565b4210155b1561247657600261242d8385612e85565b50805b831561259857600e81905561259e565b60118190555b50505050565b6020805460ff60a81b1916600160a81b178155604080516002808252606082018352600093919290918301908036833701905050905030816000815181106125ee576125ee612f35565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266b9190612ed1565b8160018151811061267e5761267e612f35565b6001600160a01b0390921660209283029190910190910152602754156126cf5760c8602754836126ae9190612e98565b6126b89190612eaf565b60268190556126c79083612e85565b602481905591505b601f546126e79030906001600160a01b031684611c88565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612720908590600090869030904290600401612f4b565b600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff1615156001151514801561279b57506276a700601454426127999190612e85565b105b1561287c5760646127ad86600a612e98565b6127b79190612eaf565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a6846040516127ea91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461283f576040519150601f19603f3d011682016040523d82523d6000602084013e612844565b606091505b505090508061287a5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610526565b505b600060275411801561289057506000602654115b1561299657602454856026546128a69190612e98565b6128b09190612eaf565b60268054600091829055602491909155601f5491945091506128dd9030906001600160a01b031683611c88565b601f546001600160a01b031663f305d7198430846000808361290042603c612e72565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af115801561296d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129929190612eee565b5050505b6023546001600160a01b031615612a9857602254606490846129b88789612e85565b6129c29190612e85565b6129cc9190612e98565b6129d69190612eaf565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612a28576040519150601f19603f3d011682016040523d82523d6000602084013e612a2d565b606091505b5050905080612a635760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610526565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612fbf83390190565b60006020808352835180602085015260005b81811015612af457858101830151858201604001528201612ad8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610be157600080fd5b60008060408385031215612b3d57600080fd5b8235612b4881612b15565b946020939093013593505050565b600060208284031215612b6857600080fd5b5035919050565b600080600060608486031215612b8457600080fd5b8335612b8f81612b15565b92506020840135612b9f81612b15565b929592945050506040919091013590565b8015158114610be157600080fd5b60008060408385031215612bd157600080fd5b823591506020830135612be381612bb0565b809150509250929050565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151612c3b60a084018215159052565b5060c083015160c083015260e0830151612c5960e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b600060208284031215612cc657600080fd5b8135612cd181612b15565b9392505050565b60008060408385031215612ceb57600080fd5b50508035926020909101359150565b6000808284036060811215612d0e57600080fd5b833592506040601f1982011215612d2457600080fd5b506040516040810181811067ffffffffffffffff82111715612d5657634e487b7160e01b600052604160045260246000fd5b6040526020840135612d6781612b15565b81526040939093013560208401525092909150565b600080600060608486031215612d9157600080fd5b833592506020840135612da381612bb0565b91506040840135612db381612b15565b809150509250925092565b60008060408385031215612dd157600080fd5b8235612ddc81612b15565b91506020830135612be381612b15565b600181811c90821680612e0057607f821691505b602082108103612e2057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e3857600080fd5b5051919050565b600060208284031215612e5157600080fd5b8151612cd181612bb0565b634e487b7160e01b600052601160045260246000fd5b808201808211156104e6576104e6612e5c565b818103818111156104e6576104e6612e5c565b80820281158282048414176104e6576104e6612e5c565b600082612ecc57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612ee357600080fd5b8151612cd181612b15565b600080600060608486031215612f0357600080fd5b8351925060208401519150604084015190509250925092565b600060018201612f2e57612f2e612e5c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612f9d5784516001600160a01b031683529383019391830191600101612f78565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122048e77e6bf63327f12ec0d67053073aa278ed2c3d262bc481049ec22fbf4d3c4864736f6c63430008190033

Verified Source Code Full Match

Compiler: v0.8.25+commit.b61c2a91 EVM: paris Optimization: Yes (800 runs)
IERC20.sol 29 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;


interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
IStaking.sol 27 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IStaking {
    struct StakingParams {
            address owner;
            uint256 withdrawTimeout;
        }
    struct StakingDetails {
        uint256 claimable;
        uint256 withdrawable;
        uint256 unstakedAmount;
        uint256 totalRewards;
        uint256 timeToWithdraw;
        uint256 stakedAmount;
    }
    function transferOwnership(address _newOwner) external;
    function owner() external view returns (address);
    function rescueERC20(address _address) external;
    function stake(uint256 _amount) external;
    function unstake(uint256 _amount) external;
    function restake() external;
    function withdraw() external;
    function claimRewards() external;
    //function refreshPool() external;
    function getUserDetails(address) external view returns (StakingDetails memory);
}
DeployyyyerToken.sol 833 lines
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/

pragma solidity ^0.8.23; 
import {IStaking} from "../interfaces/IStaking.sol";
import {StakingPool} from "./StakingPool.sol";

library SafeCall {
    /**
     * @notice Perform a low level call without copying any returndata
     *
     * @param _target   Address to call
     * @param _gas      Amount of gas to pass to the call
     * @param _value    Amount of value to pass to the call
     * @param _calldata Calldata to pass to the call
     */
    function call(
        address _target,
        uint256 _gas,
        uint256 _value,
        bytes memory _calldata
    ) internal returns (bool) {
        bool _success;
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                _value, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
        }
        return _success;
    }
}


interface IHelper {
	function isValidRouter(address router) external view returns (bool);
}


interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed ownerAddress, address indexed spender, uint256 value);
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);

}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface ITeamFinanceLocker {
    function lockToken(
        address _tokenAddress,
        address _withdrawalAddress,
        uint256 _amount,
        uint256 _unlockTime,
        bool _mintNFT, 
        address referrer
    ) external payable returns (uint256 _id);
}


/// @title DeployyyyerToken 
/// @notice Contains methods related to ERC20
/// @dev 
contract DeployyyyerToken is IERC20 {
    address owner_; 
    uint256 minLiq;
    uint256 lockerId;
    address teamFinanceLocker;

    mapping(address => bool)  isExTxLimit; //is excluded from transaction limit
    mapping(address => bool)  isExWaLimit; //is excluded from wallet limit
    mapping (address => uint256)  balances; //ERC20 balance
    mapping (address => mapping (address => uint256))  allowances; //ERC20 balance

    address payable taxWallet; //tax wallet for the token
    address payable deployyyyerCa; //deployyyyer contract address

    
    // Reduction Rules
    uint256  buyCount; 

    uint256 initTaxType; //0-time,1-buyCount,2-hybrid,3-none
    //interval*1, lastIntEnd+(interval*2), lastIntEnd+(interval*3)
    uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
    uint256 countInterval; //0-100 

    //current taxes
    uint256  taxBuy; 
    uint256  maxBuyTax; //40%
    uint256  minBuyTax; //0

    uint256  taxSell; 
    uint256  maxSellTax; //40%
    uint256  minSellTax; //0

    uint256  tradingOpened;

    // Token Information
    uint8   decimals_;
    uint256   tTotal;
    string   name_;
    string   symbol_;

    // Contract Swap Rules 
    uint256 lastSwapBlock;
    uint256 preventSwap; //50            
    uint256  taxSwapThreshold; //0.1%
    uint256  maxTaxSwap; //1%
    uint256  maxWallet; //1%
    uint256  maxTx;

    IUniswapV2Router02  uniswapV2Router;
    address  uniswapV2Pair;
    
    bool  tradingOpen; //true if liquidity pool is created
    bool  inSwap;
    bool  walletLimited;
    bool isFreeTier;
    bool isBurnt;
    bool isRetrieved;
    uint256 lockPeriod_;
    uint256 stakingShare;
    address stakingContract;

    uint256 lastSwap;


    bool liquidityOpen;
    uint256 halfLp;
    uint256 lpTax;
    event TradingEnabled(address pair, uint256 liq, uint256 lockPeriod, bool isBurnt, address router);
	event TaxMade(uint256 amount);
    event TaxGiven(uint256 amount);
    event StakingMade(uint256 amount);
    event ExternalLocked(uint256 id, uint256 lockPeriod);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    event IncreasedLimits(uint256 maxWallet, uint256 maxTx);
    event LockUpdated(uint256 ldays);
    event LockRetrieved();
    event SocialsSet(string telegram, string twitter, string website);
    event LpBurnt();
    event StakingLaunched(address stakingPool, address owner, uint256 share);
    event StakingShareIncreased(uint256 share);
    event StakingArgs(IStaking.StakingParams params);

    struct InitParams {
        address owner;
        address taxWallet;
        address teamFinanceLocker;
        uint256 minLiq; 
        uint256 supply;
        uint256 initTaxType; //0-time,1-buyCount,2-hybrid
        uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
        uint256 countInterval; //0-100 
        uint256  maxBuyTax; //40%
        uint256  minBuyTax; //0
        uint256  maxSellTax; //40%
        uint256  minSellTax; //0
        uint256 lpTax;
        uint256 maxWallet;
        uint256 maxTx;
        uint256 preventSwap;
        uint256 maxSwap;
        uint256 taxSwapThreshold;
        string  name;
        string  symbol;
        bool isFreeTier;
    }


    struct LPDetails {
        address pair;
        uint256 buycount;
        uint256 taxBuy;
        uint256 taxSell;
        uint256 lockDays;
        bool isBurnt;
        uint256 tradingOpened;
        bool walletLimited;
        address stakingContract; //address(0) backward comp
        uint256 stakingShare; //external lock id here
        uint256 maxTx;
        uint256 maxWallet;
        address router;
        address presale; //address(0) backward comp
    }

    //reentrancy lock
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    /// @notice Constructor of Diamond Proxy for a launched token
    constructor(InitParams memory params) {
        owner_ = params.owner;
        emit OwnershipTransferred(address(0), owner_);
        teamFinanceLocker = params.teamFinanceLocker;
        // adding ERC165 data

        deployyyyerCa = payable(msg.sender);
 
        minLiq = params.minLiq;
        taxBuy = params.maxBuyTax; //20%
        maxBuyTax = params.maxBuyTax;
        minBuyTax = params.minBuyTax;

        taxSell = params.maxSellTax; //20%
        maxSellTax = params.maxSellTax;
        minSellTax = params.minSellTax;
        lpTax = params.lpTax;
        
        initTaxType = params.initTaxType;
        initInterval = params.initInterval;
        countInterval = params.countInterval;

        // Reduction Rules
        buyCount = 0; 
        isFreeTier = params.isFreeTier;
    

        // Token Information
        decimals_ = 18;

        taxWallet = payable(params.taxWallet);
        
        name_ = params.name;
        symbol_ = params.symbol;
        tTotal = params.supply;

        // Contract Swap Rules            
        taxSwapThreshold = params.taxSwapThreshold; //0.1%
        maxTaxSwap = params.maxSwap; //1%
        walletLimited = true;
        
        
        maxWallet = tTotal * params.maxWallet / 10000;  //1% (allow 1 - 100)
        maxTx = tTotal * params.maxTx / 10000;
        if (params.maxWallet == 10000 && params.maxTx == 10000) {
            walletLimited = false;
        }
        emit IncreasedLimits(params.maxWallet, params.maxTx);
        balances[address(this)] = tTotal;
        emit Transfer(address(0), address(this), tTotal);

        preventSwap = params.preventSwap;

    } 


    /// @notice Create liquidity pool and start trading for the token
    /// @dev
    function startTrading(uint256 lockPeriod, bool shouldBurn, address router) external payable  {
        require(msg.sender == owner_, "o");
        require(!tradingOpen, "1");
        require(address(this).balance >= minLiq, "2");
        if(!shouldBurn) {
            require(lockPeriod >= 14);
        } 
        
        tradingOpen = true;

        uint256 maxTxTemp = maxTx;
        uint256 maxWalletTemp = maxWallet;
        bool walletLimitedTemp = walletLimited;
        
        if(walletLimited == true) {
            maxTx = tTotal;
            maxWallet = tTotal;
            walletLimited = false;
        }
        

        isExTxLimit[address(this)] = true;
        isExTxLimit[owner_] = true;
        isExTxLimit[address(0x000000000000000000000000000000000000dEaD)] = true;

        isExWaLimit[address(this)] = true;
        isExWaLimit[owner_] = true;
        isExWaLimit[address(0x000000000000000000000000000000000000dEaD)] = true;
        
        //0x000000000000000000000000000000000000dEaD or address(0)
        address liqOwner = address(this);
        if(shouldBurn) {
            liqOwner = address(0);
            isBurnt = true;
        } else {
            lockPeriod_ = lockPeriod;
            isBurnt = false;
        }

        uint256 liqBalance = balances[address(this)];
        tradingOpened = block.timestamp;
        
        require(IHelper(deployyyyerCa).isValidRouter(router));
        uniswapV2Router = IUniswapV2Router02(router);
        allowances[address(this)][address(uniswapV2Router)] = tTotal;
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        isExWaLimit[address(uniswapV2Pair)] = true;
        isExTxLimit[address(uniswapV2Pair)] = true;
        isExTxLimit[address(uniswapV2Router)] = true;
        isExWaLimit[address(uniswapV2Router)] = true;
        
        
        emit TradingEnabled(uniswapV2Pair, address(this).balance, lockPeriod_, shouldBurn, address(uniswapV2Router));
        require(IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max), "3");
        
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),liqBalance,0,0,liqOwner,block.timestamp+60);
        liquidityOpen = true;
        
        if(walletLimitedTemp == true) {
            maxTx = maxTxTemp;
            maxWallet = maxWalletTemp;
            walletLimited = true;
        }

    }

    function lockOnTeamFinance(uint256 lps, bool ref) external payable  {
        require(msg.sender ==  owner_ && isBurnt == false && isRetrieved == false && tradingOpen == true && lps >= 3600 * 24 * 14, "o");
        //require(isBurnt == false && isRetrieved == false && tradingOpen == true, "lt");
        //require(lps >= 3600 * 24 * 14, "ls");
        uint256 lpBalance = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).approve(teamFinanceLocker, lpBalance);
        lockerId = ITeamFinanceLocker(teamFinanceLocker).lockToken{value: msg.value}(uniswapV2Pair, msg.sender, lpBalance, block.timestamp + lps, false, ref?address(deployyyyerCa):address(0));
        isRetrieved = true;
        emit ExternalLocked(lockerId, lps);
        //emit ExternalLocked(lockPeriodSec);
    }

    /// @notice Burn the liquidity pool tokens of the token
    function burnLP() external  {
        require(msg.sender == owner_, "o");
        require(!isBurnt && !isRetrieved && tradingOpen, "a"); 
        isBurnt = true;
        emit LpBurnt();
        require(IERC20(uniswapV2Pair).transfer(address(0x000000000000000000000000000000000000dEaD), IERC20(   uniswapV2Pair).balanceOf(address(this))), "o2");        
    }

    /// @notice Get lp lock period remaining
    /// @return lpldays lock days remaining 
    function getLockleft() private view returns (uint256) {
        if(!tradingOpen) {
            return 0;
        }
        //time traversed in days
        uint256 tt = ((block.timestamp - tradingOpened)/86400);
        if (tt > lockPeriod_) {
            return 0;
        } else {
            return lockPeriod_ - tt;
        }

    }
    
    /// @notice Extend LP lock
    /// @dev should not be already retrieved or burnt
    /// @param ldays no of days to extend
    function extendLock(uint256 ldays) external  {
        require(msg.sender == owner_, "o");
        require(!isRetrieved && !isBurnt && tradingOpen, "a");
        //expired lock 
        if((tradingOpened + (lockPeriod_*86400)) < block.timestamp) {
            lockPeriod_ = (block.timestamp - tradingOpened)/86400;
        }
        lockPeriod_ += ldays; 
        emit LockUpdated(lockPeriod_);
        
    }
    
    /// @notice Retrieve LP tokens
    /// @dev should not be already retrieved or burnt
    function retrieveLock() external  {
        require(msg.sender == owner_, "o");
        require(!isRetrieved && !isBurnt && tradingOpen, "a");
        if((tradingOpened + (lockPeriod_*60*60*24)) < block.timestamp) {
            isRetrieved = true;
            
            uint256 bal = IERC20(uniswapV2Pair).balanceOf(address(this));
            emit LockRetrieved();
            require(IERC20(uniswapV2Pair).transfer(msg.sender, bal), "b");
            
        }
    }

    function increaseLimits(uint256 maxwallet, uint256 maxtx) external {
        require(msg.sender ==  owner_ && walletLimited, "o");
        //require(walletLimited);
        require(tTotal * maxwallet / 10000 >= maxWallet && maxwallet <= 10000, "a");
        require(tTotal * maxtx / 10000 >= maxTx && maxtx <= 10000, "b");
        maxWallet = tTotal * maxwallet / 10000;   
        maxTx = tTotal * maxtx / 10000;
        
        if (maxwallet == 10000 && maxtx == 10000) {
            walletLimited = false;
        }

        emit IncreasedLimits(maxwallet, maxtx);
    }

    ///@dev Returns the name of the token.
    function name() external view override returns (string memory) {
        return name_;
    }

    ///@dev Returns the symbol of the token, usually a shorter version of name.
    function symbol() external view override returns (string memory) {
        return symbol_;
    }

    ///@dev Returns the number of decimals used to get its user representation.
    function decimals() external view override returns (uint8) {
        return decimals_;
    }

    ///@dev Returns the value of tokens in existence.
    function totalSupply() public view override returns (uint256) {
        return tTotal;
    }

    ///@dev Returns the value of tokens owned by account.
    function balanceOf(address account) public view override returns (uint256) {
        return balances[account];
    }

    ///@dev Moves a amount of tokens from the caller's account to receipient.
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    ///@dev Returns the remaining number of tokens that `spender` will be
    // allowed to spend on behalf of `owner` through {transferFrom}. This is
    // zero by default
    function allowance(address owner, address spender) external view override returns (uint256) {
        return allowances[owner][spender];
    }

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's token   
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(amount <= allowances[sender][msg.sender], "25");
        _approve(sender, msg.sender,allowances[sender][msg.sender] - amount);
        _transfer(sender, recipient, amount);
        return true;
    }
    
    function _approve(address _owner, address _spender, uint256 _amount) private {
        require(_owner != address(0));
        require(_spender != address(0));
        allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /// @notice sets tax for the trade
    /// @dev 
    function _setTax(bool isBuy) private {
        uint256 maxTax;
        uint256 minTax;
        uint256 tax;
        if(isBuy) {
            maxTax = maxBuyTax;
            minTax = minBuyTax;
            tax = taxBuy;
        } else {
            maxTax = maxSellTax;
            minTax = minSellTax;
            tax = taxSell;
        }

        if(tax != minTax) {
            if(initTaxType == 0) {
                if (block.timestamp >= (tradingOpened + (initInterval))) {
                    tax = minTax; 
                }
                else if (block.timestamp >= (tradingOpened + (initInterval/2))) {
                    tax = minTax + (maxTax - minTax)/4;
                }
                else if (block.timestamp >= (tradingOpened + (initInterval/4))) {
                    tax = minTax + ((maxTax - minTax)/2);
                }
                else {       
                    tax = maxTax; 
                }        
                  
            } else if(initTaxType == 1) {
                if (buyCount > (countInterval)) {
                    tax = minTax; 
                } else {       
                    tax = maxTax; 
                } 
                //this is forced after 2hrs
                if(block.timestamp >= (tradingOpened + 7200)) {
                    tax = minTax;
                }      

            } else if(initTaxType == 2){
                if (buyCount > (countInterval) || block.timestamp >= (tradingOpened + (initInterval))) {
                    tax = minTax; 
                }
                else if (buyCount > (countInterval/2) || block.timestamp >= (tradingOpened + (initInterval/2))) {
                    tax = minTax + (maxTax - minTax)/4;
                }
                else if (buyCount > (countInterval/4) || block.timestamp >= (tradingOpened + (initInterval/4))) {
                    tax = minTax + ((maxTax - minTax)/2);
                }
                else {       
                    tax = maxTax; 
                }        
            // } else if(   initTaxType == 3) { //check block number}        
                
            } else {
                tax = minTax; 
            }

            if(isBuy) {
                   taxBuy = tax;
            } else {
                   taxSell = tax;
            }
        }

    }

    /// @notice internal method of transfer
    /// @dev 
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0) && to != address(0));
        //require(to != address(0));
        //require(amount > 0); //compliance erc20
        require(balances[from] >= amount, "66");
        uint256 taxAmount=0;
        
        if (tradingOpen &&  walletLimited && !isExTxLimit[from] && !isExTxLimit[to])
            require(maxTx >= amount, "30");
        if (tradingOpen && walletLimited && !isExWaLimit[to])
            require((balances[to] + amount) <= maxWallet, "31");
         
        if (from != owner_ && to != owner_ && liquidityOpen == true) {
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
            	//buy from uniswap, only if amount > 0
                buyCount++;
                _setTax(true);

            	taxAmount = amount * taxBuy / 100;
                //console.log("_setTaxDone");
                
                
            }
            if(to == uniswapV2Pair && from!= address(this)) {
            	//sell from uniswap
                _setTax(false);
                taxAmount = amount * taxSell / 100;    
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapped = false;
        if (!inSwap && to == uniswapV2Pair && from!= address(this) && contractTokenBalance > 0 && buyCount > preventSwap) {
            //we swap only on sell to uniswap pool
            if(contractTokenBalance > taxSwapThreshold || ((block.timestamp - tradingOpened) > (86400) && minBuyTax == 0 && minSellTax == 0)) {
                if(block.number > lastSwapBlock) {
                    if(contractTokenBalance < maxTaxSwap) {
                        swapTokensForEth(contractTokenBalance);
                    }
                    else {
                        swapTokensForEth(maxTaxSwap);
                    }
                    sendETHToFee(address(this).balance);
                    swapped = true;
                    lastSwapBlock = block.number;
                }
            }
        }

        if(taxAmount > 0) {
            balances[address(this)] = balances[address(this)] + (taxAmount);
            emit Transfer(from, address(this), taxAmount);
        }

        //from can be taxWallet
        balances[from] = balances[from] - amount;
        balances[to] = balances[to] + amount - taxAmount;
        emit Transfer(from, to, amount - taxAmount);
        
        if(swapped) {
            //everything else is taken care, anything left is for token's tax wallet
            //this call needs to be safe from reverts, consuming all gas and return bombs
            bool ttax = SafeCall.call(taxWallet, 100000, address(this).balance, "");
            if(ttax)
                emit TaxMade(address(this).balance);
        }

    }

    /// @notice swaps tokens from tax into eth
    /// @dev this is nonrentrant using lockTheSwap
    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if(lpTax > 0) { 
            halfLp = tokenAmount * lpTax / 200;  
            tokenAmount -= halfLp; 
            lastSwap = tokenAmount;
        }

        _approve(address(this), address(uniswapV2Router), tokenAmount);
           uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    /// @notice sends the eth to respective tax wallets 
    /// @dev 
    function sendETHToFee(uint256 amount) private {  
        uint256 da = 0;
        uint256 ethLpShare = 0;
        uint256 spshare = 0;
        uint256 halfLpTemp;
        //s.isFreeTier && 
        if(isFreeTier == true && ((block.timestamp - tradingOpened) < (86400*90))) {     
            da = amount * 10 / 100;
            emit TaxGiven(da);
            (bool stax, ) =  deployyyyerCa.call{value: da}("");
            require(stax, "99");
        }
        if(lpTax > 0 && halfLp > 0) {
            //newly added liquidity is also locked
            //address liqOwner = address(this);
            
            //we should also be keeping half of lp in tokens, so that u add equal amount of eth and token to lp
            ethLpShare = halfLp * amount / lastSwap;
            halfLpTemp = halfLp;
            halfLp = 0;
            lastSwap = 0;
            _approve(address(this), address(uniswapV2Router), halfLpTemp);
            uniswapV2Router.addLiquidityETH{ value: ethLpShare }(
                address(this),
                halfLpTemp,
                0,
                0,
                address(this),
                block.timestamp + 60
            );

            
        }
        if(stakingContract != address(0)) {
            spshare = (amount - da - ethLpShare) * stakingShare / 100;
            //stakingContract is safe since its our own! 
            (bool sent, ) = stakingContract.call{value: spshare}("");
            require(sent, "s9");
            emit StakingMade(spshare);
        }
    }

    /// @notice recovers eth to tax wallet if any
    /// @dev 
    function recoverEth() private {
        //blocked while trading is disabled
        if(!inSwap && tradingOpen) { 
            uint256 contractETHBalance = address(this).balance;
            if(contractETHBalance > 0) {
                sendETHToFee(contractETHBalance);
                (bool ttax, ) = taxWallet.call{value: address(this).balance}("");
                if(ttax)
                    emit TaxMade(address(this).balance);
            }
        }

    }

    /// @notice rescues any erc20 tokens sent to contract, also recovers eth to tax wallet if any
    /// @dev trying to rescue own token or own lp tokens will revert
    function rescueERC20(address _address) external {
        //block pulling out lp
        require(_address != uniswapV2Pair); 
        require(_address != address(this));
        
        require(IERC20(_address).transfer(taxWallet, IERC20(_address).balanceOf(address(this))), "r");
        recoverEth();
    }
    
    /// @notice Set the address of the new owner of the contract
    /// @param _newOwner The address of the new owner of the contract
    function transferOwnership(address _newOwner) external {
        require(msg.sender == owner_, "o");
        emit OwnershipTransferred(owner_, _newOwner);
        //isExTxLimit[owner_] = false;
        //isExWaLimit[owner_] = false;
        owner_ = _newOwner;
        isExTxLimit[owner_] = true;
        isExWaLimit[owner_] = true;
        
    }
    
    /// @notice Get the address of the owner
    /// @return The address of the owner.
    function owner() public view returns (address) {
        //address _owner = owner_;
        return owner_;
    }
    

    /// @notice Get liquidity pool details of the token
    /// @return IOwnership.LPDetails
    /// @dev 
    function getLPDetails() external view returns (LPDetails memory) {
        return LPDetails(uniswapV2Pair, buyCount, taxBuy, taxSell, getLockleft(), isBurnt, tradingOpened, walletLimited, stakingContract, stakingShare, maxTx, maxWallet, address(uniswapV2Router), address(0));
    }


    /// @notice increase revenue share to staking pool for the token
    /// @dev 
    function increaseStakingShare(uint256 share) external {
        require(msg.sender == owner_ && stakingShare > 0 && share > 0, "o");
        //staking pool is live
        //require(stakingShare > 0 && share > 0);
        stakingShare += share;
        require(stakingShare <= 100, "os");
        emit StakingShareIncreased(stakingShare);
    }

    /// @notice launch staking pool for the token
    /// @dev 
    function launchStaking(uint256 share, IStaking.StakingParams memory params) external {
        require(msg.sender == owner_, "o");
        require(stakingShare == 0 && share > 0 && share <= 100, "y");
        //require(stakingShare == 0, "o12");
        require(params.withdrawTimeout >= 2 days && params.withdrawTimeout < 10 days, "z");
        stakingShare = share;
        params.owner = msg.sender;
        
        StakingPool stakingPool = new StakingPool(params);
        isExTxLimit[address(stakingPool)] = true;
        isExWaLimit[address(stakingPool)] = true;
        emit StakingLaunched(address(stakingPool), msg.sender, stakingShare);
        emit StakingArgs(params);
        stakingContract = payable(address(stakingPool));

    }
    
    /// @notice receive eth
    receive() external payable {}

}
StakingPool.sol 209 lines
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/

pragma solidity ^0.8.23;

import "../interfaces/IStaking.sol";
import { IERC20 } from "../interfaces/IERC20.sol"; 

struct AppStorageStaking {
    address token;
    address owner;
    uint256 accRewardsPrecision;
    uint256 totalStakedAmount;
    uint256 withdrawTimeout;
    uint256 unallocatedETH;
    uint256 accRewardsPerShare;
    uint256 totalETHCollected;
    mapping(address => uint256) totalRewards;
    mapping(address => uint256) rewardDebt;
    mapping(address => uint256) stakedAmount;
    mapping(address => uint256) claimedAmount;
    mapping(address => uint256) claimableRewards;
    mapping(address => uint256) lastUnstakeTime;
    mapping(address => uint256) unstakedAmount;

}

contract Modifiers {
    AppStorageStaking internal s;
}
/// @title StakingPool
/// @dev 
contract StakingPool is IStaking, Modifiers {
    event Stake(address indexed user, uint256 amount);
    event Unstake(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event ClaimRewards(address indexed user, uint256 amount);
    event RewardsReceived(address indexed sender, uint256 amount, uint256 accRewardsPerShare);
    //event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(IStaking.StakingParams memory params) {
        require(params.owner != address(0));
        s.owner = params.owner;
        //init appStorage 
        s.accRewardsPrecision = 1e18;  
        s.token = msg.sender;
        s.withdrawTimeout = params.withdrawTimeout;

    } 

    //tracking ownership in subgraph is not needed here, since ownership is unimportant
    /// @notice transfer ownership
    /// @dev
    function transferOwnership(address _newOwner) external override {
        require(msg.sender == s.owner);
        s.owner =  _newOwner;
    }
    
    /// @notice return owner address
    /// @dev
    function owner() external override view returns (address owner_) {
        owner_ = s.owner;
    }

    /// @notice rescue erc20 tokens from the contract
    /// @dev
    function rescueERC20(address _address) external {
        //only use of owner: as the rescue wallet! 
        bool ret = IERC20(_address).transfer(s.owner, IERC20(_address).balanceOf(address(this)));
        require(ret, "1");
    }

    /// @notice stake tokens
    /// @dev
    function stake(uint256 _amount) external override {
        uint256 pending = 0;
        require(_amount > 0);
        if (s.stakedAmount[msg.sender] > 0) {
            pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        }

        uint256 unstakedAmount = s.unstakedAmount[msg.sender];
        if (unstakedAmount >= _amount) {
            s.unstakedAmount[msg.sender] -= _amount;
        } else {
            uint256 tokensNeeded = _amount - unstakedAmount;
            s.unstakedAmount[msg.sender] = 0;
            //requires staking contract to be approved by user
        	require(IERC20(s.token).transferFrom(msg.sender, address(this), tokensNeeded), "2");
        }
        
        s.stakedAmount[msg.sender] += _amount;
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; 
        s.totalStakedAmount += _amount;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }
        
        emit Stake(msg.sender, _amount);
    }

    /// @notice unstake staked tokens
    /// @dev
    function unstake(uint256 _amount) external override {
        require(_amount > 0 && s.stakedAmount[msg.sender] >= _amount, "3"); 
        uint256 pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        s.stakedAmount[msg.sender] -= _amount;
        s.lastUnstakeTime[msg.sender] = block.timestamp;
        s.unstakedAmount[msg.sender] += _amount;

        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        s.totalStakedAmount -= _amount;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }

        emit Unstake(msg.sender, _amount);
    }

    /// @notice restake unstaked tokens
    /// @dev
    function restake() external override {
        uint256 pending = 0;
        uint256 amountToRestake = s.unstakedAmount[msg.sender];
        require(amountToRestake > 0, "4"); 
        //allocateRewards();
        if (s.stakedAmount[msg.sender] > 0) {
            pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        }

        s.unstakedAmount[msg.sender] = 0;
        s.stakedAmount[msg.sender] += amountToRestake;
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        s.totalStakedAmount += amountToRestake;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }
        emit Stake(msg.sender, amountToRestake);
    }

    /// @notice withdraw unstaked tokens
    /// @dev
    function withdraw() external override {
        uint256 toWithdraw = s.unstakedAmount[msg.sender];
        require(toWithdraw > 0, "5");
        require(block.timestamp >= s.lastUnstakeTime[msg.sender] + s.withdrawTimeout, "6");
        s.unstakedAmount[msg.sender] = 0;
        emit Withdraw(msg.sender, toWithdraw);
        require(IERC20(s.token).transfer(msg.sender, toWithdraw), "7");
        
    }

    /// @notice claim rewards in eth
    /// @dev
    function claimRewards() external override {
        s.claimableRewards[msg.sender] += ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        uint256 claimable = s.claimableRewards[msg.sender];
        require(claimable > 0, "8");
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        uint256 amount = address(this).balance > claimable ? claimable : address(this).balance;
        s.claimableRewards[msg.sender] -= amount;
        s.claimedAmount[msg.sender] += amount; 
        emit ClaimRewards(msg.sender, amount);
        (bool sent,) = payable(msg.sender).call{value: amount}("");
        require(sent, "9");
        
    }
    
    /// @notice get details related to the user
    /// @dev
    function getUserDetails(address _user) external view returns (IStaking.StakingDetails memory) {
    	uint256 withdrawable = 0;
    	uint256 timeToWithdraw = 0;
    	uint256 claimable = s.claimableRewards[_user] + ((s.stakedAmount[_user] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[_user];
    	
    	if (block.timestamp >= s.lastUnstakeTime[_user] + s.withdrawTimeout) {
            withdrawable = s.unstakedAmount[_user];
        } else {
        	timeToWithdraw = block.timestamp - s.lastUnstakeTime[_user] + s.withdrawTimeout;
        }

        return IStaking.StakingDetails(claimable, withdrawable, s.unstakedAmount[_user], s.totalRewards[_user], timeToWithdraw, s.stakedAmount[_user]);
    }

    /// @notice receive
    /// @dev staing rewards in eth, sets accRewardsPerShare
    receive() external payable {
        uint256 amount = msg.value;
        require(amount > 0, "r");
        s.totalRewards[msg.sender] += amount;
        s.totalETHCollected += amount;
        if (s.totalStakedAmount == 0) {
            s.unallocatedETH += amount;
        } else {
            s.accRewardsPerShare += ((amount+s.unallocatedETH) * s.accRewardsPrecision) / s.totalStakedAmount;  
            s.unallocatedETH = 0;         
        }
        emit RewardsReceived(msg.sender, amount, s.accRewardsPerShare);
    }

}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
getLPDetails 0x5c89dfe1 → tuple
name 0x06fdde03 → string
owner 0x8da5cb5b → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 13 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burnLP 0x0b45260e
No parameters
extendLock 0x44ee3a1c
uint256 ldays
increaseLimits 0x78f8484b
uint256 maxwallet
uint256 maxtx
increaseStakingShare 0x20ffb26d
uint256 share
launchStaking 0xa3d57c72
uint256 share
tuple params
lockOnTeamFinance 0x505f5c08
uint256 lps
bool ref
rescueERC20 0xccec3716
address _address
retrieveLock 0x4839c8b3
No parameters
startTrading 0xdb7c4dda
uint256 lockPeriod
bool shouldBurn
address router
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address _newOwner

Recent Transactions

No transactions found for this address