Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x478059f577Cb739f0AF0f37A365DD069Ba5BD8Be
Balance 0 ETH
Nonce 1
Code Size 14004 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14004 bytes
0x6080604052600436106102345760003560e01c80636352211e1161012e578063b88d4fde116100ab578063dd48f7741161006f578063dd48f77414610c0c578063e66075c214610c47578063e985e9c514610c5c578063f01fe69214610c97578063f93ce63a14610cd057610270565b8063b88d4fde14610ab4578063c1bd8cf914610b85578063c87b56dd14610b9a578063c8c2ed5414610bc4578063d0763c9514610bd957610270565b806377dc4159116100f257806377dc41591461098557806382bc590f146109af5780638e8fa11f146109d957806395d89b4114610a64578063a22cb46514610a7957610270565b80636352211e1461081a57806368f2cd31146108445780636c0360eb1461087757806370a082311461088c57806371f03793146108bf57610270565b806318160ddd116101bc5780634f558e79116101805780634f558e791461062d5780634f6ccce71461065757806353a1397c1461068157806355f804b3146106b45780635ba13abf1461076557610270565b806318160ddd1461050c57806323b872dd146105335780632f745c591461057657806342842e0e146105af5780634707d000146105f257610270565b806306fdde031161020357806306fdde031461032d578063081812fc146103b7578063095ea7b3146103e15780630ae3ec681461041c5780630f5746251461044657610270565b8063017e97bc1461027557806301ffc9a7146102a6578063042c4e87146102ee57806305d2035b1461031857610270565b366102705760405162461bcd60e51b81526004018080602001828103825260298152602001806132316029913960400191505060405180910390fd5b600080fd5b34801561028157600080fd5b5061028a610d03565b604080516001600160a01b039092168252519081900360200190f35b3480156102b257600080fd5b506102da600480360360208110156102c957600080fd5b50356001600160e01b031916610d12565b604080519115158252519081900360200190f35b3480156102fa57600080fd5b506102da6004803603602081101561031157600080fd5b5035610d35565b34801561032457600080fd5b506102da610df3565b34801561033957600080fd5b50610342610e26565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037c578181015183820152602001610364565b50505050905090810190601f1680156103a95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103c357600080fd5b5061028a600480360360208110156103da57600080fd5b5035610ebc565b3480156103ed57600080fd5b5061041a6004803603604081101561040457600080fd5b506001600160a01b038135169060200135610f1e565b005b34801561042857600080fd5b506102da6004803603602081101561043f57600080fd5b5035610ff9565b34801561045257600080fd5b5061041a6004803603606081101561046957600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561049857600080fd5b8201836020820111156104aa57600080fd5b803590602001918460018302840111600160201b831117156104cb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611083945050505050565b34801561051857600080fd5b5061052161111d565b60408051918252519081900360200190f35b34801561053f57600080fd5b5061041a6004803603606081101561055657600080fd5b506001600160a01b03813581169160208101359091169060400135611141565b34801561058257600080fd5b506105216004803603604081101561059957600080fd5b506001600160a01b038135169060200135611198565b3480156105bb57600080fd5b5061041a600480360360608110156105d257600080fd5b506001600160a01b038135811691602081013590911690604001356111c7565b3480156105fe57600080fd5b5061041a6004803603604081101561061557600080fd5b506001600160a01b03813581169160200135166111e2565b34801561063957600080fd5b506102da6004803603602081101561065057600080fd5b5035611327565b34801561066357600080fd5b506105216004803603602081101561067a57600080fd5b5035611332565b34801561068d57600080fd5b50610521600480360360208110156106a457600080fd5b50356001600160a01b031661134e565b3480156106c057600080fd5b5061041a600480360360208110156106d757600080fd5b810190602081018135600160201b8111156106f157600080fd5b82018360208201111561070357600080fd5b803590602001918460018302840111600160201b8311171561072457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611360945050505050565b34801561077157600080fd5b5061041a6004803603604081101561078857600080fd5b81359190810190604081016020820135600160201b8111156107a957600080fd5b8201836020820111156107bb57600080fd5b803590602001918460208302840111600160201b831117156107dc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113ca945050505050565b34801561082657600080fd5b5061028a6004803603602081101561083d57600080fd5b5035611504565b34801561085057600080fd5b5061041a6004803603602081101561086757600080fd5b50356001600160a01b0316611532565b34801561088357600080fd5b5061034261161c565b34801561089857600080fd5b50610521600480360360208110156108af57600080fd5b50356001600160a01b031661167d565b3480156108cb57600080fd5b5061041a600480360360608110156108e257600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561091157600080fd5b82018360208201111561092357600080fd5b803590602001918460018302840111600160201b8311171561094457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116e5945050505050565b34801561099157600080fd5b506102da600480360360208110156109a857600080fd5b503561177a565b3480156109bb57600080fd5b506102da600480360360208110156109d257600080fd5b503561180b565b3480156109e557600080fd5b5061041a600480360360408110156109fc57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a2657600080fd5b820183602082011115610a3857600080fd5b803590602001918460018302840111600160201b83111715610a5957600080fd5b50909250905061181d565b348015610a7057600080fd5b5061034261195f565b348015610a8557600080fd5b5061041a60048036036040811015610a9c57600080fd5b506001600160a01b03813516906020013515156119c0565b348015610ac057600080fd5b5061041a60048036036080811015610ad757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610b1157600080fd5b820183602082011115610b2357600080fd5b803590602001918460018302840111600160201b83111715610b4457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ac5945050505050565b348015610b9157600080fd5b50610521611b1d565b348015610ba657600080fd5b5061034260048036036020811015610bbd57600080fd5b5035611b2c565b348015610bd057600080fd5b5061028a611dd3565b348015610be557600080fd5b5061041a60048036036020811015610bfc57600080fd5b50356001600160a01b0316611de2565b348015610c1857600080fd5b5061041a60048036036040811015610c2f57600080fd5b506001600160a01b0381358116916020013516611ecc565b348015610c5357600080fd5b5061028a611f83565b348015610c6857600080fd5b506102da60048036036040811015610c7f57600080fd5b506001600160a01b0381358116916020013516611f92565b348015610ca357600080fd5b5061041a60048036036040811015610cba57600080fd5b50803590602001356001600160a01b0316611fc0565b348015610cdc57600080fd5b5061041a60048036036020811015610cf357600080fd5b50356001600160a01b03166120ce565b600b546001600160a01b031681565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60007f00000000000000000000000000000000000000000000000000000000000003e88210610d955760405162461bcd60e51b81526004018080602001828103825260248152602001806135be6024913960400191505060405180910390fd5b600160027f00000000000000000000000000000000000000000000000000000000000003e804038210158015610ded575060017f00000000000000000000000000000000000000000000000000000000000003e80382105b92915050565b60007f00000000000000000000000000000000000000000000000000000000000003e8610e1e6121cb565b101590505b90565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000610ec7826121d7565b610f025760405162461bcd60e51b815260040180806020018281038252602c8152602001806134b2602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610f2982611504565b9050806001600160a01b0316836001600160a01b03161415610f7c5760405162461bcd60e51b815260040180806020018281038252602181526020018061356c6021913960400191505060405180910390fd5b806001600160a01b0316610f8e6121ea565b6001600160a01b03161480610faf5750610faf81610faa6121ea565b611f92565b610fea5760405162461bcd60e51b815260040180806020018281038252603881526020018061331b6038913960400191505060405180910390fd5b610ff483836121ee565b505050565b60007f00000000000000000000000000000000000000000000000000000000000003e882106110595760405162461bcd60e51b81526004018080602001828103825260248152602001806135be6024913960400191505060405180910390fd5b507f00000000000000000000000000000000000000000000000000000000000003e8600019011490565b600061108e84611504565b6001600160a01b0381166000908152600d602090815260409182902054825130606090811b82850152630f57462560e01b603483015233811b60388301526bffffffffffffffffffffffff1986821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611116828287878761225c565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000003e890565b61115261114c6121ea565b82612395565b61118d5760405162461bcd60e51b815260040180806020018281038252603181526020018061358d6031913960400191505060405180910390fd5b610ff4838383612439565b6001600160a01b03821660009081526001602052604081206111c0908363ffffffff61259716565b9392505050565b610ff483838360405180602001604052806000815250611ac5565b600c546001600160a01b0316331461122b5760405162461bcd60e51b81526004018080602001828103825260368152602001806135366036913960400191505060405180910390fd5b604080516370a0823160e01b815230600482015290516001600160a01b0384169163a9059cbb91849184916370a0823191602480820192602092909190829003018186803b15801561127c57600080fd5b505afa158015611290573d6000803e3d6000fd5b505050506040513d60208110156112a657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b505050506040513d602081101561132157600080fd5b50505050565b6000610ded826121d7565b60008061134660028463ffffffff6125a316565b509392505050565b600d6020526000908152604090205481565b600a546001600160a01b03163314806113835750600b546001600160a01b031633145b6113be5760405162461bcd60e51b815260040180806020018281038252604081526020018061363f6040913960400191505060405180910390fd5b6113c7816125bf565b50565b600a546001600160a01b03163314806113ed5750600b546001600160a01b031633145b6114285760405162461bcd60e51b815260040180806020018281038252604081526020018061363f6040913960400191505060405180910390fd5b611430610df3565b1561146c5760405162461bcd60e51b815260040180806020018281038252603281526020018061360d6032913960400191505060405180910390fd5b80517f00000000000000000000000000000000000000000000000000000000000003e860001984830101106114d25760405162461bcd60e51b81526004018080602001828103825260228152602001806132cc6022913960400191505060405180910390fd5b60005b81811015611321576114fc8382815181106114ec57fe5b6020026020010151828601612668565b6001016114d5565b6000610ded8260405180606001604052806029815260200161337d602991396002919063ffffffff6127a216565b600a546001600160a01b0316331461157b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806132ee602d913960400191505060405180910390fd5b6001600160a01b0381166115c05760405162461bcd60e51b81526004018080602001828103825260298152602001806134896029913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907fa3294bd3c62ef75af9339cf8fe3dd1225c58c03e6ea1bfcbae8c49436fade37a90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eb25780601f10610e8757610100808354040283529160200191610eb2565b60006001600160a01b0382166116c45760405162461bcd60e51b815260040180806020018281038252602a815260200180613353602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600160205260409020610ded906127af565b60006116f084611504565b6001600160a01b0381166000908152600d602090815260409182902054825130606090811b828501526371f0379360e01b60348301526bffffffffffffffffffffffff1986821b8116603884015289821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611116828287878761225c565b60007f00000000000000000000000000000000000000000000000000000000000003e882106117da5760405162461bcd60e51b81526004018080602001828103825260248152602001806135be6024913960400191505060405180910390fd5b50600119600a7f00000000000000000000000000000000000000000000000000000000000003e86003020401101590565b600061181682610d35565b1592915050565b600c546001600160a01b031633146118665760405162461bcd60e51b81526004018080602001828103825260368152602001806135366036913960400191505060405180910390fd5b6001600160a01b0383166118c1576040805162461bcd60e51b815260206004820152601e60248201527f6e65656420612076616c69642072657665727365207265676973747261720000604482015290519081900360640190fd5b60405163c47f002760e01b8152602060048201908152602482018390526001600160a01b0385169163c47f00279185918591908190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b15801561193557600080fd5b505af1158015611949573d6000803e3d6000fd5b505050506040513d602081101561111657600080fd5b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610eb25780601f10610e8757610100808354040283529160200191610eb2565b6119c86121ea565b6001600160a01b0316826001600160a01b03161415611a2e576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000611a3b6121ea565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a7f6121ea565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b611ad6611ad06121ea565b83612395565b611b115760405162461bcd60e51b815260040180806020018281038252603181526020018061358d6031913960400191505060405180910390fd5b611321848484846127ba565b6000611b276121cb565b905090565b6060611b37826121d7565b611b725760405162461bcd60e51b815260040180806020018281038252602f815260200180613507602f913960400191505060405180910390fd5b60008281526008602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015611c075780601f10611bdc57610100808354040283529160200191611c07565b820191906000526020600020905b815481529060010190602001808311611bea57829003601f168201915b505060095493945050505060026000196101006001841615020190911604611c30579050610d30565b805115611d01576009816040516020018083805460018160011615610100020316600290048015611c985780601f10611c76576101008083540402835291820191611c98565b820191906000526020600020905b815481529060010190602001808311611c84575b5050825160208401908083835b60208310611cc45780518252601f199092019160209182019101611ca5565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050610d30565b6009611d0c8461280c565b6040516020018083805460018160011615610100020316600290048015611d6a5780601f10611d48576101008083540402835291820191611d6a565b820191906000526020600020905b815481529060010190602001808311611d56575b5050825160208401908083835b60208310611d965780518252601f199092019160209182019101611d77565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b600c546001600160a01b031681565b600c546001600160a01b03163314611e2b5760405162461bcd60e51b81526004018080602001828103825260368152602001806135366036913960400191505060405180910390fd5b6001600160a01b038116611e705760405162461bcd60e51b81526004018080602001828103825260328152602001806134136032913960400191505060405180910390fd5b600c546040516001600160a01b038084169216907fe74ad8e35ae0d7f4389ff1318666007250321a66dd644dca021b5e2e30fa2a5c90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314611f155760405162461bcd60e51b81526004018080602001828103825260368152602001806135366036913960400191505060405180910390fd5b6040805163a22cb46560e01b81526001600160a01b0383811660048301526001602483015291519184169163a22cb4659160448082019260009290919082900301818387803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b505050505050565b600a546001600160a01b031681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b0316331480611fe35750600b546001600160a01b031633145b61201e5760405162461bcd60e51b815260040180806020018281038252604081526020018061363f6040913960400191505060405180910390fd5b612026610df3565b156120625760405162461bcd60e51b815260040180806020018281038252603281526020018061360d6032913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e882106120c05760405162461bcd60e51b81526004018080602001828103825260228152602001806132cc6022913960400191505060405180910390fd5b6120ca8183612668565b5050565b600b546001600160a01b031633146121175760405162461bcd60e51b815260040180806020018281038252602f8152602001806133a6602f913960400191505060405180910390fd5b6001600160a01b03811661215c5760405162461bcd60e51b815260040180806020018281038252602b8152602001806135e2602b913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907fce25c0b3947fab39d425994edb341c50f20faf7987f0211bd06db98f98d4fdca90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b80516120ca906009906020840190613144565b6000611b2760026128e7565b6000610ded60028363ffffffff6128f216565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061222382611504565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612267856128fe565b90506000612275828461294f565b9050866001600160a01b0316816001600160a01b0316146122c75760405162461bcd60e51b815260040180806020018281038252603e8152602001806133d5603e913960400191505060405180910390fd5b6001600160a01b038781166000818152600d60209081526040918290205482513381529182015281518994891693927fba05f551fcc429cba611372aa0055e3573f26273f66d1a48bdb5b4f7896bf022928290030190a46001600160a01b0387166000908152600d602052604090205461234890600163ffffffff612b3616565b600d6000896001600160a01b03166001600160a01b031681526020019081526020016000208190555061238c878587604051806020016040528060008152506127ba565b50505050505050565b60006123a0826121d7565b6123db5760405162461bcd60e51b815260040180806020018281038252602c8152602001806132a0602c913960400191505060405180910390fd5b60006123e683611504565b9050806001600160a01b0316846001600160a01b031614806124215750836001600160a01b031661241684610ebc565b6001600160a01b0316145b8061243157506124318185611f92565b949350505050565b826001600160a01b031661244c82611504565b6001600160a01b0316146124915760405162461bcd60e51b81526004018080602001828103825260298152602001806134de6029913960400191505060405180910390fd5b6001600160a01b0382166124d65760405162461bcd60e51b815260040180806020018281038252602481526020018061325a6024913960400191505060405180910390fd5b6124e1838383610ff4565b6124ec6000826121ee565b6001600160a01b0383166000908152600160205260409020612514908263ffffffff612b9016565b506001600160a01b038216600090815260016020526040902061253d908263ffffffff612b9c16565b506125506002828463ffffffff612ba816565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006111c08383612bbe565b60008080806125b28686612c22565b9097909650945050505050565b6125c8816121b8565b7f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea726125f161161c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561262b578181015183820152602001612613565b50505050905090810190601f1680156126585780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6001600160a01b0382166126c3576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6126cc816121d7565b1561271e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61272a60008383610ff4565b6001600160a01b0382166000908152600160205260409020612752908263ffffffff612b9c16565b506127656002828463ffffffff612ba816565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612431848484612c84565b6000610ded82612d30565b6127c5848484612439565b6127d184848484612d34565b6113215760405162461bcd60e51b81526004018080602001828103825260328152602001806131ff6032913960400191505060405180910390fd5b60608161283157506040805180820190915260018152600360fc1b6020820152610d30565b8160005b811561284957600101600a82049150612835565b60608167ffffffffffffffff8111801561286257600080fd5b506040519080825280601f01601f19166020018201604052801561288d576020820181803683370190505b50859350905060001982015b83156128de57600a840660300160f81b828280600190039350815181106128bc57fe5b60200101906001600160f81b031916908160001a905350600a84049350612899565b50949350505050565b6000610ded82612f6f565b60006111c08383612f76565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b600081516041146129a7576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612a185760405162461bcd60e51b815260040180806020018281038252602281526020018061327e6022913960400191505060405180910390fd5b8060ff16601b14158015612a3057508060ff16601c14155b15612a6c5760405162461bcd60e51b81526004018080602001828103825260228152602001806134456022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015612ac4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b2c576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b6000828201838110156111c0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006111c08383612f8b565b60006111c08383613051565b600061243184846001600160a01b03851661309b565b81546000908210612c005760405162461bcd60e51b81526004018080602001828103825260228152602001806131dd6022913960400191505060405180910390fd5b826000018281548110612c0f57fe5b9060005260206000200154905092915050565b60008082612c308582612f76565b612c6b5760405162461bcd60e51b81526004018080602001828103825260228152602001806134676022913960400191505060405180910390fd5b6000818152602095909552604090942054939492505050565b6000612c908484612f76565b8290612d1a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cdf578181015183820152602001612cc7565b50505050905090810190601f168015612d0c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050506000908152602091909152604090205490565b5490565b6000612d48846001600160a01b03166130f3565b612d5457506001612431565b600060606001600160a01b038616630a85bd0160e11b612d726121ea565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612deb578181015183820152602001612dd3565b50505050905090810190601f168015612e185780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310612e805780518252601f199092019160209182019101612e61565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ee2576040519150601f19603f3d011682016040523d82523d6000602084013e612ee7565b606091505b509150915081612f3857805115612f015780518082602001fd5b60405162461bcd60e51b81526004018080602001828103825260328152602001806131ff6032913960400191505060405180910390fd5b6000818060200190516020811015612f4f57600080fd5b50516001600160e01b031916630a85bd0160e11b14935061243192505050565b6001015490565b60009081526020919091526040902054151590565b600081815260018301602052604081205480156130475783546000198083019190810190600090879083908110612fbe57fe5b9060005260206000200154905080876000018481548110612fdb57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061300b57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ded565b6000915050610ded565b600061305d838361312c565b61309357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ded565b506000610ded565b60008281526020849052604081205481906130c1575060018085018054820190556130de565b826130da575060018401805460001901905560006130de565b5060005b60009384526020949094525060409091205590565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612431575050151592915050565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061318557805160ff19168380011785556131b2565b828001600101855582156131b2579182015b828111156131b2578251825591602001919060010190613197565b506131be9291506131c2565b5090565b610e2391905b808211156131be57600081556001016131c856fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657254686520636f6e74726163742063616e6e6f74207265636569766520455448207061796d656e74732e4552433732313a207472616e7366657220746f20746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c75654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e6e6f74206d696e7420746f6b656e207769746820746f6f2068696768204944637265617465436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e7368697070696e67436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e5369676e6174757265206e6565647320746f206d6174636820706172616d65746572732c206e6f6e63652c20616e642063757272656e74206f776e65722e746f6b656e41737369676e6d656e74436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473637265617465436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e746f6b656e41737369676e6d656e74436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656450726f706572747920717565727920666f72206e6f6e6578697374656e7420746f6b656e7368697070696e67436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e546869732063616c6c206f6e6c7920776f726b73207768656e206d696e74696e67206973206e6f742066696e69736865642e637265617465436f6e74726f6c206f72207368697070696e67436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2ea26469706673582212204e21a723aeeec86673361688b89a805386b7a7a35ec7617ecb8766402639ef8e64736f6c634300060b0033

Verified Source Code Partial Match

Compiler: v0.6.11+commit.5ef660b1 EVM: istanbul Optimization: Yes (200 runs)
CryptostampGoldenUnicorn.sol 2091 lines
/*
 * Crypto stamp Golden Unicorn
 * digital-physical collectible postage stamp
 *
 * Developed by Capacity Blockchain Solutions GmbH <capacity.at>
 * for Österreichische Post AG <post.at>
 */


// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }

    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/introspection/IERC165.sol

pragma solidity ^0.6.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 IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[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: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.6.2;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transfered from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from`, `to` cannot be zero.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from`, `to` cannot be zero.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from`, `to` cannot be zero.
      * - `tokenId` 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 {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.6.2;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.6.2;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.6.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
abstract contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public virtual returns (bytes4);
}

// File: @openzeppelin/contracts/introspection/ERC165.sol

pragma solidity ^0.6.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.6.2;

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @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");
    }
}

// File: @openzeppelin/contracts/utils/EnumerableSet.sol

pragma solidity ^0.6.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: contracts/EnumerableRandomMapSimple.sol

pragma solidity ^0.6.0;

library EnumerableRandomMapSimple {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct Map {
        // Storage of map keys and values
        mapping(bytes32 => bytes32) _entries;
        uint256 _length;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        bool newVal;
        if (map._entries[key] == bytes32("")) { // add new entry
            map._length++;
            newVal = true;
        }
        else if (value == bytes32("")) { // remove entry
            map._length--;
            newVal = false;
        }
        else {
            newVal = false;
        }
        map._entries[key] = value;
        return newVal;
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage /*map*/, bytes32 /*key*/) private pure returns (bool) {
        revert("No removal supported");
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._entries[key] != bytes32("");
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        bytes32 key = bytes32(index);
        require(_contains(map, key), "EnumerableMap: index out of bounds");
        return (key, map._entries[key]);
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        return _get(map, key, "EnumerableMap: nonexistent key");
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        require(_contains(map, key), errorMessage); // Equivalent to contains(map, key)
        return map._entries[key];
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint256(value)));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key), errorMessage)));
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.6.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: contracts/OZ_Clone/ERC721_simplemaps.sol

pragma solidity ^0.6.0;

// Clone of OpenZeppelin 3.0.0 token/ERC721/ERC721.sol with just imports adapted and EnumerableMap exchanged for EnumerableMapSimple,
// and totalSupply() marked as virtual.












/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableRandomMapSimple for EnumerableRandomMapSimple.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableRandomMapSimple.UintToAddressMap private _tokenOwners;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _holderTokens[owner].length();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() public view override returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the URI for a given token ID. May return an empty string.
     *
     * If a base URI is set (via {_setBaseURI}), it is added as a prefix to the
     * token's own URI (via {_setTokenURI}).
     *
     * If there is a base URI but no token URI, the token's ID will be used as
     * its URI when appending it to the base URI. This pattern for autogenerated
     * token URIs can lead to large gas savings.
     *
     * .Examples
     * |===
     * |`_setBaseURI()` |`_setTokenURI()` |`tokenURI()`
     * | ""
     * | ""
     * | ""
     * | ""
     * | "token.uri/123"
     * | "token.uri/123"
     * | "token.uri/"
     * | "123"
     * | "token.uri/123"
     * | "token.uri/"
     * | ""
     * | "token.uri/<tokenId>"
     * |===
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];

        // If there is no base URI, return the token URI.
        if (bytes(_baseURI).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(_baseURI, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view override virtual returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param operator operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function...

// [truncated — 79641 bytes total]

Read Contract

balanceOf 0x70a08231 → uint256
baseURI 0x6c0360eb → string
createControl 0xe66075c2 → address
exists 0x4f558e79 → bool
getApproved 0x081812fc → address
isApprovedForAll 0xe985e9c5 → bool
isLastUnicorn 0x0ae3ec68 → bool
mintedSupply 0xc1bd8cf9 → uint256
mintingFinished 0x05d2035b → bool
name 0x06fdde03 → string
ownerOf 0x6352211e → address
shippingControl 0x017e97bc → address
signedTransferNonce 0x53a1397c → uint256
sourceOnChainRaffle 0x77dc4159 → bool
sourceRaffle 0x82bc590f → bool
sourceSale 0x042c4e87 → bool
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenAssignmentControl 0xc8c2ed54 → address
tokenByIndex 0x4f6ccce7 → uint256
tokenOfOwnerByIndex 0x2f745c59 → uint256
tokenURI 0xc87b56dd → string
totalSupply 0x18160ddd → uint256

Write Contract 16 functions

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

approve 0x095ea7b3
address to
uint256 tokenId
approveNFTrescue 0xdd48f774
address _foreignNFT
address _to
create 0xf01fe692
uint256 _tokenId
address _owner
createMulti 0x5ba13abf
uint256 _tokenIdStart
address[] _owners
registerReverseENS 0x8e8fa11f
address _reverseRegistrarAddress
string _name
rescueToken 0x4707d000
address _foreignToken
address _to
safeTransferFrom 0x42842e0e
address from
address to
uint256 tokenId
safeTransferFrom 0xb88d4fde
address from
address to
uint256 tokenId
bytes _data
setApprovalForAll 0xa22cb465
address operator
bool approved
setBaseURI 0x55f804b3
string _newBaseURI
signedTransfer 0x71f03793
uint256 _tokenId
address _to
bytes _signature
signedTransferWithOperator 0x0f574625
uint256 _tokenId
address _to
bytes _signature
transferCreateControl 0x68f2cd31
address _newCreateControl
transferFrom 0x23b872dd
address from
address to
uint256 tokenId
transferShippingControl 0xf93ce63a
address _newShippingControl
transferTokenAssignmentControl 0xd0763c95
address _newTokenAssignmentControl

Recent Transactions

No transactions found for this address