0xb2b0…c525

All memos sent from and to 0xb2b0…c525.

FacetSwapV1Router: EXCESSIVE_INP`DUniswapV2Router: EXCESSIVE_INPUT`DFee cannot be greater than 100%a$7V[Qa iV[`@QbFFacetSwapV1Router: INSUFFICIENT_`DFacetSwapV1Library: INVALID_PATH`DMax path length exceededRouter WETH balance decreasedMust have WETH as either first o`DRpCannot self trade`xFacetSwapV1Router: EXPIREDFacetSwapV1Router: INSUFFICIENT_`DFacetSwapV1Router: INSUFFICIENT_`DFacetSwapV1Library: ZERO_ADDRESS`DFacetSwapV1Library: IDENTICAL_AD`DTransferHelper::transferFrom: tr`DFacetSwapV1Library: INSUFFICIENT
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":"upgrade","args":{"newHash":"0xa46f3d0539f8556dc2f86b63e68249db6c1db193da387d780aaded983f4c7ae4","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(:FacetBuddy) {\n event(:CallOnBehalfOfUser, { onBehalfOf: :address, addressToCall: :address, calldata: :string, initialAmount: :uint256, finalAmount: :uint256, resultSuccess: :bool, resultData: :string })\n address(:public, :factory)\n address(:public, :erc20Bridge)\n address(:public, :forUser)\n bool(:locked)\n constructor(erc20Bridge: :address, forUser: :address) {\n s.factory=msg.sender\n s.erc20Bridge=erc20Bridge\n s.forUser=forUser\n }\n function(:_makeCall, { addressToCall: :address, calldata: :string, revertOnFailure: :bool }, :internal) {\n require(addressToCall != address(this), \"Cannot call self\")\n require(!s.locked, \"No reentrancy allowed\")\n s.locked=true\n initialBalance = _balance\n _approve(addressToCall, initialBalance)\n (success, data) = addressToCall.call(calldata)\n require(success || !revertOnFailure, \"Call failed: (#{calldata})\")\n _approve(addressToCall, 0)\n finalBalance = _balance\n if finalBalance \u003e 0\n _transfer(s.forUser, finalBalance)\n end\n s.locked=false\n emit(:CallOnBehalfOfUser, onBehalfOf: s.forUser, addressToCall: addressToCall, calldata: calldata, initialAmount: initialBalance, finalAmount: finalBalance, resultSuccess: success, resultData: data)\n }\n function(:callForUser, { amountToSpend: :uint256, addressToCall: :address, calldata: :string }, :public) {\n require(msg.sender == s.forUser || msg.sender == s.factory, \"Only the user or factory can callForUser\")\n ERC20(s.erc20Bridge).transferFrom(s.forUser, address(this), amountToSpend)\n _makeCall(addressToCall, calldata, true)\n }\n function(:callFromBridge, { addressToCall: :address, calldata: :string }, :public) {\n require(msg.sender == s.erc20Bridge, \"Only the bridge can callFromBridge\")\n _makeCall(addressToCall, calldata, false)\n }\n function(:_balance, :internal, :view, returns: :uint256) {\n ERC20(s.erc20Bridge).balanceOf(address(this))\n }\n function(:_approve, { spender: :address, amount: :uint256 }, :internal, returns: :bool) {\n ERC20(s.erc20Bridge).approve(spender, amount)\n }\n function(:_transfer, { to: :address, amount: :uint256 }, :internal, returns: :bool) {\n ERC20(s.erc20Bridge).transfer(to, 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(:FacetBuddyFactory, is: [:Upgradeable], upgradeable: true) {\n event(:BuddyCreated, { forUser: :address, buddy: :address })\n address(:public, :erc20Bridge)\n mapping(({ address: :address }), :public, :buddyForUser)\n mapping(({ address: :address }), :public, :userForBuddy)\n constructor(erc20Bridge: :address) {\n require(erc20Bridge != address(0), \"Invalid smart contract\")\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n s.erc20Bridge=erc20Bridge\n }\n function(:findOrCreateBuddy, { forUser: :address }, :public, returns: :address) {\n existingBuddy = s.buddyForUser[forUser]\n if existingBuddy != address(0)\n return existingBuddy\n end\n salt = keccak256(abi.encodePacked(forUser))\n buddy = new(FacetBuddy(s.erc20Bridge, forUser, { salt: salt }))\n require(s.userForBuddy[buddy] == address(0), \"Buddy already exists for user\")\n s.buddyForUser[forUser] = buddy\n s.userForBuddy[buddy] = forUser\n emit(:BuddyCreated, forUser: forUser, buddy: buddy)\n return buddy\n }\n function(:callBuddyForUser, { amountToSpend: :uint256, addressToCall: :address, calldata: :string }, :public) {\n buddy = findOrCreateBuddy(msg.sender)\n FacetBuddy(buddy).callForUser(amountToSpend: amountToSpend, addressToCall: addressToCall, calldata: calldata)\n }\n function(:predictBuddyAddress, { forUser: :address }, :public, :view, returns: :address) {\n return create2_address(salt: keccak256(abi.encodePacked(forUser)), deployer: address(this), contract_type: \"FacetBuddy\")\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(:EtherBridge04, is: [:ERC20, :Upgradeable, :Ownable, :Pausable], 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, :trustedSmartContract)\n address(:public, :facetBuddyFactory)\n mapping(({ bytes32: :uint256 }), :public, :withdrawalIdAmount)\n mapping(({ address: :bytes32 }), :public, :userWithdrawalId)\n constructor(name: :string, symbol: :string, trustedSmartContract: :address) {\n require(trustedSmartContract != address(0), \"Invalid smart contract\")\n self.ERC20.constructor(name: name, symbol: symbol, decimals: 18)\n self.Upgradeable.constructor(upgradeAdmin: msg.sender)\n self.Ownable.constructor(owner: msg.sender)\n s.trustedSmartContract=trustedSmartContract\n }\n function(:setFacetBuddyFactory, { facetBuddyFactory: :address }, :public) {\n onlyOwner!\n s.facetBuddyFactory=facetBuddyFactory\n nil\n }\n function(:bridgeIn, { to: :address, amount: :uint256 }, :public) {\n require(msg.sender == s.trustedSmartContract, \"Only the trusted smart contract can bridge in tokens\")\n _mint(to: to, amount: amount)\n emit(:BridgedIn, to: to, amount: amount)\n }\n function(:bridgeAndCall, { to: :address, amount: :uint256, addressToCall: :address, base64Calldata: :string }, :public) {\n if s.facetBuddyFactory == address(0)\n return bridgeIn(to: to, amount: amount)\n end\n buddy = FacetBuddyFactory(s.facetBuddyFactory).findOrCreateBuddy(to)\n bridgeIn(to: buddy, amount: amount)\n FacetBuddy(buddy).callFromBridge(addressToCall: addressToCall, calldata: base64Calldata.base64Decode)\n }\n function(:predictBuddyAddress, { forUser: :address }, :public, :view, returns: :address) {\n return FacetBuddyFactory(s.facetBuddyFactory).predictBuddyAddress(forUser)\n }\n function(:bridgeOut, { amount: :uint256 }, :public) {\n whenNotPaused!\n withdrawalId = tx.current_transaction_hash\n require(s.userWithdrawalId[msg.sender] == bytes32(0), \"Withdrawal pending\")\n require(s.withdrawalIdAmount[withdrawalId] == 0, \"Already bridged out\")\n require(amount \u003e 0, \"Invalid amount\")\n s.userWithdrawalId[msg.sender] = withdrawalId\n s.withdrawalIdAmount[withdrawalId] = amount\n _burn(from: msg.sender, amount: amount)\n emit(:InitiateWithdrawal, from: msg.sender, amount: amount, withdrawalId: withdrawalId)\n }\n function(:markWithdrawalComplete, { to: :address, withdrawalId: :bytes32 }, :public) {\n require(msg.sender == s.trustedSmartContract, \"Only the trusted smart contract can mark withdrawals as complete\")\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 function(:pause, :public) {\n onlyOwner!\n _pause\n }\n function(:unpause, :public) {\n onlyOwner!\n _unpause\n }\n}\n"}}}
data:application/vnd.facet.system+json;rule=esip6,{"op":"updateSupportedContracts","data":["0x048cc2bb0751a06b409ab438941182f7c4e753eb2b3c5a40b338d7c44d7b43d1","0x4bddad53945dd1d0b155207b1e6a9d641a7658788ac6b35e02bbfae63ccdd6f0","0xa2a9d5bf9901d7a15ae08ceb568dac12d14dab2d5994ec8037feae7aeeb4e2c7","0xcae364f38cd61ae19f32d460fc14eb8e62ebd0a5cc26b1a95dfac3d5d834c1aa","0x9022ced2f52aee8b28119f0490767a6e0b80b492642364382e609b6e84d85ce0","0x52c3226b3e5045a92e0a3975978997b7e5af223021470a1deb14211511dd04c9","0xa46f3d0539f8556dc2f86b63e68249db6c1db193da387d780aaded983f4c7ae4","0xa26bdad3c05ec5c4a0e234b5f755ca9cf7311dd857250a183b74a779e3c96ef8","0xb71fdafae3610cb8e74900b8e6d43163aaab54cc6e6c54ff5b7c7570a2dabe5c","0xd7ecfb5c3eb58b7875a7c70799632006a0c00e4e002aea6b1e03809442f763f8","0xb5b742d755877bac6b80e2f0af4d97792fce2b2a58ff0ee2274b86eac91e977f","0xee18008875b9e2ecadebb7566928a6a853a23f15c2393221f6a9db8d81fd5670","0x6c5eee22f9574d847b4d90833da27228c6567cee2e004d4ccbb6a34011ab66e4","0xb1b0ed1e4a8c9c9b0210f267137e368f782453e41f622fa8cf68296d04c84c88","0xe46dfedf0c0e9a0985d5151f5844bea96e5ac147cd9ddc7daa22a0899659d2f5","0x958b66f80d8d14e5c2129434bb8c78aabb60b5cfb7113224102e1a9a07c77ac5","0x2dce6b589dd5a5bedc5d9a91806a6cc5f16ae52c0f8dae730a886d7212db2dfd","0xd6c73897c5441fa221f1f0ebaee84241099b58f9cf51f6f4bcaf6bac4c29756d","0x45b224f1320c602a827823099dc4e7f596baf4227f919102a7f80523834edb02"]}
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.tx+json;rule=esip6,{"op":"call","data":{"to":"0x77a9bb1ad908cdab503f8da9d0891575524064d6","function":"upgrade","args":{"newHash":"0x048cc2bb0751a06b409ab438941182f7c4e753eb2b3c5a40b338d7c44d7b43d1","newSource":""}}}
G_data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"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] \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(:TokenUpgradeRenderer02, 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 mapping(({ address: mapping(uint256: array(:string)) }), :public, :tokenUpgradeLevelImageURIsByCollection)\n mapping(({ address: mapping(uint256: :bytes32) }), :public, :blockHashByTokenLevelByCollection)\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, imageURIs: [:string] }, :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 require(imageURIs.length \u003c= 25, \"Max 25 image URIs allowed\")\n s.tokenUpgradeLevelsByCollection[collection].push(newLevel)\n index = s.tokenUpgradeLevelsByCollection[collection].length - 1\n s.tokenUpgradeLevelImageURIsByCollection[collection][index] = imageURIs\n s.blockHashByTokenLevelByCollection[collection][index] = blockhash(block.number)\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, imageURIs: [:string] }, :public) {\n requireSenderAdmin(collection)\n require(imageURIs.length \u003c= 25, \"Max 25 image URIs allowed\")\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 s.tokenUpgradeLevelImageURIsByCollection[collection][index] = imageURIs\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 uriAryLength = s.tokenUpgradeLevelImageURIsByCollection[collection][status.upgradeLevel].length\n imageURI = if uriAryLength \u003e 0\n blockhash = s.blockHashByTokenLevelByCollection[collection][status.upgradeLevel]\n entropy = uint256(keccak256(abi.encodePacked(collection, blockhash, tokenId)))\n s.tokenUpgradeLevelImageURIsByCollection[collection][status.upgradeLevel][entropy % uriAryLength]\n else\n upgradeLevel.imageURI\n end\n image_field = if imageURI.length == 0\n \"\"\n else\n \"\\\"image\\\": #{json.stringify(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","init_code_hash":"0x048cc2bb0751a06b409ab438941182f7c4e753eb2b3c5a40b338d7c44d7b43d1","args":{"perUpgradeFee":0,"feeTo":"0x0000000000000000000000000000000000000000","weth":"0x0000000000000000000000000000000000000000"}}}
data:application/vnd.facet.system+json;rule=esip6,{"op":"updateSupportedContracts","data":["0x048cc2bb0751a06b409ab438941182f7c4e753eb2b3c5a40b338d7c44d7b43d1","0x4bddad53945dd1d0b155207b1e6a9d641a7658788ac6b35e02bbfae63ccdd6f0","0xa2a9d5bf9901d7a15ae08ceb568dac12d14dab2d5994ec8037feae7aeeb4e2c7","0xcae364f38cd61ae19f32d460fc14eb8e62ebd0a5cc26b1a95dfac3d5d834c1aa","0x9022ced2f52aee8b28119f0490767a6e0b80b492642364382e609b6e84d85ce0","0x52c3226b3e5045a92e0a3975978997b7e5af223021470a1deb14211511dd04c9","0xdf13c05ccd7d54d7b9a8f3e2be83630c4d38d8bed6ce7e8f6a1a15466f3e9d58","0xa26bdad3c05ec5c4a0e234b5f755ca9cf7311dd857250a183b74a779e3c96ef8","0xb71fdafae3610cb8e74900b8e6d43163aaab54cc6e6c54ff5b7c7570a2dabe5c","0xd7ecfb5c3eb58b7875a7c70799632006a0c00e4e002aea6b1e03809442f763f8","0xb5b742d755877bac6b80e2f0af4d97792fce2b2a58ff0ee2274b86eac91e977f","0xee18008875b9e2ecadebb7566928a6a853a23f15c2393221f6a9db8d81fd5670","0x6c5eee22f9574d847b4d90833da27228c6567cee2e004d4ccbb6a34011ab66e4","0xb1b0ed1e4a8c9c9b0210f267137e368f782453e41f622fa8cf68296d04c84c88","0xe46dfedf0c0e9a0985d5151f5844bea96e5ac147cd9ddc7daa22a0899659d2f5","0x958b66f80d8d14e5c2129434bb8c78aabb60b5cfb7113224102e1a9a07c77ac5","0x2dce6b589dd5a5bedc5d9a91806a6cc5f16ae52c0f8dae730a886d7212db2dfd","0xd6c73897c5441fa221f1f0ebaee84241099b58f9cf51f6f4bcaf6bac4c29756d","0x45b224f1320c602a827823099dc4e7f596baf4227f919102a7f80523834edb02"]}
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":"0x1673540243e793b0e77c038d4a88448eff524dce","function":"transfer","args":{"to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7","amount":"7270063449750000000"}}}
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xf29e6e319ac4ce8c100cfc02b1702eb3d275029e","function":"removeLiquidity","args":{"liquidity":"54251068813973677252","to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7","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":"2053916649100949739346","to":"0xD66Cb98865181a890ffee5654fAe1D6b4D1827a7","deadline":"1000000000000000000","amountAMin":"0","amountBMin":"0","tokenA":"0x1673540243e793b0e77c038d4a88448eff524dce","tokenB":"0x5d0dc4380fc8d501795aec7e7a908cb25c4131c6"}}}
1-50 of 153