Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x9F1300a84A3D4627b9CF999B0160682B51F3430f
Balance 0 ETH
Nonce 1
Code Size 24159 bytes
Indexed Transactions 0 (1 on-chain, 0.7% indexed)
External Etherscan · Sourcify

Contract Bytecode

24159 bytes
0x60806040526004361061020e5760003560e01c80638305b68e11610118578063b3a35b40116100a0578063e8a3d4851161006f578063e8a3d485146107e8578063e985e9c514610813578063f242432a14610850578063f2fde38b14610879578063f81b6db8146108a25761020e565b8063b3a35b401461073d578063b90838bf14610766578063d94f1d061461078f578063e7b7857c146107ab5761020e565b806391564697116100e75780639156469714610640578063a22cb4651461066b578063a82620d514610694578063ac9eb943146106d5578063ad25ca29146107005761020e565b80638305b68e146105825780638679984f146105ad57806388b45046146105ea5780638da5cb5b146106155761020e565b80632f48ab7d1161019b57806340b2f5b51161016a57806340b2f5b514610499578063410b8cb2146104c45780634e1273f4146104ef57806354592b691461052c578063715018a61461056b5761020e565b80632f48ab7d146103c4578063307de5f3146103ef578063332a101d14610433578063395dd80a1461045c5761020e565b80630e89341c116101e25780630e89341c146102e157806320b15edb1461031e57806324bb7c831461034957806324bf54f4146103725780632eb2c2d61461039b5761020e565b8062fdd58e1461021357806301ffc9a71461025057806302fe53051461028d5780630c33e31f146102b6575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190614359565b6108cd565b60405161024791906150ed565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061443e565b610996565b6040516102849190614e1f565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061453a565b610a78565b005b3480156102c257600080fd5b506102cb610b90565b6040516102d891906150ed565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190614583565b610b96565b6040516103159190614e8b565b60405180910390f35b34801561032a57600080fd5b50610333610bde565b60405161034091906150ed565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b91906142ea565b610be4565b005b34801561037e57600080fd5b50610399600480360381019061039491906146a0565b610dbe565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190614144565b6113eb565b005b3480156103d057600080fd5b506103d96113f2565b6040516103e69190614e3a565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190614583565b611418565b60405161042a989796959493929190615169565b60405180910390f35b34801561043f57600080fd5b5061045a600480360381019061045591906147b7565b61159a565b005b34801561046857600080fd5b50610483600480360381019061047e91906140d7565b61175a565b60405161049091906150ed565b60405180910390f35b3480156104a557600080fd5b506104ae611772565b6040516104bb9190614e70565b60405180910390f35b3480156104d057600080fd5b506104d9611798565b6040516104e69190614cce565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190614399565b6117be565b6040516105239190614dfd565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e9190614359565b6118d7565b60405161056293929190614d7a565b60405180910390f35b34801561057757600080fd5b506105806119b6565b005b34801561058e57600080fd5b50610597611a37565b6040516105a49190614cce565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf9190614583565b611a5d565b6040516105e191906150ed565b60405180910390f35b3480156105f657600080fd5b506105ff611a75565b60405161060c9190614e3a565b60405180910390f35b34801561062157600080fd5b5061062a611a9b565b6040516106379190614cce565b60405180910390f35b34801561064c57600080fd5b50610655611b38565b6040516106629190614e55565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d91906142aa565b611b5e565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190614583565b611b74565b6040516106cc959493929190615108565b60405180910390f35b3480156106e157600080fd5b506106ea611d18565b6040516106f791906150ed565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190614583565b611d1e565b6040516107349190614e1f565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f91906145dd565b611d7f565b005b34801561077257600080fd5b5061078d60048036038101906107889190614498565b611e14565b005b6107a960048036038101906107a4919061461d565b61201f565b005b3480156107b757600080fd5b506107d260048036038101906107cd91906140d7565b612ca5565b6040516107df9190614e1f565b60405180910390f35b3480156107f457600080fd5b506107fd612d35565b60405161080a9190614e8b565b60405180910390f35b34801561081f57600080fd5b5061083a60048036038101906108359190614104565b612d65565b6040516108479190614e1f565b60405180910390f35b34801561085c57600080fd5b5061087760048036038101906108729190614213565b612df9565b005b34801561088557600080fd5b506108a0600480360381019061089b91906140d7565b612eda565b005b3480156108ae57600080fd5b506108b7612fcb565b6040516108c491906150ed565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590614eed565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a715750610a7082612fd1565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610a97611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae49061500d565b60405180910390fd5b7f2f000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168160018351610b3f919061545a565b81518110610b5057610b4f61579a565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610b8d57610b8c8161303b565b5b50565b60115481565b6060610ba26000613055565b610bb7600184610bb29190615379565b6130e9565b604051602001610bc8929190614c7d565b6040516020818303038152906040529050919050565b600d5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b9061504d565b60405180910390fd5b60405180606001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815250600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610d3690615693565b91905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190610dab929190613ca4565b5060408201518160020155905050505050565b3373ffffffffffffffffffffffffffffffffffffffff16610ddd611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a9061500d565b60405180910390fd5b6000811415610f75576040518061010001604052808b81526020018a8152602001898152602001888152602001600081526020018661ffff1681526020018561ffff1681526020018461ffff168152506003600060046000815480929190610e9a90615693565b919050558152602001908152602001600020600082015181600001556020820151816001019080519060200190610ed2929190613ca4565b506040820151816002019080519060200190610eef929190613ca4565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548161ffff021916908361ffff16021790555060c08201518160050160026101000a81548161ffff021916908361ffff16021790555060e08201518160050160046101000a81548161ffff021916908361ffff1602179055509050506113df565b60018114156110e4576004548210610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990614f2d565b60405180910390fd5b6040518061010001604052808b81526020018a81526020018981526020018881526020018781526020018661ffff1681526020018561ffff1681526020018461ffff1681525060036000848152602001908152602001600020600082015181600001556020820151816001019080519060200190611041929190613ca4565b50604082015181600201908051906020019061105e929190613ca4565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548161ffff021916908361ffff16021790555060c08201518160050160026101000a81548161ffff021916908361ffff16021790555060e08201518160050160046101000a81548161ffff021916908361ffff1602179055509050506113de565b60028114156113dd576004548210611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890614f2d565b60405180910390fd5b60008290505b6001600454611146919061545a565b811015611286576003600060018361115e9190615379565b81526020019081526020016000206003600083815260200190815260200160002060008201548160000155600182018160010190805461119d90615630565b6111a8929190613d2a565b5060028201816002019080546111bd90615630565b6111c8929190613d2a565b5060038201548160030155600482015481600401556005820160009054906101000a900461ffff168160050160006101000a81548161ffff021916908361ffff1602179055506005820160029054906101000a900461ffff168160050160026101000a81548161ffff021916908361ffff1602179055506005820160049054906101000a900461ffff168160050160046101000a81548161ffff021916908361ffff160217905550905050808061127e90615693565b915050611137565b50604051806101000160405280600081526020016040518060200160405280600081525081526020016040518060200160405280600081525081526020016000815260200160008152602001600061ffff168152602001600061ffff168152602001600061ffff168152506003600060046000815461130490615606565b919050819055815260200190815260200160002060008201518160000155602082015181600101908051906020019061133e929190613ca4565b50604082015181600201908051906020019061135b929190613ca4565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548161ffff021916908361ffff16021790555060c08201518160050160026101000a81548161ffff021916908361ffff16021790555060e08201518160050160046101000a81548161ffff021916908361ffff1602179055509050505b5b5b50505050505050505050565b5050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360205280600052604060002060009150905080600001549080600101805461144190615630565b80601f016020809104026020016040519081016040528092919081815260200182805461146d90615630565b80156114ba5780601f1061148f576101008083540402835291602001916114ba565b820191906000526020600020905b81548152906001019060200180831161149d57829003601f168201915b5050505050908060020180546114cf90615630565b80601f01602080910402602001604051908101604052809291908181526020018280546114fb90615630565b80156115485780601f1061151d57610100808354040283529160200191611548565b820191906000526020600020905b81548152906001019060200180831161152b57829003601f168201915b5050505050908060030154908060040154908060050160009054906101000a900461ffff16908060050160029054906101000a900461ffff16908060050160049054906101000a900461ffff16905088565b3373ffffffffffffffffffffffffffffffffffffffff166115b9611a9b565b73ffffffffffffffffffffffffffffffffffffffff161461160f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116069061500d565b60405180910390fd5b6001811461165c57601154831061165b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116529061502d565b60405180910390fd5b5b600081141561168e576001826116729190615379565b6010600085815260200190815260200160002081905550611755565b60018114156116d6576001826116a49190615379565b60106000601160008154809291906116bb90615693565b91905055815260200190815260200160002081905550611754565b60028114156117535760008390505b60115481101561173957601060006001836117009190615379565b8152602001908152602001600020546010600083815260200190815260200160002081905550808061173190615693565b9150506116e5565b506011600081548092919061174d90615606565b91905055505b5b5b505050565b60066020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb9061508d565b60405180910390fd5b6000835167ffffffffffffffff811115611821576118206157c9565b5b60405190808252806020026020018201604052801561184f5781602001602082028036833780820191505090505b50905060005b84518110156118cc5761189c8582815181106118745761187361579a565b5b602002602001015185838151811061188f5761188e61579a565b5b60200260200101516108cd565b8282815181106118af576118ae61579a565b5b602002602001018181525050806118c590615693565b9050611855565b508091505092915050565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101805461192d90615630565b80601f016020809104026020016040519081016040528092919081815260200182805461195990615630565b80156119a65780601f1061197b576101008083540402835291602001916119a6565b820191906000526020600020905b81548152906001019060200180831161198957829003601f168201915b5050505050908060020154905083565b3373ffffffffffffffffffffffffffffffffffffffff166119d5611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229061500d565b60405180910390fd5b611a35600061324a565b565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b0f5773775dd9d922b48c42c34b88811c97863ad894ecf99050611b35565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b90565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b70611b6961328e565b8383613296565b5050565b600060608060008060036000878152602001908152602001600020600001546003600088815260200190815260200160002060010160036000898152602001908152602001600020600201600360008a815260200190815260200160002060030154600360008b815260200190815260200160002060040154838054611bf990615630565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2590615630565b8015611c725780601f10611c4757610100808354040283529160200191611c72565b820191906000526020600020905b815481529060010190602001808311611c5557829003601f168201915b50505050509350828054611c8590615630565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb190615630565b8015611cfe5780601f10611cd357610100808354040283529160200191611cfe565b820191906000526020600020905b815481529060010190602001808311611ce157829003601f168201915b505050505092509450945094509450945091939590929450565b60045481565b600080600090505b601154811015611d7457600183611d3d9190615379565b60106000838152602001908152602001600020541415611d61576001915050611d7a565b8080611d6c90615693565b915050611d26565b50600090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611d9e611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb9061500d565b60405180910390fd5b611e108183600160405180602001604052806000815250613403565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611e33611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e809061500d565b60405180910390fd5b86600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d8190555050505050505050565b600360008581526020019081526020016000206003015460036000868152602001908152602001600020600401541061208d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612084906150cd565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166372f2f50960646003600089815260200190815260200160002060050160009054906101000a900461ffff1661ffff16600360008a8152602001908152602001600020600001546121199190615400565b61212391906153cf565b6040518263ffffffff1660e01b815260040161213f91906150ed565b60206040518083038186803b15801561215757600080fd5b505afa15801561216b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218f91906145b0565b90503373ffffffffffffffffffffffffffffffffffffffff166121b0611a9b565b73ffffffffffffffffffffffffffffffffffffffff16146129565760008361ffff16141561226e578034101561221b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221290614fad565b60405180910390fd5b612223611a9b565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612268573d6000803e3d6000fd5b50612955565b60018361ffff1614156123915760646003600087815260200190815260200160002060050160029054906101000a900461ffff1661ffff1660036000888152602001908152602001600020600001546122c79190615400565b6122d191906153cf565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3361231a611a9b565b846040518463ffffffff1660e01b815260040161233993929190614ce9565b602060405180830381600087803b15801561235357600080fd5b505af1158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190614411565b50612954565b60028361ffff1614156127095760646003600087815260200190815260200160002060050160049054906101000a900461ffff1661ffff16826123d49190615400565b6123de91906153cf565b90506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377e73a51836040518263ffffffff1660e01b815260040161243d91906150ed565b60206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d91906145b0565b905061249886611d1e565b1561264a57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377e73a51600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166372f2f5096064600360008c815260200190815260200160002060050160049054906101000a900461ffff1661ffff16600360008d8152602001908152602001600020600001546125659190615400565b61256f91906153cf565b6040518263ffffffff1660e01b815260040161258b91906150ed565b60206040518083038186803b1580156125a357600080fd5b505afa1580156125b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125db91906145b0565b6040518263ffffffff1660e01b81526004016125f791906150ed565b60206040518083038186803b15801561260f57600080fd5b505afa158015612623573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264791906145b0565b90505b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33612691611a9b565b846040518463ffffffff1660e01b81526004016126b093929190614ce9565b602060405180830381600087803b1580156126ca57600080fd5b505af11580156126de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127029190614411565b5050612953565b60038361ffff161415612952576000805b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481101561290c576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010180546127c190615630565b80601f01602080910402602001604051908101604052809291908181526020018280546127ed90615630565b801561283a5780601f1061280f5761010080835404028352916020019161283a565b820191906000526020600020905b81548152906001019060200180831161281d57829003601f168201915b50505050509050846040516020016128529190614c66565b60405160208183030381529060405280519060200120816040516020016128799190614c66565b604051602081830303815290604052805190602001201480156128ee575087600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060020154145b156128f857600192505b50808061290490615693565b91505061271a565b5060018114612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294790614f4d565b60405180910390fd5b505b5b5b5b5b60003390503373ffffffffffffffffffffffffffffffffffffffff1661297a611a9b565b73ffffffffffffffffffffffffffffffffffffffff16141561299a578490505b6129b68187600160405180602001604052806000815250613403565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310c881b133886001600360008c815260200190815260200160002060040154612a199190615379565b60016040518563ffffffff1660e01b8152600401612a3a9493929190614db8565b600060405180830381600087803b158015612a5457600080fd5b505af1158015612a68573d6000803e3d6000fd5b505050506103e8600d546103e8612a7f9190615379565b6003600089815260200190815260200160002060000154612aa09190615400565b612aaa91906153cf565b9150612c9d82600360008981526020019081526020016000206001018054612ad190615630565b80601f0160208091040260200160405190810160405280929190818152602001828054612afd90615630565b8015612b4a5780601f10612b1f57610100808354040283529160200191612b4a565b820191906000526020600020905b815481529060010190602001808311612b2d57829003601f168201915b5050505050600360008a81526020019081526020016000206002018054612b7090615630565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9c90615630565b8015612be95780601f10612bbe57610100808354040283529160200191612be9565b820191906000526020600020905b815481529060010190602001808311612bcc57829003601f168201915b5050505050600360008b8152602001908152602001600020600301546001600360008d815260200190815260200160002060040154612c289190615379565b600360008d815260200190815260200160002060050160009054906101000a900461ffff16600360008e815260200190815260200160002060050160029054906101000a900461ffff16600360008f815260200190815260200160002060050160049054906101000a900461ffff168e613599565b505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480612d2e57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6060612d416000613055565b604051602001612d519190614cac565b604051602081830303815290604052905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612e875750612e58611a9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebd90614fcd565b60405180910390fd5b612ed38585858585613705565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16612ef9611a9b565b73ffffffffffffffffffffffffffffffffffffffff1614612f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f469061500d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb690614f0d565b60405180910390fd5b612fc88161324a565b50565b60075481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8060029080519060200190613051929190613ca4565b5050565b60606002805461306490615630565b80601f016020809104026020016040519081016040528092919081815260200182805461309090615630565b80156130dd5780601f106130b2576101008083540402835291602001916130dd565b820191906000526020600020905b8154815290600101906020018083116130c057829003601f168201915b50505050509050919050565b60606000821415613131576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613245565b600082905060005b6000821461316357808061314c90615693565b915050600a8261315c91906153cf565b9150613139565b60008167ffffffffffffffff81111561317f5761317e6157c9565b5b6040519080825280601f01601f1916602001820160405280156131b15781602001600182028036833780820191505090505b5090505b6000851461323e576001826131ca919061545a565b9150600a856131d991906156dc565b60306131e59190615379565b60f81b8183815181106131fb576131fa61579a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561323791906153cf565b94506131b5565b8093505050505b919050565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fc9061506d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133f69190614e1f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a906150ad565b60405180910390fd5b600061347d61328e565b905061349e8160008761348f886137a6565b613498886137a6565b87613820565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134fd9190615379565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161357b9291906151f5565b60405180910390a461359281600087878787613828565b5050505050565b60045481106135dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d490614f2d565b60405180910390fd5b6040518061010001604052808a81526020018981526020018881526020018781526020018681526020018561ffff1681526020018461ffff1681526020018361ffff168152506003600083815260200190815260200160002060008201518160000155602082015181600101908051906020019061365c929190613ca4565b506040820151816002019080519060200190613679929190613ca4565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548161ffff021916908361ffff16021790555060c08201518160050160026101000a81548161ffff021916908361ffff16021790555060e08201518160050160046101000a81548161ffff021916908361ffff160217905550905050505050505050505050565b61370d61328e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061375357506137528561374d61328e565b612d65565b5b613792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378990614f6d565b60405180910390fd5b61379f8585858585613a0f565b5050505050565b60606000600167ffffffffffffffff8111156137c5576137c46157c9565b5b6040519080825280602002602001820160405280156137f35781602001602082028036833780820191505090505b509050828160008151811061380b5761380a61579a565b5b60200260200101818152505080915050919050565b505050505050565b6138478473ffffffffffffffffffffffffffffffffffffffff16613c91565b15613a07578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161388d959493929190614d20565b602060405180830381600087803b1580156138a757600080fd5b505af19250505080156138d857506040513d601f19601f820116820180604052508101906138d5919061446b565b60015b61397e576138e46157f8565b806308c379a0141561394157506138f9615cdb565b806139045750613943565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139389190614e8b565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397590614ead565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fc90614ecd565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7690614f8d565b60405180910390fd5b6000613a8961328e565b9050613aa9818787613a9a886137a6565b613aa3886137a6565b87613820565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3790614fed565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bf59190615379565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613c729291906151f5565b60405180910390a4613c88828888888888613828565b50505050505050565b600080823b905060008111915050919050565b828054613cb090615630565b90600052602060002090601f016020900481019282613cd25760008555613d19565b82601f10613ceb57805160ff1916838001178555613d19565b82800160010185558215613d19579182015b82811115613d18578251825591602001919060010190613cfd565b5b509050613d269190613db7565b5090565b828054613d3690615630565b90600052602060002090601f016020900481019282613d585760008555613da6565b82601f10613d695780548555613da6565b82800160010185558215613da657600052602060002091601f016020900482015b82811115613da5578254825591600101919060010190613d8a565b5b509050613db39190613db7565b5090565b5b80821115613dd0576000816000905550600101613db8565b5090565b6000613de7613de284615243565b61521e565b90508083825260208201905082856020860282011115613e0a57613e0961581f565b5b60005b85811015613e3a5781613e208882613f38565b845260208401935060208301925050600181019050613e0d565b5050509392505050565b6000613e57613e528461526f565b61521e565b90508083825260208201905082856020860282011115613e7a57613e7961581f565b5b60005b85811015613eaa5781613e9088826140ad565b845260208401935060208301925050600181019050613e7d565b5050509392505050565b6000613ec7613ec28461529b565b61521e565b905082815260208101848484011115613ee357613ee2615824565b5b613eee8482856155c4565b509392505050565b6000613f09613f04846152cc565b61521e565b905082815260208101848484011115613f2557613f24615824565b5b613f308482856155c4565b509392505050565b600081359050613f4781615d71565b92915050565b600082601f830112613f6257613f6161581a565b5b8135613f72848260208601613dd4565b91505092915050565b600082601f830112613f9057613f8f61581a565b5b8135613fa0848260208601613e44565b91505092915050565b600081359050613fb881615d88565b92915050565b600081519050613fcd81615d88565b92915050565b600081359050613fe281615d9f565b92915050565b600081519050613ff781615d9f565b92915050565b600082601f8301126140125761401161581a565b5b8135614022848260208601613eb4565b91505092915050565b60008135905061403a81615db6565b92915050565b60008135905061404f81615dcd565b92915050565b60008135905061406481615de4565b92915050565b600082601f83011261407f5761407e61581a565b5b813561408f848260208601613ef6565b91505092915050565b6000813590506140a781615dfb565b92915050565b6000813590506140bc81615e12565b92915050565b6000815190506140d181615e12565b92915050565b6000602082840312156140ed576140ec61582e565b5b60006140fb84828501613f38565b91505092915050565b6000806040838503121561411b5761411a61582e565b5b600061412985828601613f38565b925050602061413a85828601613f38565b9150509250929050565b600080600080600060a086880312156141605761415f61582e565b5b600061416e88828901613f38565b955050602061417f88828901613f38565b945050604086013567ffffffffffffffff8111156141a05761419f615829565b5b6141ac88828901613f7b565b935050606086013567ffffffffffffffff8111156141cd576141cc615829565b5b6141d988828901613f7b565b925050608086013567ffffffffffffffff8111156141fa576141f9615829565b5b61420688828901613ffd565b9150509295509295909350565b600080600080600060a0868803121561422f5761422e61582e565b5b600061423d88828901613f38565b955050602061424e88828901613f38565b945050604061425f888289016140ad565b9350506060614270888289016140ad565b925050608086013567ffffffffffffffff81111561429157614290615829565b5b61429d88828901613ffd565b9150509295509295909350565b600080604083850312156142c1576142c061582e565b5b60006142cf85828601613f38565b92505060206142e085828601613fa9565b9150509250929050565b6000806000606084860312156143035761430261582e565b5b600061431186828701613f38565b935050602084013567ffffffffffffffff81111561433257614331615829565b5b61433e8682870161406a565b925050604061434f868287016140ad565b9150509250925092565b600080604083850312156143705761436f61582e565b5b600061437e85828601613f38565b925050602061438f858286016140ad565b9150509250929050565b600080604083850312156143b0576143af61582e565b5b600083013567ffffffffffffffff8111156143ce576143cd615829565b5b6143da85828601613f4d565b925050602083013567ffffffffffffffff8111156143fb576143fa615829565b5b61440785828601613f7b565b9150509250929050565b6000602082840312156144275761442661582e565b5b600061443584828501613fbe565b91505092915050565b6000602082840312156144545761445361582e565b5b600061446284828501613fd3565b91505092915050565b6000602082840312156144815761448061582e565b5b600061448f84828501613fe8565b91505092915050565b600080600080600080600060e0888a0312156144b7576144b661582e565b5b60006144c58a828b0161402b565b97505060206144d68a828b0161402b565b96505060406144e78a828b01614055565b95505060606144f88a828b01614040565b94505060806145098a828b01613f38565b93505060a061451a8a828b01613f38565b92505060c061452b8a828b016140ad565b91505092959891949750929550565b6000602082840312156145505761454f61582e565b5b600082013567ffffffffffffffff81111561456e5761456d615829565b5b61457a8482850161406a565b91505092915050565b6000602082840312156145995761459861582e565b5b60006145a7848285016140ad565b91505092915050565b6000602082840312156145c6576145c561582e565b5b60006145d4848285016140c2565b91505092915050565b600080604083850312156145f4576145f361582e565b5b6000614602858286016140ad565b925050602061461385828601613f38565b9150509250929050565b600080600080608085870312156146375761463661582e565b5b6000614645878288016140ad565b945050602061465687828801613f38565b935050604061466787828801614098565b925050606085013567ffffffffffffffff81111561468857614687615829565b5b6146948782880161406a565b91505092959194509250565b6000806000806000806000806000806101408b8d0312156146c4576146c361582e565b5b60006146d28d828e016140ad565b9a505060208b013567ffffffffffffffff8111156146f3576146f2615829565b5b6146ff8d828e0161406a565b99505060408b013567ffffffffffffffff8111156147205761471f615829565b5b61472c8d828e0161406a565b985050606061473d8d828e016140ad565b975050608061474e8d828e016140ad565b96505060a061475f8d828e01614098565b95505060c06147708d828e01614098565b94505060e06147818d828e01614098565b9350506101006147938d828e016140ad565b9250506101206147a58d828e016140ad565b9150509295989b9194979a5092959850565b6000806000606084860312156147d0576147cf61582e565b5b60006147de868287016140ad565b93505060206147ef868287016140ad565b9250506040614800868287016140ad565b9150509250925092565b60006148168383614c48565b60208301905092915050565b61482b8161548e565b82525050565b600061483c8261530d565b614846818561533b565b9350614851836152fd565b8060005b83811015614882578151614869888261480a565b97506148748361532e565b925050600181019050614855565b5085935050505092915050565b614898816154a0565b82525050565b60006148a982615318565b6148b3818561534c565b93506148c38185602086016155d3565b6148cc81615833565b840191505092915050565b6148e081615546565b82525050565b6148ef8161556a565b82525050565b6148fe8161558e565b82525050565b61490d816155b2565b82525050565b600061491e82615323565b614928818561535d565b93506149388185602086016155d3565b61494181615833565b840191505092915050565b600061495782615323565b614961818561536e565b93506149718185602086016155d3565b80840191505092915050565b600061498a60348361535d565b915061499582615851565b604082019050919050565b60006149ad60288361535d565b91506149b8826158a0565b604082019050919050565b60006149d0602b8361535d565b91506149db826158ef565b604082019050919050565b60006149f360268361535d565b91506149fe8261593e565b604082019050919050565b6000614a16600d8361535d565b9150614a218261598d565b602082019050919050565b6000614a39600e8361535d565b9150614a44826159b6565b602082019050919050565b6000614a5c60298361535d565b9150614a67826159df565b604082019050919050565b6000614a7f60258361535d565b9150614a8a82615a2e565b604082019050919050565b6000614aa2600e8361535d565b9150614aad82615a7d565b602082019050919050565b6000614ac560098361535d565b9150614ad082615aa6565b602082019050919050565b6000614ae8602a8361535d565b9150614af382615acf565b604082019050919050565b6000614b0b60058361536e565b9150614b1682615b1e565b600582019050919050565b6000614b2e60208361535d565b9150614b3982615b47565b602082019050919050565b6000614b5160138361535d565b9150614b5c82615b70565b602082019050919050565b6000614b7460008361536e565b9150614b7f82615b99565b600082019050919050565b6000614b97600c8361535d565b9150614ba282615b9c565b602082019050919050565b6000614bba60298361535d565b9150614bc582615bc5565b604082019050919050565b6000614bdd60298361535d565b9150614be882615c14565b604082019050919050565b6000614c0060218361535d565b9150614c0b82615c63565b604082019050919050565b6000614c2360098361535d565b9150614c2e82615cb2565b602082019050919050565b614c428161550e565b82525050565b614c518161553c565b82525050565b614c608161553c565b82525050565b6000614c72828461494c565b915081905092915050565b6000614c89828561494c565b9150614c95828461494c565b9150614ca082614afe565b91508190509392505050565b6000614cb8828461494c565b9150614cc382614b67565b915081905092915050565b6000602082019050614ce36000830184614822565b92915050565b6000606082019050614cfe6000830186614822565b614d0b6020830185614822565b614d186040830184614c57565b949350505050565b600060a082019050614d356000830188614822565b614d426020830187614822565b614d4f6040830186614c57565b614d5c6060830185614c57565b8181036080830152614d6e818461489e565b90509695505050505050565b6000606082019050614d8f6000830186614822565b8181036020830152614da18185614913565b9050614db06040830184614c57565b949350505050565b6000608082019050614dcd6000830187614822565b614dda6020830186614c57565b614de76040830185614c57565b614df46060830184614904565b95945050505050565b60006020820190508181036000830152614e178184614831565b905092915050565b6000602082019050614e34600083018461488f565b92915050565b6000602082019050614e4f60008301846148d7565b92915050565b6000602082019050614e6a60008301846148e6565b92915050565b6000602082019050614e8560008301846148f5565b92915050565b60006020820190508181036000830152614ea58184614913565b905092915050565b60006020820190508181036000830152614ec68161497d565b9050919050565b60006020820190508181036000830152614ee6816149a0565b9050919050565b60006020820190508181036000830152614f06816149c3565b9050919050565b60006020820190508181036000830152614f26816149e6565b9050919050565b60006020820190508181036000830152614f4681614a09565b9050919050565b60006020820190508181036000830152614f6681614a2c565b9050919050565b60006020820190508181036000830152614f8681614a4f565b9050919050565b60006020820190508181036000830152614fa681614a72565b9050919050565b60006020820190508181036000830152614fc681614a95565b9050919050565b60006020820190508181036000830152614fe681614ab8565b9050919050565b6000602082019050818103600083015261500681614adb565b9050919050565b6000602082019050818103600083015261502681614b21565b9050919050565b6000602082019050818103600083015261504681614b44565b9050919050565b6000602082019050818103600083015261506681614b8a565b9050919050565b6000602082019050818103600083015261508681614bad565b9050919050565b600060208201905081810360008301526150a681614bd0565b9050919050565b600060208201905081810360008301526150c681614bf3565b9050919050565b600060208201905081810360008301526150e681614c16565b9050919050565b60006020820190506151026000830184614c57565b92915050565b600060a08201905061511d6000830188614c57565b818103602083015261512f8187614913565b905081810360408301526151438186614913565b90506151526060830185614c57565b61515f6080830184614c57565b9695505050505050565b60006101008201905061517f600083018b614c57565b8181036020830152615191818a614913565b905081810360408301526151a58189614913565b90506151b46060830188614c57565b6151c16080830187614c57565b6151ce60a0830186614c39565b6151db60c0830185614c39565b6151e860e0830184614c39565b9998505050505050505050565b600060408201905061520a6000830185614c57565b6152176020830184614c57565b9392505050565b6000615228615239565b90506152348282615662565b919050565b6000604051905090565b600067ffffffffffffffff82111561525e5761525d6157c9565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561528a576152896157c9565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152b6576152b56157c9565b5b6152bf82615833565b9050602081019050919050565b600067ffffffffffffffff8211156152e7576152e66157c9565b5b6152f082615833565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153848261553c565b915061538f8361553c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153c4576153c361570d565b5b828201905092915050565b60006153da8261553c565b91506153e58361553c565b9250826153f5576153f461573c565b5b828204905092915050565b600061540b8261553c565b91506154168361553c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561544f5761544e61570d565b5b828202905092915050565b60006154658261553c565b91506154708361553c565b9250828210156154835761548261570d565b5b828203905092915050565b60006154998261551c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006154e38261548e565b9050919050565b60006154f58261548e565b9050919050565b60006155078261548e565b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061555182615558565b9050919050565b60006155638261551c565b9050919050565b60006155758261557c565b9050919050565b60006155878261551c565b9050919050565b6000615599826155a0565b9050919050565b60006155ab8261551c565b9050919050565b60006155bd8261550e565b9050919050565b82818337600083830152505050565b60005b838110156155f15780820151818401526020810190506155d6565b83811115615600576000848401525b50505050565b60006156118261553c565b915060008214156156255761562461570d565b5b600182039050919050565b6000600282049050600182168061564857607f821691505b6020821081141561565c5761565b61576b565b5b50919050565b61566b82615833565b810181811067ffffffffffffffff8211171561568a576156896157c9565b5b80604052505050565b600061569e8261553c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156d1576156d061570d565b5b600182019050919050565b60006156e78261553c565b91506156f28361553c565b9250826157025761570161573c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156158175760046000803e615814600051615844565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f696e64657820696e76616c696400000000000000000000000000000000000000600082015250565b7f6e6f742072656769737465726564000000000000000000000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f657468206e6f7420656e6f756768000000000000000000000000000000000000600082015250565b7f7065726d69206572720000000000000000000000000000000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5f696e646578206973206e6f742076616c696400000000000000000000000000600082015250565b50565b7f6e6f207065726d6973696f6e0000000000000000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f736f6c6420616c6c2e0000000000000000000000000000000000000000000000600082015250565b600060443d1015615ceb57615d6e565b615cf3615239565b60043d036004823e80513d602482011167ffffffffffffffff82111715615d1b575050615d6e565b808201805167ffffffffffffffff811115615d395750505050615d6e565b80602083010160043d038501811115615d56575050505050615d6e565b615d6582602001850186615662565b82955050505050505b90565b615d7a8161548e565b8114615d8557600080fd5b50565b615d91816154a0565b8114615d9c57600080fd5b50565b615da8816154ac565b8114615db357600080fd5b50565b615dbf816154d8565b8114615dca57600080fd5b50565b615dd6816154ea565b8114615de157600080fd5b50565b615ded816154fc565b8114615df857600080fd5b50565b615e048161550e565b8114615e0f57600080fd5b50565b615e1b8161553c565b8114615e2657600080fd5b5056fea264697066735822122017a8cb76a628e206df8fe844a07f4c6d1138c86a5328ae56a177bd3312a793c364736f6c63430008060033

Verified Source Code Partial Match

Compiler: v0.8.6+commit.11564f7e EVM: berlin Optimization: No
IncomeIslandETH.sol 1792 lines
pragma solidity ^0.8.0;

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)
/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)
/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: balance query for the zero address"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            address(0),
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            address(0),
            _asSingletonArray(id),
            _asSingletonArray(amount),
            ""
        );

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
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);
    }
}

/**
 * @title IUtility interface
 */
interface IUtility {
    /**
     * @notice get number of income token vs wbnb
     */
    function getIncomeTokenFromBNB(uint256 bnbNumber)
        external
        view
        returns (uint256);

    /**
     * @notice get number of income token vs wbnb
     */
    function getBNBFromIncomeToken(uint256 incomeTokenNumber)
        external
        view
        returns (uint256);

    /**
     * @notice get number of income token vs wbnb
     */
    function getBnbTokenFromDollar(uint256 dollarAmount)
        external
        view
        returns (uint256);

    function getDollarFromBnb(uint256 bnbAmount)
        external
        view
        returns (uint256);
}

/**
 * @title IMiningContract interface
 */
interface IMiningContract {
    /**
     * @notice update nftHistory variable.
     * @param _owner the nft owner address
     * @param _nftType the nft type
     * @param _nftNum the nft unique number
     * @param _mode 0: remove 1: add
     */
    function updateNFTHistory(
        address _owner,
        uint256 _nftType,
        uint256 _nftNum,
        uint16 _mode
    ) external;
}

contract IncomeIslandETH is ERC1155 {
    using Address for address;

    /// @notice Information about the NFT as the property
    struct NftInfo {
        uint256 priceUSDT;
        string name;
        string category;
        uint256 limitNumber;
        uint256 soldNumber;
        uint16 prosETH;
        uint16 prosUSDT;
        uint16 prosINCOME;
    }

    /// @notice Information about the Paypal transaction
    struct TrxInfo {
        address owner;
        string trx;
        uint256 nftType;
    }

    // @notice NftInfo map
    mapping(uint256 => NftInfo) public nftTypeList;

    // @notice total nftType number
    uint256 public totalNftTypeNumber;

    // @notice TrxInfo map
    mapping(address => mapping(uint256 => TrxInfo)) public trIdList;

    // @notice total Paypal transaction length
    mapping(address => uint256) public trIdListLength;

    // @notice the price that enters the metaverse with usd
    uint256 public metaverseFeePrice;

    // @notice wbnb token and wbusd pair address
    address public transferContractAddress;

    // @notice ERC20 income token
    IERC20 public income;

    // @notice ERC20 usdt token
    IERC20 public usdt;

    // @notice IUtility contract Interface
    IUtility public utility;

    // @notice IMiningContract contract Interface
    IMiningContract public miningContract;

    // @notice the riging rate when the users buy the property. The decimal is 1000
    uint256 public priceRisingRate;

    // @notice Fiat register wallet
    address public fiatWallet;

    address private _ownerAddress;

    // @notice total Paypal transaction length
    mapping(uint256 => uint256) public disableList;
    uint256 public disableListLength;

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        if (_ownerAddress == address(0)) {
            return 0x775Dd9d922B48C42C34b88811C97863Ad894eCf9;
        }
        return _ownerAddress;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal {
        _ownerAddress = newOwner;
    }

    /**
     * @notice IncomeIsland Constructor
     * @param _uri default ipfs asset uri
     */
    constructor(string memory _uri) ERC1155(_uri) {}

    /**
     * @notice update disable list variable.
     * @param _nftType nft type
     * @param _index the disable position which will operate
     * @param _mode 0: update 1: add 2: remove
     */
    function manageDisableList(
        uint256 _index,
        uint256 _nftType,
        uint256 _mode
    ) public onlyOwner {
        if (_mode != 1) {
            require(_index < disableListLength, "_index is not valid");
        }
        if (_mode == 0) {
            disableList[_index] = _nftType + 1;
        } else if (_mode == 1) {
            disableList[disableListLength++] = _nftType + 1;
        } else if (_mode == 2) {
            for (uint256 i = _index; i < disableListLength; i++) {
                disableList[i] = disableList[i + 1];
            }
            disableListLength--;
        }
    }

    function isDisabled(uint256 _nftType) public view returns (bool) {
        for (uint256 i = 0; i < disableListLength; i++) {
            if (disableList[i] == _nftType + 1) {
                return true;
            }
        }
        return false;
    }

    // Metadata
    function setURI(string memory uri_) public onlyOwner {
        if (bytes(uri_)[bytes(uri_).length - 1] == bytes1("/")) _setURI(uri_);
    }

    function uri(uint256 tokenId_)
        public
        view
        override
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    ERC1155.uri(0),
                    Strings.toString(tokenId_ + 1),
                    ".json"
                )
            );
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(ERC1155.uri(0), ""));
    }

    /**
     * @notice use this function for minting the nft
     * @param _nftId the index for minting about the nft
     * @param _receiptor use when the msg.sender is super admin
     * @param _buyType 0: BNB, 1: USDT, 2: IncomeIsland, 3: Paypal
     */
    function mintByProperty(
        uint256 _nftId,
        address _receiptor,
        uint16 _buyType,
        string memory _trId
    ) external payable {
        require(
            nftTypeList[_nftId].soldNumber < nftTypeList[_nftId].limitNumber,
            "sold all."
        );

        uint256 nftPrice = utility.getBnbTokenFromDollar(
            (nftTypeList[_nftId].priceUSDT * nftTypeList[_nftId].prosETH) / 100
        );

        if (address(owner()) != msg.sender) {
            if (_buyType == 0) {
                // ETH
                require(msg.value >= nftPrice, "eth not enough");
                payable(address(uint160(owner()))).transfer(msg.value);
            } else if (_buyType == 1) {
                // USDT
                nftPrice =
                    (nftTypeList[_nftId].priceUSDT *
                        nftTypeList[_nftId].prosUSDT) /
                    100;
                usdt.transferFrom(msg.sender, address(owner()), nftPrice);
            } else if (_buyType == 2) {
                nftPrice = (nftPrice * nftTypeList[_nftId].prosINCOME) / 100;

                uint256 incomeNum = utility.getIncomeTokenFromBNB(nftPrice);
                if (isDisabled(_nftId)) {
                    incomeNum = utility.getIncomeTokenFromBNB(
                        utility.getBnbTokenFromDollar(
                            (nftTypeList[_nftId].priceUSDT *
                                nftTypeList[_nftId].prosINCOME) / 100
                        )
                    );
                }
                income.transferFrom(msg.sender, owner(), incomeNum);
            } else if (_buyType == 3) {
                uint256 valid = 0;
                for (uint256 i = 0; i < trIdListLength[_receiptor]; i++) {
                    string memory trId = trIdList[_receiptor][i].trx;
                    if (
                        keccak256(abi.encodePacked((trId))) ==
                        keccak256(abi.encodePacked((_trId))) &&
                        trIdList[_receiptor][i].nftType == _nftId
                    ) {
                        valid = 1;
                    }
                }
                require(valid == 1, "not registered");
            }
        }

        address to = msg.sender;
        if (address(owner()) == msg.sender) {
            to = _receiptor;
        }

        _mint(to, _nftId, 1, "");

        miningContract.updateNFTHistory(
            msg.sender,
            _nftId,
            nftTypeList[_nftId].soldNumber + 1,
            1
        );

        nftPrice =
            (nftTypeList[_nftId].priceUSDT * (1000 + priceRisingRate)) /
            1000;
        updatePublicNFTType(
            nftPrice,
            nftTypeList[_nftId].name,
            nftTypeList[_nftId].category,
            nftTypeList[_nftId].limitNumber,
            nftTypeList[_nftId].soldNumber + 1,
            nftTypeList[_nftId].prosETH,
            nftTypeList[_nftId...

// [truncated — 56651 bytes total]

Read Contract

balanceOf 0x00fdd58e → uint256
balanceOfBatch 0x4e1273f4 → uint256[]
checkTransferPermission 0xe7b7857c → bool
contractURI 0xe8a3d485 → string
disableList 0x8679984f → uint256
disableListLength 0x0c33e31f → uint256
fiatWallet 0x8305b68e → address
getNftType 0xa82620d5 → uint256, string, string, uint256, uint256
income 0x88b45046 → address
isApprovedForAll 0xe985e9c5 → bool
isDisabled 0xad25ca29 → bool
metaverseFeePrice 0xf81b6db8 → uint256
miningContract 0x91564697 → address
nftTypeList 0x307de5f3 → uint256, string, string, uint256, uint256, uint16, uint16, uint16
owner 0x8da5cb5b → address
priceRisingRate 0x20b15edb → uint256
supportsInterface 0x01ffc9a7 → bool
totalNftTypeNumber 0xac9eb943 → uint256
trIdList 0x54592b69 → address, string, uint256
trIdListLength 0x395dd80a → uint256
transferContractAddress 0x410b8cb2 → address
uri 0x0e89341c → string
usdt 0x2f48ab7d → address
utility 0x40b2f5b5 → address

Write Contract 12 functions

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

addTrxList 0x24bb7c83
address _owner
string _trx
uint256 _nftType
manageDisableList 0x332a101d
uint256 _index
uint256 _nftType
uint256 _mode
manageNFTType 0x24bf54f4
uint256 _priceUSDT
string _name
string _category
uint256 _limitNumber
uint256 _soldNumber
uint16 _prosETH
uint16 _prosUSDT
uint16 _prosINCOME
uint256 _index
uint256 _mode
mintByProperty 0xd94f1d06
uint256 _nftId
address _receiptor
uint16 _buyType
string _trId
mintByPropertyByOwner 0xb3a35b40
uint256 _nftId
address _receiptor
renounceOwnership 0x715018a6
No parameters
safeBatchTransferFrom 0x2eb2c2d6
address from
address to
uint256[] ids
uint256[] amounts
bytes data
safeTransferFrom 0xf242432a
address from
address to
uint256 id
uint256 amount
bytes data
setApprovalForAll 0xa22cb465
address operator
bool approved
setConfig 0xb90838bf
address _income
address _usdt
address _utility
address _miningContract
address _address
address _fiataddr
uint256 _priceRisingRate
setURI 0x02fe5305
string uri_
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

This address has 1 on-chain transactions, but only 0.7% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →