Address Contract Partially Verified
Address
0x3cfF74F85CDa4739756BACD64D92A02D70Dad955
Balance
0 ETH
Nonce
1
Code Size
9739 bytes
Creator
0x166A5ABA...7d6E at tx 0xc9c044d2...eaabd4
Indexed Transactions
0
Contract Bytecode
9739 bytes
0x6080604052600436106102855760003560e01c806370a0823111610153578063b88d4fde116100cb578063e985e9c51161007f578063eff31e9e11610064578063eff31e9e146106e6578063f2fde38b146106fb578063f3b2db3f1461071b57600080fd5b8063e985e9c5146106b1578063ed6661c2146106d157600080fd5b8063cc41d795116100b0578063cc41d79514610666578063d2d65ff51461067c578063e086e5ec1461069c57600080fd5b8063b88d4fde14610626578063c87b56dd1461064657600080fd5b80638da5cb5b11610122578063963565e111610107578063963565e1146105d05780639753eac0146105f0578063a22cb4651461060657600080fd5b80638da5cb5b1461059857806395d89b41146105bb57600080fd5b806370a0823114610518578063715018a61461053857806373b2e80e1461054d5780638d859f3e1461057d57600080fd5b806342842e0e11610201578063564566a8116101b55780635b7445a51161019a5780635b7445a5146104c95780636352211e146104e35780636c0360eb1461050357600080fd5b8063564566a81461048f5780635ac103fe146104a957600080fd5b80635025b548116101e65780635025b548146104075780635312650e1461043b57806355f804b31461046f57600080fd5b806342842e0e146103c75780634f6ccce7146103e757600080fd5b806318160ddd116102585780632db115441161023d5780632db115441461037e5780632f745c591461039157806332cb6b0c146103b157600080fd5b806318160ddd1461033b57806323b872dd1461035e57600080fd5b806301ffc9a71461028a57806306fdde03146102bf578063081812fc146102e1578063095ea7b314610319575b600080fd5b34801561029657600080fd5b506102aa6102a5366004612024565b610730565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d4610801565b6040516102b69190612099565b3480156102ed57600080fd5b506103016102fc3660046120ac565b610893565b6040516001600160a01b0390911681526020016102b6565b34801561032557600080fd5b506103396103343660046120da565b6108ff565b005b34801561034757600080fd5b50600454600019015b6040519081526020016102b6565b34801561036a57600080fd5b50610339610379366004612106565b6109de565b61033961038c3660046120ac565b6109ee565b34801561039d57600080fd5b506103506103ac3660046120da565b610c49565b3480156103bd57600080fd5b506103506108ae81565b3480156103d357600080fd5b506103396103e2366004612106565b610d31565b3480156103f357600080fd5b506103506104023660046120ac565b610e31565b34801561041357600080fd5b506103017f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561044757600080fd5b506103017f000000000000000000000000f42aa99f011a1fa7cda90e5e98b277e306bca83e81565b34801561047b57600080fd5b5061033961048a366004612147565b610e7c565b34801561049b57600080fd5b506008546102aa9060ff1681565b3480156104b557600080fd5b506103396104c43660046121ce565b610ee8565b3480156104d557600080fd5b506005546102aa9060ff1681565b3480156104ef57600080fd5b506103016104fe3660046120ac565b610f5b565b34801561050f57600080fd5b506102d4610ff0565b34801561052457600080fd5b506103506105333660046121e9565b61107e565b34801561054457600080fd5b5061033961111c565b34801561055957600080fd5b506102aa6105683660046121e9565b60096020526000908152604090205460ff1681565b34801561058957600080fd5b5061035066470de4df82000081565b3480156105a457600080fd5b5060055461010090046001600160a01b0316610301565b3480156105c757600080fd5b506102d4611188565b3480156105dc57600080fd5b506103396105eb366004612252565b611197565b3480156105fc57600080fd5b5061035061089881565b34801561061257600080fd5b506103396106213660046122be565b61137a565b34801561063257600080fd5b50610339610641366004612309565b6113e6565b34801561065257600080fd5b506102d46106613660046120ac565b6114d8565b34801561067257600080fd5b5061035060065481565b34801561068857600080fd5b506103396106973660046121ce565b611602565b3480156106a857600080fd5b50610339611675565b3480156106bd57600080fd5b506102aa6106cc3660046123e9565b6116df565b3480156106dd57600080fd5b50610350609681565b3480156106f257600080fd5b50610350601681565b34801561070757600080fd5b506103396107163660046121e9565b6116eb565b34801561072757600080fd5b50610350601481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061079357507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806107c757507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806107fb57507f780e9d63000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606000805461081090612422565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90612422565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b5050505050905090565b600061089e826117d3565b6108e35760405162461bcd60e51b81526020600482015260116024820152702727a722ac24a9aa22a72a2faa27a5a2a760791b60448201526064015b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b600061090a82610f5b565b905061091681336116df565b806109295750336001600160a01b038216145b6109755760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016108da565b600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6109e98383836117e7565b505050565b60085460ff16610a405760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f7420616374697665000000000000000000000000000060448201526064016108da565b333214610a8f5760405162461bcd60e51b815260206004820152601460248201527f4e6f20636f6e74726163747320616c6c6f77656400000000000000000000000060448201526064016108da565b6000610a9e6004546000190190565b90506096811015610b34573360009081526009602052604090205460ff1615610b095760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636c61696d6564000000000000000000000000000000000060448201526064016108da565b336000818152600960205260409020805460ff19166001908117909155610b309190611a60565b5050565b610b458266470de4df820000612473565b3414610b935760405162461bcd60e51b815260206004820152601260248201527f57726f6e6720657468657220616d6f756e74000000000000000000000000000060448201526064016108da565b6014821115610be45760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473207478206c696d697400000000000000000060448201526064016108da565b610898610bf18383612492565b1115610c3f5760405162461bcd60e51b815260206004820152601960248201527f4d6178207075626c696320737570706c7920726561636865640000000000000060448201526064016108da565b610b303383611a60565b6000610c548361107e565b8210610c925760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be929c888ab609b1b60448201526064016108da565b600454600090815b81811015610ce557610cab81610f5b565b6001600160a01b0316866001600160a01b03161415610cdd5784831415610cd65792506107fb915050565b6001909201915b600101610c9a565b505060405162461bcd60e51b815260206004820152600960248201527f4e4f545f464f554e440000000000000000000000000000000000000000000000604482015260640190506108da565b610d3c8383836117e7565b6001600160a01b0382163b1580610de55750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd991906124aa565b6001600160e01b031916145b6109e95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016108da565b6000610e3c826117d3565b610e785760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be929c888ab609b1b60448201526064016108da565b5090565b6005546001600160a01b03610100909104163314610edc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6109e960078383611f7e565b6005546001600160a01b03610100909104163314610f485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6005805460ff1916911515919091179055565b6000610f66826117d3565b610fa65760405162461bcd60e51b81526020600482015260116024820152702727a722ac24a9aa22a72a2faa27a5a2a760791b60448201526064016108da565b815b60048181548110610fbb57610fbb6124c7565b6000918252602090912001546001600160a01b031691508115610fde5750919050565b80610fe8816124dd565b915050610fa8565b60078054610ffd90612422565b80601f016020809104026020016040519081016040528092919081815260200182805461102990612422565b80156110765780601f1061104b57610100808354040283529160200191611076565b820191906000526020600020905b81548152906001019060200180831161105957829003601f168201915b505050505081565b60006001600160a01b0382166110d65760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49445f4f574e45520000000000000000000000000000000000000060448201526064016108da565b60045460015b81811015611115576110ed81610f5b565b6001600160a01b0316846001600160a01b0316141561110d576001909201915b6001016110dc565b5050919050565b6005546001600160a01b0361010090910416331461117c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6111866000611bf2565b565b60606001805461081090612422565b6005546001600160a01b036101009091041633146111f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b600083815b818110156112ba576000878783818110611218576112186124c7565b905060200201602081019061122d91906121e9565b90506001600160a01b0381166112855760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726563697069656e7400000000000000000000000000000060448201526064016108da565b6000868684818110611299576112996124c7565b9050602002013590506112ac8282611a60565b9390930192506001016111fc565b5060065482016108ae6112d06004546000190190565b111561131e5760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c792072656163686564000000000000000000000000000060448201526064016108da565b601681111561136f5760405162461bcd60e51b815260206004820152601c60248201527f416d6f756e7420657863656564732072657365727665206c696d69740000000060448201526064016108da565b600655505050505050565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113f18484846117e7565b6001600160a01b0383163b15806114865750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a02906114379033908990889088906004016124f8565b6020604051808303816000875af1158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a91906124aa565b6001600160e01b031916145b6114d25760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016108da565b50505050565b60606114e3826117d3565b6115235760405162461bcd60e51b81526020600482015260116024820152702727a722ac24a9aa22a72a2faa27a5a2a760791b60448201526064016108da565b60006007805461153290612422565b80601f016020809104026020016040519081016040528092919081815260200182805461155e90612422565b80156115ab5780601f10611580576101008083540402835291602001916115ab565b820191906000526020600020905b81548152906001019060200180831161158e57829003601f168201915b5050505050905080516000146115ea57806115c584611c63565b6040516020016115d6929190612534565b6040516020818303038152906040526115fb565b604051806020016040528060008152505b9392505050565b6005546001600160a01b036101009091041633146116625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6008805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146116d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6111863347611d9d565b60006115fb8383611e40565b6005546001600160a01b0361010090910416331461174b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108da565b6001600160a01b0381166117c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108da565b6117d081611bf2565b50565b600081158015906107fb5750506004541190565b826001600160a01b03166117fa82610f5b565b6001600160a01b0316146118505760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016108da565b6001600160a01b0382166118a65760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016108da565b336001600160a01b03841614806118cd5750336118c282610893565b6001600160a01b0316145b806118dd57506118dd83336116df565b6119295760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016108da565b6000818152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff191690556004805483919083908110611969576119696124c7565b60009182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039390931692909217909155600480546000198401929190839081106119bb576119bb6124c7565b6000918252602090912001546001600160a01b03161415611a195783600482815481106119ea576119ea6124c7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001600160a01b038216611ab65760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016108da565b80611b035760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f414d4f554e5400000000000000000000000000000000000060448201526064016108da565b60045460005b60018303811015611b61576004805460010181556000908152604051838301916001600160a01b038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101611b09565b506004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386169081179091556040516000198585010192907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b600580546001600160a01b038381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081611ca357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ccd5780611cb7816124dd565b9150611cc69050600a83612579565b9150611ca7565b60008167ffffffffffffffff811115611ce857611ce86122f3565b6040519080825280601f01601f191660200182016040528015611d12576020820181803683370190505b5090505b8415611d9557611d2760018361258d565b9150611d34600a866125a4565b611d3f906030612492565b60f81b818381518110611d5457611d546124c7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d8e600a86612579565b9450611d16565b949350505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dea576040519150601f19603f3d011682016040523d82523d6000602084013e611def565b606091505b50509050806109e95760405162461bcd60e51b815260206004820152601360248201527f455448207472616e73666572206661696c65640000000000000000000000000060448201526064016108da565b60055460009060ff168015611f4357506040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1169063c455279190602401602060405180830381865afa158015611ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef391906125b8565b6001600160a01b0316826001600160a01b03161480611f4357507f000000000000000000000000f42aa99f011a1fa7cda90e5e98b277e306bca83e6001600160a01b0316826001600160a01b0316145b15611f50575060016107fb565b6001600160a01b0380841660009081526003602090815260408083209386168352929052205460ff166115fb565b828054611f8a90612422565b90600052602060002090601f016020900481019282611fac5760008555611ff2565b82601f10611fc55782800160ff19823516178555611ff2565b82800160010185558215611ff2579182015b82811115611ff2578235825591602001919060010190611fd7565b50610e789291505b80821115610e785760008155600101611ffa565b6001600160e01b0319811681146117d057600080fd5b60006020828403121561203657600080fd5b81356115fb8161200e565b60005b8381101561205c578181015183820152602001612044565b838111156114d25750506000910152565b60008151808452612085816020860160208601612041565b601f01601f19169290920160200192915050565b6020815260006115fb602083018461206d565b6000602082840312156120be57600080fd5b5035919050565b6001600160a01b03811681146117d057600080fd5b600080604083850312156120ed57600080fd5b82356120f8816120c5565b946020939093013593505050565b60008060006060848603121561211b57600080fd5b8335612126816120c5565b92506020840135612136816120c5565b929592945050506040919091013590565b6000806020838503121561215a57600080fd5b823567ffffffffffffffff8082111561217257600080fd5b818501915085601f83011261218657600080fd5b81358181111561219557600080fd5b8660208285010111156121a757600080fd5b60209290920196919550909350505050565b803580151581146121c957600080fd5b919050565b6000602082840312156121e057600080fd5b6115fb826121b9565b6000602082840312156121fb57600080fd5b81356115fb816120c5565b60008083601f84011261221857600080fd5b50813567ffffffffffffffff81111561223057600080fd5b6020830191508360208260051b850101111561224b57600080fd5b9250929050565b6000806000806040858703121561226857600080fd5b843567ffffffffffffffff8082111561228057600080fd5b61228c88838901612206565b909650945060208701359150808211156122a557600080fd5b506122b287828801612206565b95989497509550505050565b600080604083850312156122d157600080fd5b82356122dc816120c5565b91506122ea602084016121b9565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561231f57600080fd5b843561232a816120c5565b9350602085013561233a816120c5565b925060408501359150606085013567ffffffffffffffff8082111561235e57600080fd5b818701915087601f83011261237257600080fd5b813581811115612384576123846122f3565b604051601f8201601f19908116603f011681019083821181831017156123ac576123ac6122f3565b816040528281528a60208487010111156123c557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156123fc57600080fd5b8235612407816120c5565b91506020830135612417816120c5565b809150509250929050565b600181811c9082168061243657607f821691505b6020821081141561245757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561248d5761248d61245d565b500290565b600082198211156124a5576124a561245d565b500190565b6000602082840312156124bc57600080fd5b81516115fb8161200e565b634e487b7160e01b600052603260045260246000fd5b60006000198214156124f1576124f161245d565b5060010190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261252a608083018461206d565b9695505050505050565b60008351612546818460208801612041565b83519083019061255a818360208801612041565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b60008261258857612588612563565b500490565b60008282101561259f5761259f61245d565b500390565b6000826125b3576125b3612563565b500690565b6000602082840312156125ca57600080fd5b81516115fb816120c556fea2646970667358221220bcc9d19db706e10e4c971dbc80d95d4b2226e0437a46b8b4dd7b99e1ed154cca64736f6c634300080b0033
Verified Source Code Partial Match
Compiler: v0.8.11+commit.d7f03943
EVM: london
Optimization: Yes (1000 runs)
Bendys.sol 814 lines
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @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;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @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 is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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() == _msgSender(), "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 {
_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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_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: ERC721/ERC721TokenReceiver.sol
pragma solidity ^0.8.0;
/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
function onERC721Received(
address operator,
address from,
uint256 id,
bytes calldata data
) external returns (bytes4);
}
// File: ERC721/ERC721.sol
pragma solidity ^0.8.0;
abstract contract ERC721 {
/* -------------------------------------------------------------------------- */
/* EVENTS */
/* -------------------------------------------------------------------------- */
/// @dev Emitted when `id` token is transferred from `from` to `to`.
event Transfer(address indexed from, address indexed to, uint256 indexed id);
/// @dev Emitted when `owner` enables `approved` to manage the `id` token.
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
/// @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);
/* -------------------------------------------------------------------------- */
/* METADATA STORAGE */
/* -------------------------------------------------------------------------- */
/// @dev The collection name.
string private _name;
/// @dev The collection symbol.
string private _symbol;
/* -------------------------------------------------------------------------- */
/* ERC721 STORAGE */
/* -------------------------------------------------------------------------- */
/// @dev ID => spender
mapping(uint256 => address) internal _tokenApprovals;
/// @dev owner => operator => approved
mapping(address => mapping(address => bool)) internal _operatorApprovals;
/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */
/// @param name_ The collection name.
/// @param symbol_ The collection symbol.
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/* -------------------------------------------------------------------------- */
/* ERC165 LOGIC */
/* -------------------------------------------------------------------------- */
/// @notice Returns true if this contract implements an interface from its ID.
/// @dev 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.
/// @return The implementation status.
function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC721Metadata
interfaceId == 0x780e9d63; // ERC165 Interface ID for ERC721Enumerable
}
/* -------------------------------------------------------------------------- */
/* METADATA LOGIC */
/* -------------------------------------------------------------------------- */
/// @notice Returns the collection name.
/// @return The collection name.
function name() public view virtual returns (string memory) {
return _name;
}
/// @notice Returns the collection symbol.
/// @return The collection symbol.
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/// @notice Returns the Uniform Resource Identifier (URI) for `id` token.
/// @param id The token ID.
/// @return The URI.
function tokenURI(uint256 id) public view virtual returns (string memory);
/* -------------------------------------------------------------------------- */
/* ENUMERABLE LOGIC */
/* -------------------------------------------------------------------------- */
/// @notice Returns the total amount of tokens stored by the contract.
/// @return The token supply.
function totalSupply() public view virtual returns (uint256);
/// @notice Returns a token ID owned by `owner` at a given `index` of its token list.
/// @dev Use along with {balanceOf} to enumerate all of `owner`'s tokens.
/// @param owner The address to query.
/// @param index The index to query.
/// @return The token ID.
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256);
/// @notice Returns a token ID at a given `index` of all the tokens stored by the contract.
/// @dev Use along with {totalSupply} to enumerate all tokens.
/// @param index The index to query.
/// @return The token ID.
function tokenByIndex(uint256 index) public view virtual returns (uint256);
/* -------------------------------------------------------------------------- */
/* ERC721 LOGIC */
/* -------------------------------------------------------------------------- */
/// @notice Returns the account approved for a token ID.
/// @dev Requirements:
/// - `id` must exist.
/// @param id Token ID to query.
/// @return The account approved for `id` token.
function getApproved(uint256 id) public virtual returns (address) {
require(_exists(id), "NONEXISTENT_TOKEN");
return _tokenApprovals[id];
}
/// @notice Returns if the `operator` is allowed to manage all of the assets of `owner`.
/// @param owner The address of the owner.
/// @param operator The address of the operator.
/// @return True if `operator` was approved by `owner`.
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/// @notice Gives permission to `to` to transfer `id` token to another account.
/// @dev 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.
/// - `id` must exist.
/// Emits an {Approval} event.
/// @param spender The address of the spender to approve to.
/// @param id The token ID to approve.
function approve(address spender, uint256 id) public virtual {
address owner = ownerOf(id);
require(isApprovedForAll(owner, msg.sender) || msg.sender == owner, "NOT_AUTHORIZED");
_tokenApprovals[id] = spender;
emit Approval(owner, spender, id);
}
/// @notice Approve or remove `operator` as an operator for the caller.
/// @dev Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
/// Emits an {ApprovalForAll} event.
/// @param operator The address of the operator to approve.
/// @param approved The status to set.
function setApprovalForAll(address operator, bool approved) public virtual {
_operatorApprovals[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
/// @notice Transfers `id` token from `from` to `to`.
/// WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
/// @dev Requirements:
/// - `to` cannot be the zero address.
/// - `id` 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.
/// @param from The address to transfer from.
/// @param to The address to transfer to.
/// @param id The token ID to transfer.
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
_transfer(from, to, id);
}
/// @notice Safely transfers `id` token from `from` to `to`.
/// @dev Requirements:
/// - `to` cannot be the zero address.
/// - `id` token must exist and be owned by `from`.
/// - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
/// - If `to` refers to a smart contract, it must implement {ERC721TokenReceiver-onERC721Received}, which is called upon a safe transfer.
/// Emits a {Transfer} event.
/// @param from The address to transfer from.
/// @param to The address to transfer to.
/// @param id The token ID to transfer.
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
_transfer(from, to, id);
require(to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT");
}
/// @notice Safely transfers `id` token from `from` to `to`.
/// @dev Requirements:
/// - `to` cannot be the zero address.
/// - `id` token must exist and be owned by `from`.
/// - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
/// - If `to` refers to a smart contract, it must implement {ERC721TokenReceiver-onERC721Received}, which is called upon a safe transfer.
/// Emits a {Transfer} event.
/// Additionally passes `data` in the callback.
/// @param from The address to transfer from.
/// @param to The address to transfer to.
/// @param id The token ID to transfer.
/// @param data The calldata to pass in the {ERC721TokenReceiver-onERC721Received} callback.
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes memory data
) public virtual {
_transfer(from, to, id);
require(to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT");
}
/// @notice Returns the number of tokens in an account.
/// @param owner The address to query.
/// @return The balance.
function balanceOf(address owner) public view virtual returns (uint256);
/// @notice Returns the owner of a token ID.
/// @dev Requirements:
/// - `id` must exist.
/// @param id The token ID.
function ownerOf(uint256 id) public view virtual returns (address);
/* -------------------------------------------------------------------------- */
/* INTERNAL LOGIC */
/* -------------------------------------------------------------------------- */
/// @dev Returns whether a token ID exists.
/// Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
/// Tokens start existing when they are minted.
/// @param id Token ID to query.
function _exists(uint256 id) internal view virtual returns (bool);
/// @dev Transfers `id` from `from` to `to`.
/// Requirements:
/// - `to` cannot be the zero address.
/// - `id` token must be owned by `from`.
/// Emits a {Transfer} event.
/// @param from The address to transfer from.
/// @param to The address to transfer to.
/// @param id The token ID to transfer.
function _transfer(
address from,
address to,
uint256 id
) internal virtual;
/// @dev Mints `amount` tokens to `to`.
/// Requirements:
/// - there must be `amount` tokens remaining unminted in the total collection.
/// - `to` cannot be the zero address.
/// Emits `amount` {Transfer} events.
/// @param to The address to mint to.
/// @param amount The amount of tokens to mint.
function _mint(address to, uint256 amount) internal virtual;
/// @dev Safely mints `amount` of tokens and transfers them to `to`.
/// If `to` is a contract it must implement {ERC721TokenReceiver.onERC721Received}
/// that returns {ERC721TokenReceiver.onERC721Received.selector}.
/// @param to The address to mint to.
/// @param amount The amount of tokens to mint.
function _safeMint(address to, uint256 amount) internal virtual {
_mint(to, amount);
require(to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(address(0), to, totalSupply() - amount + 1, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT");
}
/// @dev Safely mints `amount` of tokens and transfers them to `to`.
/// Requirements:
/// - `id` must not exist.
/// - If `to` refers to a smart contract, it must implement {ERC721TokenReceiver.onERC721Received}, which is called upon a safe transfer.
/// Additionally passes `data` in the callback.
/// @param to The address to mint to.
/// @param amount The amount of tokens to mint.
/// @param data The calldata to pass in the {ERC721TokenReceiver.onERC721Received} callback.
function _safeMint(
address to,
uint256 amount,
bytes memory data
) internal virtual {
_mint(to, amount);
require(to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(address(0), to, totalSupply() - amount + 1, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT");
}
/* -------------------------------------------------------------------------- */
/* UTILS */
/* -------------------------------------------------------------------------- */
/// @notice Converts a `uint256` to its ASCII `string` decimal representation.
/// @dev https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol
function toString(uint256 value) internal pure virtual returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
}
// File: ERC721/extensions/ERC721Tradable.sol
pragma solidity ^0.8.0;
/// @notice An interface for the OpenSea Proxy Registry.
interface IProxyRegistry {
function proxies(address) external view returns (address);
}
abstract contract ERC721Tradable is ERC721 {
/* -------------------------------------------------------------------------- */
/* IMMUTABLE STORAGE */
/* -------------------------------------------------------------------------- */
/// @notice The OpenSea Proxy Registry address.
address public immutable openSeaProxyRegistry;
/// @notice The LooksRare Transfer Manager (ERC721) address.
address public immutable looksRareTransferManager;
/* -------------------------------------------------------------------------- */
/* MUTABLE STORAGE */
/* -------------------------------------------------------------------------- */
/// @notice Returns true if the stored marketplace addresses are whitelisted in {isApprovedForAll}.
/// @dev Enabled by default. Can be turned off with {setMarketplaceApprovalForAll}.
bool public marketPlaceApprovalForAll = true;
/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */
/// OpenSea proxy registry addresses:
/// - ETHEREUM MAINNET: 0xa5409ec958C83C3f309868babACA7c86DCB077c1
/// - ETHEREUM RINKEBY: 0xF57B2c51dED3A29e6891aba85459d600256Cf317
/// LooksRare Transfer Manager addresses (https://docs.looksrare.org/developers/deployed-contract-addresses):
/// - ETHEREUM MAINNET: 0xf42aa99F011A1fA7CDA90E5E98b277E306BcA83e
/// - ETHEREUM RINKEBY: 0x3f65A762F15D01809cDC6B43d8849fF24949c86a
/// @param _openSeaProxyRegistry The OpenSea proxy registry address.
constructor(address _openSeaProxyRegistry, address _looksRareTransferManager) {
require(_openSeaProxyRegistry != address(0) && _looksRareTransferManager != address(0), "INVALID_ADDRESS");
openSeaProxyRegistry = _openSeaProxyRegistry;
looksRareTransferManager = _looksRareTransferManager;
}
/* -------------------------------------------------------------------------- */
/* ERC721ATradable LOGIC */
/* -------------------------------------------------------------------------- */
/// @notice Enables or disables the marketplace whitelist in {isApprovedForAll}.
/// @dev Must be implemented in inheriting contracts.
/// Recommended to use in combination with an access control contract (e.g. OpenZeppelin's Ownable).
function setMarketplaceApprovalForAll(bool approved) public virtual;
/// @return True if `operator` is a whitelisted marketplace contract or if it was approved by `owner` with {ERC721A.setApprovalForAll}.
/// @inheritdoc ERC721
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
if (marketPlaceApprovalForAll && (operator == IProxyRegistry(openSeaProxyRegistry).proxies(owner) || operator == looksRareTransferManager)) return true;
return super.isApprovedForAll(owner, operator);
}
}
// File: ERC721/ERC721M.sol
pragma solidity ^0.8.0;
abstract contract ERC721M is ERC721 {
/* -------------------------------------------------------------------------- */
/* ERC721M STORAGE */
/* -------------------------------------------------------------------------- */
/// @dev The index is the token ID counter and points to its owner.
address[] internal _owners;
/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */
constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {
// Initializes the index to 1.
_owners.push();
}
/* -------------------------------------------------------------------------- */
/* ENUMERABLE LOGIC */
/* -------------------------------------------------------------------------- */
/// @inheritdoc ERC721
function totalSupply() public view override returns (uint256) {
// Overflow is impossible as _owners.length is initialized to 1.
unchecked {
return _owners.length - 1;
}
}
/// @dev O(totalSupply), it is discouraged to call this function from other contracts
/// as it can become very expensive, especially with higher total collection sizes.
/// @inheritdoc ERC721
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < balanceOf(owner), "INVALID_INDEX");
// Both of the counters cannot overflow because the loop breaks before that.
unchecked {
uint256 count;
uint256 _currentIndex = _owners.length; // == totalSupply() + 1 == _owners.length - 1 + 1
for (uint256 i; i < _currentIndex; i++) {
if (owner == ownerOf(i)) {
if (count == index) return i;
else count++;
}
}
}
revert("NOT_FOUND");
}
/// @inheritdoc ERC721
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(_exists(index), "INVALID_INDEX");
return index;
}
/* -------------------------------------------------------------------------- */
/* ERC721 LOGIC */
/* -------------------------------------------------------------------------- */
/// @dev O(totalSupply), it is discouraged to call this function from other contracts
/// as it can become very expensive, especially with higher total collection sizes.
/// @inheritdoc ERC721
function balanceOf(address owner) public view virtual override returns (uint256 balance) {
require(owner != address(0), "INVALID_OWNER");
unchecked {
// Start at 1 since token 0 does not exist
uint256 _currentIndex = _owners.length; // == totalSupply() + 1 == _owners.length - 1 + 1
for (uint256 i = 1; i < _currentIndex; i++) {
if (owner == ownerOf(i)) {
balance++;
}
}
}
}
/// @dev O(MAX_TX), gradually moves to O(1) as more tokens get transferred and
/// the owners are explicitly set.
/// @inheritdoc ERC721
function ownerOf(uint256 id) public view virtual override returns (address owner) {
require(_exists(id), "NONEXISTENT_TOKEN");
for (uint256 i = id; ; i++) {
owner = _owners[i];
if (owner != address(0)) {
return owner;
}
}
}
/* -------------------------------------------------------------------------- */
/* INTERNAL LOGIC */
/* -------------------------------------------------------------------------- */
/// @inheritdoc ERC721
function _mint(address to, uint256 amount) internal virtual override {
require(to != address(0), "INVALID_RECIPIENT");
require(amount != 0, "INVALID_AMOUNT");
unchecked {
uint256 _currentIndex = _owners.length; // == totalSupply() + 1 == _owners.length - 1 + 1
for (uint256 i; i < amount - 1; i++) {
// storing address(0) while also incrementing the index
_owners.push();
emit Transfer(address(0), to, _currentIndex + i);
}
// storing the actual owner
_owners.push(to);
emit Transfer(address(0), to, _currentIndex + (amount - 1));
}
}
/// @inheritdoc ERC721
function _exists(uint256 id) internal view virtual override returns (bool) {
return id != 0 && id < _owners.length;
}
/// @inheritdoc ERC721
function _transfer(
address from,
address to,
uint256 id
) internal virtual override {
require(ownerOf(id) == from, "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(msg.sender == from || getApproved(id) == msg.sender || isApprovedForAll(from, msg.sender), "NOT_AUTHORIZED");
delete _tokenApprovals[id];
_owners[id] = to;
unchecked {
uint256 prevId = id - 1;
if (_owners[prevId] == address(0)) {
_owners[prevId] = from;
}
}
emit Transfer(from, to, id);
}
}
// File: Bendys.sol
pragma solidity ^0.8.0;
contract Bendys is ERC721M, ERC721Tradable, Ownable {
uint256 public constant PRICE = 0.02 ether;
uint256 public constant MAX_SUPPLY = 2222;
uint256 public constant MAX_RESERVE = 22;
uint256 public constant MAX_PUBLIC = 2200; // MAX_SUPPLY - MAX_RESERVE
uint256 public constant MAX_FREE = 150;
uint256 public constant MAX_TX = 20;
uint256 public reservesMinted;
string public baseURI;
bool public isSaleActive;
mapping (address => bool) public hasClaimed;
/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */
constructor(
address _openSeaProxyRegistry,
address _looksRareTransferManager,
string memory _baseURI
) payable ERC721M("Bendys", "BENDYS") ERC721Tradable(_openSeaProxyRegistry, _looksRareTransferManager) {
baseURI = _baseURI;
}
/* -------------------------------------------------------------------------- */
/* USER */
/* -------------------------------------------------------------------------- */
/// @notice Mints an amount of tokens and transfers them to the caller during the public sale.
/// @param amount The amount of tokens to mint.
function publicMint(uint256 amount) external payable {
require(isSaleActive, "Sale is not active");
require(msg.sender == tx.origin, "No contracts allowed");
uint256 _totalSupply = totalSupply();
if (_totalSupply < MAX_FREE) {
require(!hasClaimed[msg.sender], "Already claimed");
hasClaimed[msg.sender] = true;
_mint(msg.sender, 1);
return;
}
require(msg.value == PRICE * amount, "Wrong ether amount");
require(amount <= MAX_TX, "Amount exceeds tx limit");
require(_totalSupply + amount <= MAX_PUBLIC, "Max public supply reached");
_mint(msg.sender, amount);
}
/* -------------------------------------------------------------------------- */
/* OWNER */
/* -------------------------------------------------------------------------- */
/// @notice Enables or disables minting through {publicMint}.
/// @dev Requirements:
/// - Caller must be the owner.
function setIsSaleActive(bool _isSaleActive) external onlyOwner {
isSaleActive = _isSaleActive;
}
/// @notice Mints tokens to multiple addresses.
/// @dev Requirements:
/// - Caller must be the owner.
/// @param recipients The addresses to mint the tokens to.
/// @param amounts The amounts of tokens to mint.
function reserveMint(address[] calldata recipients, uint256[] calldata amounts) external onlyOwner {
unchecked {
uint256 sum;
uint256 length = recipients.length;
for (uint256 i; i < length; i++) {
address to = recipients[i];
require(to != address(0), "Invalid recipient");
uint256 amount = amounts[i];
_mint(to, amount);
sum += amount;
}
uint256 totalReserves = reservesMinted + sum;
require(totalSupply() <= MAX_SUPPLY, "Max supply reached");
require(totalReserves <= MAX_RESERVE, "Amount exceeds reserve limit");
reservesMinted = totalReserves;
}
}
/// @notice Sets the base Uniform Resource Identifier (URI) for token metadata.
/// @dev Requirements:
/// - Caller must be the owner.
/// @param _baseURI The base URI.
function setBaseURI(string calldata _baseURI) external onlyOwner {
baseURI = _baseURI;
}
/// @notice Withdraws all contract balance to the caller.
/// @dev Requirements:
/// - Caller must be the owner.
function withdrawETH() external onlyOwner {
_transferETH(msg.sender, address(this).balance);
}
/// @dev Requirements:
/// - Caller must be the owner.
/// @inheritdoc ERC721Tradable
function setMarketplaceApprovalForAll(bool approved) public override onlyOwner {
marketPlaceApprovalForAll = approved;
}
/* -------------------------------------------------------------------------- */
/* SOLIDITY OVERRIDES */
/* -------------------------------------------------------------------------- */
/// @inheritdoc ERC721
function tokenURI(uint256 id) public view override returns (string memory) {
require(_exists(id), "NONEXISTENT_TOKEN");
string memory _baseURI = baseURI;
return bytes(_baseURI).length == 0 ? "" : string(abi.encodePacked(_baseURI, toString(id)));
}
/// @inheritdoc ERC721Tradable
function isApprovedForAll(address owner, address operator) public view override(ERC721, ERC721Tradable) returns (bool) {
return ERC721Tradable.isApprovedForAll(owner, operator);
}
/* -------------------------------------------------------------------------- */
/* UTILS */
/* -------------------------------------------------------------------------- */
function _transferETH(address to, uint256 value) internal {
// solhint-disable-next-line avoid-low-level-calls
(bool success, ) = to.call{ value: value }("");
require(success, "ETH transfer failed");
}
}
Read Contract
MAX_FREE 0xed6661c2 → uint256
MAX_PUBLIC 0x9753eac0 → uint256
MAX_RESERVE 0xeff31e9e → uint256
MAX_SUPPLY 0x32cb6b0c → uint256
MAX_TX 0xf3b2db3f → uint256
PRICE 0x8d859f3e → uint256
balanceOf 0x70a08231 → uint256
baseURI 0x6c0360eb → string
hasClaimed 0x73b2e80e → bool
isApprovedForAll 0xe985e9c5 → bool
isSaleActive 0x564566a8 → bool
looksRareTransferManager 0x5312650e → address
marketPlaceApprovalForAll 0x5b7445a5 → bool
name 0x06fdde03 → string
openSeaProxyRegistry 0x5025b548 → address
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
reservesMinted 0xcc41d795 → uint256
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenByIndex 0x4f6ccce7 → uint256
tokenOfOwnerByIndex 0x2f745c59 → uint256
tokenURI 0xc87b56dd → string
totalSupply 0x18160ddd → uint256
Write Contract 14 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 id
getApproved 0x081812fc
uint256 id
returns: address
publicMint 0x2db11544
uint256 amount
renounceOwnership 0x715018a6
No parameters
reserveMint 0x963565e1
address[] recipients
uint256[] amounts
safeTransferFrom 0x42842e0e
address from
address to
uint256 id
safeTransferFrom 0xb88d4fde
address from
address to
uint256 id
bytes data
setApprovalForAll 0xa22cb465
address operator
bool approved
setBaseURI 0x55f804b3
string _baseURI
setIsSaleActive 0xd2d65ff5
bool _isSaleActive
setMarketplaceApprovalForAll 0x5ac103fe
bool approved
transferFrom 0x23b872dd
address from
address to
uint256 id
transferOwnership 0xf2fde38b
address newOwner
withdrawETH 0xe086e5ec
No parameters
Recent Transactions
No transactions found for this address