Address Contract Partially Verified
Address
0x0fc584529a2AEfA997697FAfAcbA5831faC0c22d
Balance
0 ETH
Nonce
1
Code Size
20981 bytes
Creator
0xDEA9196D...346a at tx 0x56e4b7d7...dc7db2
Indexed Transactions
1 (24,458,520 → 24,458,520)
Value (indexed)
↓ 0.003386 ETH
Gas Used (indexed)
95,146
Contract Bytecode
20981 bytes
0x6080604052600436106101795760003560e01c80637fc82484116100cb578063a02716171161007f578063bc197c8111610059578063bc197c81146104db578063f23a6e6114610520578063f2fde38b1461056557600080fd5b8063a027161714610467578063ab3a412114610487578063ad5c4648146104a757600080fd5b80638da5cb5b116100b05780638da5cb5b146103f5578063929bf3d3146104135780639bf1401c1461043357600080fd5b80637fc82484146103c2578063839006f2146103d557600080fd5b806357e836dc1161012d5780635ee50f88116101075780635ee50f881461032d5780636d13582c14610379578063715018a6146103ad57600080fd5b806357e836dc146102e757806358fbdd0a146102fa5780635d8117a61461030d57600080fd5b8063150b7a021161015e578063150b7a021461025757806342c4ccaa146102b45780634447d888146102c757600080fd5b806301ffc9a7146102025780630956642b1461023757600080fd5b366101fd57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101fb5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561020e57600080fd5b5061022261021d36600461495b565b610585565b60405190151581526020015b60405180910390f35b34801561024357600080fd5b506101fb610252366004614cca565b6105ee565b34801561026357600080fd5b5061029b6102723660046147d7565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161022e565b6101fb6102c2366004614b27565b610762565b3480156102d357600080fd5b506101fb6102e2366004614dc1565b610d19565b6101fb6102f5366004614a4e565b6110ea565b6101fb61030836600461499b565b611767565b34801561031957600080fd5b506101fb610328366004614c0e565b611d00565b34801561033957600080fd5b506103617f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821681565b6040516001600160a01b03909116815260200161022e565b34801561038557600080fd5b506103617f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b3480156103b957600080fd5b506101fb6121d0565b6101fb6103d0366004614d5e565b612245565b3480156103e157600080fd5b506101fb6103f03660046146f5565b612709565b34801561040157600080fd5b506000546001600160a01b0316610361565b34801561041f57600080fd5b506101fb61042e366004614cca565b6128d3565b34801561043f57600080fd5b506103617f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e3781565b34801561047357600080fd5b506101fb610482366004614c0e565b6129b3565b34801561049357600080fd5b506101fb6104a2366004614c0e565b612ba3565b3480156104b357600080fd5b506103617f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156104e757600080fd5b5061029b6104f636600461472d565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561052c57600080fd5b5061029b61053b366004614841565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561057157600080fd5b506101fb6105803660046146f5565b612d9b565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806105e857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600260015414156106415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061066757506001600160a01b0381163014155b61067057600080fd5b8461067a57600080fd5b6000806106ba8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce83888489898961330a565b90507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d818989905082600184516107049190615120565b8151811061072257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a15050600180555050505050505050565b600260015414156107b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906107db57506001600160a01b0381163014155b6107e457600080fd5b886107ee57600080fd5b6000805b8a8110156108955760008a8a8381811061081c57634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116108755760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61087f81846150e9565b925050808061088d90615163565b9150506107f2565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b1580156108f957600080fd5b505afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190614711565b9050600061093f8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190614983565b6109ba9190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f757600080fd5b505afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614983565b610a399190615101565b610a4391906150e9565b9050610a7a6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21633308a613414565b6000610a8882898989613452565b9050610b4d8f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8482600081518110610b9157634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190614983565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29091169063a9059cbb90604401602060405180830381600087803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d02919061493b565b505060018055505050505050505050505050505050565b60026001541415610d6c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590610d9257506001600160a01b0381163014155b610d9b57600080fd5b86610da557600080fd5b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b031663220613798c6040518263ffffffff1660e01b8152600401610df891815260200190565b60a06040518083038186803b158015610e1057600080fd5b505afa158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e489190614e4d565b509194509250610e5c91508990508b615120565b610e669083615101565b610e708983615101565b610e7a91906150e9565b9250610eb49150506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333088613414565b6000610ede82610ecc670de0b6b3a76400008c615101565b610ed691906150e9565b878787613452565b9050610f208a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8982600081518110610f6357634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0386169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190614983565b905080156110d95760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061493b565b505b505060018055505050505050505050565b6002600154141561113d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061116357506001600160a01b0381163014155b61116c57600080fd5b878061117757600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b50505050506000805b828110156112905760008a8a8381811061121957634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116112725760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61127c81846150e9565b9250508061128990615163565b90506111ef565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190614711565b9050600061133a8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190614983565b6113b59190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190614983565b6114349190615101565b61143e91906150e9565b9050600061144e82348a8a613452565b90506115138f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b848260008151811061155757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116219190614983565b604051632e1a7d4d60e01b8152600481018290529091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b505050506000876001600160a01b03168260405160006040518083038185875af1925050503d80600081146116eb576040519150601f19603f3d011682016040523d82523d6000602084013e6116f0565b606091505b5050905080610d025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b600260015414156117ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906117e057506001600160a01b0381163014155b6117e957600080fd5b856117f357600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50506040516340d1b7db60e11b8152600481018c9052600093507f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b031692506381a36fb6915060240160206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190614711565b905060006119108689615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119819190614983565b61198b9190615101565b87879050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190614983565b611a0a9190615101565b611a1491906150e9565b90506000611a2482348888613452565b9050611a968b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8a8a905082600081518110611add57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015611b6f57600080fd5b505afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614983565b604051632e1a7d4d60e01b8152600481018290529091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c71576040519150601f19603f3d011682016040523d82523d6000602084013e611c76565b606091505b5050905080611ced5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050600180555050505050505050505050565b60026001541415611d535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590611d7957506001600160a01b0381163014155b611d8257600080fd5b86611d8c57600080fd5b611dc16001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333087613414565b6040516340d1b7db60e11b8152600481018a90526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b158015611e2457600080fd5b505afa158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190614711565b90506000611e6a878a615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea357600080fd5b505afa158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190614983565b611ee59190615101565b88889050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190614983565b611f649190615101565b611f6e91906150e9565b90506000611f7e82888888613452565b90506120018c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8b8b90508260008151811061204857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190614983565b90508015611ced5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc919061493b565b505050600180555050505050505050505050565b336121e36000546001600160a01b031690565b6001600160a01b0316146122395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6122436000613ad6565b565b600260015414156122985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906122be57506001600160a01b0381163014155b6122c757600080fd5b856122d157600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b50506040517f22061379000000000000000000000000000000000000000000000000000000008152600481018b9052600093508392506001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616915063220613799060240160a06040518083038186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb9190614e4d565b509194509250600091506124119050878a615120565b61241b9084615101565b6124258884615101565b61242f91906150e9565b9050600061245b82612449670de0b6b3a76400008d615101565b61245391906150e9565b348989613452565b905061249d8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8a826000815181106124e057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b15801561257257600080fd5b505afa158015612586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125aa9190614983565b905080156126f757604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561261457600080fd5b505af1158015612628573d6000803e3d6000fd5b505050506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612679576040519150601f19603f3d011682016040523d82523d6000602084013e61267e565b606091505b50509050806126f55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b505b50506001805550505050505050505050565b3361271c6000546001600160a01b031690565b6001600160a01b0316146127725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b03811661284257604051600090339047908381818185875af1925050503d80600081146127c2576040519150601f19603f3d011682016040523d82523d6000602084013e6127c7565b606091505b505090508061283e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050565b6040516370a0823160e01b81523060048201526128d09033906001600160a01b038416906370a082319060240160206040518083038186803b15801561288757600080fd5b505afa15801561289b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bf9190614983565b6001600160a01b0384169190613b3e565b50565b600260015414156129265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061294c57506001600160a01b0381163014155b61295557600080fd5b8461295f57600080fd5b60008061299f8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce838884898989613b6e565b60026001541415612a065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612a2c57506001600160a01b0381163014155b612a3557600080fd5b86612a3f57600080fd5b600080612ab08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b91509150612ac2828783888888613b6e565b50600089815b81811015612b14578a8a82818110612af057634e487b7160e01b600052603260045260246000fd5b9050602002013583612b0291906150e9565b9250612b0d81615163565b9050612ac8565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828b8b612b44600182615120565b818110612b6157634e487b7160e01b600052603260045260246000fd5b604080519485526020918202939093013590840152506001600160a01b0388169082015260600160405180910390a15050600180555050505050505050505050565b60026001541415612bf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612c1c57506001600160a01b0381163014155b612c2557600080fd5b86612c2f57600080fd5b600080612ca08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b915091506000612cb483888489898961330a565b905060008a815b81811015612d07578b8b82818110612ce357634e487b7160e01b600052603260045260246000fd5b9050602002013583612cf591906150e9565b9250612d0081615163565b9050612cbb565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828460018651612d399190615120565b81518110612d5757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a1505060018055505050505050505050505050565b33612dae6000546001600160a01b031690565b6001600160a01b031614612e045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b038116612e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101f2565b6128d081613ad6565b801580612f2b57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f299190614983565b155b612f9d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016101f2565b6040516001600160a01b0383166024820152604481018290526130199084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f7c565b505050565b606061302d8484600085614061565b90505b9392505050565b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6866040518263ffffffff1660e01b815260040161308a91815260200190565b60206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311757600080fd5b505afa15801561312b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314f9190614711565b855190915060005b818110156131d3576131918388838151811061318357634e487b7160e01b600052603260045260246000fd5b6020026020010151866141a0565b6131c383858984815181106131b657634e487b7160e01b600052603260045260246000fd5b60200260200101516144d0565b6131cc81615163565b9050613157565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90613205908a908590600401614f3a565b602060405180830381600087803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132579190614983565b506000875190506000856001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b15801561329957600080fd5b505afa1580156132ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d19190614983565b6132db9083615101565b6132ed670de0b6b3a764000084615101565b6132f79190615120565b95975094955050505050505b9250929050565b60606133406001600160a01b0388167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f87612e89565b6040517f18cbafe50000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f16906318cbafe5906133b29089908b908a908a908a904290600401615021565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261340891908101906148a8565b98975050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261344c9085906323b872dd60e01b90608401612fe2565b50505050565b606060007f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b0316638803dbee8787878730426040518763ffffffff1660e01b81526004016134ac96959493929190615021565b600060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261350291908101906148a8565b9695505050505050565b6040516340d1b7db60e11b81526004810186905260009081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b15801561357157600080fd5b505afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061365390339030908c908c90600401614ee2565b600060405180830381600087803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156136cf57600080fd5b505af11580156136e3573d6000803e3d6000fd5b5050604051632321420560e21b81526001600160a01b0385169250638c8508149150613719908a908a908a908a90600401614f68565b600060405180830381600087803b15801561373357600080fd5b505af1158015613747573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376f91908101906148a8565b5090979650505050505050565b6040516340d1b7db60e11b8152600481018590526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b1580156137df57600080fd5b505afa1580156137f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138179190614711565b6040517f9d54def60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639d54def69061386390879087908790600401614fef565b600060405180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b991908101906148a8565b505050505050565b6040516340d1b7db60e11b81526004810185905260009081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b15801561392657600080fd5b505afa15801561393a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395e9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561399b57600080fd5b505afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d39190614711565b865190915060005b81811015613a3c57613a078389838151811061318357634e487b7160e01b600052603260045260246000fd5b613a2c83858a84815181106131b657634e487b7160e01b600052603260045260246000fd5b613a3581615163565b90506139db565b50604051632321420560e21b81526060906001600160a01b03851690638c85081490613a72908b9085908c908c90600401614f68565b600060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ac891908101906148a8565b509298975050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261301990849063a9059cbb60e01b90606401612fe2565b6060613ba46001600160a01b0388167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f87612e89565b6040517f38ed17390000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f16906338ed1739906133b29089908b908a908a908a904290600401615021565b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6876040518263ffffffff1660e01b8152600401613c6991815260200190565b60206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb99190614711565b90506001600160a01b038116613d115760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016101f2565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4c57600080fd5b505afa158015613d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d849190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d690613db990339030908b908b90600401614ee2565b600060405180830381600087803b158015613dd357600080fd5b505af1158015613de7573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90613e7e908a908a90600401614f3a565b602060405180830381600087803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed09190614983565b9050600081846001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f469190614983565b613f509190615101565b613f62670de0b6b3a764000084615101565b613f6c9190615120565b9399939850929650505050505050565b6000613fd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301e9092919063ffffffff16565b8051909150156130195780806020019051810190613fef919061493b565b6130195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101f2565b6060824710156140d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101f2565b843b6141275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f2565b600080866001600160a01b031685876040516141439190614ec6565b60006040518083038185875af1925050503d8060008114614180576040519150601f19603f3d011682016040523d82523d6000602084013e614185565b606091505b509150915061419582828661459c565b979650505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614230576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050614443565b816001600160a01b0316866001600160a01b031614156143db5760008560405160240161425f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a16906142c1908590614ec6565b600060405180830381855afa9150503d80600081146142fc576040519150601f19603f3d011682016040523d82523d6000602084013e614301565b606091505b509150915060008180602001905181019061431c9190614711565b905082801561433357506001600160a01b03811633145b61437f5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e657200000000000000000000000000000060448201526064016101f2565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506144439350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161445e9190614ec6565b6000604051808303816000865af19150503d806000811461449b576040519150601f19603f3d011682016040523d82523d6000602084013e6144a0565b606091505b50915091508181906144c55760405162461bcd60e51b81526004016101f29190614fbc565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b03861683141561451557505050505050565b816001600160a01b0316866001600160a01b031614156138b95760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050614443565b606083156145ab575081613030565b8251156145bb5782518084602001fd5b8160405162461bcd60e51b81526004016101f29190614fbc565b80356145e0816151aa565b919050565b60008083601f8401126145f6578182fd5b50813567ffffffffffffffff81111561460d578182fd5b6020830191508360208260051b850101111561330357600080fd5b600082601f830112614638578081fd5b8135602061464d614648836150c5565b615094565b80838252828201915082860187848660051b890101111561466c578586fd5b855b8581101561376f5781358452928401929084019060010161466e565b600082601f83011261469a578081fd5b813567ffffffffffffffff8111156146b4576146b4615194565b6146c7601f8201601f1916602001615094565b8181528460208386010111156146db578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614706578081fd5b8135613030816151aa565b600060208284031215614722578081fd5b8151613030816151aa565b600080600080600060a08688031215614744578081fd5b853561474f816151aa565b9450602086013561475f816151aa565b9350604086013567ffffffffffffffff8082111561477b578283fd5b61478789838a01614628565b9450606088013591508082111561479c578283fd5b6147a889838a01614628565b935060808801359150808211156147bd578283fd5b506147ca8882890161468a565b9150509295509295909350565b600080600080608085870312156147ec578384fd5b84356147f7816151aa565b93506020850135614807816151aa565b925060408501359150606085013567ffffffffffffffff811115614829578182fd5b6148358782880161468a565b91505092959194509250565b600080600080600060a08688031215614858578081fd5b8535614863816151aa565b94506020860135614873816151aa565b93506040860135925060608601359150608086013567ffffffffffffffff81111561489c578182fd5b6147ca8882890161468a565b600060208083850312156148ba578182fd5b825167ffffffffffffffff8111156148d0578283fd5b8301601f810185136148e0578283fd5b80516148ee614648826150c5565b80828252848201915084840188868560051b870101111561490d578687fd5b8694505b8385101561492f578051835260019490940193918501918501614911565b50979650505050505050565b60006020828403121561494c578081fd5b81518015158114613030578182fd5b60006020828403121561496c578081fd5b81356001600160e01b031981168114613030578182fd5b600060208284031215614994578081fd5b5051919050565b60008060008060008060008060a0898b0312156149b6578586fd5b88359750602089013567ffffffffffffffff808211156149d4578788fd5b6149e08c838d016145e5565b909950975060408b01359150808211156149f8578485fd5b614a048c838d016145e5565b909750955060608b0135915080821115614a1c578485fd5b50614a298b828c016145e5565b9094509250506080890135614a3d816151aa565b809150509295985092959890939650565b60008060008060008060008060008060c08b8d031215614a6c578384fd5b8a35995060208b013567ffffffffffffffff80821115614a8a578586fd5b614a968e838f016145e5565b909b50995060408d0135915080821115614aae578586fd5b614aba8e838f016145e5565b909950975060608d0135915080821115614ad2578586fd5b614ade8e838f016145e5565b909750955060808d0135915080821115614af6578384fd5b50614b038d828e016145e5565b9094509250614b16905060a08c016145d5565b90509295989b9194979a5092959850565b600080600080600080600080600080600060e08c8e031215614b47578485fd5b8b359a5067ffffffffffffffff8060208e01351115614b64578586fd5b614b748e60208f01358f016145e5565b909b50995060408d0135811015614b89578586fd5b614b998e60408f01358f016145e5565b909950975060608d0135811015614bae578586fd5b614bbe8e60608f01358f016145e5565b909750955060808d0135945060a08d0135811015614bda578182fd5b50614beb8d60a08e01358e016145e5565b9093509150614bfc60c08d016145d5565b90509295989b509295989b9093969950565b600080600080600080600080600060c08a8c031215614c2b578283fd5b8935985060208a013567ffffffffffffffff80821115614c49578485fd5b614c558d838e016145e5565b909a50985060408c0135915080821115614c6d578485fd5b614c798d838e016145e5565b909850965060608c0135955060808c0135915080821115614c98578485fd5b50614ca58c828d016145e5565b90945092505060a08a0135614cb9816151aa565b809150509295985092959850929598565b600080600080600080600060a0888a031215614ce4578081fd5b87359650602088013567ffffffffffffffff80821115614d02578283fd5b614d0e8b838c016145e5565b909850965060408a0135955060608a0135915080821115614d2d578283fd5b50614d3a8a828b016145e5565b9094509250506080880135614d4e816151aa565b8091505092959891949750929550565b600080600080600080600060a0888a031215614d78578081fd5b8735965060208801359550604088013567ffffffffffffffff80821115614d9d578283fd5b614da98b838c016145e5565b909750955060608a0135915080821115614d2d578283fd5b60008060008060008060008060c0898b031215614ddc578182fd5b8835975060208901359650604089013567ffffffffffffffff80821115614e01578384fd5b614e0d8c838d016145e5565b909850965060608b0135955060808b0135915080821115614e2c578384fd5b50614e398b828c016145e5565b90945092505060a0890135614a3d816151aa565b600080600080600060a08688031215614e64578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614ebb57815187529582019590820190600101614e9f565b509495945050505050565b60008251614ed8818460208701615137565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614f0e60a0830185614e8c565b8281036060840152614f208185614e8c565b838103608090940193909352508152602001949350505050565b604081526000614f4d6040830185614e8c565b8281036020840152614f5f8185614e8c565b95945050505050565b608081526000614f7b6080830187614e8c565b8281036020840152614f8d8187614e8c565b90508281036040840152614fa18186614e8c565b9150506001600160a01b038316606083015295945050505050565b6020815260008251806020840152614fdb816040850160208701615137565b601f01601f19169190910160400192915050565b8381526060602082015260006150086060830185614e8c565b90506001600160a01b0383166040830152949350505050565b868152602080820187905260a0604083018190528201859052600090869060c08401835b88811015615073578335615058816151aa565b6001600160a01b031682529282019290820190600101615045565b506001600160a01b0396909616606085015250505060800152949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156150bd576150bd615194565b604052919050565b600067ffffffffffffffff8211156150df576150df615194565b5060051b60200190565b600082198211156150fc576150fc61517e565b500190565b600081600019048311821515161561511b5761511b61517e565b500290565b6000828210156151325761513261517e565b500390565b60005b8381101561515257818101518382015260200161513a565b8381111561344c5750506000910152565b60006000198214156151775761517761517e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146128d057600080fdfea2646970667358221220c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a764736f6c63430008040033
Verified Source Code Partial Match
Compiler: v0.8.4+commit.c7e474f2
EVM: istanbul
Optimization: Yes (1000 runs)
NFTXMarketplaceZap.sol 1796 lines
// Sources flattened with hardhat v2.8.2 https://hardhat.org
// File contracts/solidity/interface/INFTXEligibility.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface INFTXEligibility {
// Read functions.
function name() external pure returns (string memory);
function finalized() external view returns (bool);
function targetAsset() external pure returns (address);
function checkAllEligible(uint256[] calldata tokenIds)
external
view
returns (bool);
function checkEligible(uint256[] calldata tokenIds)
external
view
returns (bool[] memory);
function checkAllIneligible(uint256[] calldata tokenIds)
external
view
returns (bool);
function checkIsEligible(uint256 tokenId) external view returns (bool);
// Write functions.
function __NFTXEligibility_init_bytes(bytes calldata configData) external;
function beforeMintHook(uint256[] calldata tokenIds) external;
function afterMintHook(uint256[] calldata tokenIds) external;
function beforeRedeemHook(uint256[] calldata tokenIds) external;
function afterRedeemHook(uint256[] calldata tokenIds) external;
}
// File contracts/solidity/token/IERC20Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/solidity/proxy/IBeacon.sol
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function childImplementation() external view returns (address);
function upgradeChildTo(address newImplementation) external;
}
// File contracts/solidity/interface/INFTXVaultFactory.sol
pragma solidity ^0.8.0;
interface INFTXVaultFactory is IBeacon {
// Read functions.
function numVaults() external view returns (uint256);
function zapContract() external view returns (address);
function feeDistributor() external view returns (address);
function eligibilityManager() external view returns (address);
function vault(uint256 vaultId) external view returns (address);
function allVaults() external view returns (address[] memory);
function vaultsForAsset(address asset) external view returns (address[] memory);
function isLocked(uint256 id) external view returns (bool);
function excludedFromFees(address addr) external view returns (bool);
function factoryMintFee() external view returns (uint64);
function factoryRandomRedeemFee() external view returns (uint64);
function factoryTargetRedeemFee() external view returns (uint64);
function factoryRandomSwapFee() external view returns (uint64);
function factoryTargetSwapFee() external view returns (uint64);
function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256);
event NewFeeDistributor(address oldDistributor, address newDistributor);
event NewZapContract(address oldZap, address newZap);
event FeeExclusion(address feeExcluded, bool excluded);
event NewEligibilityManager(address oldEligManager, address newEligManager);
event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress);
event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee);
event DisableVaultFees(uint256 vaultId);
event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee);
// Write functions.
function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external;
function createVault(
string calldata name,
string calldata symbol,
address _assetAddress,
bool is1155,
bool allowAllItems
) external returns (uint256);
function setFeeDistributor(address _feeDistributor) external;
function setEligibilityManager(address _eligibilityManager) external;
function setZapContract(address _zapContract) external;
function setFeeExclusion(address _excludedAddr, bool excluded) external;
function setFactoryFees(
uint256 mintFee,
uint256 randomRedeemFee,
uint256 targetRedeemFee,
uint256 randomSwapFee,
uint256 targetSwapFee
) external;
function setVaultFees(
uint256 vaultId,
uint256 mintFee,
uint256 randomRedeemFee,
uint256 targetRedeemFee,
uint256 randomSwapFee,
uint256 targetSwapFee
) external;
function disableVaultFees(uint256 vaultId) external;
}
// File contracts/solidity/interface/INFTXVault.sol
pragma solidity ^0.8.0;
interface INFTXVault is IERC20Upgradeable {
function manager() external view returns (address);
function assetAddress() external view returns (address);
function vaultFactory() external view returns (INFTXVaultFactory);
function eligibilityStorage() external view returns (INFTXEligibility);
function is1155() external view returns (bool);
function allowAllItems() external view returns (bool);
function enableMint() external view returns (bool);
function enableRandomRedeem() external view returns (bool);
function enableTargetRedeem() external view returns (bool);
function enableRandomSwap() external view returns (bool);
function enableTargetSwap() external view returns (bool);
function vaultId() external view returns (uint256);
function nftIdAt(uint256 holdingsIndex) external view returns (uint256);
function allHoldings() external view returns (uint256[] memory);
function totalHoldings() external view returns (uint256);
function mintFee() external view returns (uint256);
function randomRedeemFee() external view returns (uint256);
function targetRedeemFee() external view returns (uint256);
function randomSwapFee() external view returns (uint256);
function targetSwapFee() external view returns (uint256);
function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256);
event VaultInit(
uint256 indexed vaultId,
address assetAddress,
bool is1155,
bool allowAllItems
);
event ManagerSet(address manager);
event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr);
// event CustomEligibilityDeployed(address eligibilityAddr);
event EnableMintUpdated(bool enabled);
event EnableRandomRedeemUpdated(bool enabled);
event EnableTargetRedeemUpdated(bool enabled);
event EnableRandomSwapUpdated(bool enabled);
event EnableTargetSwapUpdated(bool enabled);
event Minted(uint256[] nftIds, uint256[] amounts, address to);
event Redeemed(uint256[] nftIds, uint256[] specificIds, address to);
event Swapped(
uint256[] nftIds,
uint256[] amounts,
uint256[] specificIds,
uint256[] redeemedIds,
address to
);
function __NFTXVault_init(
string calldata _name,
string calldata _symbol,
address _assetAddress,
bool _is1155,
bool _allowAllItems
) external;
function finalizeVault() external;
function setVaultMetadata(
string memory name_,
string memory symbol_
) external;
function setVaultFeatures(
bool _enableMint,
bool _enableRandomRedeem,
bool _enableTargetRedeem,
bool _enableRandomSwap,
bool _enableTargetSwap
) external;
function setFees(
uint256 _mintFee,
uint256 _randomRedeemFee,
uint256 _targetRedeemFee,
uint256 _randomSwapFee,
uint256 _targetSwapFee
) external;
function disableVaultFees() external;
// This function allows for an easy setup of any eligibility module contract from the EligibilityManager.
// It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow
// a similar interface.
function deployEligibilityStorage(
uint256 moduleIndex,
bytes calldata initData
) external returns (address);
// The manager has control over options like fees and features
function setManager(address _manager) external;
function mint(
uint256[] calldata tokenIds,
uint256[] calldata amounts /* ignored for ERC721 vaults */
) external returns (uint256);
function mintTo(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
address to
) external returns (uint256);
function redeem(uint256 amount, uint256[] calldata specificIds)
external
returns (uint256[] calldata);
function redeemTo(
uint256 amount,
uint256[] calldata specificIds,
address to
) external returns (uint256[] calldata);
function swap(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
uint256[] calldata specificIds
) external returns (uint256[] calldata);
function swapTo(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
uint256[] calldata specificIds,
address to
) external returns (uint256[] calldata);
function allValidNFTs(uint256[] calldata tokenIds)
external
view
returns (bool);
}
// File contracts/solidity/interface/INFTXFeeDistributor.sol
pragma solidity ^0.8.0;
interface INFTXFeeDistributor {
struct FeeReceiver {
uint256 allocPoint;
address receiver;
bool isContract;
}
function nftxVaultFactory() external returns (address);
function lpStaking() external returns (address);
function treasury() external returns (address);
function defaultTreasuryAlloc() external returns (uint256);
function defaultLPAlloc() external returns (uint256);
function allocTotal(uint256 vaultId) external returns (uint256);
function specificTreasuryAlloc(uint256 vaultId) external returns (uint256);
// Write functions.
function __FeeDistributor__init__(address _lpStaking, address _treasury) external;
function rescueTokens(address token) external;
function distribute(uint256 vaultId) external;
function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external;
function initializeVaultReceivers(uint256 _vaultId) external;
function changeMultipleReceiverAlloc(
uint256[] memory _vaultIds,
uint256[] memory _receiverIdxs,
uint256[] memory allocPoints
) external;
function changeMultipleReceiverAddress(
uint256[] memory _vaultIds,
uint256[] memory _receiverIdxs,
address[] memory addresses,
bool[] memory isContracts
) external;
function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external;
function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external;
function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external;
// Configuration functions.
function setTreasuryAddress(address _treasury) external;
function setDefaultTreasuryAlloc(uint256 _allocPoint) external;
function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external;
function setLPStakingAddress(address _lpStaking) external;
function setNFTXVaultFactory(address _factory) external;
function setDefaultLPAlloc(uint256 _allocPoint) external;
}
// File contracts/solidity/interface/INFTXLPStaking.sol
pragma solidity ^0.8.0;
interface INFTXLPStaking {
function nftxVaultFactory() external view returns (address);
function rewardDistTokenImpl() external view returns (address);
function stakingTokenProvider() external view returns (address);
function vaultToken(address _stakingToken) external view returns (address);
function stakingToken(address _vaultToken) external view returns (address);
function rewardDistributionToken(uint256 vaultId) external view returns (address);
function newRewardDistributionToken(uint256 vaultId) external view returns (address);
function oldRewardDistributionToken(uint256 vaultId) external view returns (address);
function unusedRewardDistributionToken(uint256 vaultId) external view returns (address);
function rewardDistributionTokenAddr(address stakedToken, address rewardToken) external view returns (address);
// Write functions.
function __NFTXLPStaking__init(address _stakingTokenProvider) external;
function setNFTXVaultFactory(address newFactory) external;
function setStakingTokenProvider(address newProvider) external;
function addPoolForVault(uint256 vaultId) external;
function updatePoolForVault(uint256 vaultId) external;
function updatePoolForVaults(uint256[] calldata vaultId) external;
function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool);
function deposit(uint256 vaultId, uint256 amount) external;
function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external;
function exit(uint256 vaultId, uint256 amount) external;
function rescue(uint256 vaultId) external;
function withdraw(uint256 vaultId, uint256 amount) external;
function claimRewards(uint256 vaultId) external;
}
// File contracts/solidity/interface/IUniswapV2Router01.sol
pragma solidity ^0.8.0;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)
external
pure
returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
// File contracts/solidity/interface/IERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @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[EIP 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 contracts/solidity/token/IERC1155Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
// File contracts/solidity/token/IERC721ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721ReceiverUpgradeable {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File contracts/solidity/token/ERC721HolderUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721HolderUpgradeable is IERC721ReceiverUpgradeable {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
// File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
interface IERC1155ReceiverUpgradeable is IERC165Upgradeable {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
// File contracts/solidity/util/ERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 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);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is IERC165Upgradeable {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
}
// File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId
|| super.supportsInterface(interfaceId);
}
}
// File contracts/solidity/token/ERC1155HolderUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155HolderUpgradeable is ERC1155ReceiverUpgradeable {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
// File contracts/solidity/util/Address.sol
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File contracts/solidity/util/SafeERC20Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20Upgradeable {
using Address for address;
function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/solidity/NFTXMarketplaceZap.sol
pragma solidity ^0.8.0;
// Authors: @0xKiwi_.
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
function balanceOf(address to) external view returns (uint256);
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
/**
* @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.
*
* By default, the owner account will be the one that deploys the contract. 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 {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(msg.sender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == msg.sender, "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract NFTXMarketplaceZap is Ownable, ReentrancyGuard, ERC721HolderUpgradeable, ERC1155HolderUpgradeable {
using SafeERC20Upgradeable for IERC20Upgradeable;
IWETH public immutable WETH;
INFTXLPStaking public immutable lpStaking;
INFTXVaultFactory public immutable nftxFactory;
IUniswapV2Router01 public immutable sushiRouter;
uint256 constant BASE = 1e18;
event Buy(uint256 count, uint256 ethSpent, address to);
event Sell(uint256 count, uint256 ethReceived, address to);
event Swap(uint256 count, uint256 ethSpent, address to);
constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() {
nftxFactory = INFTXVaultFactory(_nftxFactory);
lpStaking = INFTXLPStaking(INFTXFeeDistributor(INFTXVaultFactory(_nftxFactory).feeDistributor()).lpStaking());
sushiRouter = IUniswapV2Router01(_sushiRouter);
WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH());
IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).safeApprove(_sushiRouter, type(u...
// [truncated — 66500 bytes total]
Read Contract
WETH 0xad5c4648 → address
lpStaking 0x9bf1401c → address
nftxFactory 0x5ee50f88 → address
owner 0x8da5cb5b → address
supportsInterface 0x01ffc9a7 → bool
sushiRouter 0x6d13582c → address
Write Contract 16 functions
These functions modify contract state and require a wallet transaction to execute.
buyAndRedeem 0x7fc82484
uint256 vaultId
uint256 amount
uint256[] specificIds
address[] path
address to
buyAndRedeemWETH 0x4447d888
uint256 vaultId
uint256 amount
uint256[] specificIds
uint256 maxWethIn
address[] path
address to
buyAndSwap1155 0x57e836dc
uint256 vaultId
uint256[] idsIn
uint256[] amounts
uint256[] specificIds
address[] path
address to
buyAndSwap1155WETH 0x42c4ccaa
uint256 vaultId
uint256[] idsIn
uint256[] amounts
uint256[] specificIds
uint256 maxWethIn
address[] path
address to
buyAndSwap721 0x58fbdd0a
uint256 vaultId
uint256[] idsIn
uint256[] specificIds
address[] path
address to
buyAndSwap721WETH 0x5d8117a6
uint256 vaultId
uint256[] idsIn
uint256[] specificIds
uint256 maxWethIn
address[] path
address to
mintAndSell1155 0xab3a4121
uint256 vaultId
uint256[] ids
uint256[] amounts
uint256 minWethOut
address[] path
address to
mintAndSell1155WETH 0xa0271617
uint256 vaultId
uint256[] ids
uint256[] amounts
uint256 minWethOut
address[] path
address to
mintAndSell721 0x0956642b
uint256 vaultId
uint256[] ids
uint256 minEthOut
address[] path
address to
mintAndSell721WETH 0x929bf3d3
uint256 vaultId
uint256[] ids
uint256 minWethOut
address[] path
address to
onERC1155BatchReceived 0xbc197c81
address
address
uint256[]
uint256[]
bytes
returns: bytes4
onERC1155Received 0xf23a6e61
address
address
uint256
uint256
bytes
returns: bytes4
onERC721Received 0x150b7a02
address
address
uint256
bytes
returns: bytes4
renounceOwnership 0x715018a6
No parameters
rescue 0x839006f2
address token
transferOwnership 0xf2fde38b
address newOwner
Top Interactions
| Address | Txns | Sent | Received |
|---|---|---|---|
| 0x2c93110E...020f | 1 | 1 |
Recent Transactions
|
| Hash | Block | Age | From/To | Value | |
|---|---|---|---|---|---|
| 0x2dad7982...1e6267 Fail | 24,458,520 | IN | 0x2c93110E...020f | 0.003386 ETH |