Address Contract Partially Verified
Address
0x478059f577Cb739f0AF0f37A365DD069Ba5BD8Be
Balance
0 ETH
Nonce
1
Code Size
14004 bytes
Creator
0x15BeF7EE...Fef2 at tx 0x56338055...2a721d
Indexed Transactions
0
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