Address Contract Verified
Address
0x3BeA26866FcE3596E7e994e45a0a65b74E16947E
Balance
0 ETH
Nonce
1
Code Size
13821 bytes
Creator
0x75775181...c50D at tx 0xb180c781...8224d9
Indexed Transactions
0
Contract Bytecode
13821 bytes
0x608060405260043610610387575f3560e01c80638da5cb5b116101d3578063db0dbb71116100fd578063e985e9c51161009d578063f30874ea1161006d578063f30874ea14610ac4578063f34657ec14610ad9578063f72171f114610b06578063fea414b614610b25575f80fd5b8063e985e9c514610a2c578063ebf39a4114610a73578063efe8232814610a86578063f2fde38b14610aa5575f80fd5b8063e6087db0116100d8578063e6087db0146109a9578063e690f9eb146109d4578063e6a72acf146109ed578063e8656fcc14610a18575f80fd5b8063db0dbb711461093d578063e213b5f61461096b578063e5fd11451461097e575f80fd5b8063ae4e494211610173578063c82e474b11610143578063c82e474b146108d6578063c87b56dd146108f5578063ce55c66a14610914578063d5abeb0114610928575f80fd5b8063ae4e494214610866578063b3978a8614610885578063b80f8fb4146108a4578063b88d4fde146108c3575f80fd5b806395d89b41116101ae57806395d89b4114610800578063a22cb46514610814578063a75c3ad914610833578063a8ddf8f614610847575f80fd5b80638da5cb5b146107b2578063905d7b33146107cf57806393a24841146107e3575f80fd5b806331f72d77116102b45780636352211e1161025457806370a082311161022457806370a0823114610741578063715018a6146107605780637bd4f071146107745780638034824214610793575f80fd5b80636352211e146106bb57806363691c93146106da5780636c0360eb146106f95780636e75e2e21461070d575f80fd5b8063483f0a821161028f578063483f0a821461063f5780634a5bd2fd1461065e57806355f804b31461067d578063581636dd1461069c575f80fd5b806331f72d77146105ee578063412753581461060d57806342842e0e1461062c575f80fd5b806316da3bc61161032a57806322536c03116102fa57806322536c031461053357806323b872dd1461057257806324a663c3146105855780632a55205a146105b0575f80fd5b806316da3bc6146104a257806317d791d0146104cd57806318160ddd146105005780631f46634214610514575f80fd5b8063081812fc11610365578063081812fc14610424578063095ea7b31461045b5780630ed64eff1461047057806311f7acb914610483575f80fd5b806301d2718e1461038b57806301ffc9a7146103d457806306fdde0314610403575b5f80fd5b348015610396575f80fd5b506103c16103a5366004612d81565b601a60209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b3480156103df575f80fd5b506103f36103ee366004612dc4565b610b45565b60405190151581526020016103cb565b34801561040e575f80fd5b50610417610b64565b6040516103cb9190612e2c565b34801561042f575f80fd5b5061044361043e366004612e3e565b610bf4565b6040516001600160a01b0390911681526020016103cb565b61046e610469366004612e55565b610c2d565b005b6103c161047e366004612e7f565b610c3d565b34801561048e575f80fd5b5061046e61049d366004612e7f565b610d47565b3480156104ad575f80fd5b506103c16104bc366004612e3e565b60156020525f908152604090205481565b3480156104d8575f80fd5b506103c17f000000000000000000000000000000000000000000000000000000000000012c81565b34801561050b575f80fd5b506103c1610e66565b34801561051f575f80fd5b5061046e61052e366004612e9f565b610e72565b34801561053e575f80fd5b5061055261054d366004612e7f565b610f1a565b6040805194855260208501939093529183015260608201526080016103cb565b61046e610580366004612eba565b610f7e565b348015610590575f80fd5b506103c161059f366004612e3e565b60176020525f908152604090205481565b3480156105bb575f80fd5b506105cf6105ca366004612e7f565b6110d8565b604080516001600160a01b0390931683526020830191909152016103cb565b3480156105f9575f80fd5b5061046e610608366004612e3e565b61115b565b348015610618575f80fd5b50601154610443906001600160a01b031681565b61046e61063a366004612eba565b611168565b34801561064a575f80fd5b506103c1610659366004612e3e565b611187565b348015610669575f80fd5b506103f3610678366004612e3e565b6111a6565b348015610688575f80fd5b5061046e610697366004612f92565b6111f6565b3480156106a7575f80fd5b5061046e6106b63660046130cb565b61123c565b3480156106c6575f80fd5b506104436106d5366004612e3e565b6112d4565b3480156106e5575f80fd5b50601354610443906001600160a01b031681565b348015610704575f80fd5b506104176112de565b348015610718575f80fd5b506103c1610727366004612e9f565b6001600160a01b03165f908152600c602052604090205490565b34801561074c575f80fd5b506103c161075b366004612e9f565b61136a565b34801561076b575f80fd5b5061046e6113ae565b34801561077f575f80fd5b5061046e61078e366004612e7f565b6113c1565b34801561079e575f80fd5b5061046e6107ad366004612e7f565b611418565b3480156107bd575f80fd5b50600b546001600160a01b0316610443565b3480156107da575f80fd5b5061046e611490565b3480156107ee575f80fd5b506014546001600160a01b0316610443565b34801561080b575f80fd5b506104176114be565b34801561081f575f80fd5b5061046e61082e366004613140565b6114cd565b34801561083e575f80fd5b5061046e611538565b348015610852575f80fd5b5061046e61086136600461316c565b61154d565b348015610871575f80fd5b50601254610443906001600160a01b031681565b348015610890575f80fd5b5061046e61089f366004613187565b6115e4565b3480156108af575f80fd5b506103c16108be366004612e3e565b61167e565b61046e6108d13660046131a3565b6116a9565b3480156108e1575f80fd5b5061046e6108f0366004612e7f565b6116e4565b348015610900575f80fd5b5061041761090f366004612e3e565b611752565b34801561091f575f80fd5b506103c16117ca565b348015610933575f80fd5b506103c1600d5481565b348015610948575f80fd5b506103f3610957366004612e3e565b601b6020525f908152604090205460ff1681565b6103c161097936600461321e565b61180f565b348015610989575f80fd5b506103c1610998366004612e3e565b60186020525f908152604090205481565b3480156109b4575f80fd5b506103c16109c3366004612e3e565b601c6020525f908152604090205481565b3480156109df575f80fd5b50600e546103f39060ff1681565b3480156109f8575f80fd5b506103c1610a07366004612e3e565b60166020525f908152604090205481565b348015610a23575f80fd5b506103f3611a20565b348015610a37575f80fd5b506103f3610a4636600461327e565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6103c1610a813660046132aa565b611a4d565b348015610a91575f80fd5b50601454610443906001600160a01b031681565b348015610ab0575f80fd5b5061046e610abf366004612e9f565b611c07565b348015610acf575f80fd5b506103c1600f5481565b348015610ae4575f80fd5b50610af8610af33660046132aa565b611c41565b6040516103cb9291906132e0565b348015610b11575f80fd5b50610af8610b203660046132fa565b611f15565b348015610b30575f80fd5b50335f908152600c60205260409020546103c1565b5f610b4f826122a4565b80610b5e5750610b5e826122f1565b92915050565b606060028054610b7390613341565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f90613341565b8015610bea5780601f10610bc157610100808354040283529160200191610bea565b820191905f5260205f20905b815481529060010190602001808311610bcd57829003601f168201915b5050505050905090565b5f610bfe82612325565b610c1257610c126333d1c03960e21b61236f565b505f908152600660205260409020546001600160a01b031690565b610c3982826001612377565b5050565b5f8181526015602090815260408083205433845260198352818420858552909252822054610c6b9085613387565b1115610cc657335f9081526019602090815260408083208584528252808320546015909252909120548491610c9f9161339a565b6040516303e635fb60e11b8152600481019290925260248201526044015b60405180910390fd5b335f90815260196020908152604080832085845290915281208054859290610cef908490613387565b90915550610d009050338484612418565b604080518581526020810185905291925033917f2e8ac5177a616f2aec08c3048f5021e4e9743ece034e8d83ba5caf76688bb475910160405180910390a2610b5e816127a2565b610d4f61282a565b610d5882612857565b610d6557610d658261289f565b5f805b601d54811015610de85783601d8281548110610d8657610d866133ad565b905f5260205f20015403610da557610d9e8383613387565b9150610de0565b60175f601d8381548110610dbb57610dbb6133ad565b905f5260205f20015481526020019081526020015f205482610ddd9190613387565b91505b600101610d68565b50600d54811115610e545760405163e066a8d760e01b815260206004820152602f60248201527f4e657720737570706c7920706572206d696e742067726f75702065786365656460448201526e39903a37ba30b61039bab838363c9760891b6064820152608401610cbd565b505f9182526017602052604090912055565b6001545f54035f190190565b6013546001600160a01b03163314610e9f5760405163472511eb60e11b8152336004820152602401610cbd565b6001600160a01b038116610ec65760405163547e168960e01b815260040160405180910390fd5b601480546001600160a01b0319166001600160a01b0383169081179091556040519081527f65b193217dd691927510cfa45296799f4dc5a6b0d113a7f1863661cd57b1587f9060200160405180910390a150565b5f82815260166020526040812054819081908190610f399086906133c1565b925084610f446117ca565b610f4e91906133c1565b91506064610f5d8460036133c1565b610f6791906133d8565b9050610f738284613387565b935092959194509250565b5f610f8882612901565b6001600160a01b039485169490915081168414610fae57610fae62a1148160e81b61236f565b5f8281526006602052604090208054338082146001600160a01b03881690911417610ff157610fdd8633610a46565b610ff157610ff1632ce44b5f60e11b61236f565b8015610ffb575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b8416900361108757600184015f818152600460205260408120549003611085575f548114611085575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f036110cf576110cf633a954ecd60e21b61236f565b50505050505050565b5f828152600a6020526040812080548291906001600160a01b03811690600160a01b90046001600160601b03168161112b5750506009546001600160a01b03811690600160a01b90046001600160601b03165b5f6127106111426001600160601b038416896133c1565b61114c91906133d8565b92989297509195505050505050565b61116361282a565b600f55565b61118283838360405180602001604052805f8152506116a9565b505050565b601d8181548110611196575f80fd5b5f91825260209091200154905081565b5f818152601b602052604081205460ff166111ee575f828152601c602052604090205415806111e257505f828152601c60205260409020544211155b156111ee57505f919050565b506001919050565b6111fe61282a565b601061120a828261343b565b506040515f19906001907f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c905f90a350565b61124461282a565b61124d82612857565b61125a5761125a8261289f565b5f5b83518110156112ce57818181518110611277576112776133ad565b6020026020010151601a5f8581526020019081526020015f205f8684815181106112a3576112a36133ad565b6020908102919091018101516001600160a01b031682528101919091526040015f205560010161125c565b50505050565b5f610b5e82612901565b601080546112eb90613341565b80601f016020809104026020016040519081016040528092919081815260200182805461131790613341565b80156113625780601f1061133957610100808354040283529160200191611362565b820191905f5260205f20905b81548152906001019060200180831161134557829003601f168201915b505050505081565b5f6001600160a01b038216611389576113896323d3ad8160e21b61236f565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b6113b661282a565b6113bf5f61299a565b565b6113c961282a565b5f8181526015602090815260409182902084905581518481529081018390527fd6255c9c7b77c2a54f193e4634719645ef0fbdc4816638350b099b15a4ebca7f91015b60405180910390a15050565b61142061282a565b61142981612857565b61144957604051635831017d60e01b815260048101829052602401610cbd565b5f818152601c602090815260409182902084905581518481529081018390527fb024af7f651e94348c4e66cfe71f68a3f246eff857f95f105766bc15f4ea84fc910161140c565b6012546114a5906001600160a01b03166129eb565b506011546114bb906001600160a01b03166129eb565b50565b606060038054610b7390613341565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6011546114bb906001600160a01b03166129eb565b61155561282a565b600e5481151560ff9091161515036115c35760405163e066a8d760e01b815260206004820152602a60248201527f4d696e742073746174757320697320616c726561647920746865206f6e6520796044820152691bdd48195b9d195c995960b21b6064820152608401610cbd565b8015155f036115d1575f600f555b600e805460ff1916911515919091179055565b6115ec61282a565b6115f581612857565b61161557604051635831017d60e01b815260048101829052602401610cbd565b5f818152601b60205260408120805460ff19168415159081179091559003611646575f818152601c60205260408120555b604080518315158152602081018390527fd88af4ad8d3188d34ada8f4e850b4b6b3b2610392d5c8ffffa63b28ae831da54910161140c565b5f60648261168a6117ca565b61169491906133c1565b61169f90600b6133c1565b610b5e91906133d8565b6116b4848484610f7e565b6001600160a01b0383163b156112ce576116d084848484612aa3565b6112ce576112ce6368d2bf6b60e11b61236f565b6116ec61282a565b6116f581612857565b611702576117028161289f565b5f81815260166020526040908190208390555181907fa7e52343431f792020e7cb8411a08014688ca11782fd5709fa2531b3d74ba457906117469085815260200190565b60405180910390a25050565b606061175d82612325565b61177157611771630a14c4b560e41b61236f565b5f61177a612b82565b905080515f036117985760405180602001604052805f8152506117c3565b806117a284612b91565b6040516020016117b39291906134fb565b6040516020818303038152906040525b9392505050565b5f60647f000000000000000000000000000000000000000000000000000000000000012c6117f6612bd4565b61180091906133c1565b61180a91906133d8565b905090565b5f61181861282a565b815183511461187a5760405163e066a8d760e01b815260206004820152602760248201527f4d69736d61746368206265747765656e20726563697069656e747320616e6420604482015266616d6f756e747360c81b6064820152608401610cbd565b5f805b83518110156118b557838181518110611898576118986133ad565b6020026020010151826118ab9190613387565b915060010161187d565b506118bf8161167e565b9150813410156119275760405163e066a8d760e01b815260206004820152602c60248201527f4e6f7420656e6f7567682045746865722073656e7420666f722074686520616960448201526b7264726f702063686172676560a01b6064820152608401610cbd565b6011546001600160a01b03165f908152600c602052604081208054849290611950908490613387565b909155505f90505b8451811015611a0f575f848281518110611974576119746133ad565b60200260200101519050600d548161198a610e66565b6119949190613387565b11156119e35760405163e066a8d760e01b815260206004820152601a60248201527f41697264726f702065786365656473206d617820737570706c790000000000006044820152606401610cbd565b611a068683815181106119f8576119f86133ad565b602002602001015182612c3f565b50600101611958565b50611a19826127a2565b5092915050565b600e545f9060ff16611a4757600f541580611a3d5750600f544211155b15611a4757505f90565b50600190565b604051638988eea960e01b81523360048201526001600160a01b03821660248201523060448201525f60648201819052906c447e69651d841bd8d104bed49390638988eea990608401602060405180830381865afa158015611ab1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ad59190613529565b611afd5760405163472511eb60e11b81526001600160a01b0383166004820152602401610cbd565b5f838152601560209081526040808320546001600160a01b03861684526019835281842087855290925290912054611b359086613387565b1115611b72576001600160a01b0382165f9081526019602090815260408083208684528252808320546015909252909120548591610c9f9161339a565b6001600160a01b0382165f90815260196020908152604080832086845290915281208054869290611ba4908490613387565b90915550611bb59050828585612418565b604080518681526020810186905291925033916001600160a01b038516917fce55cbb6a167cf85969795eda1f8d0a2e0152274849017210ca560bd3c963f7f910160405180910390a36117c3816127a2565b611c0f61282a565b6001600160a01b038116611c3857604051631e4fbdf760e01b81525f6004820152602401610cbd565b6114bb8161299a565b5f828152601560209081526040808320546001600160a01b03851684526019835281842086855290925282205460609190611c7c9087613387565b1115611cb5575050604080518082019091526013815272115e18d959591cd3585e14195c95d85b1b195d606a1b60208201525f90611f0d565b845f03611cec57505060408051808201909152601081526f24b73b30b634b227b832b930ba34b7b760811b60208201525f90611f0d565b611cf4611a20565b611d2457505060408051808201909152600c81526b4d696e74496e61637469766560a01b60208201525f90611f0d565b5f848152601b602052604090205460ff16611d96575f848152601c60205260409020541580611d6057505f848152601c60205260409020544211155b15611d965750506040805180820190915260118152704d696e7447726f7570496e61637469766560781b60208201525f90611f0d565b8315611e49575f848152601a602090815260408083206001600160a01b03871684529091528120549003611df057505060408051808201909152600c81526b4e6f74496e50726573616c6560a01b60208201525f90611f0d565b5f848152601a602090815260408083206001600160a01b0387168452909152902054851115611e4957505060408051808201909152601081526f457863656564734d696e7451756f746160801b60208201525f90611f0d565b5f84815260176020908152604080832054601890925290912054611e6e908790613387565b1115611ead575050604080518082019091526019815278457863656564734d61784d696e7447726f7570537570706c7960381b60208201525f90611f0d565b600d5485611eb9610e66565b611ec39190613387565b1115611ef957505060408051808201909152601081526f457863656564734d6178537570706c7960801b60208201525f90611f0d565b505060408051602081019091525f81526001905b935093915050565b604051638988eea960e01b81526001600160a01b038083166004830152831660248201523060448201525f60648201819052906060906c447e69651d841bd8d104bed49390638988eea990608401602060405180830381865afa158015611f7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fa29190613529565b611fd257505060408051808201909152600c81526b155b985d5d1a1bdc9a5e995960a21b60208201525f9061229b565b5f858152601560209081526040808320546001600160a01b0388168452601983528184208985529092529091205461200a9088613387565b1115612043575050604080518082019091526013815272115e18d959591cd3585e14195c95d85b1b195d606a1b60208201525f9061229b565b855f0361207a57505060408051808201909152601081526f24b73b30b634b227b832b930ba34b7b760811b60208201525f9061229b565b612082611a20565b6120b257505060408051808201909152600c81526b4d696e74496e61637469766560a01b60208201525f9061229b565b5f858152601b602052604090205460ff16612124575f858152601c602052604090205415806120ee57505f858152601c60205260409020544211155b156121245750506040805180820190915260118152704d696e7447726f7570496e61637469766560781b60208201525f9061229b565b84156121d7575f858152601a602090815260408083206001600160a01b0388168452909152812054900361217e57505060408051808201909152600c81526b4e6f74496e50726573616c6560a01b60208201525f9061229b565b5f858152601a602090815260408083206001600160a01b03881684529091529020548611156121d757505060408051808201909152601081526f457863656564734d696e7451756f746160801b60208201525f9061229b565b5f858152601760209081526040808320546018909252909120546121fc908890613387565b111561223b575050604080518082019091526019815278457863656564734d61784d696e7447726f7570537570706c7960381b60208201525f9061229b565b600d5486612247610e66565b6122519190613387565b111561228757505060408051808201909152601081526f457863656564734d6178537570706c7960801b60208201525f9061229b565b505060408051602081019091525f81526001905b94509492505050565b5f6301ffc9a760e01b6001600160e01b0319831614806122d457506380ac58cd60e01b6001600160e01b03198316145b80610b5e5750506001600160e01b031916635b5e139f60e01b1490565b5f6001600160e01b0319821663152a902d60e11b1480610b5e57506301ffc9a760e01b6001600160e01b0319831614610b5e565b5f8160011161236a575f5482101561236a575f5b505f82815260046020526040812054908190036123605761235983613544565b9250612339565b600160e01b161590505b919050565b805f5260045ffd5b5f612381836112d4565b90508180156123995750336001600160a01b03821614155b156123bc576123a88133610a46565b6123bc576123bc6367d9dca160e11b61236f565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b5f825f036124695760405163e066a8d760e01b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610cbd565b612471611a20565b61248e57604051630d0ca57160e21b815260040160405180910390fd5b5f828152601b602052604090205460ff166124eb575f828152601c602052604090205415806124ca57505f828152601c60205260409020544211155b156124eb57604051632bf6312360e01b815260048101839052602401610cbd565b81156125eb575f828152601a602090815260408083206001600160a01b038816845290915281205490036125445760405163043374df60e21b81526001600160a01b038516600482015260248101839052604401610cbd565b5f828152601a602090815260408083206001600160a01b03881684529091529020548311156125b4575f828152601a602090815260408083206001600160a01b03881684529091529081902054905163ed0fcc5760e01b8152610cbd918591600401918252602082015260400190565b5f828152601a602090815260408083206001600160a01b0388168452909152812080548592906125e590849061339a565b90915550505b5f82815260176020908152604080832054601890925290912054612610908590613387565b111561265d575f82815260186020908152604080832054601790925290912054849161263b9161339a565b60405163cc3f2f1b60e01b815260048101929092526024820152604401610cbd565b600d5483612669610e66565b6126739190613387565b11156126b15782612682610e66565b600d5461268f919061339a565b60405163adc3cee560e01b815260048101929092526024820152604401610cbd565b5f805f806126bf8688610f1a565b9350935093509350833410156126f15760405163c108422360e01b815260048101859052346024820152604401610cbd565b5f6126fc8284613387565b6011546001600160a01b03165f908152600c602052604081208054929350839290919061272a908490613387565b9091555061273a9050828561339a565b6012546001600160a01b03165f908152600c602052604081208054909190612763908490613387565b90915550505f87815260186020526040812080548a9290612785908490613387565b9091555061279590503389612c3f565b5092979650505050505050565b5f6127ad823461339a565b90508015610c39576040515f90339083908381818185875af1925050503d805f81146127f4576040519150601f19603f3d011682016040523d82523d5f602084013e6127f9565b606091505b505090508061118257335f908152600c602052604081208054849290612820908490613387565b9091555050505050565b600b546001600160a01b031633146113bf5760405163118cdaa760e01b8152336004820152602401610cbd565b5f805b601d548110156128975782601d8281548110612878576128786133ad565b905f5260205f2001540361288f5750600192915050565b60010161285a565b505f92915050565b5f818152601660209081526040808320839055601582528083208390556017825280832083905560189091528120819055601d805460018101825591527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0155565b5f8160011161298a57505f81815260046020526040902054805f03612978575f54821061293857612938636f96cda160e11b61236f565b5b505f19015f81815260046020526040902054801561293957600160e01b81165f0361296357919050565b612973636f96cda160e11b61236f565b612939565b600160e01b81165f0361298a57919050565b61236a636f96cda160e11b61236f565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f818152600c6020526040808220805490839055905190929083908381818185875af1925050503d805f8114612a46576040519150601f19603f3d011682016040523d82523d5f602084013e612a4b565b606091505b5050905080612a9d5760405163e066a8d760e01b815260206004820152601860248201527f5769746864726177205472616e73666572204661696c656400000000000000006044820152606401610cbd565b50919050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290612ad7903390899088908890600401613559565b6020604051808303815f875af1925050508015612b11575060408051601f3d908101601f19168201909252612b0e91810190613595565b60015b612b64573d808015612b3e576040519150601f19603f3d011682016040523d82523d5f602084013e612b43565b606091505b5080515f03612b5c57612b5c6368d2bf6b60e11b61236f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060108054610b7390613341565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480612baa5750819003601f19909101908152919050565b60145460408051635a04434360e11b815290515f926001600160a01b03169163b40886869160048083019260209291908290030181865afa158015612c1b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180a91906135b0565b610c39828260405180602001604052805f815250612c5d8383612cb3565b6001600160a01b0383163b15611182575f548281035b612c855f868380600101945086612aa3565b612c9957612c996368d2bf6b60e11b61236f565b818110612c7357815f5414612cac575f80fd5b5050505050565b5f805490829003612cce57612cce63b562e8dd60e01b61236f565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b17811790915580845260059092528220805468010000000000000001860201905590819003612d2b57612d2b622e076360e81b61236f565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4818160010191508103612d3057505f5550505050565b6001600160a01b03811681146114bb575f80fd5b5f8060408385031215612d92575f80fd5b823591506020830135612da481612d6d565b809150509250929050565b6001600160e01b0319811681146114bb575f80fd5b5f60208284031215612dd4575f80fd5b81356117c381612daf565b5f5b83811015612df9578181015183820152602001612de1565b50505f910152565b5f8151808452612e18816020860160208601612ddf565b601f01601f19169290920160200192915050565b602081525f6117c36020830184612e01565b5f60208284031215612e4e575f80fd5b5035919050565b5f8060408385031215612e66575f80fd5b8235612e7181612d6d565b946020939093013593505050565b5f8060408385031215612e90575f80fd5b50508035926020909101359150565b5f60208284031215612eaf575f80fd5b81356117c381612d6d565b5f805f60608486031215612ecc575f80fd5b8335612ed781612d6d565b92506020840135612ee781612d6d565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f3557612f35612ef8565b604052919050565b5f67ffffffffffffffff831115612f5657612f56612ef8565b612f69601f8401601f1916602001612f0c565b9050828152838383011115612f7c575f80fd5b828260208301375f602084830101529392505050565b5f60208284031215612fa2575f80fd5b813567ffffffffffffffff811115612fb8575f80fd5b8201601f81018413612fc8575f80fd5b612b7a84823560208401612f3d565b5f67ffffffffffffffff821115612ff057612ff0612ef8565b5060051b60200190565b5f82601f830112613009575f80fd5b8135602061301e61301983612fd7565b612f0c565b8083825260208201915060208460051b87010193508684111561303f575f80fd5b602086015b8481101561306457803561305781612d6d565b8352918301918301613044565b509695505050505050565b5f82601f83011261307e575f80fd5b8135602061308e61301983612fd7565b8083825260208201915060208460051b8701019350868411156130af575f80fd5b602086015b8481101561306457803583529183019183016130b4565b5f805f606084860312156130dd575f80fd5b833567ffffffffffffffff808211156130f4575f80fd5b61310087838801612ffa565b945060208601359350604086013591508082111561311c575f80fd5b506131298682870161306f565b9150509250925092565b80151581146114bb575f80fd5b5f8060408385031215613151575f80fd5b823561315c81612d6d565b91506020830135612da481613133565b5f6020828403121561317c575f80fd5b81356117c381613133565b5f8060408385031215613198575f80fd5b8235612e7181613133565b5f805f80608085870312156131b6575f80fd5b84356131c181612d6d565b935060208501356131d181612d6d565b925060408501359150606085013567ffffffffffffffff8111156131f3575f80fd5b8501601f81018713613203575f80fd5b61321287823560208401612f3d565b91505092959194509250565b5f806040838503121561322f575f80fd5b823567ffffffffffffffff80821115613246575f80fd5b61325286838701612ffa565b93506020850135915080821115613267575f80fd5b506132748582860161306f565b9150509250929050565b5f806040838503121561328f575f80fd5b823561329a81612d6d565b91506020830135612da481612d6d565b5f805f606084860312156132bc575f80fd5b833592506020840135915060408401356132d581612d6d565b809150509250925092565b8215158152604060208201525f612b7a6040830184612e01565b5f805f806080858703121561330d575f80fd5b8435935060208501359250604085013561332681612d6d565b9150606085013561333681612d6d565b939692955090935050565b600181811c9082168061335557607f821691505b602082108103612a9d57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5e57610b5e613373565b81810381811115610b5e57610b5e613373565b634e487b7160e01b5f52603260045260245ffd5b8082028115828204841417610b5e57610b5e613373565b5f826133f257634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561118257805f5260205f20601f840160051c8101602085101561341c5750805b601f840160051c820191505b81811015612cac575f8155600101613428565b815167ffffffffffffffff81111561345557613455612ef8565b613469816134638454613341565b846133f7565b602080601f83116001811461349c575f84156134855750858301515b5f19600386901b1c1916600185901b1785556134f3565b5f85815260208120601f198616915b828110156134ca578886015182559484019460019091019084016134ab565b50858210156134e757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f835161350c818460208801612ddf565b835190830190613520818360208801612ddf565b01949350505050565b5f60208284031215613539575f80fd5b81516117c381613133565b5f8161355257613552613373565b505f190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061358b90830184612e01565b9695505050505050565b5f602082840312156135a5575f80fd5b81516117c381612daf565b5f602082840312156135c0575f80fd5b505191905056fea2646970667358221220955c74d07a6384f7abb45664f3fe98720c8650d855c336ec26963275d8fa838164736f6c63430008180033
Verified Source Code Full Match
Compiler: v0.8.24+commit.e11b9ed9
EVM: shanghai
Optimization: Yes (200 runs)
Tut_Loudio.sol 3283 lines
// Sources flattened with hardhat v2.22.19 https://hardhat.org // SPDX-License-Identifier: Apache-2.0 AND CC0-1.0 AND MIT AND UNLICENSED // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. * * NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the * royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/common/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/common/ERC2981.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the ERC. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) public view virtual returns (address receiver, uint256 amount) { RoyaltyInfo storage _royaltyInfo = _tokenRoyaltyInfo[tokenId]; address royaltyReceiver = _royaltyInfo.receiver; uint96 royaltyFraction = _royaltyInfo.royaltyFraction; if (royaltyReceiver == address(0)) { royaltyReceiver = _defaultRoyaltyInfo.receiver; royaltyFraction = _defaultRoyaltyInfo.royaltyFraction; } uint256 royaltyAmount = (salePrice * royaltyFraction) / _feeDenominator(); return (royaltyReceiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @pythnetwork/pyth-sdk-solidity/[email protected] // Original license: SPDX_License_Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @title IPythEvents contains the events that Pyth contract emits. /// @dev This interface can be used for listening to the updates for off-chain and testing purposes. interface IPythEvents { /// @dev Emitted when the price feed with `id` has received a fresh update. /// @param id The Pyth Price Feed ID. /// @param publishTime Publish time of the given price update. /// @param price Price of the given price update. /// @param conf Confidence interval of the given price update. event PriceFeedUpdate( bytes32 indexed id, uint64 publishTime, int64 price, uint64 conf ); } // File @pythnetwork/pyth-sdk-solidity/[email protected] // Original license: SPDX_License_Identifier: Apache-2.0 pragma solidity ^0.8.0; contract PythStructs { // A price with a degree of uncertainty, represented as a price +- a confidence interval. // // The confidence interval roughly corresponds to the standard error of a normal distribution. // Both the price and confidence are stored in a fixed-point numeric representation, // `x * (10^expo)`, where `expo` is the exponent. // // Please refer to the documentation at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how // to how this price safely. struct Price { // Price int64 price; // Confidence interval around the price uint64 conf; // Price exponent int32 expo; // Unix timestamp describing when the price was published uint publishTime; } // PriceFeed represents a current aggregate price from pyth publisher feeds. struct PriceFeed { // The price ID. bytes32 id; // Latest available price Price price; // Latest available exponentially-weighted moving average price Price emaPrice; } } // File @pythnetwork/pyth-sdk-solidity/[email protected] // Original license: SPDX_License_Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @title Consume prices from the Pyth Network (https://pyth.network/). /// @dev Please refer to the guidance at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how to consume prices safely. /// @author Pyth Data Association interface IPyth is IPythEvents { /// @notice Returns the price of a price feed without any sanity checks. /// @dev This function returns the most recent price update in this contract without any recency checks. /// This function is unsafe as the returned price update may be arbitrarily far in the past. /// /// Users of this function should check the `publishTime` in the price to ensure that the returned price is /// sufficiently recent for their application. If you are considering using this function, it may be /// safer / easier to use `getPriceNoOlderThan`. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getPriceUnsafe( bytes32 id ) external view returns (PythStructs.Price memory price); /// @notice Returns the price that is no older than `age` seconds of the current time. /// @dev This function is a sanity-checked version of `getPriceUnsafe` which is useful in /// applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently /// recently. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getPriceNoOlderThan( bytes32 id, uint age ) external view returns (PythStructs.Price memory price); /// @notice Returns the exponentially-weighted moving average price of a price feed without any sanity checks. /// @dev This function returns the same price as `getEmaPrice` in the case where the price is available. /// However, if the price is not recent this function returns the latest available price. /// /// The returned price can be from arbitrarily far in the past; this function makes no guarantees that /// the returned price is recent or useful for any particular application. /// /// Users of this function should check the `publishTime` in the price to ensure that the returned price is /// sufficiently recent for their application. If you are considering using this function, it may be /// safer / easier to use either `getEmaPrice` or `getEmaPriceNoOlderThan`. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getEmaPriceUnsafe( bytes32 id ) external view returns (PythStructs.Price memory price); /// @notice Returns the exponentially-weighted moving average price that is no older than `age` seconds /// of the current time. /// @dev This function is a sanity-checked version of `getEmaPriceUnsafe` which is useful in /// applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently /// recently. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getEmaPriceNoOlderThan( bytes32 id, uint age ) external view returns (PythStructs.Price memory price); /// @notice Update price feeds with given update messages. /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// Prices will be updated if they are more recent than the current stored prices. /// The call will succeed even if the update is not the most recent. /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid. /// @param updateData Array of price update data. function updatePriceFeeds(bytes[] calldata updateData) external payable; /// @notice Wrapper around updatePriceFeeds that rejects fast if a price update is not necessary. A price update is /// necessary if the current on-chain publishTime is older than the given publishTime. It relies solely on the /// given `publishTimes` for the price feeds and does not read the actual price update publish time within `updateData`. /// /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// /// `priceIds` and `publishTimes` are two arrays with the same size that correspond to senders known publishTime /// of each priceId when calling this method. If all of price feeds within `priceIds` have updated and have /// a newer or equal publish time than the given publish time, it will reject the transaction to save gas. /// Otherwise, it calls updatePriceFeeds method to update the prices. /// /// @dev Reverts if update is not needed or the transferred fee is not sufficient or the updateData is invalid. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param publishTimes Array of publishTimes. `publishTimes[i]` corresponds to known `publishTime` of `priceIds[i]` function updatePriceFeedsIfNecessary( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64[] calldata publishTimes ) external payable; /// @notice Returns the required fee to update an array of price updates. /// @param updateData Array of price update data. /// @return feeAmount The required fee in Wei. function getUpdateFee( bytes[] calldata updateData ) external view returns (uint feeAmount); /// @notice Parse `updateData` and return price feeds of the given `priceIds` if they are all published /// within `minPublishTime` and `maxPublishTime`. /// /// You can use this method if you want to use a Pyth price at a fixed time and not the most recent price; /// otherwise, please consider using `updatePriceFeeds`. This method may store the price updates on-chain, if they /// are more recent than the current stored prices. /// /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// /// /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid or there is /// no update for any of the given `priceIds` within the given time range. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param minPublishTime minimum acceptable publishTime for the given `priceIds`. /// @param maxPublishTime maximum acceptable publishTime for the given `priceIds`. /// @return priceFeeds Array of the price feeds corresponding to the given `priceIds` (with the same order). function parsePriceFeedUpdates( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64 minPublishTime, uint64 maxPublishTime ) external payable returns (PythStructs.PriceFeed[] memory priceFeeds); /// @notice Similar to `parsePriceFeedUpdates` but ensures the updates returned are /// the first updates published in minPublishTime. That is, if there are multiple updates for a given timestamp, /// this method will return the first update. This method may store the price updates on-chain, if they /// are more recent than the current stored prices. /// /// /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid or there is /// no update for any of the given `priceIds` within the given time range and uniqueness condition. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param minPublishTime minimum acceptable publishTime for the given `priceIds`. /// @param maxPublishTime maximum acceptable publishTime for the given `priceIds`. /// @return priceFeeds Array of the price feeds corresponding to the given `priceIds` (with the same order). function parsePriceFeedUpdatesUnique( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64 minPublishTime, uint64 maxPublishTime ) external payable returns (PythStructs.PriceFeed[] memory priceFeeds); } // File contracts/main-contracts/KingdomlyFeeContract.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.24; error InsufficientUpdateFee(uint256 requiredFee); error ContractNotVerified(address contractAddress); contract KingdomlyFeeContract is Ownable { uint256 private cachedOneDollarInWei; uint256 private maxPriceAgeInSeconds; IPyth pyth; bytes32 ethUsdPriceId; constructor(address _pyth, bytes32 _ethUsdPriceId) Ownable(msg.sender) { pyth = IPyth(_pyth); ethUsdPriceId = _ethUsdPriceId; maxPriceAgeInSeconds = 60 * 60 * 24; } function getOneDollarInWei() public view returns (uint256) { try pyth.getPriceNoOlderThan(ethUsdPriceId, maxPriceAgeInSeconds) returns (PythStructs.Price memory price) { uint256 ethPrice18Decimals = (uint256(uint64(price.price)) * (10 ** 18)) / (10 ** uint8(uint32(-1 * price.expo))); uint256 oneDollarInWei = ((10 ** 18) * (10 ** 18)) / ethPrice18Decimals; return oneDollarInWei; } catch { return cachedOneDollarInWei; } } function updateOracleAndGetOneDollarInWei(bytes[] calldata pythPriceUpdate) public payable returns (uint256) { uint256 updateFee = pyth.getUpdateFee(pythPriceUpdate); if (msg.value != updateFee) { revert InsufficientUpdateFee(updateFee); } pyth.updatePriceFeeds{value: msg.value}(pythPriceUpdate); cachedOneDollarInWei = getOneDollarInWei(); return cachedOneDollarInWei; } function updateMaxPriceAgeInSeconds(uint256 _maxPriceAgeInSeconds) public onlyOwner { maxPriceAgeInSeconds = _maxPriceAgeInSeconds; } } // File contracts/utils/IDelegateRegistry.sol // Original license: SPDX_License_Identifier: CC0-1.0 pragma solidity >=0.8.13; /** * @title IDelegateRegistry * @custom:version 2.0 * @custom:author foobar (0xfoobar) * @notice A standalone immutable registry storing delegated permissions from one address to another */ interface IDelegateRegistry { /// @notice Delegation type, NONE is used when a delegation does not exist or is revoked enum DelegationType { NONE, ALL, CONTRACT, ERC721, ERC20, ERC1155 } /// @notice Struct for returning delegations struct Delegation { DelegationType type_; address to; address from; bytes32 rights; address contract_; uint256 tokenId; uint256 amount; } /// @notice Emitted when an address delegates or revokes rights for their entire wallet event DelegateAll(address indexed from, address indexed to, bytes32 rights, bool enable); /// @notice Emitted when an address delegates or revokes rights for a contract address event DelegateContract( address indexed from, address indexed to, address indexed contract_, bytes32 rights, bool enable ); /// @notice Emitted when an address delegates or revokes rights for an ERC721 tokenId event DelegateERC721( address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, bool enable ); /// @notice Emitted when an address delegates or revokes rights for an amount of ERC20 tokens event DelegateERC20( address indexed from, address indexed to, address indexed contract_, bytes32 rights, uint256 amount ); /// @notice Emitted when an address delegates or revokes rights for an amount of an ERC1155 tokenId event DelegateERC1155( address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, uint256 amount ); /// @notice Thrown if multicall calldata is malformed error MulticallFailed(); /** * ----------- WRITE ----------- */ /** * @notice Call multiple functions in the current contract and return the data from all of them if they all succeed * @param data The encoded function data for each of the calls to make to this contract * @return results The results from each of the calls passed in via data */ function multicall(bytes[] calldata data) external payable returns (bytes[] memory results); /** * @notice Allow the delegate to act on behalf of `msg.sender` for all contracts * @param to The address to act as delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateAll(address to, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific contract * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateContract(address to, address contract_, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific ERC721 token * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC721(address to, address contract_, uint256 tokenId, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC20 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address for the fungible token contract * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC20(address to, address contract_, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC1155 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address of the contract that holds the token * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount of that token id to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC1155(address to, address contract_, uint256 tokenId, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * ----------- CHECKS ----------- */ /** * @notice Check if `to` is a delegate of `from` for the entire wallet * @param to The potential delegate address * @param from The potential address who delegated rights * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on the from's behalf */ function checkDelegateForAll(address to, address from, bytes32 rights) external view returns (bool); /** * @notice Check if `to` is a delegate of `from` for the specified `contract_` or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet or that specific contract */ function checkDelegateForContract(address to, address from, address contract_, bytes32 rights) external view returns (bool); /** * @notice Check if `to` is a delegate of `from` for the specific `contract` and `tokenId`, the entire `contract_`, or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param tokenId The token id for the token to delegating * @param from The wallet that issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet, that contract, or that specific tokenId */ function checkDelegateForERC721(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (bool); /** * @notice Returns the amount of ERC20 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights) external view returns (uint256); /** * @notice Returns the amount of a ERC1155 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param tokenId The token id to check the delegated amount of * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC1155(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (uint256); /** * ----------- ENUMERATIONS ----------- */ /** * @notice Returns all enabled delegations a given delegate has received * @param to The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getIncomingDelegations(address to) external view returns (Delegation[] memory delegations); /** * @notice Returns all enabled delegations an address has given out * @param from The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getOutgoingDelegations(address from) external view returns (Delegation[] memory delegations); /** * @notice Returns all hashes associated with enabled delegations an address has received * @param to The address to retrieve incoming delegation hashes for * @return delegationHashes Array of delegation hashes */ function getIncomingDelegationHashes(address to) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns all hashes associated with enabled delegations an address has given out * @param from The address to retrieve outgoing delegation hashes for * @return delegationHashes Array of delegation hashes */ function getOutgoingDelegationHashes(address from) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns the delegations for a given array of delegation hashes * @param delegationHashes is an array of hashes that correspond to delegations * @return delegations Array of Delegation structs, return empty structs for nonexistent or revoked delegations */ function getDelegationsFromHashes(bytes32[] calldata delegationHashes) external view returns (Delegation[] memory delegations); /** * ----------- STORAGE ACCESS ----------- */ /** * @notice Allows external contracts to read arbitrary storage slots */ function readSlot(bytes32 location) external view returns (bytes32); /** * @notice Allows external contracts to read an arbitrary array of storage slots */ function readSlots(bytes32[] calldata locations) external view returns (bytes32[] memory); } // File erc721a/contracts/[email protected] // Original license: SPDX_License_Identifier: MIT // ERC721A Contracts v4.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); /** * `_sequentialUpTo()` must be greater than `_startTokenId()`. */ error SequentialUpToTooSmall(); /** * The `tokenId` of a sequential mint exceeds `_sequentialUpTo()`. */ error SequentialMintExceedsLimit(); /** * Spot minting requires a `tokenId` greater than `_sequentialUpTo()`. */ error SpotMintTokenIdTooSmall(); /** * Cannot mint over a token that already exists. */ error TokenAlreadyExists(); /** * The feature is not compatible with spot mints. */ error NotCompatibleWithSpotMints(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File erc721a/contracts/[email protected] // Original license: SPDX_License_Identifier: MIT // ERC721A Contracts v4.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * The `_sequentialUpTo()` function can be overriden to enable spot mints * (i.e. non-consecutive mints) for `tokenId`s greater than `_sequentialUpTo()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b... // [truncated — 122009 bytes total]
Read Contract
activeMintGroups 0x483f0a82 → uint256
balanceOf 0x70a08231 → uint256
baseURI 0x6c0360eb → string
canDelegateMintCheck 0xf72171f1 → bool, string
canMintCheck 0xf34657ec → bool, string
checkPendingBalance 0xfea414b6 → uint256
checkPendingBalanceFor 0x6e75e2e2 → uint256
contractMintLive 0xe690f9eb → bool
contractPresaleActive 0xdb0dbb71 → bool
feeAddress 0x41275358 → address
getApproved 0x081812fc → address
getKingdomlyFeeContract 0x93a24841 → address
isApprovedForAll 0xe985e9c5 → bool
kingdomlyAdmin 0x63691c93 → address
kingdomlyFeeContract 0xefe82328 → address
maxMintPerWallet 0x16da3bc6 → uint256
maxSupply 0xd5abeb01 → uint256
maxSupplyPerMintGroup 0x24a663c3 → uint256
mintGroupMints 0xe5fd1145 → uint256
mintLive 0xe8656fcc → bool
mintPrice 0xe6a72acf → uint256
mintQuotas 0x01d2718e → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
ownerPayoutAddress 0xae4e4942 → address
presaleActive 0x4a5bd2fd → bool
presaleScheduledStartTimestamp 0xe6087db0 → uint256
quoteAirdropFees 0xb80f8fb4 → uint256
quoteBatchMint 0x22536c03 → uint256, uint256, uint256, uint256
royaltyInfo 0x2a55205a → address, uint256
scheduledMintLiveTimestamp 0xf30874ea → uint256
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
threeDollarsEth 0xce55c66a → uint256
threeDollarsInCents 0x17d791d0 → uint256
tokenURI 0xc87b56dd → string
totalSupply 0x18160ddd → uint256
Write Contract 22 functions
These functions modify contract state and require a wallet transaction to execute.
airdropNFTs 0xe213b5f6
address[] recipients
uint256[] amounts
returns: uint256
approve 0x095ea7b3
address to
uint256 tokenId
batchMint 0x0ed64eff
uint256 amount
uint256 mintId
returns: uint256
changeMintStatus 0xa8ddf8f6
bool status
changeSalePrice 0xc82e474b
uint256 newmintPrice
uint256 mintId
delegatedMint 0xebf39a41
uint256 amount
uint256 mintId
address vault
returns: uint256
renounceOwnership 0x715018a6
No parameters
safeTransferFrom 0x42842e0e
address from
address to
uint256 tokenId
safeTransferFrom 0xb88d4fde
address from
address to
uint256 tokenId
bytes _data
schedulePresaleMintStart 0x80348242
uint256 startTimestamp
uint256 mintId
setApprovalForAll 0xa22cb465
address operator
bool approved
setBaseURI 0x55f804b3
string newBaseURI
setMaxMintPerWallet 0x7bd4f071
uint256 newMaxMintPerWallet
uint256 mintGroupId
setMintLiveTimestamp 0x31f72d77
uint256 timestamp
setMintQuota 0x581636dd
address[] addressToAdd
uint256 mintId
uint256[] _mintQuotas
setNewKingdomlyFeeContract 0x1f466342
address _kingdomlyFeeContract
setNewMaxPerMintGroup 0x11f7acb9
uint256 mintId
uint256 newMax
stopOrStartpresaleMint 0xb3978a86
bool presaleStatus
uint256 mintId
transferFrom 0x23b872dd
address from
address to
uint256 tokenId
transferOwnership 0xf2fde38b
address newOwner
withdrawFeeFunds 0xa75c3ad9
No parameters
withdrawMintFunds 0x905d7b33
No parameters
Recent Transactions
No transactions found for this address