Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xeAc193F6A2bC81e09DD043F80A37Aa94596a6E0B
Balance 0 ETH
Nonce 2
Code Size 11303 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

11303 bytes
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a9059cbb11610097578063cba0e99611610071578063cba0e9961461043c578063d80528ae14610468578063dd62ed3e1461048b578063f2fde38b146104c457600080fd5b8063a9059cbb14610374578063c1eb6dfd14610387578063cb7115951461042957600080fd5b8063715018a6146102c45780637df0f767146102cc578063860aefcf146102f857806395d89b4114610313578063960bfe041461033557806399c8d5561461034857600080fd5b806323b872dd1161014b57806342966c681161012557806342966c681461026d57806351bc3c85146102805780635c07c9931461028857806370a082311461029b57600080fd5b806323b872dd146102385780632836be241461024b578063313ce5671461025e57600080fd5b80630210a83d1461019357806306fdde031461019d578063095ea7b3146101d95780630a6a52b9146101fc57806316114acd1461020f57806318160ddd14610222575b600080fd5b61019b6104d7565b005b60408051808201909152600e81526d4a61636b204c6576696e20496e7560901b60208201525b6040516101d09190612656565b60405180910390f35b6101ec6101e73660046126b9565b6107d8565b60405190151581526020016101d0565b61019b61020a3660046126f3565b61083f565b61019b61021d36600461272c565b6109e8565b61022a610b3c565b6040519081526020016101d0565b6101ec610246366004612750565b610b5d565b61019b6102593660046126f3565b610c1e565b604051600981526020016101d0565b61019b61027b366004612791565b610d96565b61019b610e82565b61019b6102963660046127bc565b610eb6565b61022a6102a936600461272c565b6001600160a01b031660009081526001602052604090205490565b61019b610eee565b6101ec6102da36600461272c565b6001600160a01b031660009081526009602052604090205460ff1690565b600454600554604080519283526020830191909152016101d0565b6040805180820190915260068152654c4556494e5560d01b60208201526101c3565b61019b610343366004612791565b610f22565b610350610f99565b6040805160ff948516815292841660208401529216918101919091526060016101d0565b6101ec6103823660046126b9565b610fb9565b600054600754600854604080516001600160a01b0394851681527f00000000000000000000000013b867889b797d2d90d77d7ac47e3f9a5fb7356f85166020820152928416908301527306450dee7fd2fb8e39061434babcfc05599a6fb86060830152600080516020612bd28339815191526080830152737a250d5630b4cf539739df2c5dacb4c659f2488d60a08301529190911660c082015260e0016101d0565b61019b61043736600461272c565b610fc6565b6101ec61044a36600461272c565b6001600160a01b031660009081526006602052604090205460ff1690565b61047061109f565b604080519384526020840192909252908201526060016101d0565b61022a6104993660046127ef565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61019b6104d236600461272c565b611100565b6000546001600160a01b0316331461050a5760405162461bcd60e51b81526004016105019061281d565b60405180910390fd5b6040516370a0823160e01b8152306004820152600090600080516020612bd2833981519152906370a0823190602401602060405180830381865afa158015610556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057a9190612844565b116105b95760405162461bcd60e51b815260206004820152600f60248201526e555344432076616c7565207a65726f60881b6044820152606401610501565b6008546001600160a01b0316156105fe5760405162461bcd60e51b81526020600482015260096024820152684c502065786973747360b81b6044820152606401610501565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610674919061285d565b6040516364e329cb60e11b8152306004820152600080516020612bd283398151915260248201526001600160a01b03919091169063c9c65396906044016020604051808303816000875af11580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f4919061285d565b600880546001600160a01b0319166001600160a01b039290921691821790556000908152600960209081526040808320805460ff19166001908117909155308085529252918290205491516370a0823160e01b8152600481018290526107b69290600080516020612bd2833981519152906370a0823190602401602060405180830381865afa15801561078b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107af9190612844565b6000611136565b600b546107c39042612890565b600a8190556107d3906000612890565b600c55565b3360009081526001602052604081205461082a5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f2062616c616e636560681b6044820152606401610501565b61083533848461138f565b5060015b92915050565b6000546001600160a01b031633146108695760405162461bcd60e51b81526004016105019061281d565b604080518082018252600b81526a139bdd08185b1b1bddd95960aa1b6020808301919091526001600160a01b038516600090815260069091529190912054819060ff16156108ca5760405162461bcd60e51b81526004016105019190612656565b5060085481906001600160a01b038581169116036108fb5760405162461bcd60e51b81526004016105019190612656565b50806001600160a01b03841630036109265760405162461bcd60e51b81526004016105019190612656565b507f00000000000000000000000013b867889b797d2d90d77d7ac47e3f9a5fb7356f6001600160a01b0316836001600160a01b03161415819061097c5760405162461bcd60e51b81526004016105019190612656565b50806001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d036109bb5760405162461bcd60e51b81526004016105019190612656565b50506001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610a125760405162461bcd60e51b81526004016105019061281d565b306001600160a01b03821603610a585760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610501565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190612844565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3791906128a3565b505050565b6000610b4a6009600a6129a4565b610b5890633b9aca006129b3565b905090565b6001600160a01b0383166000908152600260209081526040808320338452909152812054821115610bd05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a20616d6f756e74206578636565647320616c6c6f77616e6365006044820152606401610501565b6001600160a01b038416600090815260026020908152604080832033845290915281208054849290610c039084906129ca565b90915550610c149050848484611452565b5060019392505050565b6000546001600160a01b03163314610c485760405162461bcd60e51b81526004016105019061281d565b604080518082018252600b81526a139bdd08185b1b1bddd95960aa1b6020808301919091526001600160a01b038516600090815260099091529190912054819060ff1615610ca95760405162461bcd60e51b81526004016105019190612656565b50806001600160a01b0384163003610cd45760405162461bcd60e51b81526004016105019190612656565b507f00000000000000000000000013b867889b797d2d90d77d7ac47e3f9a5fb7356f6001600160a01b0316836001600160a01b031614158190610d2a5760405162461bcd60e51b81526004016105019190612656565b50806001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d03610d695760405162461bcd60e51b81526004016105019190612656565b50506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b33600090815260016020526040902054811115610de35760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610501565b3360009081526001602052604081208054839290610e029084906129ca565b9091555050600080805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054839290610e42908490612890565b909155505060405181815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6000546001600160a01b03163314610eac5760405162461bcd60e51b81526004016105019061281d565b610eb461178b565b565b6000546001600160a01b03163314610ee05760405162461bcd60e51b81526004016105019061281d565b610eea8282611aaf565b5050565b6000546001600160a01b03163314610f185760405162461bcd60e51b81526004016105019061281d565b610eb46000611c47565b6000546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016105019061281d565b60008111610f945760405162461bcd60e51b815260206004820152601560248201527405468726573686f6c642063616e6e6f74206265203605c1b6044820152606401610501565b600355565b600080600080600080610faa611c9b565b91989097509095509350505050565b6000610835338484611452565b6000546001600160a01b03163314610ff05760405162461bcd60e51b81526004016105019061281d565b6001600160a01b03811660009081526009602052604090205460ff1615801561103657506001600160a01b038116737a250d5630b4cf539739df2c5dacb4c659f2488d14155b801561104b57506001600160a01b0381163014155b801561105f57506001600160a01b03811615155b61106857600080fd5b6001600160a01b03166000818152600660205260409020805460ff19166001179055600780546001600160a01b0319169091179055565b6000806000806110ad611d3c565b905060006110bd6009600a6129a4565b6110cb90633b9aca006129b3565b306000908152600160205260409020546110e590846129b3565b6110ef91906129dd565b600354929690955091935090915050565b6000546001600160a01b0316331461112a5760405162461bcd60e51b81526004016105019061281d565b61113381611c47565b50565b6040516370a0823160e01b815230600482015283906001600160a01b038616906370a0823190602401602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a09190612844565b10156111e25760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b6044820152606401610501565b6040516370a0823160e01b81523060048201528290600080516020612bd2833981519152906370a0823190602401602060405180830381865afa15801561122d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190612844565b10156112915760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768205553444360881b6044820152606401610501565b61129b8484611e58565b6112b3600080516020612bd283398151915283611e58565b6000546001600160a01b031681156112c9575060005b60405162e8e33760e81b8152600080516020612bd283398151915260048201526001600160a01b038087166024830152604482018590526064820186905260006084830181905260a4830152821660c48201524260e4820152737a250d5630b4cf539739df2c5dacb4c659f2488d9063e8e3370090610104016060604051808303816000875af1158015611361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138591906129ff565b5050505050505050565b6001600160a01b038316158015906113af57506001600160a01b03821615155b6113f15760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f206164647265737360681b6044820152606401610501565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383161580159061147257506001600160a01b03821615155b6114b45760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f206164647265737360681b6044820152606401610501565b6001600160a01b03831660009081526001602052604090205481111561151c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610501565b611527838383611ff2565b6115655760405162461bcd60e51b815260206004820152600f60248201526e131a5b5a5d1cc8195e18d959591959608a1b6044820152606401610501565b600a5442116115a45760405162461bcd60e51b815260206004820152600b60248201526a139bdd08195b98589b195960aa1b6044820152606401610501565b600a54421180156115b65750600c5442105b80156115c15750483a115b1561161a5760006115d2483a6129ca565b90506402540be4008082106116175760405162461bcd60e51b815260206004820152600b60248201526a139bdd08195b98589b195960aa1b6044820152606401610501565b50505b600d5460ff1615801561164657506001600160a01b03831660009081526006602052604090205460ff16155b801561166a57506001600160a01b03821660009081526009602052604090205460ff165b156116775761167761178b565b600080600061168786868661210e565b9194509250905060008161169b8486612890565b6116a59190612890565b6001600160a01b0388166000908152600160205260408120805492935087929091906116d29084906129ca565b909155505030600090815260016020526040812080548392906116f6908490612890565b90915550611706905081866129ca565b6001600160a01b0387166000908152600160205260408120805490919061172e908490612890565b92505081905550856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161177a91815260200190565b60405180910390a350505050505050565b600d805460ff1916600117905560006117a2612225565b905060008060006117b1611c9b565b919450925090506000816117c58486612a2d565b6117cf9190612a2d565b3060009081526001602052604090205490915060ff8216158015906117f45750858110155b15611a9d575084600060ff8084169061180f908816846129b3565b61181991906129dd565b9050600060028460ff168760ff168561183291906129b3565b61183c91906129dd565b61184691906129dd565b905060008460ff168660ff168561185d91906129b3565b61186791906129dd565b90506000826118768386612890565b6118809190612890565b905061188e6009600a6129a4565b8110611a985760006118b130600080516020612bd2833981519152846001612393565b90506000826118c086846129b3565b6118ca91906129dd565b905060006002846118db89866129b3565b6118e591906129dd565b6118ef91906129dd565b90506000846118fe87866129b3565b61190891906129dd565b905060ff8c1615611920576119203088856001611136565b60ff8d161561197f57600061195a600080516020612bd28339815191527306450dee7fd2fb8e39061434babcfc05599a6fb8856000612393565b905061197d7306450dee7fd2fb8e39061434babcfc05599a6fb882856001611136565b505b60ff8b1615611a93576040516370a0823160e01b8152306004820152600090600080516020612bd2833981519152906370a0823190602401602060405180830381865afa1580156119d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f89190612844565b905080821115611a06578091505b8115611a915760075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101839052600080516020612bd28339815191529063a9059cbb906044016020604051808303816000875af1158015611a6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8f91906128a3565b505b505b505050505b505050505b5050600d805460ff1916905550505050565b6000611abd6009600a6129a4565b611ac890600a6129b3565b6103e861ffff8516611adc6009600a6129a4565b611aea90633b9aca006129b3565b611af491906129b3565b611afe91906129dd565b611b089190612890565b90506000611b186009600a6129a4565b611b2390600a6129b3565b6103e861ffff8516611b376009600a6129a4565b611b4590633b9aca006129b3565b611b4f91906129b3565b611b5991906129dd565b611b639190612890565b90506004548210158015611b7957506005548110155b611bbe5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206465637265617365206c696d69747360501b6044820152606401610501565b611bca6009600a6129a4565b611bd890633b9aca006129b3565b821115611bfc57611beb6009600a6129a4565b611bf990633b9aca006129b3565b91505b611c086009600a6129a4565b611c1690633b9aca006129b3565b811115611c3a57611c296009600a6129a4565b611c3790633b9aca006129b3565b90505b6004919091556005555050565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000806000806000806000611cae611d3c565b9050620186a0811015611ccc57600193506000925060049150611d2f565b620186a08110158015611ce157506203d09081105b15611cf757600193506000925060039150611d2f565b6203d0908110158015611d0c5750620f424081105b15611d2257600193506000925060019150611d2f565b6000935060009250600091505b5091959094509092509050565b60085460009081906001600160a01b031615611e53576008546001600160a01b031660009081526001602052604081205490611d997f0000000000000000000000000000000000000000000000000000000000000006600a6129a4565b6008546040516370a0823160e01b81526001600160a01b039091166004820152600080516020612bd2833981519152906370a0823190602401602060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612844565b611e1d91906129dd565b905081611e2c6009600a6129a4565b611e3a90633b9aca006129b3565b611e4490836129b3565b611e4e91906129dd565b925050505b919050565b6000306001600160a01b03841603611eda5750306000908152600260209081526040808320737a250d5630b4cf539739df2c5dacb4c659f2488d845290915290205480821115610b3757306000908152600260209081526040808320737a250d5630b4cf539739df2c5dacb4c659f2488d845290915290206000199055505050565b604051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d60248201526001600160a01b0384169063dd62ed3e90604401602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c9190612844565b905080821115610b375760405163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015260001960248201526001600160a01b0384169063095ea7b3906044016020604051808303816000875af1158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec91906128a3565b50505050565b6004546000906001908311801561202257506001600160a01b03851660009081526006602052604090205460ff16155b801561204757506001600160a01b03841660009081526006602052604090205460ff16155b15612050575060005b6001600160a01b0384166000908152600160208190526040822054909190612079908690612890565b9050600554811180156120a557506001600160a01b03871660009081526006602052604090205460ff16155b80156120ca57506001600160a01b03861660009081526006602052604090205460ff16155b80156120ef57506001600160a01b03861660009081526009602052604090205460ff16155b156120f957600091505b8280156121035750815b979650505050505050565b6001600160a01b0383166000908152600960205260408120548190819081908190819060ff16801561215957506001600160a01b03881660009081526006602052604090205460ff16155b806121a057506001600160a01b03881660009081526009602052604090205460ff1680156121a057506001600160a01b03891660009081526006602052604090205460ff16155b156122125760008060006121b2611c9b565b9194509250905060646121c860ff85168c6129b3565b6121d291906129dd565b955060646121e360ff84168c6129b3565b6121ed91906129dd565b945060646121fe60ff83168c6129b3565b61220891906129dd565b9350505050610faa565b5060009889985088975095505050505050565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061225e5761225e612a5c565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612bd2833981519152816001815181106122a0576122a0612a5c565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d631f00ca746122ff7f0000000000000000000000000000000000000000000000000000000000000006600a6129a4565b60035461230c91906129b3565b846040518363ffffffff1660e01b815260040161232a929190612ab6565b600060405180830381865afa158015612347573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261236f9190810190612ad7565b90508060008151811061238457612384612a5c565b60200260200101519250505090565b60003081808415156001036123ca577f00000000000000000000000013b867889b797d2d90d77d7ac47e3f9a5fb7356f9250612435565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa15801561240e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124329190612844565b91505b61243f8887611e58565b604080516002808252606082018352600092602083019080368337019050509050888160008151811061247457612474612a5c565b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106124a8576124a8612a5c565b6001600160a01b0390921660209283029190910190910152604051635c11d79560e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d90635c11d79590612500908a9060009086908a904290600401612b95565b600060405180830381600087803b15801561251a57600080fd5b505af115801561252e573d6000803e3d6000fd5b505050508515156001036125cf57604051636433bbd760e01b81526001600160a01b0389811660048301527f00000000000000000000000013b867889b797d2d90d77d7ac47e3f9a5fb7356f1690636433bbd7906024016020604051808303816000875af11580156125a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c89190612844565b915061264a565b6040516370a0823160e01b81523060048201526000906001600160a01b038a16906370a0823190602401602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a9190612844565b905061264684826129ca565b9250505b50979650505050505050565b600060208083528351808285015260005b8181101561268357858101830151858201604001528201612667565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461113357600080fd5b600080604083850312156126cc57600080fd5b82356126d7816126a4565b946020939093013593505050565b801515811461113357600080fd5b6000806040838503121561270657600080fd5b8235612711816126a4565b91506020830135612721816126e5565b809150509250929050565b60006020828403121561273e57600080fd5b8135612749816126a4565b9392505050565b60008060006060848603121561276557600080fd5b8335612770816126a4565b92506020840135612780816126a4565b929592945050506040919091013590565b6000602082840312156127a357600080fd5b5035919050565b803561ffff81168114611e5357600080fd5b600080604083850312156127cf57600080fd5b6127d8836127aa565b91506127e6602084016127aa565b90509250929050565b6000806040838503121561280257600080fd5b823561280d816126a4565b91506020830135612721816126a4565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b60006020828403121561285657600080fd5b5051919050565b60006020828403121561286f57600080fd5b8151612749816126a4565b634e487b7160e01b600052601160045260246000fd5b808201808211156108395761083961287a565b6000602082840312156128b557600080fd5b8151612749816126e5565b600181815b808511156128fb5781600019048211156128e1576128e161287a565b808516156128ee57918102915b93841c93908002906128c5565b509250929050565b60008261291257506001610839565b8161291f57506000610839565b8160018114612935576002811461293f5761295b565b6001915050610839565b60ff8411156129505761295061287a565b50506001821b610839565b5060208310610133831016604e8410600b841016171561297e575081810a610839565b61298883836128c0565b806000190482111561299c5761299c61287a565b029392505050565b600061274960ff841683612903565b80820281158282048414176108395761083961287a565b818103818111156108395761083961287a565b6000826129fa57634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215612a1457600080fd5b8351925060208401519150604084015190509250925092565b60ff81811683821601908111156108395761083961287a565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015612aab5781516001600160a01b031687529582019590820190600101612a86565b509495945050505050565b828152604060208201526000612acf6040830184612a72565b949350505050565b60006020808385031215612aea57600080fd5b825167ffffffffffffffff80821115612b0257600080fd5b818501915085601f830112612b1657600080fd5b815181811115612b2857612b28612a46565b8060051b604051601f19603f83011681018181108582111715612b4d57612b4d612a46565b604052918252848201925083810185019188831115612b6b57600080fd5b938501935b82851015612b8957845184529385019392850192612b70565b98975050505050505050565b85815284602082015260a060408201526000612bb460a0830186612a72565b6001600160a01b039490941660608301525060800152939250505056fe000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48a2646970667358221220849b20ef69bfbe88704ebfc95fcb8931f7db7ab21db4fe87b1bbde560ca4fdbd64736f6c63430008110033

Verified Source Code Partial Match

Compiler: v0.8.17+commit.8df45f5f EVM: london Optimization: Yes (200 runs)
levin.sol 395 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IERC20 {
	function totalSupply() external view returns (uint256);
	function decimals() external view returns (uint8);
	function symbol() external view returns (string memory);
	function name() external view returns (string memory);
	function balanceOf(address account) external view returns (uint256);
	function transfer(address recipient, uint256 amount) external returns (bool);
	function allowance(address _owner, address spender) external view returns (uint256);
	function approve(address spender, uint256 amount) external returns (bool);
	function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
	event Transfer(address indexed from, address indexed to, uint256 value);
	event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
interface IUniswapV2Router02 {
	function getAmountsIn(uint amountOut, address[] memory path) external view returns (uint[] memory amounts);
	function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
	function factory() external pure returns (address);
	function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
}

abstract contract OWNED {
	address internal _owner;
	event OwnershipTransferred(address owner);
	constructor(address contractOwner) { _owner = contractOwner; }
	modifier onlyOwner() { require(msg.sender == _owner, "Not the owner"); _; }
	// function owner() external view returns (address) { return _owner; }  // moved into addressList() function
	function renounceOwnership() external onlyOwner { _transferOwnership(address(0)); }
	function transferOwnership(address newOwner) external onlyOwner { _transferOwnership(newOwner); }
	function _transferOwnership(address _newOwner) internal {
		_owner = _newOwner; 
		emit OwnershipTransferred(_newOwner); 
	}
}

contract LEVINU_Sidecar {
	address private immutable _owner;
	constructor() { _owner = msg.sender; }
	function owner() external view returns (address) { return _owner; }
	function recoverErc20Tokens(address tokenCA) external returns (uint256) {
		require(msg.sender == _owner, "Not authorized");
		uint256 balance = IERC20(tokenCA).balanceOf(address(this));
		if (balance > 0) { IERC20(tokenCA).transfer(msg.sender, balance); }
		return balance;
	}
}

contract JackLevinInu is IERC20, OWNED {
	mapping(address => uint256) private _balances;
	mapping(address => mapping(address => uint256)) private _allowances;
	uint8 private constant _decimals = 9;
	uint256 private constant _totalSupply = 1_000_000_000 * 10**_decimals;
	string private constant _name = "Jack Levin Inu";
	string private constant _symbol = "LEVINU";

	uint256 private _thresholdUSDC = 1000;  // tax tokens USD value threshold to trigger tax token swap, transfer and adding liquidity
	uint256 private _maxTx; 
	uint256 private _maxWallet;
	uint8 private immutable _usdcDecimals;

	uint256 private constant taxMcBracket1 = 100_000; // PROMOTION: below 100k MC tax is 5% (1 XENLP, 4 Marketing)
	uint256 private constant taxMcBracket2 = 250_000; // SUPPORT: below 250k MC tax is 4% (1 XENLP, 3 Marketing)
	uint256 private constant taxMcBracket3 = 1_000_000; // COMMUNITY: below 1m MC tax is 2% (1 XENLP, 1 Marketing), above it tax is 0% DEXENTRALIZED:

	mapping(address => bool) private _excluded;
	address private _marketingWallet = address(0x40F693a958C96241aB0281f120c878ACC664e1D3);
	
	address private constant _xen = address(0x06450dEe7FD2Fb8E39061434BAbCFC05599a6Fb8); 
	address private constant _usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); 
	
	address private immutable _sidecarAddress;
	LEVINU_Sidecar private immutable _sidecarContract;

	address private constant _swapRouterAddress = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Uniswap V2 Router
	IUniswapV2Router02 private constant _swapRouter = IUniswapV2Router02(_swapRouterAddress);
	address private _primaryLP;
	mapping(address => bool) private _isLP;
	
	uint256 private _openAt;
	uint256 private _addTime = 0;
	uint256 private _protected;

	bool private swapLocked;
	modifier lockSwap { swapLocked = true; _; swapLocked = false; }

	constructor() OWNED(msg.sender)  {
		_balances[address(this)] = _totalSupply;
		emit Transfer(address(0), address(this), _balances[address(this)]);
		
		_sidecarContract = new LEVINU_Sidecar();
		_sidecarAddress = address(_sidecarContract);
		_usdcDecimals = IERC20(_usdc).decimals();

		_changeLimits(10,20); //set max TX to 1%, max wallet 2%

		_excluded[_owner] = true;
		_excluded[address(this)] = true;
		_excluded[_swapRouterAddress] = true;
		_excluded[_marketingWallet] = true;
		_excluded[_sidecarAddress] = true;
	}

	function addressList() external view returns (address owner, address sidecar, address marketing, address xen, address usdc, address swapRouter, address primaryLP) {
		return (_owner, _sidecarAddress, _marketingWallet, _xen, _usdc, _swapRouterAddress, _primaryLP);
	}

	function totalSupply() external pure override returns (uint256) { return _totalSupply; }
	function decimals() external pure override returns (uint8) { return _decimals; }
	function symbol() external pure override returns (string memory) { return _symbol; }
	function name() external pure override returns (string memory) { return _name; }
	function balanceOf(address account) external view override returns (uint256) { return _balances[account]; }
	function allowance(address owner, address spender) external view override returns (uint256) { return _allowances[owner][spender]; }
	function approve(address spender, uint256 amount) public override returns (bool) {
		require(_balances[msg.sender] > 0,"ERC20: Zero balance");
		_approve(msg.sender, spender, amount);
		return true;
	}
	function _approve(address owner, address spender, uint256 amount ) private {
		require(owner != address(0) && spender != address(0), "ERC20: Zero address");
		_allowances[owner][spender] = amount;
		emit Approval(owner, spender, amount);
	}
	function _checkAndApproveRouter(uint256 tokenAmount) private {
		if (_allowances[address(this)][_swapRouterAddress] < tokenAmount) { 
			_approve(address(this), _swapRouterAddress, type(uint256).max);
		}
	}

	function _checkAndApproveRouterForToken(address _token, uint256 amount) internal {
		uint256 tokenAllowance;
		if (_token == address(this)) {
			tokenAllowance = _allowances[address(this)][_swapRouterAddress];
			if (amount > tokenAllowance) {
				_allowances[address(this)][_swapRouterAddress] = type(uint256).max;
			}
		} else {
			tokenAllowance = IERC20(_token).allowance(address(this), _swapRouterAddress);
			if (amount > tokenAllowance) {
				IERC20(_token).approve(_swapRouterAddress, type(uint256).max);
			}
		}
    }

	function transfer(address to, uint256 amount) public returns (bool) {
		_transfer(msg.sender, to, amount);
		return true;
	}
	function transferFrom(address from, address to, uint256 amount) public returns (bool) {
		require(_allowances[from][msg.sender] >= amount,"ERC20: amount exceeds allowance");
		_allowances[from][msg.sender] -= amount;
		_transfer(from, to, amount);
		return true;
	}
	function _transfer(address from, address to, uint256 amount) private {
		require(from != address(0) && to != address(0), "ERC20: Zero address"); 
		require(_balances[from] >= amount, "ERC20: amount exceeds balance"); 
		require(_limitCheck(from, to, amount), "Limits exceeded");
		require(block.timestamp>_openAt, "Not enabled");

		if (block.timestamp>_openAt && block.timestamp<_protected && tx.gasprice>block.basefee) {
			uint256 _gpb = tx.gasprice - block.basefee;
			uint256 _gpm = 10 * (10**9);
			require(_gpb<_gpm,"Not enabled");
		}

		if ( !swapLocked && !_excluded[from] && _isLP[to] ) { _processTaxTokens(); }
		
		(uint256 xenLP, uint256 levinuLP, uint256 marketing) = _getTaxTokens(from, to, amount);
		uint256 taxTokens = xenLP + levinuLP + marketing;
		_balances[from] -= amount;
		_balances[address(this)] += taxTokens;
		_balances[to] += (amount - taxTokens);
		emit Transfer(from, to, amount);
	}
	function _limitCheck(address from, address to, uint256 amount) private view returns (bool) {
		bool txSize = true;
		if ( amount > _maxTx && !_excluded[from] && !_excluded[to] ) { txSize = false; }
		bool walletSize = true;
		uint256 newBalanceTo = _balances[to] + amount;
		if ( newBalanceTo > _maxWallet && !_excluded[from] && !_excluded[to] && !_isLP[to] ) { walletSize = false; } 
		return (txSize && walletSize);
	}

	function _getCurrentDilutedMcUSD() private view returns (uint256) {
		uint256 marketCap;
		if (_primaryLP != address(0)) {
			uint256 tokensInLP = _balances[_primaryLP];
			uint256 usdcInLP = IERC20(_usdc).balanceOf(_primaryLP) / (10**_usdcDecimals);
			marketCap = (usdcInLP * _totalSupply / tokensInLP);
		}
		return marketCap;
	}
	function _getTaxRates() private view returns (uint8 xenRate, uint8 levinuRate, uint8 marketingRate) {
		uint8 _xenRate; uint8 _levinuRate; uint8 _marketingRate;
		uint256 currentDilutedUsdMC = _getCurrentDilutedMcUSD();
		if (currentDilutedUsdMC < taxMcBracket1 ) {
			_xenRate = 1; _levinuRate = 0; _marketingRate = 4;
		} else if (currentDilutedUsdMC >= taxMcBracket1 && currentDilutedUsdMC < taxMcBracket2) {
			_xenRate = 1; _levinuRate = 0; _marketingRate = 3;
		} else if (currentDilutedUsdMC >= taxMcBracket2 && currentDilutedUsdMC < taxMcBracket3) {
			_xenRate = 1; _levinuRate = 0; _marketingRate = 1;
		} else { 
			_xenRate = 0; _levinuRate = 0; _marketingRate = 0;
		}
		return (_xenRate, _levinuRate, _marketingRate);
	}
	function _getTaxTokens(address from, address to, uint256 amount) private view returns (uint256 xenLP, uint256 levinuLP, uint256 marketing) {
		uint256 _xenLP; uint256 _levinuLP; uint256 _marketing;
		if ( (_isLP[from] && !_excluded[to]) || (_isLP[to] && !_excluded[from]) ) { 
			(uint8 xenRate, uint8 levinuRate, uint8 marketingRate) = _getTaxRates();
			_xenLP = amount * xenRate / 100;
			_levinuLP = amount * levinuRate / 100;
			_marketing = amount * marketingRate / 100;
		}
		else { 
			_xenLP = 0;
			_levinuLP = 0;
			_marketing = 0;
		}
		return (_xenLP, _levinuLP, _marketing);
	}  

	function addInitialLiquidity() external onlyOwner {
		require(IERC20(_usdc).balanceOf(address(this))>0, "USDC value zero");
		require(_primaryLP == address(0), "LP exists");
		_primaryLP = IUniswapV2Factory(_swapRouter.factory()).createPair(address(this), _usdc);
		_isLP[_primaryLP] = true;
		_addLiquidity(address(this), _balances[address(this)], IERC20(_usdc).balanceOf(address(this)), false);
		_openAt = block.timestamp + _addTime;
		_protected = _openAt + 0;
	}

	function _addLiquidity(address _token, uint256 tokenAmount, uint256 usdcAmount, bool burnLpTokens) internal {
		require(IERC20(_token).balanceOf(address(this)) >= tokenAmount, "Not enough tokens");
		require(IERC20(_usdc).balanceOf(address(this)) >= usdcAmount, "Not enough USDC");
		_checkAndApproveRouterForToken(_token, tokenAmount);
		_checkAndApproveRouterForToken(_usdc, usdcAmount);
		address lpRecipient = _owner;
		if (burnLpTokens) { lpRecipient = address(0); }

		_swapRouter.addLiquidity(
			_usdc,  		// tokenA
			_token, 		// tokenB
			usdcAmount,     // amountADesired
			tokenAmount,    // amountBDesired
			0,      		// amountAMin -- allowing slippage
			0,      		// amountBMin -- allowing slippage
			lpRecipient, 	// to -- who gets the LP tokens
			block.timestamp // deadline
		);
	}

	function stats() external view returns (uint256 currentUsdMC, uint256 currentTaxUSD, uint256 swapThresholdUSD) { 
		uint256 currentMc = _getCurrentDilutedMcUSD();
		uint256 currentTaxValue = currentMc * _balances[address(this)] / _totalSupply;
		return (currentMc, currentTaxValue, _thresholdUSDC);
	}

	function tax() external view returns (uint8 Liquidityxen, uint8 LiquidityLEVINU, uint8 Marketing) { 
		(uint8 xenRate, uint8 levinuRate, uint8 marketingRate) = _getTaxRates();
		return (xenRate, levinuRate, marketingRate);
	}
	function limits() external view returns (uint256 maxTransaction, uint256 maxWallet) { return (_maxTx, _maxWallet); }
	function isExcluded(address wallet) external view returns (bool) { return _excluded[wallet]; }

	function changeLimits(uint16 maxTxPermille, uint16 maxWalletPermille) public onlyOwner { _changeLimits(maxTxPermille, maxWalletPermille); }
	function _changeLimits(uint16 _maxTxPermille, uint16 _maxWalletPermille) private {
		uint256 newMaxTx = (_totalSupply * _maxTxPermille / 1000) + (10 * 10**_decimals); //add 10 tokens to avoid rounding issues
		uint256 newMaxWallet = (_totalSupply * _maxWalletPermille / 1000) + (10 * 10**_decimals); //add 10 tokens to avoid rounding issues
		require(newMaxTx >= _maxTx && newMaxWallet >= _maxWallet, "Cannot decrease limits");
		if (newMaxTx > _totalSupply) { newMaxTx = _totalSupply; }
		if (newMaxWallet > _totalSupply) { newMaxWallet = _totalSupply; }
		_maxTx = newMaxTx;
		_maxWallet = newMaxWallet;
	}

	function changeTaxWallet(address walletMarketing) external onlyOwner {
		require(!_isLP[walletMarketing] && walletMarketing != _swapRouterAddress && walletMarketing != address(this) && walletMarketing != address(0));
		_excluded[walletMarketing] = true;
		_marketingWallet = walletMarketing;
	}	
	
	function _getThresholdTokenAmount() private view returns (uint256) {
		address[] memory path = new address[](2);
		path[0] = address(this);
		path[1] = _usdc;
		uint256[] memory amounts = _swapRouter.getAmountsIn(_thresholdUSDC * 10**_usdcDecimals, path); 
		return amounts[0];
	}
	function _processTaxTokens() private lockSwap {
		uint256 thresholdTokens = _getThresholdTokenAmount();
		(uint8 xenRate, uint8 levinuRate, uint8 marketingRate) = _getTaxRates();
		uint8 totalRate = xenRate + levinuRate + marketingRate;
		uint256 swapAmount = _balances[address(this)];
		if (totalRate>0 && swapAmount >= thresholdTokens) {
			swapAmount = thresholdTokens;

			uint256 tokensForxen = (swapAmount * xenRate / totalRate);
			uint256 tokensForlevinuLP = (swapAmount * levinuRate / totalRate)/2;
			uint256 tokensForMarketing = swapAmount * marketingRate / totalRate;

			uint256 tokensToSwap = tokensForxen + tokensForMarketing + tokensForlevinuLP;
			if (tokensToSwap >= 10**_decimals) {
				uint256 swappedOutputUSDC = _swapTokens(address(this), _usdc, tokensToSwap, true); //swap LEVINU for USDC, use sidecar contract
				uint256 usdcForlevinuLP = swappedOutputUSDC * tokensForlevinuLP / tokensToSwap; //calc USDC for LEVINU liquidity
				uint256 usdcToSpendOnxen = (swappedOutputUSDC * tokensForxen / tokensToSwap) / 2; //calc USDC for xen liquidity
				uint256 usdcForMarketing = swappedOutputUSDC * tokensForMarketing / tokensToSwap; //calc USDC for marketing

				if (levinuRate>0) { _addLiquidity(address(this), tokensForlevinuLP, usdcForlevinuLP, true); } //add LEVINU liquidity and burn LP tokens

				if (xenRate>0) {
					uint256 xenPurchased = _swapTokens(_usdc, _xen, usdcToSpendOnxen, false); //purchase xen for liquidity, sidecar not used
					_addLiquidity(_xen, xenPurchased, usdcToSpendOnxen, true); //add xen liquidity and burn LP tokens
				}

				if (marketingRate>0) {
					uint256 remainingUsdcBalance = IERC20(_usdc).balanceOf(address(this));
					if (usdcForMarketing > remainingUsdcBalance) { usdcForMarketing = remainingUsdcBalance; } //added check to avoid risk of having insufficient balance
					if (usdcForMarketing > 0) { IERC20(_usdc).transfer(_marketingWallet, usdcForMarketing); } //transfer USDC to marketing wallet
				}
			}

		}
	}

	function _swapTokens(address inputToken, address outputToken, uint256 inputAmount, bool useSidecar) private returns(uint256 outputAmount) {		
		address swapFunctionRecipient = address(this);
		uint256 balanceBefore;
		uint256 swappedOutputTokens;
		
		if (useSidecar == true) { swapFunctionRecipient = _sidecarAddress; }
		else { balanceBefore = IERC20(outputToken).balanceOf(address(this)); }

		_checkAndApproveRouterForToken(inputToken, inputAmount);
		address[] memory path = new address[](2);
		path[0] = inputToken;
		path[1] = outputToken;
		_swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
			inputAmount,
			0,
			path,
			swapFunctionRecipient,
			block.timestamp
		);
		
		if (useSidecar == true) { swappedOutputTokens = _sidecarContract.recoverErc20Tokens(outputToken); }
		else { 
			uint256 balanceAfter = IERC20(outputToken).balanceOf(address(this));
			swappedOutputTokens = (balanceAfter - balanceBefore); 
		}

		return swappedOutputTokens; 
	}

	function recoverTokens(address tokenCa) external onlyOwner {
		require(tokenCa != address(this),"Not allowed");
		uint256 tokenBalance = IERC20(tokenCa).balanceOf(address(this));
		IERC20(tokenCa).transfer(msg.sender, tokenBalance);
	}

	function manualSwap() external onlyOwner { _processTaxTokens(); }
	function setExcluded(address wallet, bool exclude) external onlyOwner { 
		string memory notAllowedError = "Not allowed";
		require(!_isLP[wallet], notAllowedError);
		require(wallet != address(this), notAllowedError);
		require(wallet != _sidecarAddress, notAllowedError);
		require(wallet != _swapRouterAddress, notAllowedError);
	 	_excluded[wallet] = exclude; 
	}
	function setThreshold(uint256 amountUSD) external onlyOwner {
		require(amountUSD > 0, "Threshold cannot be 0");
		_thresholdUSDC = amountUSD;
	}

	function burn(uint256 amount) external {
		require(_balances[msg.sender] >= amount, "Low balance");
		_balances[msg.sender] -= amount;
		_balances[address(0)] += amount;
		emit Transfer(msg.sender, address(0), amount);
	}
	function setAdditionalLP(address lpAddress, bool isLiqPool) external onlyOwner {
		string memory notAllowedError = "Not allowed";
		require(!_excluded[lpAddress], notAllowedError);
		require(lpAddress != _primaryLP, notAllowedError);
		require(lpAddress != address(this), notAllowedError);
		require(lpAddress != _sidecarAddress, notAllowedError);
		require(lpAddress != _swapRouterAddress, notAllowedError);
		_isLP[lpAddress] = isLiqPool;
	}
	function isLP(address ca) external view returns (bool) { return _isLP[ca]; }
}

Read Contract

addressList 0xc1eb6dfd → address, address, address, address, address, address, address
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
isExcluded 0xcba0e996 → bool
isLP 0x7df0f767 → bool
limits 0x860aefcf → uint256, uint256
name 0x06fdde03 → string
stats 0xd80528ae → uint256, uint256, uint256
symbol 0x95d89b41 → string
tax 0x99c8d556 → uint8, uint8, uint8
totalSupply 0x18160ddd → uint256

Write Contract 14 functions

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

addInitialLiquidity 0x0210a83d
No parameters
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burn 0x42966c68
uint256 amount
changeLimits 0x5c07c993
uint16 maxTxPermille
uint16 maxWalletPermille
changeTaxWallet 0xcb711595
address walletMarketing
manualSwap 0x51bc3c85
No parameters
recoverTokens 0x16114acd
address tokenCa
renounceOwnership 0x715018a6
No parameters
setAdditionalLP 0x0a6a52b9
address lpAddress
bool isLiqPool
setExcluded 0x2836be24
address wallet
bool exclude
setThreshold 0x960bfe04
uint256 amountUSD
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address