Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x367B77A4d77e83C5aE1DDEC4d749A5282a38a728
Balance 0.000073011 ETH
Nonce 3
Code Size 24396 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

24396 bytes
0x6080604052600436106102085760003560e01c80634ea272c111610118578063a9059cbb116100a0578063dc13b31c1161006f578063dc13b31c1461076d578063dd62ed3e14610798578063e9ac0e59146107d5578063f2fde38b146107ec578063fe188184146108155761020f565b8063a9059cbb1461069f578063a91bdfc1146106dc578063c9567bf914610719578063d5cc1042146107305761020f565b80638da5cb5b116100e75780638da5cb5b146105a4578063953d1408146105cf57806395d89b411461060c5780639f26198014610637578063a457c2d7146106625761020f565b80634ea272c1146104fc57806362fa83571461052757806370a0823114610550578063715018a61461058d5761020f565b80632996f9721161019b57806341ec3a521161016a57806341ec3a521461042957806342966c6814610454578063441d801f1461047d57806348fad638146104a657806349bd5a5e146104d15761020f565b80632996f9721461036d5780632bfbd9cf14610398578063313ce567146103c157806339509351146103ec5761020f565b806318160ddd116101d757806318160ddd146102c55780632175c2a0146102f057806323b872dd146103195780632743b3cb146103565761020f565b8063025164a31461021457806306fdde031461024657806308003f7814610271578063095ea7b3146102885761020f565b3661020f57005b600080fd5b34801561022057600080fd5b50610229610841565b60405161023d989796959493929190614628565b60405180910390f35b34801561025257600080fd5b5061025b610884565b6040516102689190614736565b60405180910390f35b34801561027d57600080fd5b50610286610916565b005b34801561029457600080fd5b506102af60048036038101906102aa91906147f6565b6109b8565b6040516102bc9190614836565b60405180910390f35b3480156102d157600080fd5b506102da6109d6565b6040516102e79190614851565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906148d1565b6109e0565b005b34801561032557600080fd5b50610340600480360381019061033b919061491e565b610acb565b60405161034d9190614836565b60405180910390f35b34801561036257600080fd5b5061036b610ba4565b005b34801561037957600080fd5b50610382610df4565b60405161038f91906149d0565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba91906149eb565b610e1a565b005b3480156103cd57600080fd5b506103d6610efd565b6040516103e39190614a34565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906147f6565b610f14565b6040516104209190614836565b60405180910390f35b34801561043557600080fd5b5061043e610fc7565b60405161044b9190614851565b60405180910390f35b34801561046057600080fd5b5061047b600480360381019061047691906149eb565b610fcd565b005b34801561048957600080fd5b506104a4600480360381019061049f9190614a7b565b610fda565b005b3480156104b257600080fd5b506104bb61107f565b6040516104c89190614851565b60405180910390f35b3480156104dd57600080fd5b506104e6611085565b6040516104f39190614aea565b60405180910390f35b34801561050857600080fd5b506105116110ab565b60405161051e9190614851565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190614b27565b611143565b005b34801561055c57600080fd5b5061057760048036038101906105729190614bf2565b611284565b6040516105849190614851565b60405180910390f35b34801561059957600080fd5b506105a26112cd565b005b3480156105b057600080fd5b506105b9611420565b6040516105c69190614aea565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f191906149eb565b611449565b6040516106039190614851565b60405180910390f35b34801561061857600080fd5b5061062161148c565b60405161062e9190614736565b60405180910390f35b34801561064357600080fd5b5061064c61151e565b6040516106599190614851565b60405180910390f35b34801561066e57600080fd5b50610689600480360381019061068491906147f6565b611524565b6040516106969190614836565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906147f6565b6115f1565b6040516106d39190614836565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe9190614d77565b61160f565b6040516107109190614851565b60405180910390f35b34801561072557600080fd5b5061072e611647565b005b34801561073c57600080fd5b5061075760048036038101906107529190614bf2565b611b37565b6040516107649190614836565b60405180910390f35b34801561077957600080fd5b50610782611bdc565b60405161078f9190614851565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190614da4565b611be2565b6040516107cc9190614851565b60405180910390f35b3480156107e157600080fd5b506107ea611c69565b005b3480156107f857600080fd5b50610813600480360381019061080e9190614bf2565b611d54565b005b34801561082157600080fd5b5061082a611f15565b604051610838929190614de4565b60405180910390f35b60138060000154908060010154908060020154908060030154908060040154908060050154908060060154908060090160009054906101000a900460ff16905088565b60606006805461089390614e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546108bf90614e3c565b801561090c5780601f106108e15761010080835404028352916020019161090c565b820191906000526020600020905b8154815290600101906020018083116108ef57829003601f168201915b5050505050905090565b600e5442101561095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290614edf565b60405180910390fd5b601360090160009054906101000a900460ff16156109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590614f71565b60405180910390fd5b6109b6611f47565b565b60006109cc6109c56122a3565b84846122ab565b6001905092915050565b6000600954905090565b6109e86122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90614fdd565b60405180910390fd5b60005b82829050811015610ac657610ab3838383818110610a9957610a98614ffd565b5b9050602002016020810190610aae9190614bf2565b612474565b8080610abe9061505b565b915050610a78565b505050565b6000610ad8848484612652565b610b9984610ae46122a3565b610b9485604051806060016040528060288152602001615eca60289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b4a6122a3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ce49092919063ffffffff16565b6122ab565b600190509392505050565b610bac6122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090614fdd565b60405180910390fd5b42600d5410610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c74906150ef565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cda9190614aea565b602060405180830381865afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190615124565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610d9c929190614de4565b6020604051808303816000875af1158015610dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddf9190615166565b50610df181610dec611420565b612d48565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e226122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614fdd565b60405180910390fd5b600d548111610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90615205565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900460ff16905090565b6000610fbd610f216122a3565b84610fb88560046000610f326122a3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e8890919063ffffffff16565b6122ab565b6001905092915050565b600c5481565b610fd73382612ee6565b50565b610fe26122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690614fdd565b60405180910390fd5b61107a83838361306f565b505050565b600e5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190615124565b905090565b61114b6122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90614fdd565b60405180910390fd5b633b9aca00896111e89190615225565b60136000018190555087601360010181905550866013600201819055508560136003018190555084601360040181905550633b9aca00846112299190615225565b60136006018190555082601360070190600361124692919061453a565b5081601360080190600361125b92919061453a565b5080601360090160006101000a81548160ff021916908315150217905550505050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d56122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990614fdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080824260405160200161145e9190615288565b6040516020818303038152906040528051906020012060001c61148191906152d2565b905080915050919050565b60606007805461149b90614e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546114c790614e3c565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b5050505050905090565b600d5481565b60006115e76115316122a3565b846115e285604051806060016040528060258152602001615ef2602591396004600061155b6122a3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ce49092919063ffffffff16565b6122ab565b6001905092915050565b60006116056115fe6122a3565b8484612652565b6001905092915050565b60008060039050600061162182611449565b905083816003811061163657611635614ffd565b5b602002015160ff1692505050919050565b61164f6122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d390614fdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490615375565b60405180910390fd5b61179c30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166009546122ab565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d91906153aa565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118da91906153aa565b6040518363ffffffff1660e01b81526004016118f79291906153d7565b6020604051808303816000875af1158015611916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193a91906153aa565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306119c330611284565b60008030426040518863ffffffff1660e01b81526004016119e99695949392919061543b565b60606040518083038185885af1158015611a07573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a2c919061549c565b505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611ace929190614de4565b6020604051808303816000875af1158015611aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b119190615166565b5042600e81905550611b2f6203f48042612e8890919063ffffffff16565b600d81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cd413329836040518263ffffffff1660e01b8152600401611b949190614aea565b602060405180830381865afa158015611bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd59190615166565b9050919050565b600b5481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c716122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf590614fdd565b60405180910390fd5b6000479050611d0b611420565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d50573d6000803e3d6000fd5b5050565b611d5c6122a3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090614fdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4f90615561565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60118060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6001600a60146101000a81548160ff0219169083151502179055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611fbf9190614aea565b602060405180830381865afa158015611fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120009190615124565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612081929190614de4565b6020604051808303816000875af11580156120a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c49190615166565b5060006120df6013600501548361311a90919063ffffffff16565b905061210d81600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d48565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663acdf4f186040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561217757600080fd5b505af115801561218b573d6000803e3d6000fd5b5050505060006121bc600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611284565b9050600081111561227b576121f3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ee6565b61220881600b54612e8890919063ffffffff16565b600b8190555061223961222a603c60136004015461316490919063ffffffff16565b42612e8890919063ffffffff16565b600e819055507f8bc81353cf6671d259d22783e39ed930583c86f3f4cf7e981298e6a872dfb15d81600e54604051612272929190615581565b60405180910390a15b6122836131de565b5050506000600a60146101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361231a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123119061561c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612380906156ae565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516124679190614851565b60405180910390a3505050565b61247d816132f6565b15801561252a5750601360060154601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016124e69190614aea565b602060405180830381865afa158015612503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125279190615124565b10155b156125c157600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a3b0a4f826040518263ffffffff1660e01b815260040161258a9190614aea565b600060405180830381600087803b1580156125a457600080fd5b505af11580156125b8573d6000803e3d6000fd5b5050505061264f565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b815260040161261c9190614aea565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b890615740565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612727906157d2565b60405180910390fd5b60008111612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a90615864565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128195750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156128585750612828611420565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156128975750612867611420565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905060006128a3611420565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561291157506128e1611420565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561294957503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156129a35750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156129fd5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612cd0576000612a1f84612a1187611284565b612e8890919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612ae357601360000154811115612abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab5906158f6565b60405180910390fd5b6000612ace601360020154613341565b9050808210612ae157612ae086612474565b5b505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612b8f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612bdd57601360000154811115612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd3906158f6565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612c885750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15612cce5760019150600e544210158015612cb25750601360090160009054906101000a900460ff165b15612cc457612cbf611f47565b612ccd565b612ccc613584565b5b5b505b612cdd85858585856135dd565b5050505050565b6000838311158290612d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d239190614736565b60405180910390fd5b5060008385612d3b9190615916565b9050809150509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa2abde600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1791906153aa565b308560018087426040518863ffffffff1660e01b8152600401612e409796959493929190615985565b60408051808303816000875af1158015612e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8291906159f4565b50505050565b6000808284612e979190615a34565b905083811015612edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed390615ab4565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4c90615b46565b60405180910390fd5b612f6a8160095461394690919063ffffffff16565b600981905550612fc281600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130639190614851565b60405180910390a35050565b60005b8383905081101561311457600084848381811061309257613091614ffd565b5b90506020020160208101906130a79190614bf2565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061310c9061505b565b915050613072565b50505050565b600061315c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613990565b905092915050565b600080830361317657600090506131d8565b600082846131849190615225565b90508284826131939190615b66565b146131d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ca90615c09565b60405180910390fd5b809150505b92915050565b600047905060008111156132f357600061320260028361311a90919063ffffffff16565b905061320d816139f3565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161326a9190614aea565b602060405180830381865afa158015613287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ab9190615124565b90506132b78282613c2a565b7f90496a8349529047c3ffa17bd6e613362f7c50c3ad59f2f1bf7da5766cf242fa82826040516132e8929190615581565b60405180910390a150505b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561333857506000801b8214155b92505050919050565b600080600267ffffffffffffffff81111561335f5761335e614c1f565b5b60405190808252806020026020018201604052801561338d5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342191906153aa565b8160008151811061343557613434614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061348457613483614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b815260040161351b929190615ce7565b600060405180830381865afa158015613538573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906135619190615dda565b60018151811061357457613573614ffd565b5b6020026020010151915050919050565b600061358f30611284565b905060008111156135da5760006135aa601360010154613341565b90508082101580156135c95750600a60149054906101000a900460ff16155b156135d8576135d781613ded565b5b505b50565b600081613658576136536013600701600380602002604051908101604052809291908260038015613649576020028201916000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116136125790505b505050505061160f565b6136c8565b6136c760136008016003806020026040519081016040528092919082600380156136bd576020028201916000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116136865790505b505050505061160f565b5b90506000836136d85760006136ff565b6136fe60646136f0848861316490919063ffffffff16565b61311a90919063ffffffff16565b5b90506000613716828761394690919063ffffffff16565b905061376a86600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137ff81600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e8890919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061389482600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e8890919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516139349190614851565b60405180910390a35050505050505050565b600061398883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ce4565b905092915050565b600080831182906139d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ce9190614736565b60405180910390fd5b50600083856139e69190615b66565b9050809150509392505050565b6000600267ffffffffffffffff811115613a1057613a0f614c1f565b5b604051908082528060200260200182016040528015613a3e5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad291906153aa565b81600081518110613ae657613ae5614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613b5757613b56614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401613bf49493929190615e23565b6000604051808303818588803b158015613c0d57600080fd5b505af1158015613c21573d6000803e3d6000fd5b50505050505050565b613c5730600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836122ab565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613cd6929190614de4565b6020604051808303816000875af1158015613cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d199190615166565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71983601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460008030426040518863ffffffff1660e01b8152600401613da39695949392919061543b565b60606040518083038185885af1158015613dc1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613de6919061549c565b5050505050565b6000600267ffffffffffffffff811115613e0a57613e09614c1f565b5b604051908082528060200260200182016040528015613e385781602001602082028036833780820191505090505b5090503081600081518110613e5057613e4f614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1b91906153aa565b81600181518110613f2f57613f2e614ffd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613f9630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846122ab565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613ffa959493929190615e6f565b600060405180830381600087803b15801561401457600080fd5b505af1158015614028573d6000803e3d6000fd5b505050506000479050600061405e60646140506013600301548561316490919063ffffffff16565b61311a90919063ffffffff16565b90506000614075828461394690919063ffffffff16565b90506000614081614293565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614232578073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156140fd573d6000803e3d6000fd5b5080601160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160116001018190555061416182600c54612e8890919063ffffffff16565b600c81905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b81526004016141c29190614aea565b600060405180830381600087803b1580156141dc57600080fd5b505af11580156141f0573d6000803e3d6000fd5b505050507f7e2ca3905e2a3f4806a624223ea6cdcd30dad54d82e68b44481a5e00f322efc78183604051614225929190614de4565b60405180910390a1614283565b6000601160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006011600101819055505b61428b6131de565b505050505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143279190615124565b9050600181111561453157600061433d82611449565b90506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac836040518263ffffffff1660e01b815260040161439c9190614851565b602060405180830381865afa1580156143b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143dd91906153aa565b90506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161443c9190614aea565b602060405180830381865afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190615124565b905060136006015481106144975781945050505050614537565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016144f29190614aea565b600060405180830381600087803b15801561450c57600080fd5b505af1158015614520573d6000803e3d6000fd5b505050506000945050505050614537565b60009150505b90565b826003601f016020900481019282156145c65791602002820160005b8382111561459757833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302614556565b80156145c45782816101000a81549060ff0219169055600101602081600001049283019260010302614597565b505b5090506145d391906145d7565b5090565b5b808211156145f05760008160009055506001016145d8565b5090565b6000819050919050565b614607816145f4565b82525050565b60008115159050919050565b6146228161460d565b82525050565b60006101008201905061463e600083018b6145fe565b61464b602083018a6145fe565b61465860408301896145fe565b61466560608301886145fe565b61467260808301876145fe565b61467f60a08301866145fe565b61468c60c08301856145fe565b61469960e0830184614619565b9998505050505050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156146e05780820151818401526020810190506146c5565b60008484015250505050565b6000601f19601f8301169050919050565b6000614708826146a6565b61471281856146b1565b93506147228185602086016146c2565b61472b816146ec565b840191505092915050565b6000602082019050818103600083015261475081846146fd565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006147978261476c565b9050919050565b6147a78161478c565b81146147b257600080fd5b50565b6000813590506147c48161479e565b92915050565b6147d3816145f4565b81146147de57600080fd5b50565b6000813590506147f0816147ca565b92915050565b6000806040838503121561480d5761480c614762565b5b600061481b858286016147b5565b925050602061482c858286016147e1565b9150509250929050565b600060208201905061484b6000830184614619565b92915050565b600060208201905061486660008301846145fe565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126148915761489061486c565b5b8235905067ffffffffffffffff8111156148ae576148ad614871565b5b6020830191508360208202830111156148ca576148c9614876565b5b9250929050565b600080602083850312156148e8576148e7614762565b5b600083013567ffffffffffffffff81111561490657614905614767565b5b6149128582860161487b565b92509250509250929050565b60008060006060848603121561493757614936614762565b5b6000614945868287016147b5565b9350506020614956868287016147b5565b9250506040614967868287016147e1565b9150509250925092565b6000819050919050565b600061499661499161498c8461476c565b614971565b61476c565b9050919050565b60006149a88261497b565b9050919050565b60006149ba8261499d565b9050919050565b6149ca816149af565b82525050565b60006020820190506149e560008301846149c1565b92915050565b600060208284031215614a0157614a00614762565b5b6000614a0f848285016147e1565b91505092915050565b600060ff82169050919050565b614a2e81614a18565b82525050565b6000602082019050614a496000830184614a25565b92915050565b614a588161460d565b8114614a6357600080fd5b50565b600081359050614a7581614a4f565b92915050565b600080600060408486031215614a9457614a93614762565b5b600084013567ffffffffffffffff811115614ab257614ab1614767565b5b614abe8682870161487b565b93509350506020614ad186828701614a66565b9150509250925092565b614ae48161478c565b82525050565b6000602082019050614aff6000830184614adb565b92915050565b600081905082602060030282011115614b2157614b20614876565b5b92915050565b60008060008060008060008060006101a08a8c031215614b4a57614b49614762565b5b6000614b588c828d016147e1565b9950506020614b698c828d016147e1565b9850506040614b7a8c828d016147e1565b9750506060614b8b8c828d016147e1565b9650506080614b9c8c828d016147e1565b95505060a0614bad8c828d016147e1565b94505060c0614bbe8c828d01614b05565b935050610120614bd08c828d01614b05565b925050610180614be28c828d01614a66565b9150509295985092959850929598565b600060208284031215614c0857614c07614762565b5b6000614c16848285016147b5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614c57826146ec565b810181811067ffffffffffffffff82111715614c7657614c75614c1f565b5b80604052505050565b6000614c89614758565b9050614c958282614c4e565b919050565b600067ffffffffffffffff821115614cb557614cb4614c1f565b5b602082029050919050565b614cc981614a18565b8114614cd457600080fd5b50565b600081359050614ce681614cc0565b92915050565b6000614cff614cfa84614c9a565b614c7f565b90508060208402830185811115614d1957614d18614876565b5b835b81811015614d425780614d2e8882614cd7565b845260208401935050602081019050614d1b565b5050509392505050565b600082601f830112614d6157614d6061486c565b5b6003614d6e848285614cec565b91505092915050565b600060608284031215614d8d57614d8c614762565b5b6000614d9b84828501614d4c565b91505092915050565b60008060408385031215614dbb57614dba614762565b5b6000614dc9858286016147b5565b9250506020614dda858286016147b5565b9150509250929050565b6000604082019050614df96000830185614adb565b614e0660208301846145fe565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e5457607f821691505b602082108103614e6757614e66614e0d565b5b50919050565b7f4e657874206275726e2074696d65206973206e6f7420647565207965742c206260008201527f652070617469656e740000000000000000000000000000000000000000000000602082015250565b6000614ec96029836146b1565b9150614ed482614e6d565b604082019050919050565b60006020820190508181036000830152614ef881614ebc565b9050919050565b7f4275726e696e6720746f6b656e732069732063757272656e746c79206469736160008201527f626c656400000000000000000000000000000000000000000000000000000000602082015250565b6000614f5b6024836146b1565b9150614f6682614eff565b604082019050919050565b60006020820190508181036000830152614f8a81614f4e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fc76020836146b1565b9150614fd282614f91565b602082019050919050565b60006020820190508181036000830152614ff681614fba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615066826145f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150985761509761502c565b5b600182019050919050565b7f4c69717569646974792069732063757272656e746c79206c6f636b6564000000600082015250565b60006150d9601d836146b1565b91506150e4826150a3565b602082019050919050565b60006020820190508181036000830152615108816150cc565b9050919050565b60008151905061511e816147ca565b92915050565b60006020828403121561513a57615139614762565b5b60006151488482850161510f565b91505092915050565b60008151905061516081614a4f565b92915050565b60006020828403121561517c5761517b614762565b5b600061518a84828501615151565b91505092915050565b7f4e6577206c6f636b2064617465206d757374206265206772656174657220746860008201527f616e206578697374696e67206c6f636b20646174650000000000000000000000602082015250565b60006151ef6035836146b1565b91506151fa82615193565b604082019050919050565b6000602082019050818103600083015261521e816151e2565b9050919050565b6000615230826145f4565b915061523b836145f4565b9250828202615249816145f4565b915082820484148315176152605761525f61502c565b5b5092915050565b6000819050919050565b61528261527d826145f4565b615267565b82525050565b60006152948284615271565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152dd826145f4565b91506152e8836145f4565b9250826152f8576152f76152a3565b5b828206905092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b600061535f6022836146b1565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b6000815190506153a48161479e565b92915050565b6000602082840312156153c0576153bf614762565b5b60006153ce84828501615395565b91505092915050565b60006040820190506153ec6000830185614adb565b6153f96020830184614adb565b9392505050565b6000819050919050565b600061542561542061541b84615400565b614971565b6145f4565b9050919050565b6154358161540a565b82525050565b600060c0820190506154506000830189614adb565b61545d60208301886145fe565b61546a604083018761542c565b615477606083018661542c565b6154846080830185614adb565b61549160a08301846145fe565b979650505050505050565b6000806000606084860312156154b5576154b4614762565b5b60006154c38682870161510f565b93505060206154d48682870161510f565b92505060406154e58682870161510f565b9150509250925092565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061554b6026836146b1565b9150615556826154ef565b604082019050919050565b6000602082019050818103600083015261557a8161553e565b9050919050565b600060408201905061559660008301856145fe565b6155a360208301846145fe565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006156066024836146b1565b9150615611826155aa565b604082019050919050565b60006020820190508181036000830152615635816155f9565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006156986022836146b1565b91506156a38261563c565b604082019050919050565b600060208201905081810360008301526156c78161568b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061572a6025836146b1565b9150615735826156ce565b604082019050919050565b600060208201905081810360008301526157598161571d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157bc6023836146b1565b91506157c782615760565b604082019050919050565b600060208201905081810360008301526157eb816157af565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061584e6029836146b1565b9150615859826157f2565b604082019050919050565b6000602082019050818103600083015261587d81615841565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b60006158e06025836146b1565b91506158eb82615884565b604082019050919050565b6000602082019050818103600083015261590f816158d3565b9050919050565b6000615921826145f4565b915061592c836145f4565b92508282039050818111156159445761594361502c565b5b92915050565b6000819050919050565b600061596f61596a6159658461594a565b614971565b6145f4565b9050919050565b61597f81615954565b82525050565b600060e08201905061599a600083018a614adb565b6159a76020830189614adb565b6159b460408301886145fe565b6159c16060830187615976565b6159ce6080830186615976565b6159db60a0830185614adb565b6159e860c08301846145fe565b98975050505050505050565b60008060408385031215615a0b57615a0a614762565b5b6000615a198582860161510f565b9250506020615a2a8582860161510f565b9150509250929050565b6000615a3f826145f4565b9150615a4a836145f4565b9250828201905080821115615a6257615a6161502c565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615a9e601b836146b1565b9150615aa982615a68565b602082019050919050565b60006020820190508181036000830152615acd81615a91565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b306021836146b1565b9150615b3b82615ad4565b604082019050919050565b60006020820190508181036000830152615b5f81615b23565b9050919050565b6000615b71826145f4565b9150615b7c836145f4565b925082615b8c57615b8b6152a3565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615bf36021836146b1565b9150615bfe82615b97565b604082019050919050565b60006020820190508181036000830152615c2281615be6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615c5e8161478c565b82525050565b6000615c708383615c55565b60208301905092915050565b6000602082019050919050565b6000615c9482615c29565b615c9e8185615c34565b9350615ca983615c45565b8060005b83811015615cda578151615cc18882615c64565b9750615ccc83615c7c565b925050600181019050615cad565b5085935050505092915050565b6000604082019050615cfc60008301856145fe565b8181036020830152615d0e8184615c89565b90509392505050565b600067ffffffffffffffff821115615d3257615d31614c1f565b5b602082029050602081019050919050565b6000615d56615d5184615d17565b614c7f565b90508083825260208201905060208402830185811115615d7957615d78614876565b5b835b81811015615da25780615d8e888261510f565b845260208401935050602081019050615d7b565b5050509392505050565b600082601f830112615dc157615dc061486c565b5b8151615dd1848260208601615d43565b91505092915050565b600060208284031215615df057615def614762565b5b600082015167ffffffffffffffff811115615e0e57615e0d614767565b5b615e1a84828501615dac565b91505092915050565b6000608082019050615e38600083018761542c565b8181036020830152615e4a8186615c89565b9050615e596040830185614adb565b615e6660608301846145fe565b95945050505050565b600060a082019050615e8460008301886145fe565b615e91602083018761542c565b8181036040830152615ea38186615c89565b9050615eb26060830185614adb565b615ebf60808301846145fe565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205f7ac2050fd0ff4225e2d27de2e8f3e3e0426c0fd81284c5567974fee1a83ff864736f6c63430008110033

Verified Source Code Partial Match

Compiler: v0.8.17+commit.8df45f5f EVM: london Optimization: No
SandrenFlames.sol 749 lines
pragma solidity ^0.8.17;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success,) = recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address token0, address token1) external view returns (address);
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external payable returns (uint[] memory amounts);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function WETH() external pure returns (address);
}

contract SandrenFlames is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    event TokensBurned(uint256, uint256);
    event RaffleWinner(address, uint256);
    event SandrenLiquidityAdded(uint, uint256);
    struct SandrenConfig {
        uint256 maxWalletAmount;
        uint256 ethPriceToSwap;
        uint256 ethPriceForRewards;
        uint256 liquidityPoolPercentage;
        uint256 burnFrequencynMinutes;
        uint256 burnRateInBasePoints;
        uint256 minimumSandrenTokens;
        uint8[3] buyFees;
        uint8[3] sellFees; 
        bool isBurnEnabled;        
    }

    struct LastWinner {
        address holder;
        uint ethAmount;
    }

    IUniswapV2Router02 private uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    string private _name = "Sandren Flames";
    string private _symbol = "SNDRNFLMS";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 1000000000 * 10 ** 9; 
    IterableMapping private sandrenHoldersMap = new IterableMapping();
    bool inSwapAndLiquify;
    uint256 public tokensBurnedSinceLaunch;
    uint256 public totalEthRewardedSinceLaunch;
    uint public liquidityUnlockDate;    
    uint public nextLiquidityBurnTimeStamp;   
    TokenBurner public tokenBurner = new TokenBurner(address(this));
    IERC20 private sandrenToken = IERC20(0xC39F5519123d40D695012f779afBAcBd3AdbEb91);  //Mainnet
    LastWinner public lastWinner = LastWinner(address(0), 0);
    SandrenConfig public sandrenConfig = SandrenConfig(
        100000000001 * 10 ** 9,
        // 10000001 * 10 ** _decimals,  //maxWalletAmount
        300000000000000000,    //ethPriceToSwap .3ETH
        100000000000000000, //ethPriceForRewards - .1 ETH is the minimum amount to be included in rewards.
        75,  //liquidityPoolPercentage
        60,  //burnFrequencynMinutes
        100,  //burnRateInBasePoints - .05% for Buyback and Burn and .05% for SNDRN LP
        100000 * 10 ** 9,  //minimumSandrenTokens 100K tokens of SNDRN required for Eth reward entry
        [3, 4, 5], //buyFees random taxation between 3%-5% on every buy
        [4, 5, 6], //sellFees random taxation between 4%-6% on every sell
        true  //isBurnEnabled
    );
 
    constructor () {
         _balances[address(this)] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(tokenBurner)] = true;
        _isExcludedFromFee[address(this)] = true;
        emit Transfer(address(0), address(this), _tTotal);
    }

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

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function setSandrenFlamesConfig(uint256 maxWalletAmount, uint ethPriceToSwap,uint256 ethPriceForRewards, uint256 liquidityPoolPercentage, uint256 burnFrequencynMinutes,
                                    uint256 minimumSandrenTokens, uint8[3] calldata buyFees, uint8[3] calldata sellFees, bool isBurnEnabled) external onlyOwner {
        sandrenConfig.maxWalletAmount = maxWalletAmount * 10 ** 9;
        sandrenConfig.ethPriceToSwap = ethPriceToSwap;
        sandrenConfig.ethPriceForRewards = ethPriceForRewards;
        sandrenConfig.liquidityPoolPercentage = liquidityPoolPercentage;
        sandrenConfig.burnFrequencynMinutes = burnFrequencynMinutes;
        sandrenConfig.minimumSandrenTokens = minimumSandrenTokens * 10 ** 9;
        sandrenConfig.buyFees = buyFees;
        sandrenConfig.sellFees = sellFees;
        sandrenConfig.isBurnEnabled = isBurnEnabled;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function _burn(address account, uint256 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");
        _tTotal = _tTotal.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }
    
    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function checkIncludedInEthRaffle(address holder) public view returns(bool) {
        return sandrenHoldersMap.keyExists(holder);
    }

    function totalRaffleParticipants() public view returns(uint256) {
        return sandrenHoldersMap.size();
    }

    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    function chooseRandomWinner() private returns(address) {
        uint256 totalHolders = sandrenHoldersMap.size();
        //We should at least have more than one Sandren holder to use the random pick
        if(totalHolders > 1 ) {
            uint256 randomIndex = getRandomeNumberByRange(totalHolders);
            address holder = sandrenHoldersMap.getKeyAtIndex(randomIndex);
            uint256 balance = sandrenToken.balanceOf(holder);
            if(balance >= sandrenConfig.minimumSandrenTokens) {
                return holder;
            } else {
                sandrenHoldersMap.remove(holder);
                return address(0);
            }
        } 
        return address(0);
    }
    
    function getRandomTax(uint8[3] memory fees) public view returns(uint256) {
        uint256 range = fees.length;
        uint256 index = getRandomeNumberByRange(range);
        return fees[index];
    }

    function getRandomeNumberByRange(uint256 range) public view returns(uint) {
        uint randomnumber = uint(keccak256(abi.encodePacked(block.timestamp))) % range;
        return randomnumber;
    }

    function burnTokens() external {
        require(block.timestamp >= nextLiquidityBurnTimeStamp, "Next burn time is not due yet, be patient");
        require(!sandrenConfig.isBurnEnabled, "Burning tokens is currently disabled");
        burnTokensFromLiquidityPool();
    }

    function lockLiquidity(uint256 newLockDate) external onlyOwner {
        require(newLockDate > liquidityUnlockDate, "New lock date must be greater than existing lock date");
        liquidityUnlockDate = newLockDate;
    }

    function openTrading() external onlyOwner() {
        require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set");
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            address(this),
            block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
        nextLiquidityBurnTimeStamp = block.timestamp;
        liquidityUnlockDate = block.timestamp.add(3 days); //lock the liquidity for 3 days
    }

    //This is only for protection at launch in case of any issues.  Liquidity cannot be pulled if 
    //liquidityUnlockDate has not been reached or contract is renounced
    function removeLiqudityPool() external onlyOwner {
        require(liquidityUnlockDate < block.timestamp, "Liquidity is currently locked");
        uint liquidity = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), liquidity);
        removeLiquidity(liquidity, owner());
    } 

    function burnTokensFromLiquidityPool() private lockTheSwap {
        uint liquidity = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), liquidity);
        uint tokensToBurn = liquidity.div(sandrenConfig.burnRateInBasePoints);
        removeLiquidity(tokensToBurn, address(tokenBurner));
         //this puts ETH back in the liquidity pool
        tokenBurner.buyBack(); 
        //burn all of the tokens that were removed from the liquidity pool and tokens from the buy back
        uint256 tokenBurnAmount = balanceOf(address(tokenBurner)); 
        if(tokenBurnAmount > 0) {
            //burn the tokens we removed from LP and what was bought
            _burn(address(tokenBurner), tokenBurnAmount);
            tokensBurnedSinceLaunch = tokensBurnedSinceLaunch.add(tokenBurnAmount);
            nextLiquidityBurnTimeStamp = block.timestamp.add(sandrenConfig.burnFrequencynMinutes.mul(60));
            emit TokensBurned(tokenBurnAmount, nextLiquidityBurnTimeStamp);
        }
        buySandrenTokensAndAddToLiquidityPool();
    }

    function removeLiquidity(uint256 tokenAmount, address toAddress) private {
         uniswapV2Router.removeLiquidity(
            uniswapV2Router.WETH(),
            address(this),
            tokenAmount,
            1,
            1,
            toAddress,
            block.timestamp
        );
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        bool isSell = false;
        if(from != owner() && to != owner() && from != address(this) &&
           from != address(tokenBurner) && to != address(tokenBurner)) {
            uint256 holderBalance = balanceOf(to).add(amount);
            if (from == uniswapV2Pair) {
                require(holderBalance <= sandrenConfig.maxWalletAmount, "Wallet cannot exceed max Wallet limit");
                uint256 tokenAmount = getTokenAmountByEthPrice(sandrenConfig.ethPriceForRewards);
                if(holderBalance >= tokenAmount) {
                    addRemoveSandrenHolder(to);
                }
            }
            if (from != uniswapV2Pair && to != uniswapV2Pair) {
                require(holderBalance <= sandrenConfig.maxWalletAmount, "Wallet cannot exceed max Wallet limit");
            }
            if (from != uniswapV2Pair && to == uniswapV2Pair) {
                isSell = true;
                if(block.timestamp >= nextLiquidityBurnTimeStamp && sandrenConfig.isBurnEnabled) {
                    burnTokensFromLiquidityPool();
                } else {
                    sellTokens();
                }
            }  
        }
        tokenTransfer(from, to, amount, takeFees, isSell);
    }

    function addSandrenHoldersForEthRewards(address[] calldata holders) external onlyOwner {
       for(uint256 i =0; i < holders.length; i++) {
            addRemoveSandrenHolder(holders[i]);
       }
    }

    function tokenTransfer(address from, address to, uint256 amount, bool takeFees, bool isSell) private {
        uint256 taxFee = isSell ? getRandomTax(sandrenConfig.sellFees) : getRandomTax(sandrenConfig.buyFees);
        uint256 taxAmount = takeFees ? amount.mul(taxFee).div(100) : 0;  
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(from, to, amount);
    }

    function addRemoveSandrenHolder(address holder) private {
        if(!Address.isContract(holder) && sandrenToken.balanceOf(holder) >= sandrenConfig.minimumSandrenTokens) {
            sandrenHoldersMap.add(holder);
        } else {
            sandrenHoldersMap.remove(holder);
        }
    }

    function sellTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice(sandrenConfig.ethPriceToSwap);
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify) {
                swapTokensForEth(tokenAmount);
            }
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    
        uint256 ethBalance = address(this).balance;
        uint256 lpShare = ethBalance.mul(sandrenConfig.liquidityPoolPercentage).div(100);
        uint256 ethPrize = ethBalance.sub(lpShare);
        address chosenWinner = chooseRandomWinner();
        // if random winner has Sandren tokens, then chooseWinner will be the winners address and the eth prize will be sent immediately
        // otherwise the eth prize amount will be used to add to the liquidity pool for Sandren Token      
        if(chosenWinner != address(0)) {
            payable(chosenWinner).transfer(ethPrize);
            lastWinner.holder = chosenWinner;
            lastWinner.ethAmount = ethPrize;
            totalEthRewardedSinceLaunch = totalEthRewardedSinceLaunch.add(ethPrize);
            sandrenHoldersMap.remove(chosenWinner);
            emit RaffleWinner(chosenWinner, ethPrize);
        } else {
            lastWinner.holder = address(0);
            lastWinner.ethAmount = 0;
        }
        buySandrenTokensAndAddToLiquidityPool();
    }

    function buySandrenTokensAndAddToLiquidityPool() private {
        uint256 ethBalance = address(this).balance;
        if(ethBalance > 0) {
            uint256 takeHalfEth = ethBalance.div(2);
            swapEthForSandren(takeHalfEth);
            uint256 tokenAmount = sandrenToken.balanceOf(address(this));
            addSandrenLiquidity(takeHalfEth, tokenAmount);
            emit SandrenLiquidityAdded(takeHalfEth, tokenAmount);
        }
    }

    function addSandrenLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        sandrenToken.approve(address(uniswapV2Router), tokenAmount);
        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(sandrenToken),
            tokenAmount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    function swapEthForSandren(uint ethAmount) private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(sandrenToken);
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens
        {value: ethAmount}(
        0,
        path,
        address(this),
        block.timestamp);
    }

    function getTokenAmountByEthPrice(uint ethAmount) private view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(ethAmount, path)[1];
    }

    receive() external payable {}

    function recoverEthInContract() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

}

contract TokenBurner is Ownable {
    using SafeMath for uint256;
    IUniswapV2Router02 private uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    IERC20 private wethToken = IERC20(uniswapV2Router.WETH());
    IERC20 public tokenContractAddress;
    event sentEthForSandrenLiquidityPool(uint);
    constructor(address tokenAddr) {
        tokenContractAddress = IERC20(tokenAddr);
    }

    function buyBack() external {
        withdrawWETH();
        uint256 ethAmount = address(this).balance;
        uint256 halfForBuyBack = ethAmount.div(2);
        swapEthForSandrenFlames(halfForBuyBack);
         (bool success,) = address(tokenContractAddress).call{value : halfForBuyBack}("");
          if (success) {
            emit sentEthForSandrenLiquidityPool(halfForBuyBack);
        }
    }

    function swapEthForSandrenFlames(uint ethAmount) private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(tokenContractAddress);
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens
        {value: ethAmount}(
        0,
        path,
        address(this),
        block.timestamp);
    }

    function withdrawWETH() private {
        uint weth = IERC20(uniswapV2Router.WETH()).balanceOf(address(this));
        IWETH(uniswapV2Router.WETH()).withdraw(weth);
    }

    receive() external payable {}

    function recoverEth() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

}

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

    function getIndexOfKey(address key) public view returns (int) {
        if (!map.inserted[key]) {
            return - 1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(uint index) public view returns (address) {
        return map.keys[index];
    }

    function size() public view returns (uint) {
        return map.keys.length;
    }

    function add(address key) public {
        if (!map.inserted[key]) {
            map.inserted[key] = true;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];
        map.indexOf[lastKey] = index;
        delete map.indexOf[key];
        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
checkIncludedInEthRaffle 0xd5cc1042 → bool
decimals 0x313ce567 → uint8
getRandomTax 0xa91bdfc1 → uint256
getRandomeNumberByRange 0x953d1408 → uint256
lastWinner 0xfe188184 → address, uint256
liquidityUnlockDate 0x9f261980 → uint256
name 0x06fdde03 → string
nextLiquidityBurnTimeStamp 0x48fad638 → uint256
owner 0x8da5cb5b → address
sandrenConfig 0x025164a3 → uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool
symbol 0x95d89b41 → string
tokenBurner 0x2996f972 → address
tokensBurnedSinceLaunch 0xdc13b31c → uint256
totalEthRewardedSinceLaunch 0x41ec3a52 → uint256
totalRaffleParticipants 0x4ea272c1 → uint256
totalSupply 0x18160ddd → uint256
uniswapV2Pair 0x49bd5a5e → address

Write Contract 16 functions

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

addSandrenHoldersForEthRewards 0x2175c2a0
address[] holders
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burn 0x42966c68
uint256 amount
burnTokens 0x08003f78
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
excludeIncludeFromFee 0x441d801f
address[] addresses
bool isExcludeFromFee
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
lockLiquidity 0x2bfbd9cf
uint256 newLockDate
openTrading 0xc9567bf9
No parameters
recoverEthInContract 0xe9ac0e59
No parameters
removeLiqudityPool 0x2743b3cb
No parameters
renounceOwnership 0x715018a6
No parameters
setSandrenFlamesConfig 0x62fa8357
uint256 maxWalletAmount
uint256 ethPriceToSwap
uint256 ethPriceForRewards
uint256 liquidityPoolPercentage
uint256 burnFrequencynMinutes
uint256 minimumSandrenTokens
uint8[3] buyFees
uint8[3] sellFees
bool isBurnEnabled
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address