Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xD14FC93271Bb99a46d27986e42cDA5D0D0aB2D88
Balance 0 ETH
Nonce 17
Code Size 14941 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14941 bytes
0x60806040526004361061006e575f3560e01c80636ff97f1d1161004c5780636ff97f1d146100de5780637e1c0c09146100ff578063bfa0b1331461011c578063c36d468614610130575f5ffd5b806341f1afc714610072578063581f80f5146100ae5780636f2ddd93146100c1575b5f5ffd5b34801561007d575f5ffd5b5061009161008c3660046104ae565b61014d565b6040516001600160a01b0390911681526020015b60405180910390f35b6100916100bc36600461059a565b61017c565b3480156100cc575f5ffd5b506002546001600160a01b0316610091565b3480156100e9575f5ffd5b506100f26103de565b6040516100a59190610667565b34801561010a575f5ffd5b505f545b6040519081526020016100a5565b348015610127575f5ffd5b5061010e61043f565b34801561013b575f5ffd5b506003546001600160a01b0316610091565b5f5f5f018281548110610162576101626106b2565b5f918252602090912001546001600160a01b031692915050565b5f5f5f61018761043f565b90508d156101f657600254604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b815260609190911b6bffffffffffffffffffffffff1916601482018190526e5af43d82803e903d91602b57fd5bf360881b60288301525f918360378285f5945061022492505050565b80604051610203906104a1565b8190604051809103905ff5905080158015610220573d5f5f3e3d5ffd5b5091505b505f8311801561023c57506001600160a01b03841615155b156102b9576040516323b872dd60e01b81523360048201526001600160a01b038281166024830152604482018590528516906323b872dd906064016020604051808303815f875af1158015610293573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b791906106c6565b505b806001600160a01b03166388705efb34338f8f8f8f8f8f8f8f8f8f6040518d63ffffffff1660e01b81526004016102fa9b9a99989796959493929190610716565b5f604051808303818588803b158015610311575f5ffd5b505af1158015610323573d5f5f3e3d5ffd5b50505050505f5f0181908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b0316336001600160a01b03167fe1cf7aada88886bb170a3d9ac4236616de96205174f63e5506fdd6e24582d8368f8f8f8f8f8f8f8f8f34426040516103c69b9a99989796959493929190610799565b60405180910390a39c9b505050505050505050505050565b60605f5f0180548060200260200160405190810160405280929190818152602001828054801561043557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610417575b5050505050905090565b335f8181526001602052604081208054919291908361045d8361080b565b9091555060405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160405160208183030381529060405280519060200120905090565b6131f88061083083390190565b5f602082840312156104be575f5ffd5b5035919050565b80151581146104d2575f5ffd5b50565b80356104e0816104c5565b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610508575f5ffd5b813567ffffffffffffffff811115610522576105226104e5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610551576105516104e5565b604052818152838201602001851015610568575f5ffd5b816020850160208301375f918101602001919091529392505050565b80356001600160a01b03811681146104e0575f5ffd5b5f5f5f5f5f5f5f5f5f5f5f6101608c8e0312156105b5575f5ffd5b6105be8c6104d5565b9a5060208c013567ffffffffffffffff8111156105d9575f5ffd5b6105e58e828f016104f9565b9a505060408c013567ffffffffffffffff811115610601575f5ffd5b61060d8e828f016104f9565b99505060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506101008c013592506106486101208d01610584565b91505f6101408d01359050809150509295989b509295989b9093969950565b602080825282518282018190525f918401906040840190835b818110156106a75783516001600160a01b0316835260209384019390920191600101610680565b509095945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156106d6575f5ffd5b81516106e1816104c5565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038c168152610160602082018190525f9061073a9083018d6106e8565b828103604084015261074c818d6106e8565b606084019b909b525050608081019790975260a087019590955260c086019390935260e08501919091526101008401526001600160a01b0316610120830152610140909101529392505050565b8b1515815261016060208201525f6107b561016083018d6106e8565b82810360408401526107c7818d6106e8565b606084019b909b525050608081019790975260a087019590955260c086019390935260e0850191909152610100840152610120830152610140909101529392505050565b5f6001820161082857634e487b7160e01b5f52601160045260245ffd5b506001019056fe6080604052348015600e575f5ffd5b506131dc8061001c5f395ff3fe608060405260043610610131575f3560e01c806367e828bf116100a8578063a9059cbb1161006d578063a9059cbb1461034a578063bdaaa64014610369578063dd62ed3e1461037d578063e88958dc146103c5578063f83d08ba146103d9578063f9432517146103ed575f5ffd5b806367e828bf1461029857806370a08231146102cd57806385f2aef21461030157806388705efb1461032357806395d89b4114610336575f5ffd5b806318160ddd116100f957806318160ddd146101f657806323b872dd1461020a578063313ce567146102295780633b5f19351461024f5780634000aea01461026357806353f8b30314610282575f5ffd5b806302d05d3f1461013557806306fdde031461016b57806309218e911461018c578063095ea7b3146101aa57806316f0115b146101d9575b5f5ffd5b348015610140575f5ffd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610176575f5ffd5b5061017f61041e565b6040516101629190611f83565b348015610197575f5ffd5b50600d545b604051908152602001610162565b3480156101b5575f5ffd5b506101c96101c4366004611fdf565b6104a9565b6040519015158152602001610162565b3480156101e4575f5ffd5b506003546001600160a01b031661014e565b348015610201575f5ffd5b5060055461019c565b348015610215575f5ffd5b506101c9610224366004612009565b6104be565b348015610234575f5ffd5b5061023d601281565b60405160ff9091168152602001610162565b34801561025a575f5ffd5b5061017f61053b565b34801561026e575f5ffd5b506101c961027d366004612047565b610573565b34801561028d575f5ffd5b50610296610614565b005b3480156102a3575f5ffd5b5061017f6040518060400160405280600a8152602001696562756c6c2e6d656d6560b01b81525081565b3480156102d8575f5ffd5b5061019c6102e73660046120cc565b6001600160a01b03165f908152600c602052604090205490565b34801561030c575f5ffd5b5060025461010090046001600160a01b031661014e565b610296610331366004612186565b6107d6565b348015610341575f5ffd5b5061017f610a6b565b348015610355575f5ffd5b506101c9610364366004611fdf565b610a78565b348015610374575f5ffd5b5061017f610a84565b348015610388575f5ffd5b5061019c610397366004612253565b6001600160a01b039182165f908152600c602090815260408083209390941682526001909201909152205490565b3480156103d0575f5ffd5b5061017f610a98565b3480156103e4575f5ffd5b50610296610ac5565b3480156103f8575f5ffd5b50610401610aef565b604080519384526020840192909252151590820152606001610162565b5f805461042a9061228a565b80601f01602080910402602001604051908101604052809291908181526020018280546104569061228a565b80156104a15780601f10610478576101008083540402835291602001916104a1565b820191905f5260205f20905b81548152906001019060200180831161048457829003601f168201915b505050505081565b5f6104b5338484610b0b565b90505b92915050565b6001600160a01b0383165f908152600c60209081526040808320338452600101909152812054828110156104f0575f5ffd5b5f198114610525576001600160a01b0385165f908152600c602090815260408083203384526001019091529020805484900390555b610530858585610b76565b9150505b9392505050565b606061054f60026004015460126005610c41565b60405160200161055f91906122d3565b604051602081830303815290604052905090565b5f61057f338686610b76565b50843b63ffffffff81161561060857604051636be32e7360e01b81526001600160a01b03871690636be32e73906105c09033908990899089906004016122f2565b6020604051808303815f875af11580156105dc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190612339565b610608575f5ffd5b50600195945050505050565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610665573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106899190612358565b9050806001600160a01b031663fc6f786560405180608001604052806002600b015481526020016106c86002546001600160a01b036101009091041690565b6001600160a01b0390811682526001600160801b0360208084018290526040938401829052835160e087901b6001600160e01b031916815285516004820152908501519092166024830152918301518216604482015260609092015116606482015260840160408051808303815f875af1158015610748573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076c9190612373565b505060025f0160019054906101000a90046001600160a01b03166001600160a01b031663476343ee6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156107bd575f5ffd5b505af11580156107cf573d5f5f3e3d5ffd5b5050505050565b60025460ff16156107e5575f5ffd5b600554156107f1575f5ffd5b5f8a51118015610803575060208a5111155b61080b575f5ffd5b5f895111801561081d57506020895111155b610825575f5ffd5b662386f26fc10000881015801561084a57506d314dc6448d9338c15b0a000000008811155b610852575f5ffd5b5f8711801561086057508686115b610868575f5ffd5b6015851115610875575f5ffd5b62015180831115610884575f5ffd5b60405161089090611f76565b604051809103905ff0801580156108a9573d5f5f3e3d5ffd5b5060028054610100600160a81b0319166101006001600160a01b039384168102919091179182905560405163189acdbd60e31b81528e8416600482015291049091169063c4d66de8906024015f604051808303815f87803b15801561090c575f5ffd5b505af115801561091e573d5f5f3e3d5ffd5b5050600254604051635641be4560e11b81526001600160a01b038681166004830152610100909204909116925063ac837c8a91506024015f604051808303815f87803b15801561096c575f5ffd5b505af115801561097e573d5f5f3e3d5ffd5b5050600480546001600160a01b0319166001600160a01b038f16179055505f90506109a98b826123de565b5060016109b68a826123de565b506005889055305f818152600c602090815260408083208c9055518b81527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600687905560078690556009859055601380546001600160a01b0319166001600160a01b038416179055736e0fda23ca32af8c1ca23cf328903f6054f2780b610a4b8888888486610f4e565b600a859055610a5a84426124ad565b600b55505050505050505050505050565b6001805461042a9061228a565b5f6104b5338484610b76565b606061054f60026005015460126005610c41565b600954606090610ab590610aad9060646124c0565b600380610c41565b60405160200161055f91906124d7565b60025460ff1615610ad4575f5ffd5b60055415610ae0575f5ffd5b6002805460ff19166001179055565b600a54600b545f8215801590610b0457508142105b9050909192565b6001600160a01b038381165f818152600c602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b5f5f8211610b82575f5ffd5b5f5f610b8c610aef565b92505091508015610ba35781841115610ba3575f5ffd5b83610bc2876001600160a01b03165f908152600c602052604090205490565b1015610bcc575f5ffd5b6001600160a01b038087165f818152600c6020526040808220805489900390559288168082529083902080548801905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c2d9088815260200190565b60405180910390a350600195945050505050565b60605f828411610c515783610c53565b825b90505f818511610c63575f610c6d565b610c6d82866124f3565b610c7890600a6125e9565b610c829087612608565b9050805f03610cae57604051806040016040528060018152602001600360fc1b81525092505050610534565b6001815b6009811115610cda57610cc6600a82612608565b905081610cd28161261b565b925050610cb2565b838211610cf157610cec8460016124ad565b610cf3565b815b90505f610d018560016124ad565b8211610d0d575f610d46565b846001610d1a82856124f3565b610d2491906124f3565b11610d44576001610d3586846124f3565b610d3f91906124f3565b610d46565b845b90505f5b610d5482846124f3565b811015610f41575f610d6685856124f3565b8210610da857600a6001610d7a84876124f3565b610d8491906124f3565b610d8f90600a6125e9565b610d999088612608565b610da39190612633565b610daa565b5f5b6040805160018082528183019092529192505f9190602082018180368337019050509050610dd9826030612646565b60f81b815f81518110610dee57610dee61265f565b60200101906001600160f81b03191690815f1a9053508881604051602001610e17929190612673565b60408051601f1981840301815291905298506001610e3589876124f3565b610e3f91906124f3565b831015610ea0576003610e5289876124f3565b610e5c9190612633565b6003610e698560016124ad565b610e739190612633565b03610e9b5788604051602001610e89919061268f565b60405160208183030381529060405298505b610f37565b600183610ead86886124f3565b610eb791906124f3565b610ec191906124f3565b610ecc90600a6125e9565b610ed785600a6125e9565b610ee19089612608565b610eeb9190612633565b5f03610ef8575050610f41565b6001610f0489876124f3565b610f0e91906124f3565b8303610f375788604051602001610f2591906126ab565b60405160208183030381529060405298505b5050600101610d4a565b5050505050509392505050565b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc79190612358565b6013549091506001600160a01b03168015610fe0578091505b6001600160a01b03808416908316105f61100382610ffd60055490565b8c611877565b509050836001600160a01b0316856001600160a01b0316036110645760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103830b4b9103bb4ba341039b2b63360591b60448201526064015b60405180910390fd5b7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110d89190612358565b60405163a167129560e01b81526001600160a01b03878116600483015286811660248301526127106044830152919091169063a1671295906064016020604051808303815f875af115801561112f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111539190612358565b600380546001600160a01b0319166001600160a01b0392909216918217905560405163f637731d60e01b81526001600160a01b038381166004830152919091169063f637731d906024015f604051808303815f87803b1580156111b4575f5ffd5b505af11580156111c6573d5f5f3e3d5ffd5b50506003546001600160a01b0316915061121b90505760405162461bcd60e51b8152602060048201526014602482015273141bdbdb0818dc99585d1a5bdb8819985a5b195960621b604482015260640161105b565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112909190612358565b90506112a586826112a060055490565b610b0b565b505f6112ba846112b460055490565b8e611877565b9150505f6112cb856112b460055490565b9150508a1561143457826001600160a01b03166388316456604051806101600160405280886112fa578b6112fc565b8a5b6001600160a01b031681526020018815611316578b611318565b8a5b6001600160a01b03168152612710602082015260400188611339578561133b565b845b60020b8152602001881561134f5785611351565b845b60020b81526020018861137f576103e88f61136b60055490565b0281611379576113796125f4565b04611381565b5f5b815260200188156113ad576103e88f61139960055490565b02816113a7576113a76125f4565b046113af565b5f5b81526020015f81526020015f81526020018d6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016113ef91906126c7565b6080604051808303815f875af115801561140b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142f919061278b565b505050505b826001600160a01b031663883164566040518061016001604052808861145a578b61145c565b8a5b6001600160a01b031681526020018815611476578b611478565b8a5b6001600160a01b03168152612710602082015260400188611499578561149b565b845b60020b815260200188156114af57856114b1565b845b60020b8152602001886114e3576103e88f6103e8036114cf60055490565b02816114dd576114dd6125f4565b046114e5565b5f5b81526020018815611515576103e88f6103e80361150160055490565b028161150f5761150f6125f4565b04611517565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b815260040161155791906126c7565b6080604051808303815f875af1158015611573573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611597919061278b565b505050600d556001600160a01b03881631156116b3577368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b03166304e45aaf896001600160a01b0316316040518060e001604052808b6001600160a01b031681526020018c6001600160a01b0316815260200161271062ffffff1681526020016116236004546001600160a01b031690565b6001600160a01b031681526020018c6001600160a01b03163181526020015f81526020015f6001600160a01b03168152506040518363ffffffff1660e01b815260040161167091906127d2565b60206040518083038185885af115801561168c573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116b19190612830565b505b88156118685760405163095ea7b360e01b81527368b3465833fb72a70ecdf485e0e4c7bd8665fc456004820152602481018a90526001600160a01b0388169063095ea7b3906044016020604051808303815f875af1158015611717573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173b9190612339565b6117785760405162461bcd60e51b815260206004820152600e60248201526d185c1c1c9bdd994819985a5b195960921b604482015260640161105b565b7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b03166304e45aaf6040518060e001604052808a6001600160a01b031681526020018b6001600160a01b0316815260200161271062ffffff1681526020016117e36004546001600160a01b031690565b6001600160a01b031681526020018c81526020015f81526020015f6001600160a01b03168152506040518263ffffffff1660e01b815260040161182691906127d2565b6020604051808303815f875af1158015611842573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118669190612830565b505b50505050505050505050505050565b5f5f5f6118b586611888578461188a565b855b87156118965785611898565b865b6118a690600160c01b612608565b6118b091906124c0565b6118ed565b90506118c081611930565b91506118cd60c883612847565b6118d79083612868565b91506118e282611c48565b925050935093915050565b80600260018201045b8181101561192a57809150600281828581611913576119136125f4565b040181611922576119226125f4565b0490506118f6565b50919050565b5f6401000276a36001600160a01b0383161080159061196b575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61199b5760405162461bcd60e51b81526020600482015260016024820152602960f91b604482015260640161105b565b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c97908811961790941790921717909117171760808110611a2f57607f810383901c9150611a39565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14611c3957886001600160a01b0316611c1e82611c48565b6001600160a01b03161115611c335781611c3b565b80611c3b565b815b9998505050505050505050565b5f5f5f8360020b12611c5d578260020b611c64565b8260020b5f035b9050620d89e8811115611c9d5760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640161105b565b5f816001165f03611cb257600160801b611cc4565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611cf8576ffff97272373d413259a46990580e213a0260801c5b6004821615611d17576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611d36576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611d55576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611d74576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611d93576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611db2576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611dd2576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611df2576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e12576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611e32576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611e52576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611e72576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611e92576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611eb2576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611ed3576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611ef3576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f12576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611f2f576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611f4e57805f1981611f4a57611f4a6125f4565b0490505b640100000000810615611f62576001611f64565b5f5b60ff16602082901c0192505050919050565b6109198061288e83390190565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611fcc575f5ffd5b50565b8035611fda81611fb8565b919050565b5f5f60408385031215611ff0575f5ffd5b8235611ffb81611fb8565b946020939093013593505050565b5f5f5f6060848603121561201b575f5ffd5b833561202681611fb8565b9250602084013561203681611fb8565b929592945050506040919091013590565b5f5f5f5f6060858703121561205a575f5ffd5b843561206581611fb8565b935060208501359250604085013567ffffffffffffffff811115612087575f5ffd5b8501601f81018713612097575f5ffd5b803567ffffffffffffffff8111156120ad575f5ffd5b8760208284010111156120be575f5ffd5b949793965060200194505050565b5f602082840312156120dc575f5ffd5b813561053481611fb8565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261210a575f5ffd5b813567ffffffffffffffff811115612124576121246120e7565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715612153576121536120e7565b60405281815283820160200185101561216a575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f5f5f5f5f5f5f6101608c8e0312156121a1575f5ffd5b6121aa8c611fcf565b9a5060208c013567ffffffffffffffff8111156121c5575f5ffd5b6121d18e828f016120fb565b9a505060408c013567ffffffffffffffff8111156121ed575f5ffd5b6121f98e828f016120fb565b99505060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506101008c013592506122346101208d01611fcf565b91505f6101408d01359050809150509295989b509295989b9093969950565b5f5f60408385031215612264575f5ffd5b823561226f81611fb8565b9150602083013561227f81611fb8565b809150509250929050565b600181811c9082168061229e57607f821691505b60208210810361192a57634e487b7160e01b5f52602260045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f6122de82846122bc565b630408aa8960e31b81526004019392505050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215612349575f5ffd5b81518015158114610534575f5ffd5b5f60208284031215612368575f5ffd5b815161053481611fb8565b5f5f60408385031215612384575f5ffd5b505080516020909101519092909150565b601f8211156123d957805f5260205f20601f840160051c810160208510156123ba5750805b601f840160051c820191505b818110156107cf575f81556001016123c6565b505050565b815167ffffffffffffffff8111156123f8576123f86120e7565b61240c81612406845461228a565b84612395565b6020601f82116001811461243e575f83156124275750848201515b5f19600385901b1c1916600184901b1784556107cf565b5f84815260208120601f198516915b8281101561246d578785015182556020948501946001909201910161244d565b508482101561248a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104b8576104b8612499565b80820281158282048414176104b8576104b8612499565b5f6124e282846122bc565b602560f81b81526001019392505050565b818103818111156104b8576104b8612499565b6001815b60018411156125415780850481111561252557612525612499565b600184161561253357908102905b60019390931c92800261250a565b935093915050565b5f82612557575060016104b8565b8161256357505f6104b8565b816001811461257957600281146125835761259f565b60019150506104b8565b60ff84111561259457612594612499565b50506001821b6104b8565b5060208310610133831016604e8410600b84101617156125c2575081810a6104b8565b6125ce5f198484612506565b805f19048211156125e1576125e1612499565b029392505050565b5f6104b58383612549565b634e487b7160e01b5f52601260045260245ffd5b5f82612616576126166125f4565b500490565b5f6001820161262c5761262c612499565b5060010190565b5f82612641576126416125f4565b500690565b60ff81811683821601908111156104b8576104b8612499565b634e487b7160e01b5f52603260045260245ffd5b5f61268761268183866122bc565b846122bc565b949350505050565b5f61269a82846122bc565b600b60fa1b81526001019392505050565b5f6126b682846122bc565b601760f91b81526001019392505050565b81516001600160a01b03168152610160810160208301516126f360208401826001600160a01b03169052565b50604083015161270a604084018262ffffff169052565b50606083015161271f606084018260020b9052565b506080830151612734608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015261012083015161277b6101208401826001600160a01b03169052565b5061014092830151919092015290565b5f5f5f5f6080858703121561279e575f5ffd5b845160208601519094506001600160801b03811681146127bc575f5ffd5b6040860151606090960151949790965092505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c092830151169181019190915260e00190565b5f60208284031215612840575f5ffd5b5051919050565b5f8260020b80612859576128596125f4565b808360020b0791505092915050565b600282810b9082900b03627fffff198112627fffff821317156104b8576104b861249956fe6080604052348015600e575f5ffd5b506108fd8061001c5f395ff3fe608060405260043610610092575f3560e01c8063ac837c8a11610057578063ac837c8a1461014c578063c4d66de81461016b578063e086e5ec1461018a578063ee16c1601461019e578063fc0c546a146101d5575f5ffd5b80633a98ef391461009d578063476343ee146100c55780634c02f62e146100db57806357a858fc146100ef578063894760691461012d575f5ffd5b3661009957005b5f5ffd5b3480156100a8575f5ffd5b506100b260015481565b6040519081526020015b60405180910390f35b3480156100d0575f5ffd5b506100d96101f4565b005b3480156100e6575f5ffd5b506100d9610239565b3480156100fa575f5ffd5b5061010e6101093660046107b2565b6102b0565b604080516001600160a01b0390931683526020830191909152016100bc565b348015610138575f5ffd5b506100d96101473660046107dd565b6102e5565b348015610157575f5ffd5b506100d96101663660046107dd565b61059e565b348015610176575f5ffd5b506100d96101853660046107dd565b61061e565b348015610195575f5ffd5b506100d9610669565b3480156101a9575f5ffd5b506003546101bd906001600160a01b031681565b6040516001600160a01b0390911681526020016100bc565b3480156101e0575f5ffd5b506002546101bd906001600160a01b031681565b6101fc610239565b600254610211906001600160a01b03166102e5565b6003546001600160a01b03161561023757600354610237906001600160a01b03166102e5565b565b6102377368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561028c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014791906107ff565b5f81815481106102be575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b03909116915082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610336573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035a91906107ff565b9050806001600160a01b0316826001600160a01b03160361043a576040516370a0823160e01b81523060048201526001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa1580156103bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e3919061081a565b6040518263ffffffff1660e01b815260040161040191815260200190565b5f604051808303815f87803b158015610418575f5ffd5b505af115801561042a573d5f5f3e3d5ffd5b50505050610436610669565b5050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561047e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a2919061081a565b90508015610599575f5b5f54811015610597575f5f82815481106104c8576104c8610831565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03908116808452600192830154948401859052915492945088169263a9059cbb92906105179088610859565b6105219190610876565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610569573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058d9190610895565b50506001016104ac565b505b505050565b6002546001600160a01b031633146105fc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c7920636f6e74726163742063616e2073657420746f6b656e2070616972604482015260640160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001541561062a575f5ffd5b600280546001600160a01b03191633179055610647816008610704565b610666736e0fda23ca32af8c1ca23cf328903f6054f2780b6002610704565b50565b478015610666575f5b5f54811015610436575f5f828154811061068e5761068e610831565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03168083526001918201549383018490529054919350916108fc91906106d79087610859565b6106e19190610876565b6040518115909202915f818181858888f150506001909401935061067292505050565b604080518082019091526001600160a01b038381168252602082018381525f80546001808201835582805294517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563600290920291820180546001600160a01b031916919095161790935590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909201919091558154839291906107a99084906108b4565b90915550505050565b5f602082840312156107c2575f5ffd5b5035919050565b6001600160a01b0381168114610666575f5ffd5b5f602082840312156107ed575f5ffd5b81356107f8816107c9565b9392505050565b5f6020828403121561080f575f5ffd5b81516107f8816107c9565b5f6020828403121561082a575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761087057610870610845565b92915050565b5f8261089057634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156108a5575f5ffd5b815180151581146107f8575f5ffd5b808201808211156108705761087061084556fea2646970667358221220bd58d4180fdcef733d46c8fc254a9d4f9ed9daf2de54671f07b07ee11a760d2364736f6c634300081e0033a26469706673582212209b48e9cd3a8fa1416113045f8a6bfbf412d4f83ef55165759728bfd49dd0a56a64736f6c634300081e0033a2646970667358221220c1b3ad4a5fbc0020853ee1680071d1ff382cdd4aa813d107e6d31237fd3cfd6764736f6c634300081e0033

Verified Source Code Full Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: Yes (200 runs)
NFT.sol 81 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "./ERC20.sol";

contract EBULL {

	struct Info {
		Token[] tokens;
		mapping(address => uint256) nonce;
		address template;
		address team;
	}
	Info private info;


	event NewToken(address indexed creator, address indexed token, bool proxy, string name, string symbol, uint256 totalSupply, uint256 initialMarketCap, uint256 upperMarketCap, uint256 creatorFee, uint256 transferLimit, uint256 transferLimitTime, uint256 value, uint256 launchTime);


	constructor() {
		Token _template = new Token();
		_template.lock();
		info.template = address(_template);
		Team _team = new Team();
		_team.initialize(msg.sender);
		info.team = address(_team);
	}
	
	function salt() public returns (bytes32) {
		return keccak256(abi.encodePacked(msg.sender, info.nonce[msg.sender]++));
	}

	function EbullLaunch(bool _deployProxy, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee, uint256 _transferLimit, uint256 _transferLimitTime, address _tokenPair, uint256 _initBuyAmount) external payable returns (address) {
		Token _token;
		{
			bytes32 _salt = salt();
			if (_deployProxy) {
				address _proxy;
				bytes20 _template = bytes20(info.template);
				assembly {
					let _clone := mload(0x40)
					mstore(_clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
					mstore(add(_clone, 0x14), _template)
					mstore(add(_clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
					_proxy := create2(0, _clone, 0x37, _salt)
				}
				_token = Token(_proxy);
			} else {
				_token = new Token{salt:_salt}();
			}
		}
		if(_initBuyAmount > 0 && _tokenPair != address(0)){
					ERC20(_tokenPair).transferFrom(msg.sender, address(_token), _initBuyAmount);
		}
		_token.initialize{value:msg.value}(msg.sender, _name, _symbol, _totalSupply, _initialMarketCap, _upperMarketCap, _creatorFee, _transferLimit, _transferLimitTime, _tokenPair, _initBuyAmount);
		info.tokens.push(_token);
		emit NewToken(msg.sender, address(_token), _deployProxy, _name, _symbol, _totalSupply, _initialMarketCap, _upperMarketCap, _creatorFee, _transferLimit, _transferLimitTime, msg.value, block.timestamp);
		return address(_token);
	}


	function template() public view returns (address) {
		return info.template;
	}

	function teamTemplate() public view returns (address) {
		return info.team;
	}
	
	function totalTokens() public view returns (uint256) {
		return info.tokens.length;
	}

	function tokenAtIndex(uint256 _index) public view returns (Token) {
		return info.tokens[_index];
	}

	function allTokens() public view returns (Token[] memory) {
		return info.tokens;
	}
}
ERC20.sol 670 lines
//💎 This token was launched on the ebull.meme platform. 
//💎 ebull.meme is a token launch platform on Ethereum.  
//💎 Creators earn 80% fee.								
//💎 No tax contracts, fair launch. 					


pragma solidity ^0.8.19;
// SPDX-License-Identifier: MIT
interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface Router {
	struct ExactInputSingleParams {
		address tokenIn;
		address tokenOut;
		uint24 fee;
		address recipient;
		uint256 amountIn;
		uint256 amountOutMinimum;
		uint160 sqrtPriceLimitX96;
	}
	function factory() external view returns (address);
	function positionManager() external view returns (address);
	function WETH9() external view returns (address);
	function exactInputSingle(ExactInputSingleParams calldata) external payable returns (uint256);
}

interface Factory {
	function createPool(address _tokenA, address _tokenB, uint24 _fee) external returns (address);
}

interface Pool {
	function initialize(uint160 _sqrtPriceX96) external;
}

interface PositionManager {
	struct MintParams {
		address token0;
		address token1;
		uint24 fee;
		int24 tickLower;
		int24 tickUpper;
		uint256 amount0Desired;
		uint256 amount1Desired;
		uint256 amount0Min;
		uint256 amount1Min;
		address recipient;
		uint256 deadline;
	}
	struct CollectParams {
		uint256 tokenId;
		address recipient;
		uint128 amount0Max;
		uint128 amount1Max;
	}
	function mint(MintParams calldata) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
	function collect(CollectParams calldata) external payable returns (uint256 amount0, uint256 amount1);
}

interface ERC20 {
	function balanceOf(address) external view returns (uint256);
	function transfer(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
	function approve(address, uint256) external returns (bool);
}

interface WETH is ERC20 {
	function withdraw(uint256) external;
}

//////////////////////////////////////////////////////////////
///// This token was launched on the ebull.meme platform  ////
//////////////////////////////////////////////////////////////

contract Team {

	Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);

	struct Share {
		address payable user;
		uint256 shares;
	}
	Share[] public shares;
	uint256 public totalShares;
	ERC20 public token;
    address public tokenPair;


	function initialize(address _creator) external {
		require(totalShares == 0);
		token = ERC20(msg.sender);
		_addShare(_creator, 8);
		_addShare(0x6E0FDa23cA32Af8c1cA23CF328903f6054F2780b, 2);
	}

	receive() external payable {}

	function withdrawETH() public {
		uint256 _balance = address(this).balance;
		if (_balance > 0) {
			for (uint256 i = 0; i < shares.length; i++) {
				Share memory _share = shares[i];
				!_share.user.send(_balance * _share.shares / totalShares);
			}
		}
	}

	function withdrawToken(ERC20 _token) public {
		WETH _weth = WETH(ROUTER.WETH9());
		if (address(_token) == address(_weth)) {
			_weth.withdraw(_weth.balanceOf(address(this)));
			withdrawETH();
		} else {
			uint256 _balance = _token.balanceOf(address(this));
			if (_balance > 0) {
				for (uint256 i = 0; i < shares.length; i++) {
					Share memory _share = shares[i];
					_token.transfer(_share.user, _balance * _share.shares / totalShares);
				}
			}
		}
	}

	function withdrawWETH() public {
		withdrawToken(ERC20(ROUTER.WETH9()));
	}

	function withdrawFees() external {
		withdrawWETH();
		withdrawToken(token);
        if(tokenPair!= address(0)) {
            withdrawToken(ERC20(tokenPair));
        }
	}


	function _addShare(address _user, uint256 _shares) internal {
		shares.push(Share(payable(_user), _shares));
		totalShares += _shares;
	}

    function changeTokenPair(address _tokenPair) external {
        require(msg.sender == address(token), 'Only contract can set token pair');
        tokenPair = _tokenPair;
    }
}


contract Token {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint128 constant private UINT128_MAX = type(uint128).max;
	uint256 constant private MAX_NAME_LENGTH = 32;
	uint256 constant private MIN_SUPPLY = 1e16; // 0.01 tokens
	uint256 constant private MAX_SUPPLY = 1e33; // 1 quadrillion tokens
	uint256 constant private PERCENT_PRECISION = 1000; // 1 = 0.1%
	uint256 constant private MAX_TIME_LIMIT = 24 hours;
	Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);

	int24 constant internal MIN_TICK = -887272;
	int24 constant internal MAX_TICK = -MIN_TICK;
	uint160 constant internal MIN_SQRT_RATIO = 4295128739;
	uint160 constant internal MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;

	string public name;
	string public symbol;
	uint8 constant public decimals = 18;

	string constant public source = "ebull.meme";
                                                                                  

	struct User {
		uint256 balance;
		mapping(address => uint256) allowance;
	}

	struct Info {
		bool locked;
		Team team;
		address pool;
		address creator;
		uint256 totalSupply;
		uint256 initialMarketCap;
		uint256 upperMarketCap;
		uint256 concentratedPercent;
		uint256 creatorFee;
		uint256 transferLimit;
		uint256 transferLimitEnd;
		mapping(address => User) users;
		uint256 positionId;
		string website;
		string twitter;
		string telegram;
		string discord;
		string additionalInfo;
        address tokenPair;
	}
	Info private info;


	event Transfer(address indexed from, address indexed to, uint256 tokens);
	event Approval(address indexed owner, address indexed spender, uint256 tokens);


	modifier _onlyCreator() {
		require(msg.sender == creator());
		_;
	}

	
	function lock() external {
		require(!info.locked);
		require(totalSupply() == 0);
		info.locked = true;
	}
	
	function initialize(address _creator, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee, uint256 _transferLimit, uint256 _transferLimitTime, address _tokenPair, uint256 _initBuyAmount) external payable {
		require(!info.locked);
		require(totalSupply() == 0);
		require(bytes(_name).length > 0 && bytes(_name).length <= MAX_NAME_LENGTH);
		require(bytes(_symbol).length > 0 && bytes(_symbol).length <= MAX_NAME_LENGTH);
		require(_totalSupply >= MIN_SUPPLY && _totalSupply <= MAX_SUPPLY);
		require(_initialMarketCap > 0 && _upperMarketCap > _initialMarketCap);
		require(_creatorFee <= 21);
		require(_transferLimitTime <= MAX_TIME_LIMIT);
		info.team = new Team();
		info.team.initialize(_creator);
        info.team.changeTokenPair(_tokenPair);
		info.creator = _creator;
		name = _name;
		symbol = _symbol;
		info.totalSupply = _totalSupply;
		info.users[address(this)].balance = _totalSupply;
		emit Transfer(address(0x0), address(this), _totalSupply);
		info.initialMarketCap = _initialMarketCap;
		info.upperMarketCap = _upperMarketCap;
		info.creatorFee = _creatorFee;
		info.tokenPair = _tokenPair;
		address _receipient = 0x6E0FDa23cA32Af8c1cA23CF328903f6054F2780b;
		_createLP(_initialMarketCap, _upperMarketCap, _creatorFee, _receipient, _initBuyAmount);
		info.transferLimit = _transferLimit;
		info.transferLimitEnd = block.timestamp + _transferLimitTime;
	}

	function collectTradingFees() external {
		PositionManager _pm = PositionManager(ROUTER.positionManager());
		_pm.collect(PositionManager.CollectParams({
			tokenId: info.positionId,
			recipient: team(),
			amount0Max: UINT128_MAX,
			amount1Max: UINT128_MAX
		}));
		info.team.withdrawFees();
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		return _transfer(msg.sender, _to, _tokens);
	}

	function approve(address _spender, uint256 _tokens) external returns (bool) {
		return _approve(msg.sender, _spender, _tokens);
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		unchecked {
			uint256 _allowance = allowance(_from, msg.sender);
			require(_allowance >= _tokens);
			if (_allowance != UINT_MAX) {
				info.users[_from].allowance[msg.sender] -= _tokens;
			}
			return _transfer(_from, _to, _tokens);
		}
	}

	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
		_transfer(msg.sender, _to, _tokens);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Callable(_to).tokenCallback(msg.sender, _tokens, _data));
		}
		return true;
	}
	

	function creator() public view returns (address) {
		return info.creator;
	}
	
	function team() public view returns (address) {
		return address(info.team);
	}

	function pool() public view returns (address) {
		return info.pool;
	}

	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return info.users[_user].balance;
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function position() external view returns (uint256) {
		return info.positionId;
	}

	function initialMarketCap() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.initialMarketCap, 18, 5), " ETH"));
	}

	function upperMarketCap() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.upperMarketCap, 18, 5), " ETH"));
	}

	function creatorFee() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.creatorFee * 100, 3, 3), "%"));
	}

	function transferLimit() public view returns (uint256 limit, uint256 until, bool active) {
		limit = info.transferLimit;
		until = info.transferLimitEnd;
		active = limit > 0 && block.timestamp < until;
	}


	function _createLP(uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _creatorFee, address _receipient, uint256 _initBuyAmount) internal {
		unchecked {
			address _this = address(this);
			address _weth = ROUTER.WETH9();
			address _tokenPair = info.tokenPair;
			if(_tokenPair != address(0)){
				_weth = _tokenPair;
			}
			bool _weth0 = _weth < _this;

			// Handle initial buy first if specified
		

			(uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
			require(_this != _weth, "Cannot pair with self");

			info.pool = Factory(ROUTER.factory()).createPool(_this, _weth, 10000);
			Pool(pool()).initialize(_initialSqrtPrice);
			require(info.pool != address(0), "Pool creation failed");
			PositionManager _pm = PositionManager(ROUTER.positionManager());
			_approve(_this, address(_pm), totalSupply());

			( , int24 _minTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
			( , int24 _maxTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _upperMarketCap);

			if (_creatorFee > 0) {
				_pm.mint(PositionManager.MintParams({
					token0: _weth0 ? _weth : _this,
					token1: !_weth0 ? _weth : _this,
					fee: 10000,
					tickLower: _weth0 ? _maxTick : _minTick,
					tickUpper: !_weth0 ? _maxTick : _minTick,
					amount0Desired: _weth0 ? 0 : totalSupply() * _creatorFee / PERCENT_PRECISION,
					amount1Desired: !_weth0 ? 0 : totalSupply() * _creatorFee / PERCENT_PRECISION,
					amount0Min: 0,
					amount1Min: 0,
					recipient: _receipient,
					deadline: block.timestamp
				}));
			}

			(info.positionId, , , ) = _pm.mint(PositionManager.MintParams({
				token0: _weth0 ? _weth : _this,
				token1: !_weth0 ? _weth : _this,
				fee: 10000,
				tickLower: _weth0 ? _maxTick : _minTick,
				tickUpper: !_weth0 ? _maxTick : _minTick,
				amount0Desired: _weth0 ? 0 : totalSupply() * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
				amount1Desired: !_weth0 ? 0 : totalSupply() * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
				amount0Min: 0,
				amount1Min: 0,
				recipient: _this,
				deadline: block.timestamp
			}));

			if (_this.balance > 0) {
				ROUTER.exactInputSingle{value:_this.balance}(Router.ExactInputSingleParams({
					tokenIn: _weth,
					tokenOut: _this,
					fee: 10000,
					recipient: creator(),
					amountIn: _this.balance,
					amountOutMinimum: 0,
					sqrtPriceLimitX96: 0
				}));
			}

			// Execute swap after pool is created and positions are set up
			if(_initBuyAmount > 0){
              	require(ERC20(_weth).approve(address(ROUTER), _initBuyAmount), "approve failed");
				ROUTER.exactInputSingle(Router.ExactInputSingleParams({
					tokenIn: _weth,
					tokenOut: _this,
					fee: 10000,
					recipient: creator(),
					amountIn: _initBuyAmount,
					amountOutMinimum: 0,
					sqrtPriceLimitX96: 0
				}));
			}
		}
	}
	
	function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
		info.users[_owner].allowance[_spender] = _tokens;
		emit Approval(_owner, _spender, _tokens);
		return true;
	}
	
	function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
		unchecked {
			require(_tokens > 0);
			(uint256 _limit, , bool _active) = transferLimit();
			if (_active) {
				require(_tokens <= _limit);
			}
			require(balanceOf(_from) >= _tokens);
			info.users[_from].balance -= _tokens;
			info.users[_to].balance += _tokens;
			emit Transfer(_from, _to, _tokens);
			return true;
		}
	}


	function _getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
		unchecked {
			uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
			require(absTick <= uint256(int256(MAX_TICK)), 'T');

			uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;
			if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
			if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
			if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
			if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
			if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
			if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
			if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
			if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
			if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
			if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
			if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
			if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
			if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
			if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
			if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
			if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
			if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
			if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
			if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;

			if (tick > 0) ratio = type(uint256).max / ratio;

			sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));
		}
	}

	function _getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {
		unchecked {
			require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');
			uint256 ratio = uint256(sqrtPriceX96) << 32;

			uint256 r = ratio;
			uint256 msb = 0;

			assembly {
				let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(5, gt(r, 0xFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(4, gt(r, 0xFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(3, gt(r, 0xFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(2, gt(r, 0xF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(1, gt(r, 0x3))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := gt(r, 0x1)
				msb := or(msb, f)
			}

			if (msb >= 128) r = ratio >> (msb - 127);
			else r = ratio << (127 - msb);

			int256 log_2 = (int256(msb) - 128) << 64;

			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(63, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(62, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(61, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(60, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(59, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(58, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(57, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(56, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(55, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(54, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(53, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(52, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(51, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(50, f))
			}

			int256 log_sqrt10001 = log_2 * 255738958999603826347141;

			int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);
			int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);

			tick = tickLow == tickHi ? tickLow : _getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;
		}
	}

	function _sqrt(uint256 _n) internal pure returns (uint256 result) {
		unchecked {
			uint256 _tmp = (_n + 1) / 2;
			result = _n;
			while (_tmp < result) {
				result = _tmp;
				_tmp = (_n / _tmp + _tmp) / 2;
			}
		}
	}

	function _getPriceAndTickFromValues(bool _weth0, uint256 _tokens, uint256 _weth) internal pure returns (uint160 price, int24 tick) {
		uint160 _tmpPrice = uint160(_sqrt(2**192 / (!_weth0 ? _tokens : _weth) * (_weth0 ? _tokens : _weth)));
		tick = _getTickAtSqrtRatio(_tmpPrice);
		tick = tick - (tick % 200);
		price = _getSqrtRatioAtTick(tick);
	}

	function _uint2str(uint256 _value, uint256 _scale, uint256 _maxDecimals) internal pure returns (string memory str) {
		uint256 _d = _scale > _maxDecimals ? _maxDecimals : _scale;
		uint256 _n = _value / 10**(_scale > _d ? _scale - _d : 0);
		if (_n == 0) {
			return "0";
		}
		uint256 _digits = 1;
		uint256 _tmp = _n;
		while (_tmp > 9) {
			_tmp /= 10;
			_digits++;
		}
		_tmp = _digits > _d ? _digits : _d + 1;
		uint256 _offset = (_tmp > _d + 1 ? _tmp - _d - 1 > _d ? _d : _tmp - _d - 1 : 0);
		for (uint256 i = 0; i < _tmp - _offset; i++) {
			uint256 _dec = i < _tmp - _digits ? 0 : (_n / (10**(_tmp - i - 1))) % 10;
			bytes memory _char = new bytes(1);
			_char[0] = bytes1(uint8(_dec) + 48);
			str = string(abi.encodePacked(str, string(_char)));
			if (i < _tmp - _d - 1) {
				if ((i + 1) % 3 == (_tmp - _d) % 3) {
					str = string(abi.encodePacked(str, ","));
				}
			} else {
				if ((_n / 10**_offset) % 10**(_tmp - _offset - i - 1) == 0) {
					break;
				} else if (i == _tmp - _d - 1) {
					str = string(abi.encodePacked(str, "."));
				}
			}
		}
	}

}

Read Contract

allTokens 0x6ff97f1d → address[]
teamTemplate 0xc36d4686 → address
template 0x6f2ddd93 → address
tokenAtIndex 0x41f1afc7 → address
totalTokens 0x7e1c0c09 → uint256

Write Contract 2 functions

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

EbullLaunch 0x581f80f5
bool _deployProxy
string _name
string _symbol
uint256 _totalSupply
uint256 _initialMarketCap
uint256 _upperMarketCap
uint256 _creatorFee
uint256 _transferLimit
uint256 _transferLimitTime
address _tokenPair
uint256 _initBuyAmount
returns: address
salt 0xbfa0b133
No parameters
returns: bytes32

Recent Transactions

No transactions found for this address