Address Contract Partially Verified
Address
0x7d256d82b32d8003d1cA1a1526ED211E6e0dA9e2
Balance
0 ETH
Nonce
2
Code Size
14890 bytes
Creator
0x2511df64...4066 at tx 0x6e3b2f4f...50585f
Indexed Transactions
0
Contract Bytecode
14890 bytes
0x608060405234801561001057600080fd5b50600436106103835760003560e01c806370a08231116101de578063c43a3f871161010f578063e63dfc97116100ad578063eb1af4d11161007c578063eb1af4d11461089c578063f3cb8385146108bd578063f91fc4c2146108d0578063fefd445f146108e357600080fd5b8063e63dfc97146107e8578063e8a3d48514610841578063e985e9c514610849578063ea78803f1461088957600080fd5b8063d547cfb7116100e9578063d547cfb714610780578063e2dadf4e14610788578063e3acd07d146107ae578063e54b7f3e146107c157600080fd5b8063c43a3f8714610747578063c87b56dd1461075a578063d06497bf1461076d57600080fd5b806397830de01161017c578063b2b3140d11610156578063b2b3140d146106ed578063b5a3844b14610700578063b88d4fde14610721578063bc4a96491461073457600080fd5b806397830de0146106a15780639ac8027c146106c7578063a22cb465146106da57600080fd5b80638a53ddb9116101b85780638a53ddb91461064f5780638c1858e7146106625780638da5cb5b1461068857806395d89b411461069957600080fd5b806370a082311461060057806373704e2c14610629578063776adef81461063c57600080fd5b806327ba7cc3116102b857806357f6b812116102565780636352211e116102305780636352211e146105b45780636c19e783146105c75780636ccbae5f146105da5780636dfedad7146105ed57600080fd5b806357f6b812146105665780635fd846f21461058e57806361ff33a1146105a157600080fd5b806342842e0e1161029257806342842e0e1461051a57806342966c681461052d5780634f6ccce71461054057806355ea6c471461055357600080fd5b806327ba7cc3146104e15780632f745c59146104f45780633812c6a81461050757600080fd5b806318160ddd116103255780632392c189116102ff5780632392c1891461048457806323b872dd14610497578063243c7540146104aa57806324b950fe146104ce57600080fd5b806318160ddd1461044e578063183d127214610460578063238ac9331461047357600080fd5b8063095ea7b311610361578063095ea7b3146104005780630b7bb3cb1461041557806312aaac701461042857806313af40351461043b57600080fd5b806301ffc9a71461038857806306fdde03146103c0578063081812fc146103d5575b600080fd5b6103ab610396366004612f32565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103c86108f6565b6040516103b79190613726565b6103e86103e3366004612f19565b61097c565b6040516001600160a01b0390911681526020016103b7565b61041361040e366004612e0e565b6109aa565b005b610413610423366004613297565b610a2e565b6103c8610436366004612f19565b610a7b565b610413610449366004612cd7565b610b1d565b6000545b6040519081526020016103b7565b61045261046e36600461301d565b610b56565b6008546001600160a01b03166103e8565b610413610492366004612e0e565b610b86565b6104136104a5366004612d2d565b610bbc565b6104bd6104b8366004612e82565b610bc7565b6040516103b7959493929190613537565b6104136104dc366004612f19565b610e26565b6103e86104ef366004612f19565b610e3a565b610452610502366004612e0e565b610e68565b61041361051536600461322b565b610eb9565b610413610528366004612d2d565b610f03565b61041361053b366004612f19565b610f1e565b61045261054e366004612f19565b610fa1565b6103c8610561366004612cd7565b610fb4565b610579610574366004612cd7565b610fdb565b604080519283526020830191909152016103b7565b61045261059c36600461301d565b611009565b6103c86105af3660046131ef565b611052565b6103e86105c2366004612f19565b611091565b6104136105d5366004612cd7565b6110bc565b6104526105e8366004612f19565b6110f5565b6104136105fb3660046131ef565b61111a565b61045261060e366004612cd7565b6001600160a01b031660009081526005602052604090205490565b6103e861063736600461301d565b611138565b6103e861064a366004612f19565b611169565b6103c861065d3660046130c7565b6111b4565b610675610670366004613351565b6111c8565b6040516103b797969594939291906135bd565b6007546001600160a01b03166103e8565b6103c8611490565b6106b46106af366004612f19565b6114d5565b6040516103b79796959493929190613739565b6103c86106d53660046131cd565b611536565b6104136106e8366004612dd9565b6115f9565b6104136106fb366004612f19565b611669565b61071361070e3660046131cd565b6116bd565b6040516103b792919061378a565b61041361072f366004612d6e565b6116de565b610413610742366004612f19565b61179e565b610413610755366004612e0e565b6117a9565b6103c8610768366004612f19565b611803565b61041361077b366004612f19565b611884565b6103c861188f565b61079b610796366004612e3a565b6118d4565b6040516103b797969594939291906136c5565b6104526107bc366004612f19565b611a7a565b6107d46107cf36600461331c565b611a9f565b6040516103b7989796959493929190613635565b6107fb6107f636600461301d565b611c2e565b604080519788526001600160a01b039687166020890152948616948701949094529184166060860152909216608084015260a083019190915260c082015260e0016103b7565b6103c8611c64565b6103ab610857366004612cf4565b6001600160a01b0391821660009081526005602090815260408083209390941682526002909201909152205460ff1690565b6103c8610897366004612f19565b611ca9565b6108af6108aa36600461312a565b611cdb565b6040516103b7929190613598565b6104136108cb366004612cd7565b611ebc565b6104136108de366004612e0e565b611ef5565b6104136108f1366004612f6c565b611f4e565b600654604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b15801561093b57600080fd5b505afa15801561094f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109779190810190613051565b905090565b60008054821061098b57600080fd5b506000908152600160205260409020600201546001600160a01b031690565b806109b481611091565b6001600160a01b0316336001600160a01b0316146109d157600080fd5b60008281526001602052604080822060020180546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6000848152600160205260408120600a018054610a6192879287928792909190610a5783613942565b9190505585611fb1565b610a6a57600080fd5b610a75848484612046565b50505050565b6000818152600360205260409020805460609190610a9890613907565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac490613907565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b50505050509050919050565b6007546001600160a01b03163314610b3457600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001610b699190613457565b604051602081830303815290604052805190602001209050919050565b80610b9081611091565b6001600160a01b0316336001600160a01b031614610bad57600080fd5b610bb7838361220b565b505050565b610bb7838383612319565b6060806060806060600086519050806001600160401b03811115610bed57610bed6139b3565b604051908082528060200260200182016040528015610c16578160200160208202803683370190505b509550806001600160401b03811115610c3157610c316139b3565b604051908082528060200260200182016040528015610c5a578160200160208202803683370190505b509450806001600160401b03811115610c7557610c756139b3565b604051908082528060200260200182016040528015610c9e578160200160208202803683370190505b509350806001600160401b03811115610cb957610cb96139b3565b604051908082528060200260200182016040528015610ce2578160200160208202803683370190505b509250806001600160401b03811115610cfd57610cfd6139b3565b604051908082528060200260200182016040528015610d26578160200160208202803683370190505b50915060005b81811015610e1b576060610d58898381518110610d4b57610d4b61399d565b60200260200101516114d5565b9050508b8781518110610d6d57610d6d61399d565b602002602001018b8881518110610d8657610d8661399d565b602002602001018b8981518110610d9f57610d9f61399d565b602002602001018b8a81518110610db857610db861399d565b6001600160a01b0395861660209182029290920101529383169093529281169091529190911690529050610deb81612673565b888381518110610dfd57610dfd61399d565b60209081029190910101525080610e1381613942565b915050610d2c565b505091939590929450565b610e376001600160a01b03826117a9565b50565b600080548210610e4957600080fd5b506000908152600160205260409020600301546001600160a01b031690565b6001600160a01b0382166000908152600560205260408120548210610e8c57600080fd5b506001600160a01b0391909116600090815260056020908152604080832093835260019093019052205490565b82610ec381611091565b6001600160a01b0316336001600160a01b03161480610a615750610ee681611169565b6001600160a01b0316336001600160a01b031614610a6a57600080fd5b610bb7838383604051806020016040528060008152506116de565b80610f2881611091565b6001600160a01b0316336001600160a01b031614610f4557600080fd5b610f50333084612319565b3382610f5e61046e82611ca9565b7fe7da089962443ca13b93acded259222f496b43d227e5f74af3a9303d99943201610f8886611ca9565b604051610f959190613726565b60405180910390a45050565b600080548210610fb057600080fd5b5090565b6001600160a01b0381166000908152600460205260409020805460609190610a9890613907565b600080610fe760005490565b6001600160a01b03841660009081526005602052604090205491509150915091565b60008061101583610b56565b60008181526002602052604090205490915061103057600080fd5b60008181526002602052604090205461104b906001906138ad565b9392505050565b60606000826040516020016110679190613457565b6040516020818303038152906040528051906020012090506110898482611536565b949350505050565b6000805482106110a057600080fd5b506000908152600160205260409020546001600160a01b031690565b6007546001600160a01b031633146110d357600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008054821061110457600080fd5b506000908152600160205260409020600a015490565b611134828260405180602001604052806000815250610eb9565b5050565b600060018161114684611009565b81526020810191909152604001600020600401546001600160a01b031692915050565b60008054821061117857600080fd5b600082815260016020819052604090912001546001600160a01b03908116908114156111ae576008546001600160a01b03165b90505b92915050565b60606111ab6111c284611009565b83611052565b606080606080606060008060008a116111e057600080fd5b6111e98b611a7a565b91508115611449576111fb8a8361395d565b1561120757600161120a565b60005b60ff166112178b8461387a565b6112219190613862565b905080891061122f57600080fd5b600061123b8a8c61388e565b90506112486001836138ad565b8a14801561125e575061125b8b8461395d565b15155b156112705761126d8b8461395d565b9a505b8a6001600160401b03811115611288576112886139b3565b6040519080825280602002602001820160405280156112b1578160200160208202803683370190505b5097508a6001600160401b038111156112cc576112cc6139b3565b6040519080825280602002602001820160405280156112f5578160200160208202803683370190505b5096508a6001600160401b03811115611310576113106139b3565b604051908082528060200260200182016040528015611339578160200160208202803683370190505b50955060005b8b8110156114425760008d8152600160205260408120600701908b6113845760018361136b86896138ad565b61137591906138ad565b61137f91906138ad565b61138e565b61138e8385613862565b8152602001908152602001600020548982815181106113af576113af61399d565b60200260200101818152505060006113df8a83815181106113d2576113d261399d565b6020026020010151610a7b565b90506113ea81612673565b8983815181106113fc576113fc61399d565b602002602001018181525050602081511188838151811061141f5761141f61399d565b91151560209283029190910190910152508061143a81613942565b91505061133f565b5050611471565b5060408051600080825260208201818152828401828152606084019094529198509096509094505b61147b8b88611cdb565b979c969b509499509397509495509192915050565b600654604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561093b57600080fd5b60606000806000806000806114e988611ca9565b6114f289611091565b6114fb8a611169565b6115048b610e3a565b61150d8c61097c565b6115168d6110f5565b61151f8e611a7a565b959e949d50929b5090995097509550909350915050565b606061154160005490565b831061154c57600080fd5b60008381526001602090815260408083208584526008019091529020805461157390613907565b80601f016020809104026020016040519081016040528092919081815260200182805461159f90613907565b80156115ec5780601f106115c1576101008083540402835291602001916115ec565b820191906000526020600020905b8154815290600101906020018083116115cf57829003601f168201915b5050505050905092915050565b3360008181526005602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b8061167381611091565b6001600160a01b0316336001600160a01b031614806116ab575061169681611169565b6001600160a01b0316336001600160a01b0316145b6116b457600080fd5b6111348261268f565b6060806116c983610a7b565b6116d38585611536565b915091509250929050565b6116e9848484612319565b823b63ffffffff81161561179757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906117299033908990889088906004016134fa565b602060405180830381600087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b9190612f4f565b6001600160e01b03191663150b7a0260e01b1461179757600080fd5b5050505050565b610e37600082610b86565b806117b381611091565b6001600160a01b0316336001600160a01b0316146117d057600080fd5b5060009081526001602081905260409091200180546001600160a01b0319166001600160a01b0392909216919091179055565b60065460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b15801561184857600080fd5b505afa15801561185c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ae9190810190613051565b610e376000826117a9565b6006546040805163d547cfb760e01b815290516060926001600160a01b03169163d547cfb7916004808301926000929190829003018186803b15801561093b57600080fd5b606080606080606060008060008a116118ec57600080fd5b6001600160a01b038b1660009081526005602052604090205491508115611a45576119178a8361395d565b15611923576001611926565b60005b60ff166119338b8461387a565b61193d9190613862565b905080891061194b57600080fd5b60006119578a8c61388e565b90506119646001836138ad565b8a14801561197a57506119778b8461395d565b15155b1561198c576119898b8461395d565b9a505b8a6001600160401b038111156119a4576119a46139b3565b6040519080825280602002602001820160405280156119cd578160200160208202803683370190505b50975060005b8b811015611a3e57611a0f8d8b611a05576001836119f186896138ad565b6119fb91906138ad565b61050291906138ad565b6105028385613862565b898281518110611a2157611a2161399d565b602090810291909101015280611a3681613942565b9150506119d3565b5050611a59565b506040805160008082526020820190925296505b611a6287610bc7565b9a9f939e50909c509a50979850919650945092505050565b600080548210611a8957600080fd5b5060009081526001602052604090206006015490565b60608060608060608060008060008b11611ab857600080fd5b60005491508115611bfa57611acd8b8361395d565b15611ad9576001611adc565b60005b60ff16611ae98c8461387a565b611af39190613862565b9050808a10611b0157600080fd5b6000611b0d8b8d61388e565b9050611b1a6001836138ad565b8b148015611b305750611b2d8c8461395d565b15155b15611b4257611b3f8c8461395d565b9b505b8b6001600160401b03811115611b5a57611b5a6139b3565b604051908082528060200260200182016040528015611b83578160200160208202803683370190505b50985060005b8c811015611bf357611bc48b611bba57600182611ba685886138ad565b611bb091906138ad565b61054e91906138ad565b61054e8284613862565b8a8281518110611bd657611bd661399d565b602090810291909101015280611beb81613942565b915050611b89565b5050611c0e565b506040805160008082526020820190925297505b611c1788610bc7565b9b9f939e50919c509a509897509195509350915050565b6000806000806000806000611c4288611009565b9650611c4d876114d5565b9c9e949d50929b919a509850909650945092505050565b6006546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d485916004808301926000929190829003018186803b15801561093b57600080fd5b6060611cb460005490565b8210611cbf57600080fd5b60008281526001602052604090206005018054610a9890613907565b606080611ce760005490565b8410611cf257600080fd5b8251806001600160401b03811115611d0c57611d0c6139b3565b604051908082528060200260200182016040528015611d35578160200160208202803683370190505b509250806001600160401b03811115611d5057611d506139b3565b604051908082528060200260200182016040528015611d79578160200160208202803683370190505b50915060005b81811015611eb357600086815260016020526040812086516008909101908290889085908110611db157611db161399d565b602002602001015181526020019081526020016000208054611dd290613907565b80601f0160208091040260200160405190810160405280929190818152602001828054611dfe90613907565b8015611e4b5780601f10611e2057610100808354040283529160200191611e4b565b820191906000526020600020905b815481529060010190602001808311611e2e57829003601f168201915b50505050509050611e5b81612673565b858381518110611e6d57611e6d61399d565b6020026020010181815250506020815111848381518110611e9057611e9061399d565b911515602092830291909101909101525080611eab81613942565b915050611d7f565b50509250929050565b6007546001600160a01b03163314611ed357600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b80611eff81611091565b6001600160a01b0316336001600160a01b031614611f1c57600080fd5b50600090815260016020526040902060030180546001600160a01b0319166001600160a01b0392909216919091179055565b814210611f5a57600080fd5b611f6785858585856126eb565b611f7057600080fd5b61179785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250612759915050565b60008086868686604051602001611fcb94939291906134b5565b6040516020818303038152906040528051906020012090506000611ff7611ff18361296a565b856129a5565b905061200288611091565b6001600160a01b0316816001600160a01b0316148061203a575061202588611169565b6001600160a01b0316816001600160a01b0316145b98975050505050505050565b600082511161205457600080fd5b6000826040516020016120679190613457565b60405160208183030381529060405280519060200120905061208881610a7b565b516120ae57600081815260036020908152604090912084516120ac92860190612b96565b505b600084815260016020526040902082516120d2576120cd858584612a24565b6121ab565b600082815260098201602052604090205461218857600681018054600091826120fa83613942565b90915550905061210b816001613862565b60008481526009840160209081526040808320939093558382526007850190522083905561213885610b56565b3361214561046e89611ca9565b7f180a742bbd74b1be5156ad2b394637be17b0ebab9f54e4d250753399437ba20961216f8a611ca9565b8960405161217e92919061378a565b60405180910390a4505b6000828152600882016020908152604090912084516121a992860190612b96565b505b6121b484610b56565b336121c161046e88611ca9565b7f97bdcba1fbd5143d16d316cc7a4e6ccb2345fa2c5e7ec4705eb788fb6a202eaa6121eb89611ca9565b88886040516121fc939291906137af565b60405180910390a45050505050565b6001600160a01b0382166122795760008181526001602090815260408083206004908101546001600160a01b03168452909152812061224991612c16565b600081815260016020526040902060040180546001600160a01b0384166001600160a01b03199091161790555050565b61228282610fb4565b511561228d57600080fd5b6000818152600160205260409020600401546001600160a01b0316156122b257600080fd5b6122bb81611ca9565b6001600160a01b038316600090815260046020908152604090912082516122e89391929190910190612b96565b50600081815260016020526040902060040180546001600160a01b0384166001600160a01b03199091161790555050565b600061232482611091565b905060006123318361097c565b9050816001600160a01b0316856001600160a01b03161461235157600080fd5b336001600160a01b03831614806123705750336001600160a01b038216145b806123a157506001600160a01b038216600090815260056020908152604080832033845260020190915290205460ff165b6123aa57600080fd5b600083815260016020819052604090912080546001600160a01b038088166001600160a01b03199283168117845593830180548316821790556003909201805490911690921790915581161561244f5760008381526001602052604080822060020180546001600160a01b0319169055518491906001600160a01b038716907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b61245a60008461220b565b6124638361268f565b6001600160a01b0385166000908152600560209081526040808320868452600301909152812054612496906001906138ad565b6001600160a01b03871660009081526005602052604081208054929350909160019182019183916124c791906138ad565b815260208082019290925260409081016000908120546001600160a01b038b168252600584528282208683526001908101909452919020819055915061250e908390613862565b6001600160a01b0388166000818152600560208181526040808420878552600381018352908420959095559282529091528154919061254c836138f0565b90915550506001600160a01b0380881660009081526005602081815260408084208a85526003018252808420849055938a168352529081208054908261259183613942565b9091555090506125a2816001613862565b6001600160a01b0380891660008181526005602090815260408083208c845260038101835281842096909655868352600190950190528381208a90559251899391928c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a461261661046e87611ca9565b876001600160a01b0316896001600160a01b03167faea4c1a300ad7e1fa4653406ce85b5ad8abbc04c517ec8c866f22a3099d154db6126548a611ca9565b6040516126619190613726565b60405180910390a45050505050505050565b600081516000141561268757506000919050565b506020015190565b60008181526001602052604090205b600681015415611134576000816007016000600184600601546126c191906138ad565b81526020019081526020016000205490506126e5836126df83610a7b565b83612a24565b5061269e565b600080868686866040516020016127059493929190613473565b60405160208183030381529060405280519060200120905061272f6008546001600160a01b031690565b6001600160a01b0316612744611ff18361296a565b6001600160a01b031614979650505050505050565b60008061276584610b56565b6000818152600260205260409020549091506128ea5760008054908061278a83613942565b90915550915061279b826001613862565b60008281526002602090815260408083209390935584825260018082529290912080546001600160a01b038088166001600160a01b0319928316178355938201805490911690931790925585516127fa91600584019190880190612b96565b506001600160a01b03841660009081526005602052604081208054908261282083613942565b909155509050612831816001613862565b6001600160a01b0386166000818152600560209081526040808320898452600381018352818420959095558583526001909401905282812087905591518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a482856001600160a01b031660006001600160a01b03167faea4c1a300ad7e1fa4653406ce85b5ad8abbc04c517ec8c866f22a3099d154db896040516128db9190613726565b60405180910390a45050612921565b6128f384611009565b600081815260016020526040902060020180546001600160a01b031916331790559150612921308484612319565b826001600160a01b031682827fbf3a4785433526d5666b7a9d19e1e2eaf5c084063ba37298cea8655cf88c0a8f8760405161295c9190613726565b60405180910390a450505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01610b69565b6000806000806129b485612b65565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015612a0f573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60008381526001602090815260408083208484526009810190925290912054612a4c57600080fd5b6000828152600982016020526040812054612a69906001906138ad565b9050600082600701600060018560060154612a8491906138ad565b8152602080820192909252604090810160009081205485825260078701909352208190559050612ab5826001613862565b600082815260098501602052604081209190915560068401805491612ad9836138f0565b909155505060008481526009840160209081526040808320839055600886019091528120612b0691612c16565b612b0f85610b56565b33612b1c61046e89611ca9565b7f86cb57904f14d8d9f75d3c31427ff5d8cbcf7f93b985e871c553c6618704744c612b468a611ca9565b89604051612b5592919061378a565b60405180910390a4505050505050565b60008060008351604114612b7857600080fd5b50505060208101516040820151606090920151909260009190911a90565b828054612ba290613907565b90600052602060002090601f016020900481019282612bc45760008555612c0a565b82601f10612bdd57805160ff1916838001178555612c0a565b82800160010185558215612c0a579182015b82811115612c0a578251825591602001919060010190612bef565b50610fb0929150612c4c565b508054612c2290613907565b6000825580601f10612c32575050565b601f016020900490600052602060002090810190610e3791905b5b80821115610fb05760008155600101612c4d565b8035612c6c816139c9565b919050565b80358015158114612c6c57600080fd5b600082601f830112612c9257600080fd5b8135612ca5612ca08261383b565b6137e8565b818152846020838601011115612cba57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612ce957600080fd5b813561104b816139c9565b60008060408385031215612d0757600080fd5b8235612d12816139c9565b91506020830135612d22816139c9565b809150509250929050565b600080600060608486031215612d4257600080fd5b8335612d4d816139c9565b92506020840135612d5d816139c9565b929592945050506040919091013590565b60008060008060808587031215612d8457600080fd5b8435612d8f816139c9565b93506020850135612d9f816139c9565b92506040850135915060608501356001600160401b03811115612dc157600080fd5b612dcd87828801612c81565b91505092959194509250565b60008060408385031215612dec57600080fd5b8235612df7816139c9565b9150612e0560208401612c71565b90509250929050565b60008060408385031215612e2157600080fd5b8235612e2c816139c9565b946020939093013593505050565b60008060008060808587031215612e5057600080fd5b8435612e5b816139c9565b93506020850135925060408501359150612e7760608601612c71565b905092959194509250565b60006020808385031215612e9557600080fd5b82356001600160401b03811115612eab57600080fd5b8301601f81018513612ebc57600080fd5b8035612eca612ca082613818565b80828252848201915084840188868560051b8701011115612eea57600080fd5b600094505b83851015612f0d578035835260019490940193918501918501612eef565b50979650505050505050565b600060208284031215612f2b57600080fd5b5035919050565b600060208284031215612f4457600080fd5b813561104b816139de565b600060208284031215612f6157600080fd5b815161104b816139de565b600080600080600060808688031215612f8457600080fd5b85356001600160401b0380821115612f9b57600080fd5b818801915088601f830112612faf57600080fd5b813581811115612fbe57600080fd5b896020828501011115612fd057600080fd5b60208301975080965050612fe660208901612c61565b945060408801359350606088013591508082111561300357600080fd5b5061301088828901612c81565b9150509295509295909350565b60006020828403121561302f57600080fd5b81356001600160401b0381111561304557600080fd5b61108984828501612c81565b60006020828403121561306357600080fd5b81516001600160401b0381111561307957600080fd5b8201601f8101841361308a57600080fd5b8051613098612ca08261383b565b8181528560208385010111156130ad57600080fd5b6130be8260208301602086016138c4565b95945050505050565b600080604083850312156130da57600080fd5b82356001600160401b03808211156130f157600080fd5b6130fd86838701612c81565b9350602085013591508082111561311357600080fd5b5061312085828601612c81565b9150509250929050565b6000806040838503121561313d57600080fd5b823591506020808401356001600160401b0381111561315b57600080fd5b8401601f8101861361316c57600080fd5b803561317a612ca082613818565b80828252848201915084840189868560051b870101111561319a57600080fd5b600094505b838510156131bd57803583526001949094019391850191850161319f565b5080955050505050509250929050565b600080604083850312156131e057600080fd5b50508035926020909101359150565b6000806040838503121561320257600080fd5b8235915060208301356001600160401b0381111561321f57600080fd5b61312085828601612c81565b60008060006060848603121561324057600080fd5b8335925060208401356001600160401b038082111561325e57600080fd5b61326a87838801612c81565b9350604086013591508082111561328057600080fd5b5061328d86828701612c81565b9150509250925092565b600080600080608085870312156132ad57600080fd5b8435935060208501356001600160401b03808211156132cb57600080fd5b6132d788838901612c81565b945060408701359150808211156132ed57600080fd5b6132f988838901612c81565b9350606087013591508082111561330f57600080fd5b50612dcd87828801612c81565b60008060006060848603121561333157600080fd5b833592506020840135915061334860408501612c71565b90509250925092565b6000806000806080858703121561336757600080fd5b843593506020850135925060408501359150612e7760608601612c71565b600081518084526020808501945080840160005b838110156133be5781516001600160a01b031687529582019590820190600101613399565b509495945050505050565b600081518084526020808501945080840160005b838110156133be5781511515875295820195908201906001016133dd565b600081518084526020808501945080840160005b838110156133be5781518752958201959082019060010161340f565b600081518084526134438160208601602086016138c4565b601f01601f19169290920160200192915050565b600082516134698184602087016138c4565b9190910192915050565b651e585d13919560d21b81528385600683013760609290921b6bffffffffffffffffffffffff191660069390920192830191909152601a820152603a01919050565b848152600084516134cd8160208501602089016138c4565b808301905084516134e58160208401602089016138c4565b01602081019390935250506040019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061352d9083018461342b565b9695505050505050565b60a08152600061354a60a08301886133fb565b828103602084015261355c8188613385565b905082810360408401526135708187613385565b905082810360608401526135848186613385565b9050828103608084015261203a8185613385565b6040815260006135ab60408301856133fb565b82810360208401526130be81856133c9565b60e0815260006135d060e083018a6133fb565b82810360208401526135e2818a6133fb565b905082810360408401526135f681896133c9565b9050828103606084015261360a81886133fb565b9050828103608084015261361e81876133c9565b60a0840195909552505060c0015295945050505050565b60006101008083526136498184018c6133fb565b9050828103602084015261365d818b6133fb565b90508281036040840152613671818a613385565b905082810360608401526136858189613385565b905082810360808401526136998188613385565b905082810360a08401526136ad8187613385565b60c0840195909552505060e001529695505050505050565b60e0815260006136d860e083018a6133fb565b82810360208401526136ea818a6133fb565b905082810360408401526136fe8189613385565b905082810360608401526137128188613385565b9050828103608084015261361e8187613385565b6020815260006111ab602083018461342b565b60e08152600061374c60e083018a61342b565b6001600160a01b039889166020840152968816604083015250938616606085015291909416608083015260a082019390935260c00191909152919050565b60408152600061379d604083018561342b565b82810360208401526130be818561342b565b6060815260006137c2606083018661342b565b82810360208401526137d4818661342b565b9050828103604084015261352d818561342b565b604051601f8201601f191681016001600160401b0381118282101715613810576138106139b3565b604052919050565b60006001600160401b03821115613831576138316139b3565b5060051b60200190565b60006001600160401b03821115613854576138546139b3565b50601f01601f191660200190565b6000821982111561387557613875613971565b500190565b60008261388957613889613987565b500490565b60008160001904831182151516156138a8576138a8613971565b500290565b6000828210156138bf576138bf613971565b500390565b60005b838110156138df5781810151838201526020016138c7565b83811115610a755750506000910152565b6000816138ff576138ff613971565b506000190190565b600181811c9082168061391b57607f821691505b6020821081141561393c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561395657613956613971565b5060010190565b60008261396c5761396c613987565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e3757600080fd5b6001600160e01b031981168114610e3757600080fdfea26469706673582212200d90ac9b3d5de6e1cbdc2ce82b5db4c7d87137910667056e61abdd56389a6e8364736f6c63430008060033
Verified Source Code Partial Match
Compiler: v0.8.6+commit.11564f7e
EVM: berlin
Optimization: Yes (200 runs)
YAT.sol 607 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
interface Receiver {
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4);
}
contract Metadata {
string public name = "Yat NFT";
string public symbol = "Yats";
function contractURI() external pure returns (string memory) {
return "https://a.y.at/nft_transfers/contract/";
}
function baseTokenURI() public pure returns (string memory) {
return "https://a.y.at/nft_transfers/metadata/";
}
function tokenURI(uint256 _tokenId) external pure returns (string memory) {
bytes memory _base = bytes(baseTokenURI());
uint256 _digits = 1;
uint256 _n = _tokenId;
while (_n > 9) {
_n /= 10;
_digits++;
}
bytes memory _uri = new bytes(_base.length + _digits);
for (uint256 i = 0; i < _uri.length; i++) {
if (i < _base.length) {
_uri[i] = _base[i];
} else {
uint256 _dec = (_tokenId / (10**(_uri.length - i - 1))) % 10;
_uri[i] = bytes1(uint8(_dec) + 48);
}
}
return string(_uri);
}
}
contract YAT {
address constant private USE_GLOBAL_SIGNER = address(type(uint160).max);
struct User {
uint256 balance;
mapping(uint256 => uint256) list;
mapping(address => bool) approved;
mapping(uint256 => uint256) indexOf;
}
struct Token {
address owner;
address cosigner;
address approved;
address pointsTo;
address resolvesTo;
string token;
uint256 records;
mapping(uint256 => bytes32) keys;
mapping(bytes32 => string) values;
mapping(bytes32 => uint256) indexOf;
uint256 nonce;
}
struct Info {
uint256 totalSupply;
mapping(uint256 => Token) list;
mapping(bytes32 => uint256) idOf;
mapping(bytes32 => string) dictionary;
mapping(address => string) resolve;
mapping(address => User) users;
Metadata metadata;
address owner;
address signer;
}
Info private info;
mapping(bytes4 => bool) public supportsInterface;
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Transfer(address indexed from, address indexed to, bytes32 indexed tokenHash, string token);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
event Mint(bytes32 indexed tokenHash, uint256 indexed tokenId, address indexed account, string token);
event Burn(bytes32 indexed tokenHash, uint256 indexed tokenId, address indexed account, string token);
event RecordUpdated(bytes32 indexed tokenHash, address indexed manager, bytes32 indexed keyHash, string token, string key, string value);
event RecordAdded(bytes32 indexed tokenHash, address indexed manager, bytes32 indexed keyHash, string token, string key);
event RecordDeleted(bytes32 indexed tokenHash, address indexed manager, bytes32 indexed keyHash, string token, string key);
modifier _onlyOwner() {
require(msg.sender == owner());
_;
}
modifier _onlyTokenOwner(uint256 _tokenId) {
require(msg.sender == ownerOf(_tokenId));
_;
}
modifier _onlyTokenOwnerOrCosigner(uint256 _tokenId) {
require(msg.sender == ownerOf(_tokenId) || msg.sender == cosignerOf(_tokenId));
_;
}
constructor(address _signer) {
info.metadata = new Metadata();
info.owner = msg.sender;
info.signer = _signer;
supportsInterface[0x01ffc9a7] = true; // ERC-165
supportsInterface[0x80ac58cd] = true; // ERC-721
supportsInterface[0x5b5e139f] = true; // Metadata
supportsInterface[0x780e9d63] = true; // Enumerable
}
function setOwner(address _owner) external _onlyOwner {
info.owner = _owner;
}
function setSigner(address _signer) external _onlyOwner {
info.signer = _signer;
}
function setMetadata(Metadata _metadata) external _onlyOwner {
info.metadata = _metadata;
}
function mint(string calldata _token, address _account, uint256 _expiry, bytes memory _signature) external {
require(block.timestamp < _expiry);
require(_verifyMint(_token, _account, _expiry, _signature));
_mint(_token, _account);
}
/**
* "Soft-burns" the NFT by transferring the token to the contract address.
**/
function burn(uint256 _tokenId) external _onlyTokenOwner(_tokenId) {
_transfer(msg.sender, address(this), _tokenId);
emit Burn(hashOf(tokenOf(_tokenId)), _tokenId, msg.sender, tokenOf(_tokenId));
}
function setCosigner(address _cosigner, uint256 _tokenId) public _onlyTokenOwner(_tokenId) {
info.list[_tokenId].cosigner = _cosigner;
}
function resetCosigner(uint256 _tokenId) external {
setCosigner(USE_GLOBAL_SIGNER, _tokenId);
}
function revokeCosigner(uint256 _tokenId) external {
setCosigner(address(0x0), _tokenId);
}
function setPointsTo(address _pointsTo, uint256 _tokenId) public _onlyTokenOwner(_tokenId) {
info.list[_tokenId].pointsTo = _pointsTo;
}
function resolveTo(address _resolvesTo, uint256 _tokenId) public _onlyTokenOwner(_tokenId) {
_updateResolvesTo(_resolvesTo, _tokenId);
}
function unresolve(uint256 _tokenId) external {
resolveTo(address(0x0), _tokenId);
}
function updateRecord(uint256 _tokenId, string memory _key, string memory _value, bytes memory _signature) external {
require(_verifyRecordUpdate(_tokenId, _key, _value, info.list[_tokenId].nonce++, _signature));
_updateRecord(_tokenId, _key, _value);
}
function updateRecord(uint256 _tokenId, string memory _key, string memory _value) public _onlyTokenOwnerOrCosigner(_tokenId) {
_updateRecord(_tokenId, _key, _value);
}
function deleteRecord(uint256 _tokenId, string memory _key) external {
updateRecord(_tokenId, _key, "");
}
function deleteAllRecords(uint256 _tokenId) external _onlyTokenOwnerOrCosigner(_tokenId) {
_deleteAllRecords(_tokenId);
}
function approve(address _approved, uint256 _tokenId) external _onlyTokenOwner(_tokenId) {
info.list[_tokenId].approved = _approved;
emit Approval(msg.sender, _approved, _tokenId);
}
function setApprovalForAll(address _operator, bool _approved) external {
info.users[msg.sender].approved[_operator] = _approved;
emit ApprovalForAll(msg.sender, _operator, _approved);
}
function transferFrom(address _from, address _to, uint256 _tokenId) external {
_transfer(_from, _to, _tokenId);
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
safeTransferFrom(_from, _to, _tokenId, "");
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
_transfer(_from, _to, _tokenId);
uint32 _size;
assembly {
_size := extcodesize(_to)
}
if (_size > 0) {
require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02);
}
}
function name() external view returns (string memory) {
return info.metadata.name();
}
function symbol() external view returns (string memory) {
return info.metadata.symbol();
}
function contractURI() external view returns (string memory) {
return info.metadata.contractURI();
}
function baseTokenURI() external view returns (string memory) {
return info.metadata.baseTokenURI();
}
function tokenURI(uint256 _tokenId) external view returns (string memory) {
return info.metadata.tokenURI(_tokenId);
}
function owner() public view returns (address) {
return info.owner;
}
function signer() public view returns (address) {
return info.signer;
}
function totalSupply() public view returns (uint256) {
return info.totalSupply;
}
function balanceOf(address _owner) public view returns (uint256) {
return info.users[_owner].balance;
}
function resolve(address _account) public view returns (string memory) {
return info.resolve[_account];
}
function reverseResolve(string memory _token) public view returns (address) {
return info.list[idOf(_token)].resolvesTo;
}
function hashOf(string memory _token) public pure returns (bytes32) {
return keccak256(abi.encodePacked(_token));
}
function idOf(string memory _token) public view returns (uint256) {
bytes32 _hash = hashOf(_token);
require(info.idOf[_hash] != 0);
return info.idOf[_hash] - 1;
}
function tokenOf(uint256 _tokenId) public view returns (string memory) {
require(_tokenId < totalSupply());
return info.list[_tokenId].token;
}
function ownerOf(uint256 _tokenId) public view returns (address) {
require(_tokenId < totalSupply());
return info.list[_tokenId].owner;
}
function cosignerOf(uint256 _tokenId) public view returns (address) {
require(_tokenId < totalSupply());
address _cosigner = info.list[_tokenId].cosigner;
if (_cosigner == USE_GLOBAL_SIGNER) {
_cosigner = signer();
}
return _cosigner;
}
function pointsTo(uint256 _tokenId) public view returns (address) {
require(_tokenId < totalSupply());
return info.list[_tokenId].pointsTo;
}
function nonceOf(uint256 _tokenId) public view returns (uint256) {
require(_tokenId < totalSupply());
return info.list[_tokenId].nonce;
}
function recordsOf(uint256 _tokenId) public view returns (uint256) {
require(_tokenId < totalSupply());
return info.list[_tokenId].records;
}
function getApproved(uint256 _tokenId) public view returns (address) {
require(_tokenId < totalSupply());
return info.list[_tokenId].approved;
}
function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
return info.users[_owner].approved[_operator];
}
function tokenByIndex(uint256 _index) public view returns (uint256) {
require(_index < totalSupply());
return _index;
}
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
require(_index < balanceOf(_owner));
return info.users[_owner].list[_index];
}
function getKey(bytes32 _hash) public view returns (string memory) {
return info.dictionary[_hash];
}
function getRecord(string memory _token, string memory _key) public view returns (string memory) {
return getRecord(idOf(_token), _key);
}
function getRecord(uint256 _tokenId, string memory _key) public view returns (string memory) {
bytes32 _hash = keccak256(abi.encodePacked(_key));
return getRecord(_tokenId, _hash);
}
function getRecord(uint256 _tokenId, bytes32 _hash) public view returns (string memory) {
require(_tokenId < totalSupply());
return info.list[_tokenId].values[_hash];
}
function getFullRecord(uint256 _tokenId, bytes32 _hash) public view returns (string memory, string memory) {
return (getKey(_hash), getRecord(_tokenId, _hash));
}
function getRecords(uint256 _tokenId, bytes32[] memory _hashes) public view returns (bytes32[] memory values, bool[] memory trimmed) {
require(_tokenId < totalSupply());
uint256 _length = _hashes.length;
values = new bytes32[](_length);
trimmed = new bool[](_length);
for (uint256 i = 0; i < _length; i++) {
string memory _value = info.list[_tokenId].values[_hashes[i]];
values[i] = _stringToBytes32(_value);
trimmed[i] = bytes(_value).length > 32;
}
}
function getRecordsTable(uint256 _tokenId, uint256 _limit, uint256 _page, bool _isAsc) public view returns (bytes32[] memory hashes, bytes32[] memory keys, bool[] memory keysTrimmed, bytes32[] memory values, bool[] memory valuesTrimmed, uint256 totalRecords, uint256 totalPages) {
require(_limit > 0);
totalRecords = recordsOf(_tokenId);
if (totalRecords > 0) {
totalPages = (totalRecords / _limit) + (totalRecords % _limit == 0 ? 0 : 1);
require(_page < totalPages);
uint256 _offset = _limit * _page;
if (_page == totalPages - 1 && totalRecords % _limit != 0) {
_limit = totalRecords % _limit;
}
hashes = new bytes32[](_limit);
keys = new bytes32[](_limit);
keysTrimmed = new bool[](_limit);
for (uint256 i = 0; i < _limit; i++) {
hashes[i] = info.list[_tokenId].keys[_isAsc ? _offset + i : totalRecords - _offset - i - 1];
string memory _key = getKey(hashes[i]);
keys[i] = _stringToBytes32(_key);
keysTrimmed[i] = bytes(_key).length > 32;
}
} else {
totalPages = 0;
hashes = new bytes32[](0);
keys = new bytes32[](0);
keysTrimmed = new bool[](0);
}
(values, valuesTrimmed) = getRecords(_tokenId, hashes);
}
function getYAT(string memory _token) public view returns (uint256 tokenId, address tokenOwner, address tokenCosigner, address pointer, address approved, uint256 nonce, uint256 records) {
tokenId = idOf(_token);
( , tokenOwner, tokenCosigner, pointer, approved, nonce, records) = getYAT(tokenId);
}
function getYAT(uint256 _tokenId) public view returns (string memory token, address tokenOwner, address tokenCosigner, address pointer, address approved, uint256 nonce, uint256 records) {
return (tokenOf(_tokenId), ownerOf(_tokenId), cosignerOf(_tokenId), pointsTo(_tokenId), getApproved(_tokenId), nonceOf(_tokenId), recordsOf(_tokenId));
}
function getYATs(uint256[] memory _tokenIds) public view returns (bytes32[] memory tokens, address[] memory owners, address[] memory cosigners, address[] memory pointers, address[] memory approveds) {
uint256 _length = _tokenIds.length;
tokens = new bytes32[](_length);
owners = new address[](_length);
cosigners = new address[](_length);
pointers = new address[](_length);
approveds = new address[](_length);
for (uint256 i = 0; i < _length; i++) {
string memory _token;
(_token, owners[i], cosigners[i], pointers[i], approveds[i], , ) = getYAT(_tokenIds[i]);
tokens[i] = _stringToBytes32(_token);
}
}
function getYATsTable(uint256 _limit, uint256 _page, bool _isAsc) public view returns (uint256[] memory tokenIds, bytes32[] memory tokens, address[] memory owners, address[] memory cosigners, address[] memory pointers, address[] memory approveds, uint256 totalYATs, uint256 totalPages) {
require(_limit > 0);
totalYATs = totalSupply();
if (totalYATs > 0) {
totalPages = (totalYATs / _limit) + (totalYATs % _limit == 0 ? 0 : 1);
require(_page < totalPages);
uint256 _offset = _limit * _page;
if (_page == totalPages - 1 && totalYATs % _limit != 0) {
_limit = totalYATs % _limit;
}
tokenIds = new uint256[](_limit);
for (uint256 i = 0; i < _limit; i++) {
tokenIds[i] = tokenByIndex(_isAsc ? _offset + i : totalYATs - _offset - i - 1);
}
} else {
totalPages = 0;
tokenIds = new uint256[](0);
}
(tokens, owners, cosigners, pointers, approveds) = getYATs(tokenIds);
}
function getOwnerYATsTable(address _owner, uint256 _limit, uint256 _page, bool _isAsc) public view returns (uint256[] memory tokenIds, bytes32[] memory tokens, address[] memory cosigners, address[] memory pointers, address[] memory approveds, uint256 totalYATs, uint256 totalPages) {
require(_limit > 0);
totalYATs = balanceOf(_owner);
if (totalYATs > 0) {
totalPages = (totalYATs / _limit) + (totalYATs % _limit == 0 ? 0 : 1);
require(_page < totalPages);
uint256 _offset = _limit * _page;
if (_page == totalPages - 1 && totalYATs % _limit != 0) {
_limit = totalYATs % _limit;
}
tokenIds = new uint256[](_limit);
for (uint256 i = 0; i < _limit; i++) {
tokenIds[i] = tokenOfOwnerByIndex(_owner, _isAsc ? _offset + i : totalYATs - _offset - i - 1);
}
} else {
totalPages = 0;
tokenIds = new uint256[](0);
}
(tokens, , cosigners, pointers, approveds) = getYATs(tokenIds);
}
function allInfoFor(address _owner) external view returns (uint256 supply, uint256 ownerBalance) {
return (totalSupply(), balanceOf(_owner));
}
function _mint(string memory _token, address _account) internal {
uint256 _tokenId;
bytes32 _hash = hashOf(_token);
if (info.idOf[_hash] == 0) {
_tokenId = info.totalSupply++;
info.idOf[_hash] = _tokenId + 1;
Token storage _newToken = info.list[_tokenId];
_newToken.owner = _account;
_newToken.cosigner = USE_GLOBAL_SIGNER;
_newToken.token = _token;
uint256 _index = info.users[_account].balance++;
info.users[_account].indexOf[_tokenId] = _index + 1;
info.users[_account].list[_index] = _tokenId;
emit Transfer(address(0x0), _account, _tokenId);
emit Transfer(address(0x0), _account, _hash, _token);
} else {
_tokenId = idOf(_token);
info.list[_tokenId].approved = msg.sender;
_transfer(address(this), _account, _tokenId);
}
emit Mint(_hash, _tokenId, _account, _token);
}
function _transfer(address _from, address _to, uint256 _tokenId) internal {
address _owner = ownerOf(_tokenId);
address _approved = getApproved(_tokenId);
require(_from == _owner);
require(msg.sender == _owner || msg.sender == _approved || isApprovedForAll(_owner, msg.sender));
info.list[_tokenId].owner = _to;
info.list[_tokenId].cosigner = USE_GLOBAL_SIGNER;
info.list[_tokenId].pointsTo = _to;
if (_approved != address(0x0)) {
info.list[_tokenId].approved = address(0x0);
emit Approval(_to, address(0x0), _tokenId);
}
_updateResolvesTo(address(0x0), _tokenId);
_deleteAllRecords(_tokenId);
uint256 _index = info.users[_from].indexOf[_tokenId] - 1;
uint256 _moved = info.users[_from].list[info.users[_from].balance - 1];
info.users[_from].list[_index] = _moved;
info.users[_from].indexOf[_moved] = _index + 1;
info.users[_from].balance--;
delete info.users[_from].indexOf[_tokenId];
uint256 _newIndex = info.users[_to].balance++;
info.users[_to].indexOf[_tokenId] = _newIndex + 1;
info.users[_to].list[_newIndex] = _tokenId;
emit Transfer(_from, _to, _tokenId);
emit Transfer(_from, _to, hashOf(tokenOf(_tokenId)), tokenOf(_tokenId));
}
function _updateResolvesTo(address _resolvesTo, uint256 _tokenId) internal {
if (_resolvesTo == address(0x0)) {
delete info.resolve[info.list[_tokenId].resolvesTo];
info.list[_tokenId].resolvesTo = _resolvesTo;
} else {
require(bytes(resolve(_resolvesTo)).length == 0);
require(info.list[_tokenId].resolvesTo == address(0x0));
info.resolve[_resolvesTo] = tokenOf(_tokenId);
info.list[_tokenId].resolvesTo = _resolvesTo;
}
}
function _updateRecord(uint256 _tokenId, string memory _key, string memory _value) internal {
require(bytes(_key).length > 0);
bytes32 _hash = keccak256(abi.encodePacked(_key));
if (bytes(getKey(_hash)).length == 0) {
info.dictionary[_hash] = _key;
}
Token storage _token = info.list[_tokenId];
if (bytes(_value).length == 0) {
_deleteRecord(_tokenId, _key, _hash);
} else {
if (_token.indexOf[_hash] == 0) {
uint256 _index = _token.records++;
_token.indexOf[_hash] = _index + 1;
_token.keys[_index] = _hash;
emit RecordAdded(hashOf(tokenOf(_tokenId)), msg.sender, hashOf(_key), tokenOf(_tokenId), _key);
}
_token.values[_hash] = _value;
}
emit RecordUpdated(hashOf(tokenOf(_tokenId)), msg.sender, hashOf(_key), tokenOf(_tokenId), _key, _value);
}
function _deleteRecord(uint256 _tokenId, string memory _key, bytes32 _hash) internal {
Token storage _token = info.list[_tokenId];
require(_token.indexOf[_hash] != 0);
uint256 _index = _token.indexOf[_hash] - 1;
bytes32 _moved = _token.keys[_token.records - 1];
_token.keys[_index] = _moved;
_token.indexOf[_moved] = _index + 1;
_token.records--;
delete _token.indexOf[_hash];
delete _token.values[_hash];
emit RecordDeleted(hashOf(tokenOf(_tokenId)), msg.sender, hashOf(_key), tokenOf(_tokenId), _key);
}
function _deleteAllRecords(uint256 _tokenId) internal {
Token storage _token = info.list[_tokenId];
while (_token.records > 0) {
bytes32 _hash = _token.keys[_token.records - 1];
_deleteRecord(_tokenId, getKey(_hash), _hash);
}
}
function _getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash));
}
function _splitSignature(bytes memory _signature) internal pure returns (bytes32 r, bytes32 s, uint8 v) {
require(_signature.length == 65);
assembly {
r := mload(add(_signature, 32))
s := mload(add(_signature, 64))
v := byte(0, mload(add(_signature, 96)))
}
}
function _recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) {
(bytes32 r, bytes32 s, uint8 v) = _splitSignature(_signature);
return ecrecover(_ethSignedMessageHash, v, r, s);
}
function _verifyMint(string calldata _token, address _account, uint256 _expiry, bytes memory _signature) internal view returns (bool) {
bytes32 _hash = keccak256(abi.encodePacked("yatNFT", _token, _account, _expiry));
return _recoverSigner(_getEthSignedMessageHash(_hash), _signature) == signer();
}
function _verifyRecordUpdate(uint256 _tokenId, string memory _key, string memory _value, uint256 _nonce, bytes memory _signature) internal view returns (bool) {
bytes32 _hash = keccak256(abi.encodePacked(_tokenId, _key, _value, _nonce));
address _signer = _recoverSigner(_getEthSignedMessageHash(_hash), _signature);
return _signer == ownerOf(_tokenId) || _signer == cosignerOf(_tokenId);
}
function _stringToBytes32(string memory _in) internal pure returns (bytes32 out) {
if (bytes(_in).length == 0) {
return 0x0;
}
assembly {
out := mload(add(_in, 32))
}
}
}
Read Contract
allInfoFor 0x57f6b812 → uint256, uint256
balanceOf 0x70a08231 → uint256
baseTokenURI 0xd547cfb7 → string
contractURI 0xe8a3d485 → string
cosignerOf 0x776adef8 → address
getApproved 0x081812fc → address
getFullRecord 0xb5a3844b → string, string
getKey 0x12aaac70 → string
getOwnerYATsTable 0xe2dadf4e → uint256[], bytes32[], address[], address[], address[], uint256, uint256
getRecord 0x61ff33a1 → string
getRecord 0x8a53ddb9 → string
getRecord 0x9ac8027c → string
getRecords 0xeb1af4d1 → bytes32[], bool[]
getRecordsTable 0x8c1858e7 → bytes32[], bytes32[], bool[], bytes32[], bool[], uint256, uint256
getYAT 0x97830de0 → string, address, address, address, address, uint256, uint256
getYAT 0xe63dfc97 → uint256, address, address, address, address, uint256, uint256
getYATs 0x243c7540 → bytes32[], address[], address[], address[], address[]
getYATsTable 0xe54b7f3e → uint256[], bytes32[], address[], address[], address[], address[], uint256, uint256
hashOf 0x183d1272 → bytes32
idOf 0x5fd846f2 → uint256
isApprovedForAll 0xe985e9c5 → bool
name 0x06fdde03 → string
nonceOf 0x6ccbae5f → uint256
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
pointsTo 0x27ba7cc3 → address
recordsOf 0xe3acd07d → uint256
resolve 0x55ea6c47 → string
reverseResolve 0x73704e2c → address
signer 0x238ac933 → address
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenByIndex 0x4f6ccce7 → uint256
tokenOf 0xea78803f → string
tokenOfOwnerByIndex 0x2f745c59 → uint256
tokenURI 0xc87b56dd → string
totalSupply 0x18160ddd → uint256
Write Contract 20 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address _approved
uint256 _tokenId
burn 0x42966c68
uint256 _tokenId
deleteAllRecords 0xb2b3140d
uint256 _tokenId
deleteRecord 0x6dfedad7
uint256 _tokenId
string _key
mint 0xfefd445f
string _token
address _account
uint256 _expiry
bytes _signature
resetCosigner 0x24b950fe
uint256 _tokenId
resolveTo 0x2392c189
address _resolvesTo
uint256 _tokenId
revokeCosigner 0xd06497bf
uint256 _tokenId
safeTransferFrom 0x42842e0e
address _from
address _to
uint256 _tokenId
safeTransferFrom 0xb88d4fde
address _from
address _to
uint256 _tokenId
bytes _data
setApprovalForAll 0xa22cb465
address _operator
bool _approved
setCosigner 0xc43a3f87
address _cosigner
uint256 _tokenId
setMetadata 0xf3cb8385
address _metadata
setOwner 0x13af4035
address _owner
setPointsTo 0xf91fc4c2
address _pointsTo
uint256 _tokenId
setSigner 0x6c19e783
address _signer
transferFrom 0x23b872dd
address _from
address _to
uint256 _tokenId
unresolve 0xbc4a9649
uint256 _tokenId
updateRecord 0x0b7bb3cb
uint256 _tokenId
string _key
string _value
bytes _signature
updateRecord 0x3812c6a8
uint256 _tokenId
string _key
string _value
Recent Transactions
No transactions found for this address