0xd66c…27a7

All memos sent from and to 0xd66c…27a7.

data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"transfer","args":{"amount":"1825511767826581486","to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"2212132100221000719919","amountOutMin":"893467066867424376","path":["0x55ab0390a89fed8992e3affbf61d102490735e24","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"25577774223319620595","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x55ab0390a89fed8992e3affbf61d102490735e24"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"transfer","args":{"to":"0xc2172a6315c1d7f6855768f843c420ebb36eda97","amount":"2651533886947346818"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"withdrawFees","args":{"to":"0xc2172a6315c1d7f6855768f843c420ebb36eda97"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"32753350398222342406731","amountOutMin":"16584435647535342","path":["0x2535c89c8329bd40736151ad09cc79c5e5646bbb","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"1939832331747052324900","amountOutMin":"36190337929423085","path":["0x26231ad975456d53682e1b6364e9e005886281e7","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"191299190578592916412827","amountOutMin":"20356370998406131","path":["0xa38ad4c62a70e14619fa56548bb5e11381d58ff6","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"1293251856089966997055","amountOutMin":"698249918826696947","path":["0x55ab0390a89fed8992e3affbf61d102490735e24","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"5947670528979984552","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x26231ad975456d53682e1b6364e9e005886281e7"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"54885918774724004903","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0xa38ad4c62a70e14619fa56548bb5e11381d58ff6"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"17695360378027395517","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x55ab0390a89fed8992e3affbf61d102490735e24"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"transfer","args":{"amount":"1729921891299550577","to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"1914330326527599901658","amountOutMin":"848555825784109370","path":["0x55ab0390a89fed8992e3affbf61d102490735e24","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"24151265001066892219","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x55ab0390a89fed8992e3affbf61d102490735e24"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"transfer","args":{"amount":"11724053626659030695","to":"0x75deb70b12689e9caef4b316edd04f213af06127"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"2371692239611140677304160","amountOutMin":"38830986754340851","path":["0x8bf5b06a5481fc2a32caf2333fb41feeea8db5d6","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"131743418552072507459063027","amountOutMin":"20436576857523213","path":["0xed17016b689469156542968b08d924167813245b","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"6106122978590565070541","amountOutMin":"80961311678492603","path":["0x26231ad975456d53682e1b6364e9e005886281e7","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x8bf5b06a5481fc2a32caf2333fb41feeea8db5d6","function":"approve","args":["0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","57896044618658097711785492504343953926634992332820282019728792003956564819968"]}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"2155522617916235295793165","amountOutMin":"43386512167977507","path":["0x5d0dc4380fc8d501795aec7e7a908cb25c4131c6","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xed17016b689469156542968b08d924167813245b","function":"approve","args":["0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","57896044618658097711785492504343953926634992332820282019728792003956564819968"]}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"132415468726245884721794","amountOutMin":"21673588290700118","path":["0xa38ad4c62a70e14619fa56548bb5e11381d58ff6","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"7805915276926710875112","amountOutMin":"3869002230972384592","path":["0x55ab0390a89fed8992e3affbf61d102490735e24","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"302804282674941155228","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x8bf5b06a5481fc2a32caf2333fb41feeea8db5d6"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"1654465897476408795442","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0xed17016b689469156542968b08d924167813245b"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"15252253596506384770","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x26231ad975456d53682e1b6364e9e005886281e7"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x6f34f7fb57403af78b957761bd0a0f20724f1469","function":"approve","args":["0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","57896044618658097711785492504343953926634992332820282019728792003956564819968"]}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"260215292203236478811","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x5d0dc4380fc8d501795aec7e7a908cb25c4131c6"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x5cfcd1b8e342d97c5262cf1323b109882c9d5114","function":"approve","args":["0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","57896044618658097711785492504343953926634992332820282019728792003956564819968"]}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"39231047060822278821","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0xa38ad4c62a70e14619fa56548bb5e11381d58ff6"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"107460060770613957940","to":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x55ab0390a89fed8992e3affbf61d102490735e24"}}}
data:application/vnd.facet.system+json;rule=esip6,{"op":"updateSupportedContracts","data":["0x4bddad53945dd1d0b155207b1e6a9d641a7658788ac6b35e02bbfae63ccdd6f0","0xa2a9d5bf9901d7a15ae08ceb568dac12d14dab2d5994ec8037feae7aeeb4e2c7","0xcae364f38cd61ae19f32d460fc14eb8e62ebd0a5cc26b1a95dfac3d5d834c1aa","0x9022ced2f52aee8b28119f0490767a6e0b80b492642364382e609b6e84d85ce0","0x52c3226b3e5045a92e0a3975978997b7e5af223021470a1deb14211511dd04c9","0xdf13c05ccd7d54d7b9a8f3e2be83630c4d38d8bed6ce7e8f6a1a15466f3e9d58","0xa26bdad3c05ec5c4a0e234b5f755ca9cf7311dd857250a183b74a779e3c96ef8","0xb71fdafae3610cb8e74900b8e6d43163aaab54cc6e6c54ff5b7c7570a2dabe5c","0x2dbec15cf7c23393357f0336e0058ca1c48e8f694324a6d95334f539598d9bf5","0xd7ecfb5c3eb58b7875a7c70799632006a0c00e4e002aea6b1e03809442f763f8","0xb5b742d755877bac6b80e2f0af4d97792fce2b2a58ff0ee2274b86eac91e977f","0xee18008875b9e2ecadebb7566928a6a853a23f15c2393221f6a9db8d81fd5670","0x6c5eee22f9574d847b4d90833da27228c6567cee2e004d4ccbb6a34011ab66e4","0xb1b0ed1e4a8c9c9b0210f267137e368f782453e41f622fa8cf68296d04c84c88","0xe46dfedf0c0e9a0985d5151f5844bea96e5ac147cd9ddc7daa22a0899659d2f5","0x958b66f80d8d14e5c2129434bb8c78aabb60b5cfb7113224102e1a9a07c77ac5","0x2dce6b589dd5a5bedc5d9a91806a6cc5f16ae52c0f8dae730a886d7212db2dfd","0xd6c73897c5441fa221f1f0ebaee84241099b58f9cf51f6f4bcaf6bac4c29756d","0x45b224f1320c602a827823099dc4e7f596baf4227f919102a7f80523834edb02"]}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xb2c3f692942bd4166450e8245b7609b0e2b8a878","function":"setUpgradeAdmin","args":{"newUpgradeAdmin":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xb2c3f692942bd4166450e8245b7609b0e2b8a878","function":"transferOwnership","args":{"newOwner":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0xa2a9d5bf9901d7a15ae08ceb568dac12d14dab2d5994ec8037feae7aeeb4e2c7","args":{},"source_code":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] >= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n require(allowed >= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:Ownable, abstract: true) {\n address(:public, :owner)\n event(:OwnershipTransferred, { previousOwner: :address, newOwner: :address })\n constructor(owner: :address) {\n s.owner=owner\n }\n function(:transferOwnership, { newOwner: :address }, :public) {\n onlyOwner!\n previousOwner = s.owner\n s.owner=newOwner\n emit(:OwnershipTransferred, previousOwner: previousOwner, newOwner: newOwner)\n }\n function(:onlyOwner!, :internal) {\n require(msg.sender == s.owner, \"msg.sender is not the owner\")\n }\n}\ncontract(:Pausable, abstract: true) {\n bool(:public, :paused)\n event(:Paused, { account: :address })\n event(:Unpaused, { account: :address })\n constructor(initialPauseState: :bool) {\n s.paused=initialPauseState\n }\n function(:_pause, :internal) {\n s.paused=true\n emit(:Paused, account: msg.sender)\n }\n function(:_unpause, :internal) {\n s.paused=false\n emit(:Unpaused, account: msg.sender)\n }\n function(:whenPaused!, :internal) {\n require(s.paused, \"Contract is not paused\")\n }\n function(:whenNotPaused!, :internal) {\n require(!s.paused, \"Contract is paused\")\n }\n}\ncontract(:Upgradeable, abstract: true) {\n address(:public, :upgradeAdmin)\n event(:ContractUpgraded, { oldHash: :bytes32, newHash: :bytes32 })\n event(:UpgradeAdminChanged, { newUpgradeAdmin: :address })\n constructor(upgradeAdmin: :address) {\n s.upgradeAdmin=upgradeAdmin\n }\n function(:setUpgradeAdmin, { newUpgradeAdmin: :address }, :public) {\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n s.upgradeAdmin=newUpgradeAdmin\n emit(:UpgradeAdminChanged, newUpgradeAdmin: newUpgradeAdmin)\n }\n function(:upgradeAndCall, { newHash: :bytes32, newSource: :string, migrationCalldata: :string }, :public) {\n upgrade(newHash: newHash, newSource: newSource)\n (success, data) = address(this).call(migrationCalldata)\n require(success, \"Migration failed\")\n }\n function(:upgrade, { newHash: :bytes32, newSource: :string }, :public) {\n currentHash = this.currentInitCodeHash\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n this.upgradeImplementation(newHash, newSource)\n emit(:ContractUpgraded, oldHash: currentHash, newHash: newHash)\n }\n}\ncontract(:ERC20Locker, is: [:Ownable, :Upgradeable, :Pausable], upgradeable: true) {\n event(:Deposit, { token: :address, amount: :uint256, lockDate: :uint256, unlockDate: :uint256, withdrawer: :address, lockId: :uint256 })\n event(:Relock, { token: :address, lockId: :uint256, unlockDate: :uint256 })\n event(:Withdraw, { token: :address, amount: :uint256, withdrawer: :address, lockId: :uint256 })\n struct(:TokenLock) {\n uint256(:lockId)\n address(:token)\n address(:owner)\n uint256(:amount)\n uint256(:lockDate)\n uint256(:unlockDate)\n }\n uint256(:public, :nextLockId)\n mapping(({ uint256: :TokenLock }), :public, :tokenLocks)\n constructor {\n s.nextLockId=1\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n self.Ownable.constructor(owner: msg.sender)\n }\n function(:lockToken, { token: :address, amount: :uint256, unlockDate: :uint256, withdrawer: :address }, :public) {\n whenNotPaused!\n require(unlockDate < 10000000000, \"Timestamp is in seconds\")\n require(unlockDate > block.timestamp, \"Unlock time must be in the future\")\n require(amount > 0, \"Amount must be greater than 0\")\n require(withdrawer != address(0), \"Invalid withdrawer\")\n require(ERC20(token).transferFrom(msg.sender, address(this), amount), \"Transfer failed\")\n tokenLock = TokenLock(lockId: s.nextLockId, token: token, owner: withdrawer, amount: amount, lockDate: block.timestamp, unlockDate: unlockDate)\n require(s.tokenLocks[tokenLock.lockId] == TokenLock(), \"Lock already exists\")\n s.tokenLocks[tokenLock.lockId] = tokenLock\n s.nextLockId += 1\n emit(:Deposit, token: tokenLock.token, amount: tokenLock.amount, lockDate: tokenLock.lockDate, unlockDate: tokenLock.unlockDate, withdrawer: tokenLock.owner, lockId: tokenLock.lockId)\n }\n function(:relock, { lockId: :uint256, unlockDate: :uint256 }, :public) {\n tokenLock = s.tokenLocks[lockId]\n require(tokenLock.owner == msg.sender, \"Only owner\")\n require(unlockDate < 10000000000, \"Timestamp is in seconds\")\n require(unlockDate > block.timestamp, \"Unlock time must be in the future\")\n require(unlockDate > tokenLock.unlockDate, \"Unlock date must be after current unlock date\")\n tokenLock.unlockDate=unlockDate\n emit(:Relock, token: tokenLock.token, lockId: lockId, unlockDate: unlockDate)\n }\n function(:withdraw, { lockId: :uint256, amount: :uint256 }, :public) {\n tokenLock = s.tokenLocks[lockId]\n require(tokenLock.owner == msg.sender, \"Only owner\")\n require(amount > 0, \"Amount must be greater than 0\")\n require(tokenLock != TokenLock(), \"Lock does not exist\")\n require(block.timestamp > tokenLock.unlockDate, \"Tokens are still locked\")\n require(tokenLock.amount >= amount, \"Insufficient balance\")\n tokenLock.amount -= amount\n token = tokenLock.token\n if tokenLock.amount == 0\n s.tokenLocks[lockId] = TokenLock()\n end\n require(ERC20(token).transfer(msg.sender, amount), \"Transfer failed\")\n emit(:Withdraw, token: token, amount: amount, withdrawer: msg.sender, lockId: lockId)\n }\n function(:pause, :public) {\n onlyOwner!\n _pause\n }\n function(:unpause, :public) {\n onlyOwner!\n _unpause\n }\n}\n"}}
0xd66cb988…27a7·#19,561,706·0x1f6a19d3…941db7
Facet ERC20 BridgeFacet ERC20 Bridge`@Ro0123456789abcdef`o0123456789abcdef`P[{\u00000123456789abcdefbtnOnly EOAs can use this bridgeWithdraw disabledInvalid signatureAlready processedInvalid block number or hashdata:application/vnd.facet.tx+js`on;rule=esip6,{"op":"call","data` ","function":"markWithdrawalComp`","function":"bridgeIntoExisting`Bridge","args":["a$0Wa$/a#PV[[a$;","function":"bridgeIn","args":[`0xc51896bdbc6927a64971123ebee6fe389b9de71a
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xc51896bdbc6927a64971123ebee6fe389b9de71a","function":"transferOwnership","args":{"newOwner":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xc51896bdbc6927a64971123ebee6fe389b9de71a","function":"setUpgradeAdmin","args":{"newUpgradeAdmin":"0xb2B01DeCb6cd36E7396b78D3744482627F22C525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0x9022ced2f52aee8b28119f0490767a6e0b80b492642364382e609b6e84d85ce0","args":{"trustedSmartContract":"0x00000000000001a49E2dac26e7a55EFB3F8fc0B6"},"source_code":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] >= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n require(allowed >= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:Upgradeable, abstract: true) {\n address(:public, :upgradeAdmin)\n event(:ContractUpgraded, { oldHash: :bytes32, newHash: :bytes32 })\n event(:UpgradeAdminChanged, { newUpgradeAdmin: :address })\n constructor(upgradeAdmin: :address) {\n s.upgradeAdmin=upgradeAdmin\n }\n function(:setUpgradeAdmin, { newUpgradeAdmin: :address }, :public) {\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n s.upgradeAdmin=newUpgradeAdmin\n emit(:UpgradeAdminChanged, newUpgradeAdmin: newUpgradeAdmin)\n }\n function(:upgradeAndCall, { newHash: :bytes32, newSource: :string, migrationCalldata: :string }, :public) {\n upgrade(newHash: newHash, newSource: newSource)\n (success, data) = address(this).call(migrationCalldata)\n require(success, \"Migration failed\")\n }\n function(:upgrade, { newHash: :bytes32, newSource: :string }, :public) {\n currentHash = this.currentInitCodeHash\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n this.upgradeImplementation(newHash, newSource)\n emit(:ContractUpgraded, oldHash: currentHash, newHash: newHash)\n }\n}\ncontract(:ERC20Bridge, is: [:ERC20, :Upgradeable], upgradeable: true) {\n event(:BridgedIn, { to: :address, amount: :uint256 })\n event(:InitiateWithdrawal, { from: :address, amount: :uint256, withdrawalId: :bytes32 })\n event(:WithdrawalComplete, { to: :address, amount: :uint256, withdrawalId: :bytes32 })\n address(:public, :factory)\n address(:public, :tokenSmartContract)\n address(:public, :trustedSmartContract)\n mapping(({ bytes32: :uint256 }), :public, :withdrawalIdAmount)\n mapping(({ address: :bytes32 }), :public, :userWithdrawalId)\n constructor(tokenSmartContract: :address, trustedSmartContract: :address, name: :string, symbol: :string, decimals: :uint8) {\n self.ERC20.constructor(name: name, symbol: symbol, decimals: decimals)\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n s.tokenSmartContract=tokenSmartContract\n s.trustedSmartContract=trustedSmartContract\n s.factory=msg.sender\n }\n function(:onlyFactory!, :internal) {\n require(msg.sender == s.factory, \"Only the factory can call this function\")\n }\n function(:bridgeIn, { to: :address, amount: :uint256 }, :public) {\n onlyFactory!\n _mint(to: to, amount: amount)\n emit(:BridgedIn, to: to, amount: amount)\n }\n function(:bridgeOut, { from: :address, amount: :uint256 }, :public) {\n onlyFactory!\n withdrawalId = tx.current_transaction_hash\n require(s.userWithdrawalId[from] == bytes32(0), \"Withdrawal pending\")\n require(s.withdrawalIdAmount[withdrawalId] == 0, \"Already bridged out\")\n require(amount > 0, \"Invalid amount\")\n s.userWithdrawalId[from] = withdrawalId\n s.withdrawalIdAmount[withdrawalId] = amount\n _burn(from: from, amount: amount)\n emit(:InitiateWithdrawal, from: from, amount: amount, withdrawalId: withdrawalId)\n }\n function(:markWithdrawalComplete, { to: :address, withdrawalId: :bytes32 }, :public) {\n onlyFactory!\n require(s.userWithdrawalId[to] == withdrawalId, \"Withdrawal id not found\")\n amount = s.withdrawalIdAmount[withdrawalId]\n s.withdrawalIdAmount[withdrawalId] = 0\n s.userWithdrawalId[to] = bytes32(0)\n emit(:WithdrawalComplete, to: to, amount: amount, withdrawalId: withdrawalId)\n }\n}\ncontract(:Ownable, abstract: true) {\n address(:public, :owner)\n event(:OwnershipTransferred, { previousOwner: :address, newOwner: :address })\n constructor(owner: :address) {\n s.owner=owner\n }\n function(:transferOwnership, { newOwner: :address }, :public) {\n onlyOwner!\n previousOwner = s.owner\n s.owner=newOwner\n emit(:OwnershipTransferred, previousOwner: previousOwner, newOwner: newOwner)\n }\n function(:onlyOwner!, :internal) {\n require(msg.sender == s.owner, \"msg.sender is not the owner\")\n }\n}\ncontract(:Pausable, abstract: true) {\n bool(:public, :paused)\n event(:Paused, { account: :address })\n event(:Unpaused, { account: :address })\n constructor(initialPauseState: :bool) {\n s.paused=initialPauseState\n }\n function(:_pause, :internal) {\n s.paused=true\n emit(:Paused, account: msg.sender)\n }\n function(:_unpause, :internal) {\n s.paused=false\n emit(:Unpaused, account: msg.sender)\n }\n function(:whenPaused!, :internal) {\n require(s.paused, \"Contract is not paused\")\n }\n function(:whenNotPaused!, :internal) {\n require(!s.paused, \"Contract is paused\")\n }\n}\ncontract(:ERC20BridgeFactory, is: [:Ownable, :Pausable, :Upgradeable], upgradeable: true) {\n event(:FactoryBridgedIn, { to: :address, amount: :uint256, smartContract: :address, dumbContract: :address })\n event(:FactoryInitiateWithdrawal, { from: :address, amount: :uint256, withdrawalId: :bytes32, smartContract: :address, dumbContract: :address })\n event(:FactoryWithdrawalComplete, { to: :address, amount: :uint256, withdrawalId: :bytes32, smartContract: :address, dumbContract: :address })\n event(:BridgeCreated, { newBridge: :address, tokenSmartContract: :address })\n address(:public, :trustedSmartContract)\n mapping(({ address: :address }), :public, :bridgeDumbContractToTokenSmartContract)\n mapping(({ address: :address }), :public, :tokenSmartContractToBridgeDumbContract)\n constructor(trustedSmartContract: :address) {\n require(trustedSmartContract != address(0), \"Invalid smart contract\")\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n self.Ownable.constructor(owner: msg.sender)\n s.trustedSmartContract=trustedSmartContract\n }\n function(:onlyTrustedSmartContract!, :internal) {\n require(msg.sender == s.trustedSmartContract, \"Only the trusted smart contract can call this function\")\n }\n function(:bridgeIn, { tokenSmartContract: :address, decimals: :uint8, symbol: :string, name: :string, to: :address, amount: :uint256 }, :public) {\n onlyTrustedSmartContract!\n bridge = findOrCreateBridge(tokenSmartContract: tokenSmartContract, decimals: decimals, symbol: symbol, name: name)\n ERC20Bridge(bridge).bridgeIn(to: to, amount: amount)\n emit(:FactoryBridgedIn, to: to, amount: amount, dumbContract: bridge, smartContract: tokenSmartContract)\n }\n function(:bridgeIntoExistingBridge, { tokenSmartContract: :address, to: :address, amount: :uint256 }, :public) {\n onlyTrustedSmartContract!\n bridge = s.tokenSmartContractToBridgeDumbContract[tokenSmartContract]\n require(bridge != address(0), \"Bridge not found\")\n ERC20Bridge(bridge).bridgeIn(to: to, amount: amount)\n emit(:FactoryBridgedIn, to: to, amount: amount, dumbContract: bridge, smartContract: tokenSmartContract)\n }\n function(:findOrCreateBridge, { tokenSmartContract: :address, decimals: :uint8, symbol: :string, name: :string }, :internal, returns: :address) {\n existingBridge = s.tokenSmartContractToBridgeDumbContract[tokenSmartContract]\n if existingBridge != address(0)\n return existingBridge\n end\n salt = keccak256(abi.encodePacked(tokenSmartContract))\n bridge = new(ERC20Bridge(tokenSmartContract, s.trustedSmartContract, \"Facet #{name}\", \"f#{symbol.upcase}\", decimals, { salt: salt }))\n require(s.bridgeDumbContractToTokenSmartContract[bridge] == address(0), \"Bridge already exists\")\n s.tokenSmartContractToBridgeDumbContract[tokenSmartContract] = bridge\n s.bridgeDumbContractToTokenSmartContract[bridge] = tokenSmartContract\n emit(:BridgeCreated, newBridge: bridge, tokenSmartContract: tokenSmartContract)\n return bridge\n }\n function(:bridgeOut, { bridgeDumbContract: :address, amount: :uint256 }, :public) {\n whenNotPaused!\n smartContract = s.bridgeDumbContractToTokenSmartContract[bridgeDumbContract]\n require(smartContract != address(0), \"Bridge not found\")\n ERC20Bridge(bridgeDumbContract).bridgeOut(from: msg.sender, amount: amount)\n emit(:FactoryInitiateWithdrawal, from: msg.sender, amount: amount, withdrawalId: tx.current_transaction_hash, dumbContract: bridgeDumbContract, smartContract: smartContract)\n }\n function(:markWithdrawalComplete, { to: :address, withdrawalId: :bytes32, tokenSmartContract: :address }, :public) {\n onlyTrustedSmartContract!\n dumbContract = s.tokenSmartContractToBridgeDumbContract[tokenSmartContract]\n amount = ERC20Bridge(dumbContract).withdrawalIdAmount(withdrawalId)\n ERC20Bridge(dumbContract).markWithdrawalComplete(to: to, withdrawalId: withdrawalId)\n emit(:FactoryWithdrawalComplete, to: to, amount: amount, withdrawalId: withdrawalId, dumbContract: dumbContract, smartContract: tokenSmartContract)\n }\n function(:predictBridgeAddress, { tokenSmartContract: :address }, :public, :view, returns: :address) {\n existing = s.tokenSmartContractToBridgeDumbContract[tokenSmartContract]\n if existing != address(0)\n return existing\n end\n return create2_address(salt: keccak256(abi.encodePacked(tokenSmartContract)), deployer: address(this), contract_type: \"ERC20Bridge\")\n }\n function(:pause, :public) {\n onlyOwner!\n _pause\n }\n function(:unpause, :public) {\n onlyOwner!\n _unpause\n }\n}\n"}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"bridgeOut","args":{"amount":"43000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"swapExactTokensForTokens","args":{"amountIn":"3226315475800358375802","amountOutMin":"3584003236978729785","path":["0x55ab0390a89fed8992e3affbf61d102490735e24","0x1673540243e793b0e77c038d4a88448eff524dce"],"to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7","deadline":"1000000000000000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xc75e5b07c3add38373b1bbe45ee74c661b9318f5","function":"setUpgradeAdmin","args":{"newUpgradeAdmin":"0xb2b01decb6cd36e7396b78d3744482627f22c525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xc75e5b07c3add38373b1bbe45ee74c661b9318f5","function":"transferOwnership","args":{"newOwner":"0xb2b01decb6cd36e7396b78d3744482627f22c525"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0xd6c73897c5441fa221f1f0ebaee84241099b58f9cf51f6f4bcaf6bac4c29756d","args":{"protocolFeeBPS":"100","initialPauseState":false,"_factory":"0xc5c93c9553437bf94cf07ad2e8659197c094d5b4","_WETH":"0x1673540243e793b0e77c038d4a88448eff524dce"},"source_code":""}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0x77a9bb1ad908cdab503f8da9d0891575524064d6","function":"upgrade","args":{"newHash":"0x2dbec15cf7c23393357f0336e0058ca1c48e8f694324a6d95334f539598d9bf5","newSource":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] \u003e= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] \u003e= amount, \"Insufficient balance\")\n require(allowed \u003e= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] \u003e= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:ERC721, abstract: true) {\n event(:Transfer, { from: :address, to: :address, id: :uint256 })\n event(:Approval, { owner: :address, spender: :address, id: :uint256 })\n event(:ApprovalForAll, { owner: :address, operator: :address, approved: :bool })\n string(:public, :name)\n string(:public, :symbol)\n mapping(({ uint256: :address }), :internal, :_ownerOf)\n mapping(({ address: :uint256 }), :internal, :_balanceOf)\n mapping(({ uint256: :address }), :public, :getApproved)\n mapping(({ address: mapping(address: :bool) }), :public, :isApprovedForAll)\n constructor(name: :string, symbol: :string) {\n s.name=name\n s.symbol=symbol\n }\n function(:ownerOf, { id: :uint256 }, :public, :view, :virtual, returns: :address) {\n owner = s._ownerOf[id]\n require(owner != address(0), \"ERC721: owner query for nonexistent token\")\n return owner\n }\n function(:balanceOf, { owner: :address }, :public, :view, :virtual, returns: :uint256) {\n require(owner != address(0), \"ERC721: balance query for nonexistent owner\")\n return s._balanceOf[owner]\n }\n function(:approve, { spender: :address, id: :uint256 }, :public, :virtual) {\n owner = ownerOf(id)\n require(msg.sender == owner || s.isApprovedForAll[owner][msg.sender], \"ERC721: msg.sender not authorized to approve\")\n s.getApproved[id] = spender\n emit(:Approval, owner: owner, spender: spender, id: id)\n }\n function(:setApprovalForAll, { operator: :address, approved: :bool }, :public, :virtual) {\n s.isApprovedForAll[msg.sender][operator] = approved\n emit(:ApprovalForAll, owner: msg.sender, operator: operator, approved: approved)\n }\n function(:transferFrom, { from: :address, to: :address, id: :uint256 }, :public, :virtual) {\n require(from == ownerOf(id), \"ERC721: transfer of token that is not own\")\n require(to != address(0), \"ERC721: transfer to the zero address\")\n require(isApprovedOrOwner(spender: msg.sender, id: id), \"ERC721: msg.sender not authorized to call transferFrom\")\n s._balanceOf[from] -= 1\n s._balanceOf[to] += 1\n s._ownerOf[id] = to\n s.getApproved[id] = address(0)\n emit(:Transfer, from: from, to: to, id: id)\n }\n function(:isApprovedOrOwner, { spender: :address, id: :uint256 }, :public, :view, :virtual, returns: :bool) {\n owner = ownerOf(id)\n spender == owner || s.getApproved[id] == spender || s.isApprovedForAll[owner][spender]\n }\n function(:_exists, { id: :uint256 }, :internal, :view, :virtual, returns: :bool) {\n return s._ownerOf[id] != address(0)\n }\n function(:_mint, { to: :address, id: :uint256 }, :internal, :virtual) {\n require(to != address(0), \"ERC721: mint to the zero address\")\n require(s._ownerOf[id] == address(0), \"ERC721: token already minted\")\n s._balanceOf[to] += 1\n s._ownerOf[id] = to\n emit(:Transfer, from: address(0), to: to, id: id)\n }\n function(:_burn, { id: :uint256 }, :internal, :virtual) {\n owner = s._ownerOf[id]\n require(owner != address(0), \"ERC721: burn of nonexistent token\")\n s._balanceOf[owner] -= 1\n s._ownerOf[id] = address(0)\n s.getApproved[id] = address(0)\n emit(:Transfer, from: owner, to: address(0), id: id)\n }\n function(:tokenURI, { id: :uint256 }, :public, :view, :virtual, returns: :string) {\n }\n}\ncontract(:INFTCollection01, abstract: true) {\n function(:owner, :external, :view, returns: :address)\n}\ncontract(:Upgradeable, abstract: true) {\n address(:public, :upgradeAdmin)\n event(:ContractUpgraded, { oldHash: :bytes32, newHash: :bytes32 })\n event(:UpgradeAdminChanged, { newUpgradeAdmin: :address })\n constructor(upgradeAdmin: :address) {\n s.upgradeAdmin=upgradeAdmin\n }\n function(:setUpgradeAdmin, { newUpgradeAdmin: :address }, :public) {\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n s.upgradeAdmin=newUpgradeAdmin\n emit(:UpgradeAdminChanged, newUpgradeAdmin: newUpgradeAdmin)\n }\n function(:upgradeAndCall, { newHash: :bytes32, newSource: :string, migrationCalldata: :string }, :public) {\n upgrade(newHash: newHash, newSource: newSource)\n (success, data) = address(this).call(migrationCalldata)\n require(success, \"Migration failed\")\n }\n function(:upgrade, { newHash: :bytes32, newSource: :string }, :public) {\n currentHash = this.currentInitCodeHash\n require(msg.sender == s.upgradeAdmin, \"NOT_AUTHORIZED\")\n this.upgradeImplementation(newHash, newSource)\n emit(:ContractUpgraded, oldHash: currentHash, newHash: newHash)\n }\n}\ncontract(:TokenUpgradeRenderer01, is: :Upgradeable, upgradeable: true) {\n event(:CollectionInitialized, { collection: :address, contractInfo: :ContractInfo, initialLevel: :TokenUpgradeLevel })\n event(:UpgradeLevelUpdated, { collection: :address, index: :uint256, name: :string, imageURI: :string, animationURI: :string, startTime: :uint256, endTime: :uint256, newRecord: :bool })\n event(:TokenUpgraded, { collection: :address, tokenId: :uint256, upgradeLevel: :uint256 })\n event(:ContractInfoUpdated, { collection: :address, newInfo: :ContractInfo })\n struct(:TokenUpgradeLevel) {\n string(:name)\n string(:imageURI)\n string(:animationURI)\n string(:extraAttributesJson)\n uint256(:startTime)\n uint256(:endTime)\n }\n struct(:TokenStatus) {\n uint256(:upgradeLevel)\n uint256(:lastUpgradeTime)\n }\n struct(:ContractInfo) {\n string(:name)\n string(:description)\n string(:imageURI)\n }\n mapping(({ address: array(:TokenUpgradeLevel, 1) }), :public, :tokenUpgradeLevelsByCollection)\n mapping(({ address: mapping(uint256: :TokenStatus) }), :public, :tokenStatusByCollection)\n mapping(({ address: :ContractInfo }), :public, :contractInfoByCollection)\n uint256(:public, :perUpgradeFee)\n address(:public, :feeTo)\n address(:public, :WETH)\n uint256(:public, :maxUpgradeLevelCount)\n constructor(perUpgradeFee: :uint256, feeTo: :address, weth: :address) {\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n s.maxUpgradeLevelCount=30\n s.perUpgradeFee=perUpgradeFee\n s.feeTo=feeTo\n s.WETH=weth\n }\n function(:addUpgradeLevel, { collection: :address, newLevel: :TokenUpgradeLevel }, :public) {\n requireSenderAdmin(collection)\n lastLevel = s.tokenUpgradeLevelsByCollection[collection].last\n require(newLevel.endTime \u003e newLevel.startTime, \"End time must be after start time\")\n require(newLevel.startTime \u003e lastLevel.endTime, \"Start time must be after last level end time\")\n require(s.tokenUpgradeLevelsByCollection[collection].length + 1 \u003c= s.maxUpgradeLevelCount, \"Max upgrade level count reached\")\n s.tokenUpgradeLevelsByCollection[collection].push(newLevel)\n emit(:UpgradeLevelUpdated, collection: collection, index: s.tokenUpgradeLevelsByCollection[collection].length - 1, name: newLevel.name, imageURI: newLevel.imageURI, animationURI: newLevel.animationURI, startTime: newLevel.startTime, endTime: newLevel.endTime, newRecord: true)\n }\n function(:editUpgradeLevel, { collection: :address, index: :uint256, newLevel: :TokenUpgradeLevel }, :public) {\n requireSenderAdmin(collection)\n editingFirstLevel = index == 0\n editingLastLevel = index == s.tokenUpgradeLevelsByCollection[collection].length.-(1)\n unless editingLastLevel\n nextLevel = s.tokenUpgradeLevelsByCollection[collection][index + 1]\n require(newLevel.endTime \u003c nextLevel.startTime, \"End time must be before next level start time\")\n end\n if editingFirstLevel\n newLevel.startTime=0\n newLevel.endTime=0\n else\n precedingLevel = s.tokenUpgradeLevelsByCollection[collection][index - 1]\n require(newLevel.startTime \u003e precedingLevel.endTime, \"Start time must be after preceding level end time\")\n require(newLevel.endTime \u003e newLevel.startTime, \"End time must be after start time\")\n end\n s.tokenUpgradeLevelsByCollection[collection][index] = newLevel\n emit(:UpgradeLevelUpdated, collection: collection, index: index, name: newLevel.name, imageURI: newLevel.imageURI, animationURI: newLevel.animationURI, startTime: newLevel.startTime, endTime: newLevel.endTime, newRecord: false)\n }\n function(:activeUpgradeLevelIndex, { collection: :address }, :public, :view, returns: :uint256) {\n forLoop(condition: -\u003e(i) {\n i \u003c s.tokenUpgradeLevelsByCollection[collection].length\n }) { |i|\n level = s.tokenUpgradeLevelsByCollection[collection][i]\n if level.startTime \u003c= block.timestamp \u0026\u0026 level.endTime \u003e block.timestamp\n return i\n else\n if level.startTime \u003e block.timestamp\n return 0\n end\n end\n }\n return 0\n }\n function(:activeUpgradeLevel, { collection: :address }, :public, :view, returns: :TokenUpgradeLevel) {\n index = activeUpgradeLevelIndex(collection)\n return index == 0 ? TokenUpgradeLevel() : s.tokenUpgradeLevelsByCollection[collection][index]\n }\n function(:_upgradeToken, { collection: :address, tokenId: :uint256, activeUpgrade: :TokenUpgradeLevel }, :internal) {\n require(ERC721(collection).isApprovedOrOwner(spender: msg.sender, id: tokenId), \"TokenUpgradeRenderer: msg.sender not authorized to upgrade id #{tokenId.toString}\")\n tokenStatus = s.tokenStatusByCollection[collection][tokenId]\n require(tokenStatus.lastUpgradeTime \u003c activeUpgrade.startTime, \"TokenUpgradeRenderer: Token already upgraded during this period\")\n targetLevelIndex = tokenStatus.upgradeLevel + 1\n require(targetLevelIndex \u003c s.tokenUpgradeLevelsByCollection[collection].length, \"TokenUpgradeRenderer: No more upgrade levels\")\n tokenStatus.upgradeLevel=targetLevelIndex\n tokenStatus.lastUpgradeTime=block.timestamp\n emit(:TokenUpgraded, collection: collection, tokenId: tokenId, upgradeLevel: tokenStatus.upgradeLevel)\n }\n function(:upgradeMultipleTokens, { collection: :address, tokenIds: [:uint256] }, :public) {\n require(tokenIds.length \u003c= 100, \"TokenUpgradeRenderer: Cannot upgrade more than 50 tokens at once\")\n totalFee = s.perUpgradeFee * tokenIds.length\n if totalFee \u003e 0 \u0026\u0026 s.feeTo != address(0)\n ERC20(s.WETH).transferFrom(msg.sender, s.feeTo, totalFee)\n end\n activeUpgradeIndex = activeUpgradeLevelIndex(collection)\n require(activeUpgradeIndex \u003e 0, \"TokenUpgradeRenderer: No active upgrade level\")\n activeUpgrade = s.tokenUpgradeLevelsByCollection[collection][activeUpgradeIndex]\n forLoop(condition: -\u003e(i) {\n i \u003c tokenIds.length\n }) { |i|\n _upgradeToken(collection: collection, tokenId: tokenIds[i], activeUpgrade: activeUpgrade)\n }\n }\n function(:setContractInfo, { collection: :address, info: :ContractInfo }, :public) {\n requireSenderAdmin(collection)\n s.contractInfoByCollection[collection] = info\n emit(:ContractInfoUpdated, collection: collection, newInfo: info)\n }\n function(:lastUpgradeLevel, { collection: :address, tokenId: :uint256 }, :public, :view, returns: :TokenUpgradeLevel) {\n status = s.tokenStatusByCollection[collection][tokenId]\n upgradeTime = status.lastUpgradeTime\n if upgradeTime == 0\n return TokenUpgradeLevel()\n end\n forLoop(condition: -\u003e(i) {\n i \u003c s.tokenUpgradeLevelsByCollection[collection].length\n }) { |i|\n level = s.tokenUpgradeLevelsByCollection[collection][i]\n if level.startTime \u003c= upgradeTime \u0026\u0026 level.endTime \u003e upgradeTime\n return level\n end\n }\n return TokenUpgradeLevel()\n }\n function(:tokenURI, { tokenId: :uint256 }, :external, :view, returns: :string) {\n collection = msg.sender\n status = s.tokenStatusByCollection[collection][tokenId]\n upgradeLevel = s.tokenUpgradeLevelsByCollection[collection][status.upgradeLevel]\n name_json = json.stringify(\"#{upgradeLevel.name} ##{tokenId.toString}\")\n description_json = json.stringify(s.contractInfoByCollection[collection].description)\n image_field = if upgradeLevel.imageURI.length == 0\n \"\"\n else\n \"\\\"image\\\": #{json.stringify(upgradeLevel.imageURI)},\\n\"\n end\n animation_url_field = if upgradeLevel.animationURI.length == 0\n \"\"\n else\n \"\\\"animation_url\\\": #{json.stringify(upgradeLevel.animationURI)},\\n\"\n end\n last_level = lastUpgradeLevel(collection: collection, tokenId: tokenId)\n last_upgrade_level_json = if last_level != TokenUpgradeLevel()\n \", {\\\"trait_type\\\": \\\"Last Upgrade Level\\\", \\\"value\\\": #{json.stringify(last_level.name)}}\\n\"\n else\n \"\"\n end\n extra_attributes_json = if upgradeLevel.extraAttributesJson != \"\"\n \", \" + upgradeLevel.extraAttributesJson\n else\n \"\"\n end\n json_data = \u003c\u003c-HEREDOC\n {\n \"name\": #{name_json},\n \"description\": #{description_json},\n #{image_field}\n #{animation_url_field}\n \"attributes\": [\n {\"trait_type\": \"Number\", \"display_type\": \"number\", \"value\": #{tokenId.toString}},\n {\"trait_type\": \"Level\", \"value\": #{json.stringify(upgradeLevel.name)}}\n #{last_upgrade_level_json}\n #{extra_attributes_json}\n ]\n }\n HEREDOC\n \"data:application/json;base64,\" + json_data.base64Encode\n }\n function(:initializeWithData, { contractInfo: :ContractInfo, initialLevel: :TokenUpgradeLevel }, :external) {\n setContractInfo(collection: msg.sender, info: contractInfo)\n editUpgradeLevel(collection: msg.sender, index: 0, newLevel: initialLevel)\n emit(:CollectionInitialized, collection: msg.sender, contractInfo: contractInfo, initialLevel: initialLevel)\n }\n function(:contractURI, :external, :view, returns: :string) {\n collection = msg.sender\n contractInfo = s.contractInfoByCollection[collection]\n json_data = json.stringify(name: contractInfo.name, description: contractInfo.description, image: contractInfo.imageURI)\n \"data:application/json;base64,\" + json_data.base64Encode\n }\n function(:upgradeLevelCount, { collection: :address }, :public, :view, returns: :uint256) {\n return s.tokenUpgradeLevelsByCollection[collection].length\n }\n function(:requireSenderAdmin, { target: :address }, :internal, :view) {\n require(target == msg.sender || INFTCollection01(target).owner == msg.sender, \"Admin access only\")\n }\n function(:setFeeTo, { feeTo: :address }, :public) {\n require(msg.sender == s.feeTo, \"Only feeTo can change feeTo\")\n s.feeTo=feeTo\n nil\n }\n}\n"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0x52c3226b3e5045a92e0a3975978997b7e5af223021470a1deb14211511dd04c9","args":{},"source_code":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] >= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n require(allowed >= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:ERC20BatchTransfer) {\n event(:BatchTransfer, { tokenAddress: :address, recipients: [:address], amounts: [:uint256] })\n event(:WithdrawStuckTokens, { tokenAddress: :address, to: :address, amount: :uint256 })\n uint256(:public, :singleTxAirdropLimit)\n constructor {\n s.singleTxAirdropLimit=50\n }\n function(:batchTransfer, { tokenAddress: :address, recipients: [:address], amounts: [:uint256] }, :public) {\n require(recipients.length > 0, \"Must import at least one address\")\n require(recipients.length == amounts.length, \"Address and amount arrays must be the same length\")\n require(recipients.length <= s.singleTxAirdropLimit, \"Cannot import more than #{s.singleTxAirdropLimit.toString} addresses at a time\")\n forLoop(condition: ->(i) {\n i < recipients.length\n }, max_iterations: s.singleTxAirdropLimit) { |i|\n to = recipients[i]\n amount = amounts[i]\n ERC20(tokenAddress).transferFrom(from: msg.sender, to: to, amount: amount)\n }\n emit(:BatchTransfer, tokenAddress: tokenAddress, recipients: recipients, amounts: amounts)\n }\n function(:withdrawStuckTokens, { tokenAddress: :address, to: :address, amount: :uint256 }, :public) {\n ERC20(tokenAddress).transfer(to: to, amount: amount)\n emit(:WithdrawStuckTokens, tokenAddress: tokenAddress, to: to, amount: amount)\n }\n}\n"}}
data:application/vnd.facet.system+json;rule=esip6,{"op":"updateSupportedContracts","data":["0x52c3226b3e5045a92e0a3975978997b7e5af223021470a1deb14211511dd04c9","0xdf13c05ccd7d54d7b9a8f3e2be83630c4d38d8bed6ce7e8f6a1a15466f3e9d58","0xa26bdad3c05ec5c4a0e234b5f755ca9cf7311dd857250a183b74a779e3c96ef8","0xb71fdafae3610cb8e74900b8e6d43163aaab54cc6e6c54ff5b7c7570a2dabe5c","0x2dbec15cf7c23393357f0336e0058ca1c48e8f694324a6d95334f539598d9bf5","0xd7ecfb5c3eb58b7875a7c70799632006a0c00e4e002aea6b1e03809442f763f8","0xb5b742d755877bac6b80e2f0af4d97792fce2b2a58ff0ee2274b86eac91e977f","0xee18008875b9e2ecadebb7566928a6a853a23f15c2393221f6a9db8d81fd5670","0x6c5eee22f9574d847b4d90833da27228c6567cee2e004d4ccbb6a34011ab66e4","0xb1b0ed1e4a8c9c9b0210f267137e368f782453e41f622fa8cf68296d04c84c88","0xe46dfedf0c0e9a0985d5151f5844bea96e5ac147cd9ddc7daa22a0899659d2f5","0x958b66f80d8d14e5c2129434bb8c78aabb60b5cfb7113224102e1a9a07c77ac5","0x2dce6b589dd5a5bedc5d9a91806a6cc5f16ae52c0f8dae730a886d7212db2dfd","0xd6c73897c5441fa221f1f0ebaee84241099b58f9cf51f6f4bcaf6bac4c29756d","0x45b224f1320c602a827823099dc4e7f596baf4227f919102a7f80523834edb02"]}
1-50 of 109