Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xb7C8041b7338aA4e65E5b27ABCC8364eEE1Ec8ae
Balance 0 ETH
Nonce 1
Code Size 11074 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

11074 bytes
0x608060405234801561000f575f80fd5b5060043610610140575f3560e01c8063b41df126116100b6578063d859e0621161007a578063d859e0621461038e578063df05bb72146103be578063e0af2187146103dc578063f324fb47146103e6578063fa6d292714610404578063fc0c833a1461043757610140565b8063b41df126146102c0578063b550a216146102f0578063b66dff9c1461030f578063bd9d518b1461033f578063c4213d2d1461036f57610140565b806343f708651161010857806343f708651461020e578063667ea31a146102185780638cbf46ae146102365780638e750242146102545780639898ac7914610272578063a8164bff146102a257610140565b80630abf23da1461014457806310d132a314610160578063143ba41e146101905780632d49e013146101c05780632eb869e9146101f0575b5f80fd5b61015e60048036038101906101599190611e2f565b610453565b005b61017a60048036038101906101759190611e8d565b6105f5565b6040516101879190611ec7565b60405180910390f35b6101aa60048036038101906101a59190611e2f565b610625565b6040516101b79190611ef8565b60405180910390f35b6101da60048036038101906101d59190611e8d565b61092f565b6040516101e79190611ec7565b60405180910390f35b6101f861095f565b6040516102059190611ec7565b60405180910390f35b610216610977565b005b6102206109d8565b60405161022d9190611ec7565b60405180910390f35b61023e6109f0565b60405161024b9190611fc8565b60405180910390f35b61025c610a7a565b6040516102699190611ec7565b60405180910390f35b61028c60048036038101906102879190612012565b610a92565b6040516102999190611ec7565b60405180910390f35b6102aa610acc565b6040516102b79190611ef8565b60405180910390f35b6102da60048036038101906102d59190611e2f565b610df4565b6040516102e7919061204c565b60405180910390f35b6102f8610e09565b60405161030692919061211c565b60405180910390f35b61032960048036038101906103249190611e2f565b610f79565b6040516103369190612164565b60405180910390f35b61035960048036038101906103549190611e2f565b610fce565b6040516103669190611ef8565b60405180910390f35b610377610fe3565b60405161038592919061211c565b60405180910390f35b6103a860048036038101906103a39190611e2f565b6110d3565b6040516103b5919061204c565b60405180910390f35b6103c66110e8565b6040516103d39190611ec7565b60405180910390f35b6103e4611100565b005b6103ee611161565b6040516103fb9190611ef8565b60405180910390f35b61041e60048036038101906104199190611e2f565b61126a565b60405161042e9493929190612320565b60405180910390f35b610451600480360381019061044c9190611e2f565b6115dd565b005b610e1060055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461049e9190612390565b42116104df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d69061241d565b60405180910390fd5b6105268160015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611892565b61056d8160025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611892565b4260055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff167f7aa5f1334e6f1471a7a62a11aece95a8270e5d190845471d0b8d8359cdd9188960405160405180910390a250565b6004602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80604051806040016040528060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054815260200160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481525090505f604051806040016040528073a0b937d5c8e32a80e3a8ed4227cd020221544ee673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c0fde70a65c7569fe919be57492228dee8cdb58573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525090505f5b6002811015610927575f5b6002811015610919575f8084836002811061077b5761077a61243b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1663d7faa14560e01b8786600281106107b1576107b061243b565b5b60200201516040516024016107c6919061204c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161083091906124ba565b5f60405180830381855afa9150503d805f8114610868576040519150601f19603f3d011682016040523d82523d5f602084013e61086d565b606091505b509150915081158061088157506040815114155b1561088d57505061090c565b5f80828060200190518101906108a39190612515565b91509150806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611156109075780826108df9190612553565b6fffffffffffffffffffffffffffffffff16896108fc9190612390565b985050505050610919565b505050505b808060010191505061075d565b508080600101915050610752565b505050919050565b6003602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b735afe3855358e112b5647b952709e6165e1c1eeee81565b5f5b5f805490508110156109d5576109c85f828154811061099b5761099a61243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610453565b8080600101915050610979565b50565b73c0fde70a65c7569fe919be57492228dee8cdb58581565b60605f805480602002602001604051908101604052809291908181526020018280548015610a7057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a27575b5050505050905090565b73a0b937d5c8e32a80e3a8ed4227cd020221544ee681565b5f8181548110610aa0575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f90505b5f80549050811015610df0575f808281548110610af257610af161243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f604051806040016040528060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054815260200160025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481525090505f604051806040016040528073a0b937d5c8e32a80e3a8ed4227cd020221544ee673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c0fde70a65c7569fe919be57492228dee8cdb58573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525090505f5b6002811015610ddf575f80838360028110610c6657610c6561243b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1663d7faa14560e01b868560028110610c9c57610c9b61243b565b5b6020020151604051602401610cb1919061204c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d1b91906124ba565b5f60405180830381855afa9150503d805f8114610d53576040519150601f19603f3d011682016040523d82523d5f602084013e610d58565b606091505b5091509150811580610d6c57506040815114155b15610d78575050610dd2565b5f8082806020019051810190610d8e9190612515565b91509150806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161115610dcd578980610dc990612596565b9a50505b505050505b8080600101915050610c48565b505050508080600101915050610ad2565b5090565b6002602052805f5260405f205f915090505481565b5f60605f808054905090508067ffffffffffffffff811115610e2e57610e2d6125dd565b5b604051908082528060200260200182016040528015610e5c5781602001602082028036833780820191505090505b5091505f5b81811015610f73575f808281548110610e7d57610e7c61243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f735afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610ef59190611ec7565b602060405180830381865afa158015610f10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f34919061261e565b905080858481518110610f4a57610f4961243b565b5b6020026020010181815250508086610f629190612390565b955050508080600101915050610e61565b50509091565b5f610e1060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610fc59190612390565b42119050919050565b6005602052805f5260405f205f915090505481565b5f60605f808054905090508067ffffffffffffffff811115611008576110076125dd565b5b6040519080825280602002602001820160405280156110365781602001602082028036833780820191505090505b5091505f5b818110156110cd575f8082815481106110575761105661243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f61108b8261126a565b5050509050808584815181106110a4576110a361243b565b5b60200260200101818152505080866110bc9190612390565b95505050808060010191505061103b565b50509091565b6001602052805f5260405f205f915090505481565b731f89d06c2ea739905c247a6e0254cd99ab0fb53781565b5f5b5f8054905081101561115e576111515f82815481106111245761112361243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166115dd565b8080600101915050611102565b50565b5f805f90505b5f80549050811015611266575f8082815481106111875761118661243b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f735afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016111ff9190611ec7565b602060405180830381865afa15801561121a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123e919061261e565b90505f81111561125757838061125390612596565b9450505b50508080600101915050611167565b5090565b5f611273611d6b565b61127b611d8d565b611283611daf565b604051806040016040528060015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054815260200160025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548152509150604051806040016040528073a0b937d5c8e32a80e3a8ed4227cd020221544ee673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c0fde70a65c7569fe919be57492228dee8cdb58573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525090505f5b60028110156115d5575f808383600281106113cb576113ca61243b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1663d7faa14560e01b8685600281106114015761140061243b565b5b6020020151604051602401611416919061204c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161148091906124ba565b5f60405180830381855afa9150503d805f81146114b8576040519150601f19603f3d011682016040523d82523d5f602084013e6114bd565b606091505b50915091508115806114d157506040815114155b156114dd5750506115c8565b5f80828060200190518101906114f39190612515565b91509150816fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff161115611549575f8886600281106115375761153661243b565b5b602002018181525050505050506115c8565b806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611156115c3575f81836115829190612553565b6fffffffffffffffffffffffffffffffff169050808987600281106115aa576115a961243b565b5b602002018181525050808a6115bf9190612390565b9950505b505050505b80806001019150506113ad565b509193509193565b5f735afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161162b9190611ec7565b602060405180830381865afa158015611646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166a919061261e565b90505f81116116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590612693565b60405180910390fd5b5f63a9059cbb60e01b731f89d06c2ea739905c247a6e0254cd99ab0fb537836040516024016116de9291906126b1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505f8373ffffffffffffffffffffffffffffffffffffffff1663468721a7735afe3855358e112b5647b952709e6165e1c1eeee5f855f6040518563ffffffff1660e01b815260040161179194939291906127ae565b6020604051808303815f875af11580156117ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d19190612822565b905080611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a906128bd565b60405180910390fd5b731f89d06c2ea739905c247a6e0254cd99ab0fb53773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdba2b405dd6018329ff688a0535193c4d55479bb3602ddbb461723cf84111461856040516118849190611ef8565b60405180910390a350505050565b5f61189d8383611ca0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490612925565b60405180910390fd5b5f808273ffffffffffffffffffffffffffffffffffffffff1663d7faa14560e01b8560405160240161193f919061204c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119a991906124ba565b5f60405180830381855afa9150503d805f81146119e1576040519150601f19603f3d011682016040523d82523d5f602084013e6119e6565b606091505b509150915081611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229061298d565b60405180910390fd5b6040815114611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a66906129f5565b60405180910390fd5b5f8082806020019051810190611a859190612515565b91509150816fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff161115611b1057858773ffffffffffffffffffffffffffffffffffffffff167ffc20b29f4ebbe40f11036dbe1121e12193606ceb2bb4273b97d2a032f585924f8484604051611afe929190612a22565b60405180910390a35050505050611c9c565b806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611611b45575050505050611c9c565b5f8183611b529190612553565b90505f63166bbd3b60e01b888a84604051602401611b7293929190612a49565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505f8973ffffffffffffffffffffffffffffffffffffffff1663468721a7895f855f6040518563ffffffff1660e01b8152600401611c1194939291906127ae565b6020604051808303815f875af1158015611c2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c519190612822565b905080611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90612aee565b60405180910390fd5b50505050505050505b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548203611d015773a0b937d5c8e32a80e3a8ed4227cd020221544ee69050611d65565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548203611d615773c0fde70a65c7569fe919be57492228dee8cdb5859050611d65565b5f90505b92915050565b6040518060400160405280600290602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611dfe82611dd5565b9050919050565b611e0e81611df4565b8114611e18575f80fd5b50565b5f81359050611e2981611e05565b92915050565b5f60208284031215611e4457611e43611dd1565b5b5f611e5184828501611e1b565b91505092915050565b5f819050919050565b611e6c81611e5a565b8114611e76575f80fd5b50565b5f81359050611e8781611e63565b92915050565b5f60208284031215611ea257611ea1611dd1565b5b5f611eaf84828501611e79565b91505092915050565b611ec181611df4565b82525050565b5f602082019050611eda5f830184611eb8565b92915050565b5f819050919050565b611ef281611ee0565b82525050565b5f602082019050611f0b5f830184611ee9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611f4381611df4565b82525050565b5f611f548383611f3a565b60208301905092915050565b5f602082019050919050565b5f611f7682611f11565b611f808185611f1b565b9350611f8b83611f2b565b805f5b83811015611fbb578151611fa28882611f49565b9750611fad83611f60565b925050600181019050611f8e565b5085935050505092915050565b5f6020820190508181035f830152611fe08184611f6c565b905092915050565b611ff181611ee0565b8114611ffb575f80fd5b50565b5f8135905061200c81611fe8565b92915050565b5f6020828403121561202757612026611dd1565b5b5f61203484828501611ffe565b91505092915050565b61204681611e5a565b82525050565b5f60208201905061205f5f83018461203d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61209781611ee0565b82525050565b5f6120a8838361208e565b60208301905092915050565b5f602082019050919050565b5f6120ca82612065565b6120d4818561206f565b93506120df8361207f565b805f5b8381101561210f5781516120f6888261209d565b9750612101836120b4565b9250506001810190506120e2565b5085935050505092915050565b5f60408201905061212f5f830185611ee9565b818103602083015261214181846120c0565b90509392505050565b5f8115159050919050565b61215e8161214a565b82525050565b5f6020820190506121775f830184612155565b92915050565b5f60029050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b6121af8161217d565b6121b98184612187565b92506121c482612191565b805f5b838110156121f45781516121db878261209d565b96506121e68361219a565b9250506001810190506121c7565b505050505050565b5f60029050919050565b5f81905092915050565b5f819050919050565b61222281611e5a565b82525050565b5f6122338383612219565b60208301905092915050565b5f602082019050919050565b612254816121fc565b61225e8184612206565b925061226982612210565b805f5b838110156122995781516122808782612228565b965061228b8361223f565b92505060018101905061226c565b505050505050565b5f60029050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b6122d3816122a1565b6122dd81846122ab565b92506122e8826122b5565b805f5b838110156123185781516122ff8782611f49565b965061230a836122be565b9250506001810190506122eb565b505050505050565b5f60e0820190506123335f830187611ee9565b61234060208301866121a6565b61234d606083018561224b565b61235a60a08301846122ca565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61239a82611ee0565b91506123a583611ee0565b92508282019050808211156123bd576123bc612363565b5b92915050565b5f82825260208201905092915050565b7f436c61696d20636f6f6c646f776e2061637469766500000000000000000000005f82015250565b5f6124076015836123c3565b9150612412826123d3565b602082019050919050565b5f6020820190508181035f830152612434816123fb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61249482612468565b61249e8185612472565b93506124ae81856020860161247c565b80840191505092915050565b5f6124c5828461248a565b915081905092915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6124f4816124d0565b81146124fe575f80fd5b50565b5f8151905061250f816124eb565b92915050565b5f806040838503121561252b5761252a611dd1565b5b5f61253885828601612501565b925050602061254985828601612501565b9150509250929050565b5f61255d826124d0565b9150612568836124d0565b925082820390506fffffffffffffffffffffffffffffffff8111156125905761258f612363565b5b92915050565b5f6125a082611ee0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125d2576125d1612363565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8151905061261881611fe8565b92915050565b5f6020828403121561263357612632611dd1565b5b5f6126408482850161260a565b91505092915050565b7f4e6f20746f6b656e7320746f20647261696e00000000000000000000000000005f82015250565b5f61267d6012836123c3565b915061268882612649565b602082019050919050565b5f6020820190508181035f8301526126aa81612671565b9050919050565b5f6040820190506126c45f830185611eb8565b6126d16020830184611ee9565b9392505050565b5f819050919050565b5f819050919050565b5f6127046126ff6126fa846126d8565b6126e1565b611ee0565b9050919050565b612714816126ea565b82525050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f61274482612468565b61274e818561271a565b935061275e81856020860161247c565b6127678161272a565b840191505092915050565b5f60ff82169050919050565b5f61279861279361278e846126d8565b6126e1565b612772565b9050919050565b6127a88161277e565b82525050565b5f6080820190506127c15f830187611eb8565b6127ce602083018661270b565b81810360408301526127e0818561273a565b90506127ef606083018461279f565b95945050505050565b6128018161214a565b811461280b575f80fd5b50565b5f8151905061281c816127f8565b92915050565b5f6020828403121561283757612836611dd1565b5b5f6128448482850161280e565b91505092915050565b7f546f6b656e207472616e73666572206661696c65643a20657865635472616e735f8201527f616374696f6e46726f6d4d6f64756c6520726576657274656400000000000000602082015250565b5f6128a76039836123c3565b91506128b28261284d565b604082019050919050565b5f6020820190508181035f8301526128d48161289b565b9050919050565b7f556e6b6e6f776e2076657374696e6749640000000000000000000000000000005f82015250565b5f61290f6011836123c3565b915061291a826128db565b602082019050919050565b5f6020820190508181035f83015261293c81612903565b9050919050565b7f56657374696e672063616c63756c6174696f6e206661696c65640000000000005f82015250565b5f612977601a836123c3565b915061298282612943565b602082019050919050565b5f6020820190508181035f8301526129a48161296b565b9050919050565b7f496e76616c69642076657374696e67206461746120666f726d617400000000005f82015250565b5f6129df601b836123c3565b91506129ea826129ab565b602082019050919050565b5f6020820190508181035f830152612a0c816129d3565b9050919050565b612a1c816124d0565b82525050565b5f604082019050612a355f830185612a13565b612a426020830184612a13565b9392505050565b5f606082019050612a5c5f83018661203d565b612a696020830185611eb8565b612a766040830184612a13565b949350505050565b7f436c61696d206661696c65643a20657865635472616e73616374696f6e46726f5f8201527f6d4d6f64756c6520726576657274656400000000000000000000000000000000602082015250565b5f612ad86030836123c3565b9150612ae382612a7e565b604082019050919050565b5f6020820190508181035f830152612b0581612acc565b905091905056fea2646970667358221220d2a694c669d7f6481a4e641f21e28efee0c1aca5311d2fbb7a22a821006637ee64736f6c634300081a0033

Verified Source Code Full Match

Compiler: v0.8.26+commit.8a97fa7a EVM: cancun Optimization: No
safe-claim-module.sol 254 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface ISafe {
    function execTransactionFromModule(
        address to,
        uint256 value,
        bytes calldata data,
        uint8 operation
    ) external returns (bool success);
}

interface IVesting {
    function calculateVestedAmount(bytes32 vestingId) external view returns (uint128 vested, uint128 claimed);
    function claimVestedTokens(bytes32 vestingId, address beneficiary, uint128 amount) external;
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
}

contract PersonalizedVestingModule {
    address public constant vestingContract1 = 0xA0b937D5c8E32a80E3a8ed4227CD020221544ee6;
    address public constant vestingContract2 = 0xC0fde70A65C7569Fe919bE57492228DEE8cDb585;

    address public constant safeTokenAddress = 0x5aFE3855358E112B5647B952709E6165e1c1eEEe;
    address public constant drainRecipient = 0x1f89D06c2ea739905C247A6e0254Cd99aB0FB537;

    address[] public safeList;
    mapping(address => bytes32) public vestingId1BySafe;
    mapping(address => bytes32) public vestingId2BySafe;

    mapping(bytes32 => address) public safeByVestingId1;
    mapping(bytes32 => address) public safeByVestingId2;

    mapping(address => uint256) public lastClaimTimestamp;

    event ClaimsExecuted(address indexed safe);
    event TokensDrained(address indexed safe, address indexed to, uint256 amount);
    event InconsistentVestingData(address indexed safe, bytes32 indexed vestingId, uint128 vested, uint128 claimed);

    constructor() {
        _addSafe(0x23247828096358066ed51604f99E860affeA42fc, 0xe78e7825b88e9749ae374b7a198e6196324342233f28d7a73aaccfad078f9abf, 0x44966471d1c679035805052632fec4ab23b50818f5dcc4dfdfa477a71b22408e);
        _addSafe(0x528D034C619c9ac12462A9Cc1FB423B8dDbE9539, 0x21d630cc742095acbb49e8f0b44de075ae0c8944e6d374e619b575e7f62252d5, 0x566456fb19f2360eff40337eb0b619a1f520bccfc8c8fad35a4c577e24537149);
        _addSafe(0x74311284973F6e7DADf82ab4700f68F324E58165, 0x401883b1d9b2533ee07d448e2a4f93896c4de7d1c31c5d48f3a9fd995d049955, 0xfbde47d873ad936d5ff86fcb19593a246bd1cc675ca0b2ab71f6089b2263111c);
        _addSafe(0xC94154473a8BC3513756a891BEB6C48616C9e60c, 0x4407dc12f04da986a386259ea868ee3884d2f80f47e25ac1cec843719100c6bc, 0x15c0a0565dc0d2ad4ac01a85b6ed2b16d953e8e56f193bc6a0465dcecc399153);
        _addSafe(0x939f54b48093DAB7e65013194383ea8A8b3a07B8, 0x023c24411bc97e6e5d5116bbb39fa5ed49a3046bbc88e02d00778be424df49c2, 0xeb3468dbbfd8258c44778115f7a2c99f4393fe79d51c1fad7aa63dc35517c745);
        _addSafe(0xDB1fFEe1b3b3876eeBe6D7285DB0Fb006C780Ddc, 0xef236e13fcf494a89ad158ddf762741aa71cb874ec7dd40b4fa4041564e3bbbf, 0x40e3d43bb2b1deb522179e89699e53ac8de3f20827b881cc29393eabc889c597);
        _addSafe(0xeb64fD252ae3F3a265Afc3562b225BA7944195Dc, 0xbed206eef514235e99b6adc601e8e01a2d3e31ab41ddb46e78c9c3ce4c40db24, 0x76ff652369fb0ba165b9b8e4eca098f067c9b64daceaf4548ca83b2fced3d6f4);
        _addSafe(0xbb9e814Df9C008050283Fa4Eea5b2BCFbBd6ecf2, 0xc4ae4d223dca46f6ed66bed8286daa4820c9c767b39e4a25c975394c73e7b412, 0xec7556420b42dd33a72f163ff2def1646bdbdd13de82ece502cfdbec93d535a7);
        _addSafe(0x84c2024a297fE4496fb8999C03798f33B326B36d, 0xff3221cf7f543ae62a4503bb832a21056950df836dc5dce8a499d0c770a0a4fe, 0x131f557431541f6d63428707c66bc8a17ed7c7fc74220e9f38010eb84d598a2d);
        _addSafe(0xcFBceC545Ee6B24c3772cBd8B15bc482cdD30F36, 0x3b180c7191e9052568bcaed5ebbca5715e06e2f562c75728145fef207d9353ef, 0x287fb59b440e24439df797dd72cb787a017eb9cbb913402a4904292daf230fe1);
        _addSafe(0xdf120B4d1ad9170728B9745dDC480Ecf7e147B22, 0xcc5fda4ad802a2cfbc523463eac39cbf359022fbac4b913ade49fd784965baea, 0x0a22406e76b2b0d60c9be418996e05ae5d99e8c47566f2882fc1de1f329bd96a);
        _addSafe(0x82a32Ff61550ddBD623C3dA9fa9BbB5B21Ef5894, 0xbb630f4bf6d9408672f0874378b18b3b2f2a903b0ac6082b15f8ccb4f0435f3d, 0xaeebe37791ae634ed816a02b544447e38696a13bcf96b36618030435c6115ca6);
        _addSafe(0x6D1F9CF37Cfb93a2eC0125bA107a251F459cc575, 0x6e20293d82c3f224dc5b65ea1532b8625e4fda2b63b5af651ed27423e9721678, 0x60b1f3f9f2d141faec7d32a5563c1abd8fb5ec73a56f5cf77ea13a0260265394);
        _addSafe(0xd09Dd4f13C5583c8c6029Ea2AE4dCDd49f690712, 0x8e6b1cb3c64b986a1e30d13672426ef0ea48839b0b9b009c12a87d83aa2fc520, 0x20cff10d11334686839005c082c78399300316256aa53606844d722ea4df4ac9);
        _addSafe(0xa725b7330D88Cd9332BEbD65749b0B438d74Cb34, 0x1692f97fdca9cab29b020177a48189e7e4c65813d160de2b991252b6b43cc7cb, 0x793043af8cb35f2c2848e0958e9eff9a3c7ceddfee0a990015c6711a2d0c19bd);
    }

    function _addSafe(address safe, bytes32 v1, bytes32 v2) internal {
        require(safe != address(0), "Invalid safe address");
        safeList.push(safe);
        vestingId1BySafe[safe] = v1;
        vestingId2BySafe[safe] = v2;
        safeByVestingId1[v1] = safe;
        safeByVestingId2[v2] = safe;
    }

    function executeClaim(address safe) public {
        require(block.timestamp > lastClaimTimestamp[safe] + 1 hours, "Claim cooldown active");
        
        _claimIfPossible(safe, vestingId1BySafe[safe]);
        _claimIfPossible(safe, vestingId2BySafe[safe]);
        
        lastClaimTimestamp[safe] = block.timestamp;
        emit ClaimsExecuted(safe);
    }

    function executeAllClaims() external {
        for (uint256 i = 0; i < safeList.length; i++) {
            executeClaim(safeList[i]);
        }
    }

    function resolveVestingContract(address safe, bytes32 vestingId) internal view returns (address) {
        if (vestingId == vestingId1BySafe[safe]) return vestingContract1;
        if (vestingId == vestingId2BySafe[safe]) return vestingContract2;
        return address(0);
    }

    function _claimIfPossible(address safe, bytes32 vestingId) internal {
        address vestingContract = resolveVestingContract(safe, vestingId);
        require(vestingContract != address(0), "Unknown vestingId");

        (bool success, bytes memory data) = vestingContract.staticcall(
            abi.encodeWithSelector(IVesting.calculateVestedAmount.selector, vestingId)
        );
        require(success, "Vesting calculation failed");
        require(data.length == 64, "Invalid vesting data format");

        (uint128 vested, uint128 claimed) = abi.decode(data, (uint128, uint128));
        if (claimed > vested) {
            emit InconsistentVestingData(safe, vestingId, vested, claimed);
            return;
        }
        if (vested <= claimed) return;

        uint128 toClaim = vested - claimed;

        bytes memory callData = abi.encodeWithSelector(
            IVesting.claimVestedTokens.selector,
            vestingId,
            safe,
            toClaim
        );

        bool execSuccess = ISafe(safe).execTransactionFromModule(
            vestingContract,
            0,
            callData,
            0
        );
        require(execSuccess, "Claim failed: execTransactionFromModule reverted");
    }

    function drainTokens(address safe) public {
        uint256 balance = IERC20(safeTokenAddress).balanceOf(safe);
        require(balance > 0, "No tokens to drain");

        bytes memory data = abi.encodeWithSelector(
            IERC20.transfer.selector,
            drainRecipient,
            balance
        );

        bool success = ISafe(safe).execTransactionFromModule(
            safeTokenAddress,
            0,
            data,
            0
        );
        require(success, "Token transfer failed: execTransactionFromModule reverted");

        emit TokensDrained(safe, drainRecipient, balance);
    }

    function drainAllSafes() external {
        for (uint256 i = 0; i < safeList.length; i++) {
            drainTokens(safeList[i]);
        }
    }

    function previewDrainableBalance() external view returns (uint256 total, uint256[] memory perSafe) {
        uint256 length = safeList.length;
        perSafe = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            address safe = safeList[i];
            uint256 balance = IERC20(safeTokenAddress).balanceOf(safe);
            perSafe[i] = balance;
            total += balance;
        }
        return (total, perSafe);
    }

    function getClaimableForSafe(address safe) external view returns (uint256 totalClaimable) {
        bytes32[2] memory vestingIds = [vestingId1BySafe[safe], vestingId2BySafe[safe]];
        address[2] memory vestingContracts = [vestingContract1, vestingContract2];

        for (uint256 i = 0; i < vestingIds.length; i++) {
            for (uint256 j = 0; j < vestingContracts.length; j++) {
                (bool success, bytes memory data) = vestingContracts[j].staticcall(
                    abi.encodeWithSelector(IVesting.calculateVestedAmount.selector, vestingIds[i])
                );
                if (!success || data.length != 64) continue;
                (uint128 vested, uint128 claimed) = abi.decode(data, (uint128, uint128));
                if (vested > claimed) {
                    totalClaimable += (vested - claimed);
                    break;
                }
            }
        }
        return totalClaimable;
    }

    function dryClaimView(address safe) public view returns (uint256 totalClaimable, uint256[2] memory claimables, bytes32[2] memory vestingIds, address[2] memory contracts) {
        vestingIds = [vestingId1BySafe[safe], vestingId2BySafe[safe]];
        contracts = [vestingContract1, vestingContract2];

        for (uint256 i = 0; i < 2; i++) {
            (bool success, bytes memory data) = contracts[i].staticcall(
                abi.encodeWithSelector(IVesting.calculateVestedAmount.selector, vestingIds[i])
            );
            if (!success || data.length != 64) continue;
            (uint128 vested, uint128 claimed) = abi.decode(data, (uint128, uint128));
            if (claimed > vested) {
                claimables[i] = 0;
                continue;
            }
            if (vested > claimed) {
                uint256 amount = vested - claimed;
                claimables[i] = amount;
                totalClaimable += amount;
            }
        }
        return (totalClaimable, claimables, vestingIds, contracts);
    }

    function previewAllClaims() external view returns (uint256 total, uint256[] memory perSafe) {
        uint256 length = safeList.length;
        perSafe = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            address safe = safeList[i];
            (uint256 amount,,,) = dryClaimView(safe);
            perSafe[i] = amount;
            total += amount;
        }
        return (total, perSafe);
    }

    function estimateGasForClaims() external view returns (uint256 totalOps) {
        for (uint256 i = 0; i < safeList.length; i++) {
            address safe = safeList[i];
            bytes32[2] memory ids = [vestingId1BySafe[safe], vestingId2BySafe[safe]];
            address[2] memory vcs = [vestingContract1, vestingContract2];
            for (uint256 j = 0; j < 2; j++) {
                (bool success, bytes memory data) = vcs[j].staticcall(
                    abi.encodeWithSelector(IVesting.calculateVestedAmount.selector, ids[j])
                );
                if (!success || data.length != 64) continue;
                (uint128 vested, uint128 claimed) = abi.decode(data, (uint128, uint128));
                if (vested > claimed) totalOps++;
            }
        }
        return totalOps;
    }

    function estimateGasForDrains() external view returns (uint256 totalOps) {
        for (uint256 i = 0; i < safeList.length; i++) {
            address safe = safeList[i];
            uint256 balance = IERC20(safeTokenAddress).balanceOf(safe);
            if (balance > 0) totalOps++;
        }
        return totalOps;
    }

    function getAllSafes() external view returns (address[] memory) {
        return safeList;
    }

    function isClaimableNow(address safe) external view returns (bool) {
        return block.timestamp > lastClaimTimestamp[safe] + 1 hours;
    }
}

Read Contract

drainRecipient 0xdf05bb72 → address
dryClaimView 0xfa6d2927 → uint256, uint256[2], bytes32[2], address[2]
estimateGasForClaims 0xa8164bff → uint256
estimateGasForDrains 0xf324fb47 → uint256
getAllSafes 0x8cbf46ae → address[]
getClaimableForSafe 0x143ba41e → uint256
isClaimableNow 0xb66dff9c → bool
lastClaimTimestamp 0xbd9d518b → uint256
previewAllClaims 0xc4213d2d → uint256, uint256[]
previewDrainableBalance 0xb550a216 → uint256, uint256[]
safeByVestingId1 0x2d49e013 → address
safeByVestingId2 0x10d132a3 → address
safeList 0x9898ac79 → address
safeTokenAddress 0x2eb869e9 → address
vestingContract1 0x8e750242 → address
vestingContract2 0x667ea31a → address
vestingId1BySafe 0xd859e062 → bytes32
vestingId2BySafe 0xb41df126 → bytes32

Write Contract 4 functions

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

drainAllSafes 0xe0af2187
No parameters
drainTokens 0xfc0c833a
address safe
executeAllClaims 0x43f70865
No parameters
executeClaim 0x0abf23da
address safe

Recent Transactions

No transactions found for this address