Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x0C6822ca73dE6871f27ACD9ca05A05b99294B805
Balance 0 ETH
Nonce 1
Code Size 18512 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

18512 bytes
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637a44d57c1161011a578063b9d99d29116100ad578063cb443cb51161007c578063cb443cb5146105c0578063d89135cd146105de578063e985e9c5146105fc578063f2fde38b1461062c578063f859b4f814610648576101fb565b8063b9d99d2914610528578063bc0853df14610544578063c1d0679914610560578063c87b56dd14610590576101fb565b806395d89b41116100e957806395d89b41146104b657806398f073d0146104d4578063a22cb465146104f0578063b88d4fde1461050c576101fb565b80637a44d57c1461042e578063844e0acd1461044a5780638462151c146104685780638da5cb5b14610498576101fb565b806342842e0e116101925780636352211e116101615780636352211e146103a65780636c0360eb146103d657806370a08231146103f4578063715018a614610424576101fb565b806342842e0e1461032257806342966c681461033e5780634f6ccce71461035a57806355f804b31461038a576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b85780632f745c59146102d457806341218b8014610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a6004803603810190610215919061302b565b610666565b6040516102279190613073565b60405180910390f35b6102386107b0565b6040516102459190613127565b60405180910390f35b6102686004803603810190610263919061317f565b610842565b60405161027591906131ed565b60405180910390f35b61029860048036038101906102939190613234565b6108c7565b005b6102a26109df565b6040516102af9190613283565b60405180910390f35b6102d260048036038101906102cd919061329e565b6109f9565b005b6102ee60048036038101906102e99190613234565b610a59565b6040516102fb9190613283565b60405180910390f35b61030c610ba2565b60405161031991906131ed565b60405180910390f35b61033c6004803603810190610337919061329e565b610bc8565b005b6103586004803603810190610353919061317f565b610be8565b005b610374600480360381019061036f919061317f565b610c0e565b6040516103819190613283565b60405180910390f35b6103a4600480360381019061039f9190613426565b610c61565b005b6103c060048036038101906103bb919061317f565b610cf7565b6040516103cd91906131ed565b60405180910390f35b6103de610db4565b6040516103eb9190613127565b60405180910390f35b61040e6004803603810190610409919061346f565b610e42565b60405161041b9190613283565b60405180910390f35b61042c610f6c565b005b610448600480360381019061044391906134da565b610ff4565b005b6104526110b4565b60405161045f9190613283565b60405180910390f35b610482600480360381019061047d919061346f565b6110c1565b60405161048f91906135c5565b60405180910390f35b6104a06111ba565b6040516104ad91906131ed565b60405180910390f35b6104be6111e4565b6040516104cb9190613127565b60405180910390f35b6104ee60048036038101906104e991906135e7565b611276565b005b61050a60048036038101906105059190613653565b61175f565b005b61052660048036038101906105219190613734565b6118e0565b005b610542600480360381019061053d91906137b7565b611942565b005b61055e600480360381019061055991906138ac565b6119db565b005b61057a6004803603810190610575919061346f565b611f97565b6040516105879190613073565b60405180910390f35b6105aa60048036038101906105a5919061317f565b612060565b6040516105b79190613127565b60405180910390f35b6105c8612107565b6040516105d59190613073565b60405180910390f35b6105e661211e565b6040516105f39190613283565b60405180910390f35b610616600480360381019061061191906138f5565b612128565b6040516106239190613073565b60405180910390f35b6106466004803603810190610641919061346f565b61218e565b005b610650612286565b60405161065d9190613994565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107a957506107a8826122ac565b5b9050919050565b6060600080546107bf906139de565b80601f01602080910402602001604051908101604052809291908181526020018280546107eb906139de565b80156108385780601f1061080d57610100808354040283529160200191610838565b820191906000526020600020905b81548152906001019060200180831161081b57829003601f168201915b5050505050905090565b600061084d82612316565b61088c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088390613a82565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d282610cf7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a90613b14565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096261239e565b73ffffffffffffffffffffffffffffffffffffffff16148061099157506109908161098b61239e565b612128565b5b6109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c790613ba6565b60405180910390fd5b6109da83836123a6565b505050565b60006002546003805490506109f49190613bf5565b905090565b610a0a610a0461239e565b8261245f565b610a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4090613c9b565b60405180910390fd5b610a5483838361253d565b505050565b6000610a6483610e42565b8210610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613d07565b60405180910390fd5b6000805b600380549050811015610b585760038181548110610aca57610ac9613d27565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b475783821415610b3a578092505050610b9c565b81610b4490613d56565b91505b80610b5190613d56565b9050610aa9565b506000610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9190613d07565b60405180910390fd5b505b92915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610be3838383604051806020016040528060008152506118e0565b505050565b610bf9610bf361239e565b8261245f565b610c0257600080fd5b610c0b816126f6565b50565b6000610c186110b4565b8210610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090613d07565b60405180910390fd5b819050919050565b610c6961239e565b73ffffffffffffffffffffffffffffffffffffffff16610c876111ba565b73ffffffffffffffffffffffffffffffffffffffff1614610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490613deb565b60405180910390fd5b8060079080519060200190610cf3929190612f1c565b5050565b60008060038381548110610d0e57610d0d613d27565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613a82565b60405180910390fd5b80915050919050565b60078054610dc1906139de565b80601f0160208091040260200160405190810160405280929190818152602001828054610ded906139de565b8015610e3a5780601f10610e0f57610100808354040283529160200191610e3a565b820191906000526020600020905b815481529060010190602001808311610e1d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90613e7d565b60405180910390fd5b600080600380549050905060005b81811015610f5d5760038181548110610edd57610edc613d27565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610f4a578280610f4690613d56565b9350505b8080610f5590613d56565b915050610ec1565b50600090508192505050919050565b610f7461239e565b73ffffffffffffffffffffffffffffffffffffffff16610f926111ba565b73ffffffffffffffffffffffffffffffffffffffff1614610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90613deb565b60405180910390fd5b610ff260006127f0565b565b610ffc61239e565b73ffffffffffffffffffffffffffffffffffffffff1661101a6111ba565b73ffffffffffffffffffffffffffffffffffffffff1614611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613deb565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600380549050905090565b60606110cc82610e42565b60001061110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613ee9565b60405180910390fd5b600061111983610e42565b905060008167ffffffffffffffff811115611137576111366132fb565b5b6040519080825280602002602001820160405280156111655781602001602082028036833780820191505090505b50905060005b828110156111af5761117d8582610a59565b8282815181106111905761118f613d27565b5b60200260200101818152505080806111a790613d56565b91505061116b565b508092505050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111f3906139de565b80601f016020809104026020016040519081016040528092919081815260200182805461121f906139de565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db90613f55565b60405180910390fd5b600660149054906101000a900460ff16611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90613fe7565b60405180910390fd5b600061133d61239e565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c582600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016113be929190614007565b602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190614045565b61143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906140e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016114b09190613283565b602060405180830381865afa1580156114cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f19190614119565b73ffffffffffffffffffffffffffffffffffffffff161480156115da57508073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016115819190613283565b602060405180830381865afa15801561159e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c29190614119565b73ffffffffffffffffffffffffffffffffffffffff16145b611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090614192565b60405180910390fd5b60006116236110b4565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68856040518263ffffffff1660e01b81526004016116809190613283565b600060405180830381600087803b15801561169a57600080fd5b505af11580156116ae573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68846040518263ffffffff1660e01b815260040161170d9190613283565b600060405180830381600087803b15801561172757600080fd5b505af115801561173b573d6000803e3d6000fd5b505050506117598282604051806020016040528060008152506128b6565b50505050565b61176761239e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90613b14565b60405180910390fd5b80600560006117e261239e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188f61239e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d49190613073565b60405180910390a35050565b6118f16118eb61239e565b8361245f565b611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614224565b60405180910390fd5b61193c84848484612911565b50505050565b61194a61239e565b73ffffffffffffffffffffffffffffffffffffffff166119686111ba565b73ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613deb565b60405180910390fd5b80600660146101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090613f55565b60405180910390fd5b600660149054906101000a900460ff16611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90613fe7565b60405180910390fd5b600060028251611aa89190614273565b14611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf906142f0565b60405180910390fd5b6000611af261239e565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c582600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611b73929190614007565b602060405180830381865afa158015611b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb49190614045565b611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea906140e4565b60405180910390fd5b6000611bfd6110b4565b905060005b8351811015611f91576000848281518110611c2057611c1f613d27565b5b60200260200101519050600085600184611c3a9190614310565b81518110611c4b57611c4a613d27565b5b602002602001015190508473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611cc79190613283565b602060405180830381865afa158015611ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d089190614119565b73ffffffffffffffffffffffffffffffffffffffff16148015611df157508473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611d989190613283565b602060405180830381865afa158015611db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd99190614119565b73ffffffffffffffffffffffffffffffffffffffff16145b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790614192565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401611e8b9190613283565b600060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b8152600401611f189190613283565b600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050611f7b85600285611f5b9190614366565b86611f669190614310565b604051806020016040528060008152506128b6565b5050600281611f8a9190614310565b9050611c02565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c583600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401612018929190614007565b602060405180830381865afa158015612035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120599190614045565b9050919050565b606061206b82612316565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613d07565b60405180910390fd5b60006120b461296d565b905060008151116120d457604051806020016040528060008152506120ff565b806120de846129ff565b6040516020016120ef9291906143d3565b6040516020818303038152906040525b915050919050565b6000600660149054906101000a900460ff16905090565b6000600254905090565b600073a5409ec958c83c3f309868babaca7c86dcb077c173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561217b5760019050612188565b6121858383612b60565b90505b92915050565b61219661239e565b73ffffffffffffffffffffffffffffffffffffffff166121b46111ba565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190613deb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561227a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227190614469565b60405180910390fd5b612283816127f0565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600380549050821080156123975750600073ffffffffffffffffffffffffffffffffffffffff166003838154811061235357612352613d27565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661241983610cf7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061246a82612316565b6124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090613a82565b60405180910390fd5b60006124b483610cf7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252357508373ffffffffffffffffffffffffffffffffffffffff1661250b84610842565b73ffffffffffffffffffffffffffffffffffffffff16145b8061253457506125338185612128565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661255d82610cf7565b73ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa906144d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a90614541565b60405180910390fd5b61262e838383612bf4565b6126396000826123a6565b816003828154811061264e5761264d613d27565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061270182610cf7565b905061270f81600084612bf4565b61271a6000836123a6565b6000600383815481106127305761272f613d27565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600081548092919061278b90613d56565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128c08383612bf9565b6128cd6000848484612d81565b61290c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612903906145ad565b60405180910390fd5b505050565b61291c84848461253d565b61292884848484612d81565b612967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295e906145ad565b60405180910390fd5b50505050565b60606007805461297c906139de565b80601f01602080910402602001604051908101604052809291908181526020018280546129a8906139de565b80156129f55780601f106129ca576101008083540402835291602001916129f5565b820191906000526020600020905b8154815290600101906020018083116129d857829003601f168201915b5050505050905090565b60606000821415612a47576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b5b565b600082905060005b60008214612a79578080612a6290613d56565b915050600a82612a729190614366565b9150612a4f565b60008167ffffffffffffffff811115612a9557612a946132fb565b5b6040519080825280601f01601f191660200182016040528015612ac75781602001600182028036833780820191505090505b5090505b60008514612b5457600182612ae09190613bf5565b9150600a85612aef9190614273565b6030612afb9190614310565b60f81b818381518110612b1157612b10613d27565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4d9190614366565b9450612acb565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b612c0281612316565b15612c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3990614619565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990614685565b60405180910390fd5b612cbe60008383612bf4565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612da28473ffffffffffffffffffffffffffffffffffffffff16612f09565b15612efc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dcb61239e565b8786866040518563ffffffff1660e01b8152600401612ded94939291906146fa565b6020604051808303816000875af1925050508015612e2957506040513d601f19601f82011682018060405250810190612e26919061475b565b60015b612eac573d8060008114612e59576040519150601f19603f3d011682016040523d82523d6000602084013e612e5e565b606091505b50600081511415612ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b906147fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f01565b600190505b949350505050565b600080823b905060008111915050919050565b828054612f28906139de565b90600052602060002090601f016020900481019282612f4a5760008555612f91565b82601f10612f6357805160ff1916838001178555612f91565b82800160010185558215612f91579182015b82811115612f90578251825591602001919060010190612f75565b5b509050612f9e9190612fa2565b5090565b5b80821115612fbb576000816000905550600101612fa3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61300881612fd3565b811461301357600080fd5b50565b60008135905061302581612fff565b92915050565b60006020828403121561304157613040612fc9565b5b600061304f84828501613016565b91505092915050565b60008115159050919050565b61306d81613058565b82525050565b60006020820190506130886000830184613064565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130c85780820151818401526020810190506130ad565b838111156130d7576000848401525b50505050565b6000601f19601f8301169050919050565b60006130f98261308e565b6131038185613099565b93506131138185602086016130aa565b61311c816130dd565b840191505092915050565b6000602082019050818103600083015261314181846130ee565b905092915050565b6000819050919050565b61315c81613149565b811461316757600080fd5b50565b60008135905061317981613153565b92915050565b60006020828403121561319557613194612fc9565b5b60006131a38482850161316a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131d7826131ac565b9050919050565b6131e7816131cc565b82525050565b600060208201905061320260008301846131de565b92915050565b613211816131cc565b811461321c57600080fd5b50565b60008135905061322e81613208565b92915050565b6000806040838503121561324b5761324a612fc9565b5b60006132598582860161321f565b925050602061326a8582860161316a565b9150509250929050565b61327d81613149565b82525050565b60006020820190506132986000830184613274565b92915050565b6000806000606084860312156132b7576132b6612fc9565b5b60006132c58682870161321f565b93505060206132d68682870161321f565b92505060406132e78682870161316a565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613333826130dd565b810181811067ffffffffffffffff82111715613352576133516132fb565b5b80604052505050565b6000613365612fbf565b9050613371828261332a565b919050565b600067ffffffffffffffff821115613391576133906132fb565b5b61339a826130dd565b9050602081019050919050565b82818337600083830152505050565b60006133c96133c484613376565b61335b565b9050828152602081018484840111156133e5576133e46132f6565b5b6133f08482856133a7565b509392505050565b600082601f83011261340d5761340c6132f1565b5b813561341d8482602086016133b6565b91505092915050565b60006020828403121561343c5761343b612fc9565b5b600082013567ffffffffffffffff81111561345a57613459612fce565b5b613466848285016133f8565b91505092915050565b60006020828403121561348557613484612fc9565b5b60006134938482850161321f565b91505092915050565b60006134a7826131cc565b9050919050565b6134b78161349c565b81146134c257600080fd5b50565b6000813590506134d4816134ae565b92915050565b6000602082840312156134f0576134ef612fc9565b5b60006134fe848285016134c5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61353c81613149565b82525050565b600061354e8383613533565b60208301905092915050565b6000602082019050919050565b600061357282613507565b61357c8185613512565b935061358783613523565b8060005b838110156135b857815161359f8882613542565b97506135aa8361355a565b92505060018101905061358b565b5085935050505092915050565b600060208201905081810360008301526135df8184613567565b905092915050565b600080604083850312156135fe576135fd612fc9565b5b600061360c8582860161316a565b925050602061361d8582860161316a565b9150509250929050565b61363081613058565b811461363b57600080fd5b50565b60008135905061364d81613627565b92915050565b6000806040838503121561366a57613669612fc9565b5b60006136788582860161321f565b92505060206136898582860161363e565b9150509250929050565b600067ffffffffffffffff8211156136ae576136ad6132fb565b5b6136b7826130dd565b9050602081019050919050565b60006136d76136d284613693565b61335b565b9050828152602081018484840111156136f3576136f26132f6565b5b6136fe8482856133a7565b509392505050565b600082601f83011261371b5761371a6132f1565b5b813561372b8482602086016136c4565b91505092915050565b6000806000806080858703121561374e5761374d612fc9565b5b600061375c8782880161321f565b945050602061376d8782880161321f565b935050604061377e8782880161316a565b925050606085013567ffffffffffffffff81111561379f5761379e612fce565b5b6137ab87828801613706565b91505092959194509250565b6000602082840312156137cd576137cc612fc9565b5b60006137db8482850161363e565b91505092915050565b600067ffffffffffffffff8211156137ff576137fe6132fb565b5b602082029050602081019050919050565b600080fd5b6000613828613823846137e4565b61335b565b9050808382526020820190506020840283018581111561384b5761384a613810565b5b835b818110156138745780613860888261316a565b84526020840193505060208101905061384d565b5050509392505050565b600082601f830112613893576138926132f1565b5b81356138a3848260208601613815565b91505092915050565b6000602082840312156138c2576138c1612fc9565b5b600082013567ffffffffffffffff8111156138e0576138df612fce565b5b6138ec8482850161387e565b91505092915050565b6000806040838503121561390c5761390b612fc9565b5b600061391a8582860161321f565b925050602061392b8582860161321f565b9150509250929050565b6000819050919050565b600061395a613955613950846131ac565b613935565b6131ac565b9050919050565b600061396c8261393f565b9050919050565b600061397e82613961565b9050919050565b61398e81613973565b82525050565b60006020820190506139a96000830184613985565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f657607f821691505b60208210811415613a0a57613a096139af565b5b50919050565b7f436865636b696e6720666f72204f776e6572206f66206e6f6e6578697374656e60008201527f7420746f6b656e69640000000000000000000000000000000000000000000000602082015250565b6000613a6c602983613099565b9150613a7782613a10565b604082019050919050565b60006020820190508181036000830152613a9b81613a5f565b9050919050565b7f417070726f76616c20666f72204f776e6572206973206e6f74206e656365737360008201527f6172790000000000000000000000000000000000000000000000000000000000602082015250565b6000613afe602383613099565b9150613b0982613aa2565b604082019050919050565b60006020820190508181036000830152613b2d81613af1565b9050919050565b7f417070726f76652066756e6374696f6e2063616c6c206279206e6f6e2d61707060008201527f726f7665642063616c6c65720000000000000000000000000000000000000000602082015250565b6000613b90602c83613099565b9150613b9b82613b34565b604082019050919050565b60006020820190508181036000830152613bbf81613b83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c0082613149565b9150613c0b83613149565b925082821015613c1e57613c1d613bc6565b5b828203905092915050565b7f5472616e736665722066756e6374696f6e2063616c6c206279206e6f6e2d617060008201527f70726f7665642063616c6c657200000000000000000000000000000000000000602082015250565b6000613c85602d83613099565b9150613c9082613c29565b604082019050919050565b60006020820190508181036000830152613cb481613c78565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613cf1601483613099565b9150613cfc82613cbb565b602082019050919050565b60006020820190508181036000830152613d2081613ce4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613d6182613149565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9457613d93613bc6565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dd5602083613099565b9150613de082613d9f565b602082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b7f43616e6e6f74206d6561737572652062616c616e6365206f66204e756c6c204160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e67602683613099565b9150613e7282613e0b565b604082019050919050565b60006020820190508181036000830152613e9681613e5a565b9050919050565b7f41646472657373206f776e73206e6f20746f6b656e7300000000000000000000600082015250565b6000613ed3601683613099565b9150613ede82613e9d565b602082019050919050565b60006020820190508181036000830152613f0281613ec6565b9050919050565b7f4e6f20536d61727420436f6e74726163747320616c6c6f776564000000000000600082015250565b6000613f3f601a83613099565b9150613f4a82613f09565b602082019050919050565b60006020820190508181036000830152613f6e81613f32565b9050919050565b7f5468652053796e74686573697a6572206973206e6f742061637469766520637560008201527f7272656e746c792e000000000000000000000000000000000000000000000000602082015250565b6000613fd1602883613099565b9150613fdc82613f75565b604082019050919050565b6000602082019050818103600083015261400081613fc4565b9050919050565b600060408201905061401c60008301856131de565b61402960208301846131de565b9392505050565b60008151905061403f81613627565b92915050565b60006020828403121561405b5761405a612fc9565b5b600061406984828501614030565b91505092915050565b7f53796e74686573697a6572206973206e6f7420617070726f76656420746f206260008201527f75726e20796f7572204e4654732e000000000000000000000000000000000000602082015250565b60006140ce602e83613099565b91506140d982614072565b604082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b60008151905061411381613208565b92915050565b60006020828403121561412f5761412e612fc9565b5b600061413d84828501614104565b91505092915050565b7f53796e74686573697a65722043616c6c6572206973206e6f74204f776e65722e600082015250565b600061417c602083613099565b915061418782614146565b602082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f736166655472616e736665722066756e6374696f6e2063616c6c206279206e6f60008201527f6e2d617070726f7665642063616c6c6572000000000000000000000000000000602082015250565b600061420e603183613099565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061427e82613149565b915061428983613149565b92508261429957614298614244565b5b828206905092915050565b7f556e6576656e206e756d626572206f6620424d437320696e7075747465642e00600082015250565b60006142da601f83613099565b91506142e5826142a4565b602082019050919050565b60006020820190508181036000830152614309816142cd565b9050919050565b600061431b82613149565b915061432683613149565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561435b5761435a613bc6565b5b828201905092915050565b600061437182613149565b915061437c83613149565b92508261438c5761438b614244565b5b828204905092915050565b600081905092915050565b60006143ad8261308e565b6143b78185614397565b93506143c78185602086016130aa565b80840191505092915050565b60006143df82856143a2565b91506143eb82846143a2565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614453602683613099565b915061445e826143f7565b604082019050919050565b6000602082019050818103600083015261448281614446565b9050919050565b7f43616c6c657220646f6573206e6f74206f776e20746f6b656e00000000000000600082015250565b60006144bf601983613099565b91506144ca82614489565b602082019050919050565b600060208201905081810360008301526144ee816144b2565b9050919050565b7f43616e6e6f74207472616e7366657220746f204e756c6c204164647265737300600082015250565b600061452b601f83613099565b9150614536826144f5565b602082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f4572726f722066726f6d20455243373231526563656976657220636865636b00600082015250565b6000614597601f83613099565b91506145a282614561565b602082019050919050565b600060208201905081810360008301526145c68161458a565b9050919050565b7f546f6b656e20616c726561647920657869737473000000000000000000000000600082015250565b6000614603601483613099565b915061460e826145cd565b602082019050919050565b60006020820190508181036000830152614632816145f6565b9050919050565b7f43616e6e6f74206d696e7420746f204e756c6c20416464726573730000000000600082015250565b600061466f601b83613099565b915061467a82614639565b602082019050919050565b6000602082019050818103600083015261469e81614662565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146cc826146a5565b6146d681856146b0565b93506146e68185602086016130aa565b6146ef816130dd565b840191505092915050565b600060808201905061470f60008301876131de565b61471c60208301866131de565b6147296040830185613274565b818103606083015261473b81846146c1565b905095945050505050565b60008151905061475581612fff565b92915050565b60006020828403121561477157614770612fc9565b5b600061477f84828501614746565b91505092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147e4603283613099565b91506147ef82614788565b604082019050919050565b60006020820190508181036000830152614813816147d7565b905091905056fea2646970667358221220837f2b7bca8e71d2e4956bf990576d0fe70b3552ed52089c4a064547234647f964736f6c634300080b0033

Verified Source Code Partial Match

Compiler: v0.8.11+commit.d7f03943 EVM: london Optimization: No
Ultraminers.sol 611 lines
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal 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);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

library Address {
 
    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IERC721Receiver {

    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

abstract contract ERC165 is IERC165 {

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract NFTOptimized is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;

    string private _name;
    string private _symbol;
    uint256 private burnCount;

    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = NFTOptimized.ownerOf(tokenId);
        require(to != owner, "Approval for Owner is not necessary");
        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "Approve function call by non-approved caller");

        _approve(to, tokenId);
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "Approval for Owner is not necessary");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Transfer function call by non-approved caller");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "safeTransfer function call by non-approved caller");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "Error from ERC721Receiver check");
    }

	function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
	function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "Error from ERC721Receiver check");
    }
	function _mint(address to, uint256 tokenId) internal virtual {
        require(!_exists(tokenId), "Token already exists");
        require(to != address(0), "Cannot mint to Null Address");
        
        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }

	function _burn(uint256 tokenId) internal virtual {
        address owner = NFTOptimized.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);
        burnCount++;

        emit Transfer(owner, address(0), tokenId);
    }

	function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(NFTOptimized.ownerOf(tokenId) == from, "Caller does not own token");
        require(to != address(0), "Cannot transfer to Null Address");

        _beforeTokenTransfer(from, to, tokenId);
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

	function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(NFTOptimized.ownerOf(tokenId), to, tokenId);
    }

	function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
    //Leaving this in incase anyone needs to overwrite this function for additional functionality
	function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {}

    /**
    VIEW FUNCTIONS
     */
     
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "Cannot measure balance of Null Address");
        uint count = 0;
        uint length = _owners.length;
        for(uint i = 0; i < length; i++){
          if(owner == _owners[i] ){
            count++;
          }
        }
        delete length;
        return count;
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "Checking for Owner of nonexistent tokenid");
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "Checking for Owner of nonexistent tokenid");
        return _tokenApprovals[tokenId];
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "Checking for Owner of nonexistent tokenid");
        address owner = NFTOptimized.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length - burnCount;
    }

    function totalCreated() public view virtual returns (uint256) {
        return _owners.length;
    }

    function totalBurned() public view virtual returns (uint256) {
        return burnCount;
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < NFTOptimized.balanceOf(owner), "Address owns no tokens");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);

        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < NFTOptimized.balanceOf(owner), "Token does not exist");
        uint count;

        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "Token does not exist");
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < NFTOptimized.totalCreated(), "Token does not exist");
        return index;
    }

}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


/**
::::::ccclccccclloooollooodxxxxxxxxdddxxkkkkkkkkO00000000OOkkkkkkxxdddxxxxxxxdoolllooolccccccc::::::
ccccllcccccllloooollooddxxxxxxxddxxxkkkkkkkOO000000000000000OOOkkkkkkxxxxxxxxxxxddoollloollccccccc::
llcccclllooooollooddxxxxxxxxxxxxkkkkkkkOO000OOO0KKK0000KK000OOOOOOkkkkkOkkkxxxxxxxxxddoolllolllccccc
cclllooooollloodxxxxxxxxxxxkkOkkkOOO00000OkkOkOOK00kxkkkkxxkkkkkkOO0OOkkkkOOkkkxxxxxxxxxddoooloollcc
looooolllooddxxxxxxxxxkkkOOkOOO000000OkkOkkO0Oxoc,.. .';coddddxxdxkkkkOOOOkkkkOOkkxxxdxxxxxxddoollll
oooolooddxxxxxxxxxkkkkOOOOO000000OOOOOkk0Oxoc,.          .';coddddxxxxkkkkkOOOkkkkOOkkxxxddxxxxxdool
oooloxxxxxxxxxkkkkOOOO0000O000O00OkkOOxoc,.                  .';coxxdxxxxxkkkxkkOOkkkOOOkkxxddxxxxxx
oolldxxdxxkkkkkOOO000OO000O000OOOOxo:,.                          .';coxxdxkkkxkkxxkkkOkkkOOOkxddxxxx
oolldxxdxOkkkOO00OO00OOO0OOkOOxo:,.                                  .';coxxdk0K0OkxkOOOOkkkkOxdxxxx
oolldxddkOxk00O00OOOOOxxkkxl:,.                                          .';:oxkO0K0000OO00xxOxdxxxx
oolldxddkOkkO0OOOkxxkkdl:,.                                                  ..,ckKKK0KKOO0kxOxdxxxx
oocldxddkOxxkkxxxkdc:,.                                                          lkkK0KKOO0kxOxdxxxx
oollxxdxkkxxddxxkc.                                                              :dd00KKOO0kxOxdxxxx
ooloxxdxOkxxdddxk,                                                               :ddOOKKOO0kxOxdxxxx
ooloxxxxOkxxxxxxk,                                                               :ddOO00OO0kxOxdxxxx
ooldxxxxOkxkOOxxk,            ..'''.                           .',;;,.           :ddOkk0OO0kkOxdxxxx
ooldxxxxOkxkO0xxk,           'kOdodkxc.     'c.              cOOkkkko.           :ddOkk0OO0kkOkxxxxx
ooodxxdxOxkk00dxk,           :Kl   .c0d.    cXo       ::    .dWx.                :ddOkk0OO0kkOkxxxxx
olodxxdxOxkO00dxk,           :Kc    .dO.    lW0,     .OO'    lNx.                :doOkk0OO0kkOkdxxxx
olodxxdxOxkO00kkk,           ;Kk::::o0o     oWWd.    :XNl    :Xk.                :doOkk0OO0kkOkdxxxx
olldxxdxOxkO0K0KO,           ;KOcccldkkc.  .dX0O;   .xKKO'   ,KO.                :dokkk0OO0kkOxdxxxx
olldxxdxOkkOOK00k,           ;0l      ;Ok. .k0:xx.  ;0lc0l   .O0'                :dokkk0OO0kkOxdxxxx
ollxxxdxOkkOOK0Od,           ,0l       ,Oc .Ok.,k: .dO'.xO.  .xK,                :dokkx0OO0kxOxdxxxx
oclxxxdkOkkkOK0kd,           ,0o       .kl '0x. lxclOo  :Kl   dX:                :dokkxOOO0xxOxddxxx
ocoxxxdkkkOk000kd,           ,0o       :O; ,0d  .xXX0,  .kO.  lXc                :dokxxOOO0xkOxodxxx
oloxxddkkkOO00Okd,           '0x.  ..,lkc  ;0l   :OXx.   cKc  ;Kd.               :dokkOKOO0kkOxodxxx
oloxxddkkkOO0kkkd,           .lxlclool:.   ;O:   .'c;    'Ok. .d0kxdxxo.         :dokO0KOO0xkOxodxxx
lldxxdokkkOO0kxkd,                         ...            ,:.   ';cloo:.         :dokk0XOOOxxOkddxxx
lldxxddkkkO0Kxxkd,                                                               :dokO0X00OxxOkddxxx
lldxxddkxkO0Kxxxd,                                                               :dokO0X0OOxkOkddxxx
lldxxddkxkOO0kxxo,                                                               :od000XOOOxkOkddxxx
lldxxdxkxkOO0kxdo,                                                               :od0O0X0OOxkOkddxxx
loxxxdxkxkOOKkxdo,                                                              .lod00KXOOOxkOkddxxx
loxxxdxkxkO0Kkxdo,                                                          .':cdkxkK0KKOOOxkOkddxxx
loxxxdxkxOO0K00xol,..                                                   .':ldkkxxkO00000O0OxkOkddxxx
loxxxdxkkOOO000Oxxxdl:,.                                            .,:ldkkxxkOOO00000000OkkOOkddxxx
loxxxxkkkO00O0000Okkxxxxdoloc'.                                 .':ldkkxxkOOO000000000OOkkOOOkxddxxx
loxxxdxOkkkkO0000000OOkkk000Okdc;'.                         .,:ldkkxxxkOO00000000OOOOOOOOkkxxddxxxxd
llodxddxxkOkkkkkO00000000Okkkkxxxxoc;'.                 .,:ldkkxxkkkO00000000OkkkkOOOkkxxxdxxxxxdool
oollodxxxxxxkOkkxkkO0000000KKK0Okkddddoc:,.         .,:ldkkxdkOOO00000000OkkkkkOOkkxxddxxxxxddoolloo
lloooloodxxxxxxkkkkxkkO000000000000Okxddxxol:,..,:cldkkxdxkOO00000000OkkkkkOOkkxxddxxxxxdddoollooooo
ccllloooooddxxxxxxkkOkkkkO0000000000000OOOOO0KOOOOkxdxkkO0000O000OkkkkkOOkkxxxdxxxxxxddoooloooooollc
lccccllooolooddxxxxxxxkOkkkkkkkkOO00O000KKKKKKK00OOOO000000000OkkkkOOOkxxddxxxxxxddoooloooooollccccc
ccclccccloooolloodxxxxdxxkOOOOOOkkkkO00OO0000KKKKKK0000000OkkkkkOOkxxxddxxxxxddoolloooooollcccccccll
:::clllccclloooolloodxxxxxxxkkkkkOOkkkkOO00O0000000000OOkkkkOOkxxxxxxxxxxxdoollloooooollccccclclllll
:::::ccllccccllooollloddxxxxxxxxxxkkOOkkkkOO00000OOOkkkkOOkxxxddxxxxxxdooolloooooollccccccllcllllcc:
;:::;::cccllcccllooooolloddxxxxxxxxxxxkkOOkkkOOOkkkkOOkxxxddxxxxxxddoolllooooolllcccclllcclllccc::::
',;;::::::ccllcccclloooooloooddxxxxxxxxxxkkOOOOOOkkkxxddxxxxxxxdoolllooooolllccccclccllllccc::::::::
''',;;::::::cclccccccllllooollloodxxxxxxxxxxxkxxxdddxxxxxxxdoollloooooollcccccllcllcclcc::::::::::;;
''''',;:::::::cccllcccccccooooolllodxxxxxxxxxdddxxxxxxxxxdolllooooooolccccccclllllllcc:;::::::::;,,'

    Ultraminers are synthesized from the burning of two BMCs. They are hand drawn rare and unique artworks inspired by Bitcoin miners (AntminerS19j ASIC Pro). 

*/

interface IBMC {
    function burn(uint256 tokenId) external;
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    function ownerOf(uint256 tokenId) external view returns (address);
}

contract Ultraminers is NFTOptimized, Ownable {
  using Strings for uint256;
  bool private synthesizerState = false;

  string public baseURI;
  address public umContract;
  IBMC public bmc;

  constructor(string memory _name, string memory _symbol, IBMC _bmc) NFTOptimized(_name, _symbol) {
    baseURI = "ipfs://QmVGRm43vSXRyzRRM3C8j3rvLDabuxS3nT6V5ftMjXPpL3/";
    bmc = _bmc;
    umContract = address(this);
  }

  modifier nonContract() {
    require(tx.origin == msg.sender, "No Smart Contracts allowed");
    _;
  }

  function synthesizeUltraminer(uint256 firstbmc, uint256 secondbmc) external nonContract{
    require(synthesizerState, "The Synthesizer is not active currently.");
    address caller = _msgSender();
    require(bmc.isApprovedForAll(caller, umContract), "Synthesizer is not approved to burn your NFTs.");
    require(bmc.ownerOf(firstbmc) == caller && bmc.ownerOf(secondbmc) == caller, "Synthesizer Caller is not Owner.");
    uint256 supply = totalCreated();
 
    bmc.burn(firstbmc);
    bmc.burn(secondbmc);

    _safeMint(caller, supply, "");

  }

  function synthesizeManyUltraminers(uint256[] memory bmcs) external nonContract{
    require(synthesizerState, "The Synthesizer is not active currently.");
    require(bmcs.length % 2 == 0, "Uneven number of BMCs inputted.");
    address caller = _msgSender();
    require(bmc.isApprovedForAll(caller, umContract), "Synthesizer is not approved to burn your NFTs.");
    uint256 supply = totalCreated();

    for (uint256 i = 0; i < bmcs.length; i += 2) {

        uint256 firstbmc = bmcs[i];
        uint256 secondbmc = bmcs[i + 1];
        require(bmc.ownerOf(firstbmc) == caller && bmc.ownerOf(secondbmc) == caller, "Synthesizer Caller is not Owner.");

        bmc.burn(firstbmc);
        bmc.burn(secondbmc);

        _safeMint(caller, supply + i/2, "");
    }

  }

  function setBaseURI(string memory _newBaseURI) external onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBmcContract(IBMC _newBmcContract) external onlyOwner {
    bmc = _newBmcContract;
  }

  function setSynthesizerState(bool _state) external onlyOwner {
        synthesizerState = _state;
  }

  function burn(uint256 tokenId) public {
    require(_isApprovedOrOwner(_msgSender(), tokenId));
    _burn(tokenId);
  }

   /**
    VIEW FUNCTIONS
   */

  function _baseURI() internal view virtual returns (string memory) {
	return baseURI;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
	require(_exists(tokenId), "Token does not exist");

	string memory currentBaseURI = _baseURI();
	return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
  }

  function getSynthesizerState() public view returns (bool){
        return synthesizerState;
  }

  function getBmcApprovalStatus(address _address) public view returns (bool){
        return bmc.isApprovedForAll(_address, umContract);
  }

  function isApprovedForAll(address _owner, address _operator) public override view returns (bool isOperator) {
        if (_operator == address(0xa5409ec958C83C3f309868babACA7c86DCB077c1)) {     // OpenSea Address
            return true;
        }
        
        return NFTOptimized.isApprovedForAll(_owner, _operator);
  }

}

Read Contract

balanceOf 0x70a08231 → uint256
baseURI 0x6c0360eb → string
bmc 0xf859b4f8 → address
getApproved 0x081812fc → address
getBmcApprovalStatus 0xc1d06799 → bool
getSynthesizerState 0xcb443cb5 → bool
isApprovedForAll 0xe985e9c5 → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenByIndex 0x4f6ccce7 → uint256
tokenOfOwnerByIndex 0x2f745c59 → uint256
tokenURI 0xc87b56dd → string
tokensOfOwner 0x8462151c → uint256[]
totalBurned 0xd89135cd → uint256
totalCreated 0x844e0acd → uint256
totalSupply 0x18160ddd → uint256
umContract 0x41218b80 → address

Write Contract 13 functions

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

approve 0x095ea7b3
address to
uint256 tokenId
burn 0x42966c68
uint256 tokenId
renounceOwnership 0x715018a6
No parameters
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
setBmcContract 0x7a44d57c
address _newBmcContract
setSynthesizerState 0xb9d99d29
bool _state
synthesizeManyUltraminers 0xbc0853df
uint256[] bmcs
synthesizeUltraminer 0x98f073d0
uint256 firstbmc
uint256 secondbmc
transferFrom 0x23b872dd
address from
address to
uint256 tokenId
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address