Address Contract Verified
Address
0xD14FC93271Bb99a46d27986e42cDA5D0D0aB2D88
Balance
0 ETH
Nonce
17
Code Size
14941 bytes
Creator
0x6E0FDa23...780b at tx 0x4ca5fb15...81e5d2
Indexed Transactions
0
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