diff --git a/.env.example b/.env.example index 98c1028..c21f8d1 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,2 @@ -export API_KEY_ALCHEMY="YOUR_API_KEY_ALCHEMY" -export API_KEY_ARBISCAN="YOUR_API_KEY_ARBISCAN" -export API_KEY_BSCSCAN="YOUR_API_KEY_BSCSCAN" -export API_KEY_ETHERSCAN="YOUR_API_KEY_ETHERSCAN" -export API_KEY_GNOSISSCAN="YOUR_API_KEY_GNOSISSCAN" -export API_KEY_INFURA="YOUR_API_KEY_INFURA" -export API_KEY_OPTIMISTIC_ETHERSCAN="YOUR_API_KEY_OPTIMISTIC_ETHERSCAN" -export API_KEY_POLYGONSCAN="YOUR_API_KEY_POLYGONSCAN" -export API_KEY_SNOWTRACE="YOUR_API_KEY_SNOWTRACE" -export MNEMONIC="YOUR_MNEMONIC" -export FOUNDRY_PROFILE="default" +export TESTNET=true +export HEX_PRIV_KEY="HEX_PRIV_KEY" \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6cabe8c..914ce8e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,6 @@ name: "CI" env: - API_KEY_ALCHEMY: ${{ secrets.API_KEY_ALCHEMY }} FOUNDRY_PROFILE: "ci" on: diff --git a/.gitignore b/.gitignore index d2579c2..67c86ad 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ cache coverage node_modules out +broadcast/**/dry-run/ # files *.env @@ -11,9 +12,4 @@ out .pnp.* lcov.info package-lock.json -pnpm-lock.yaml - -# broadcasts -!broadcast -broadcast/* -broadcast/*/31337/ +pnpm-lock.yaml \ No newline at end of file diff --git a/.solhint.json b/.solhint.json index d494f66..1b3b110 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,7 +1,7 @@ { "extends": "solhint:recommended", "rules": { - "code-complexity": ["error", 10], + "code-complexity": ["error", 12], "compiler-version": ["error", ">=0.8.25"], "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], diff --git a/README.md b/README.md index a0cfa8b..07a66e0 100644 --- a/README.md +++ b/README.md @@ -5,29 +5,29 @@ applications. The main contracts of Tapio V1.5 are the following: -**TapEth** : contract of rebase token tapETH +**LPToken** : contract of rebase token lpToken -**WtapETH**: contract of wrapped tapETH +**WlpToken**: contract of wrapped lpToken -**StableAsset**: contract of stableswap pool +**SelfPeggingAsset**: contract of stableswap pool -**StableAssetApplication**: user contract interface for different stableSwap pools +**SelfPeggingAssetApplication**: user contract interface for different stableSwap pools # Smart Contracts OVERVIEW The main contracts of Tapio V1.5 are the following: -**TapEth** : contract of rebase token tapETH +**LPToken** : contract of rebase token lpToken -**WtapETH**: contract of wrapped tapETH +**WlpToken**: contract of wrapped lpToken -**StableAsset**: contract of stableswap pool +**SelfPeggingAsset**: contract of stableswap pool -**StableAssetApplication**: user contract interface for different stableSwap pools +**SelfPeggingAssetApplication**: user contract interface for different stableSwap pools -## Contract TapETH +## Contract LPToken -The contract **TapETH** is upgradable and uses the interface IERC20. +The contract **LPToken** is upgradable and uses the interface IERC20. ### Write Methodes @@ -49,99 +49,65 @@ The contract **TapETH** is upgradable and uses the interface IERC20. - **transferShares(address \_recipient, uint256 \_sharesAmount)** - This function allows the caller to transfer `_sharesAmount` shares of tapETH from his address to `_recipient`. + This function allows the caller to transfer `_sharesAmount` shares of lpToken from his address to `_recipient`. - **transferSharesFrom(address \_sender, address \_recipient, uint256 \_sharesAmount)** -This function allows the spender to transfer `_sharesAmount` shares of tapETH from to `_sender` to `_recipient`. +This function allows the spender to transfer `_sharesAmount` shares of lpToken from to `_sender` to `_recipient`. - **mintShares(address \_account, uint256 \_tokenAmount)** -This function can be executed by a whitelisted stableSwap pool to mint `_tokenAmount` of tapETH for `_account`. +This function can be executed by a whitelisted stableSwap pool to mint `_tokenAmount` of lpToken for `_account`. - **burnShares(uint256 \_tokenAmount)** -This function allows the caller to burn `_tokenAmount` of tapETH. +This function allows the caller to burn `_tokenAmount` of lpToken. - **burnSharesFrom(address \_account, uint256 \_tokenAmount)** -This function allows the spender to burn `_tokenAmount` of tapETH from the addresss `_account`. +This function allows the spender to burn `_tokenAmount` of lpToken from the addresss `_account`. ### View Methodes -- **getTotalPooledEther()** +- **getTotalPeggedTokener()** - This function returns the total supply of tapETH (uint256). + This function returns the total supply of lpToken (uint256). - **getTotalShares()** - This function returns the total shares of tapETH (uint256). + This function returns the total shares of lpToken (uint256). -- **getSharesByPooledEth(uint256_tapETHAmount)** +- **getSharesByPeggedToken(uint256_lpTokenAmount)** -This function returns the shares of tapETH (uint256) corresponding to `_tapETHAmount` of tapETH. +This function returns the shares of lpToken (uint256) corresponding to `_lpTokenAmount` of lpToken. -- **getPooledEthByShares(uint256 \_sharesAmount)** +- **getPeggedTokenByShares(uint256 \_sharesAmount)** - This function returns the amount of tapETH (uint256) corresponding to `sharesAmount' shares of tapETH. + This function returns the amount of lpToken (uint256) corresponding to `sharesAmount' shares of lpToken. - **setTotalSupply(uint256 \_amount)** - This function can be only called by a whitelist stableSwap pool contract to increase the total supply of tapETH by + This function can be only called by a whitelist stableSwap pool contract to increase the total supply of lpToken by `_amount`. -## Contract WTapETH +## Contract SelfPeggingAsset -The contract **WTapETH** is upgradable and inherits from the contract ERC20Permit. - -### Write Methodes - -- **wrap(uint256 \_tapETHAmount)** - -This function allows the user to wrap `_ tapETHAmount` of tapETH that consisting in transferring `_tapETHAmount` of -tapETH to the smart contract WTapETH and minting the corresponding shares amount in wtapETH. - -- **unwrap(uint256 \_wtapETHAmount)** - -This function allows the user to unwrap `_wtapETHAmount` of wtapETH that consisting in burning `wtapETHAmount` of -wtapETH and sending from the smart contract WTapETH to the caller the corresponding amount of tapETH. - -### View Methodes - -- **getWtapETHByTapETH(uint256 \_tapETHAmount)** - -This function returns the amount of wtapETH that corresponds to `_tapETHAmount` of tapETH. - -- **getTapETHByWtapETH(uint256 \_wtapETHAmount)** - -This function returns the amount of tapETH that corresponds to `_wtapETHAmount` of wtapETH. - -- **tapETHPerToken()** - -This function returns the amount of tapETH that corresponds to 1 wtapETH. - -- **tokensPerTapETH()** - -This function returns the amount of wtapETH that corresponds to 1 tapETH. - -## Contract StableAsset - -The contract **StableAsset** is upgradable and inherits from the contract ReentrancyGuard. +The contract **SelfPeggingAsset** is upgradable and inherits from the contract ReentrancyGuard. ### Write Methodes - **mint(uint256[] calldata \_amounts, uint256 \_minMintAmount)** -This function allows the user to provide liquidity in the different tokens of the pool to mint at least `_wtapETHAmount` -of tapETH. The Logic of the function consists of : +This function allows the user to provide liquidity in the different tokens of the pool to mint at least +`_wlpTokenAmount` of lpToken. The Logic of the function consists of : 1. update token balances 2. calculate the new D value 3. calculate delta D = new D - old D 4. calculate mintAmount = delta D - feeAmount = delta D \* ( 1- mintFee) 5. revert if mintAmount < \_minMintAmount -6. mint mintAmount of tapETH for the caller -7. increase the total supply of tapETH by feeAmount +6. mint mintAmount of lpToken for the caller +7. increase the total supply of lpToken by feeAmount - **swap(uint256 \_i, uint256 \_j, uint256 \_dx, uint256 \_minDy)** @@ -154,11 +120,11 @@ The Logic of the function consists of: 4. calculate outputAmount = delta y - feeAmount = delta y \* ( 1- swapFee) 5. revert if outputAmount < \_minDy 6. send outputAmount of token index `j` to the caller -7. increase the total supply of tapETH by feeAmount +7. increase the total supply of lpToken by feeAmount - **redeemProportion(uint256 \_amount, uint256[] calldata \_minRedeemAmounts)** -This function allows the user to redeem `_amount `of tapETH in order to receive at least `_minRedeemAmounts[i]` of each +This function allows the user to redeem `_amount `of lpToken in order to receive at least `_minRedeemAmounts[i]` of each token index i. The Logic of the function consists of: 1. calculate redeemAmount = \_amount - feeAmount = amount \* ( 1 - redeemFee). @@ -167,12 +133,12 @@ token index i. The Logic of the function consists of: - revert if tokenAmount < minRedeemAmounts[i] - send tokenAmount of token index i to the caller 3. update D = D - \_amount -4. burn \_amount of tapETH from the caller -5. increase the totalSupply of tapETH by feeAmount +4. burn \_amount of lpToken from the caller +5. increase the totalSupply of lpToken by feeAmount - **redeemSingle(uint256 \_amount, uint256 \_i, uint256 \_minRedeemAmount)** -This function allows the user to redeem `_amount `of tapETH in order to receive at least `_minRedeemAmount` of token +This function allows the user to redeem `_amount `of lpToken in order to receive at least `_minRedeemAmount` of token index i. The Logic of the function consists of: 1. calculate redeemAmount = \_amount - feeAmount = amount \* ( 1 - redeemFee). @@ -180,11 +146,11 @@ index i. The Logic of the function consists of: 3. calculate delta y = new y - old y 4. revert if delta y < \_minRedeemAmount 5. send delta y of token index `i` to the caller -6. increase the total supply of tapETH by feeAmount +6. increase the total supply of lpToken by feeAmount - **redeemMulti(uint256[] calldata \_amounts, uint256 \_maxRedeemAmount)** -This function allows the user to redeem at most `_maxRedeemAmount ` of tapETH to receive `_amouns[i] `of each token +This function allows the user to redeem at most `_maxRedeemAmount ` of lpToken to receive `_amouns[i] `of each token index i. The Logic of the function consists of: 1. update balance of each token index `i ` . @@ -193,7 +159,7 @@ index i. The Logic of the function consists of: 4. calculate redeemAmount = delta D + feeAmount = delta D \* ( 1 + redeemFee) 5. revert if redeemAmount > \_maxRedeemAmount 6. for each token index i, send \_amounts[i] to the caller -7. increase the total supply of tapETH by feeAmount +7. increase the total supply of lpToken by feeAmount functions to be executed only by the governance: @@ -242,7 +208,7 @@ This function returns the current value of A. - **getMintAmount(uint256[] calldata \_amounts)** -This function returns (uint256 mintAmount, uint256 fee) where mintAmount is the amount of tapETH to mint for the user, +This function returns (uint256 mintAmount, uint256 fee) where mintAmount is the amount of lpToken to mint for the user, and fee is the mint fee. - **getSwapAmount(uint256 \_i, uint256 \_j, uint256 \_dx)** @@ -262,37 +228,37 @@ user, and fee is the redeem fee. - **getRedeemMultiAmount(uint256[] calldata \_amounts)** -This function returns (uint256 amount, uint256 fee) where amount is the amount of tapETH to redeem and fee is the redeem -fee. +This function returns (uint256 amount, uint256 fee) where amount is the amount of lpToken to redeem and fee is the +redeem fee. -## Contract StableAssetApplication +## Contract SelfPeggingAssetApplication -The contract **StableAssetApplication** is upgradable and inherits from the contract ReentrancyGuard. +The contract **SelfPeggingAssetApplication** is upgradable and inherits from the contract ReentrancyGuard. ### Write Methodes -- **mint(StableAsset \_pool, uint256[] calldata \_amounts, uint256 \_minMintAmount )** +- **mint(SelfPeggingAsset \_pool, uint256[] calldata \_amounts, uint256 \_minMintAmount )** This function allows the user to provide liquidity in the different tokens of the pool `_pool` to mint at least -`_wtapETHAmount` of tapETH. +`_wlpTokenAmount` of lpToken. -- **swap(StableAsset \_pool, uint256 \_i, uint256 \_j, uint256 \_dx, uint256 \_minDy)** +- **swap(SelfPeggingAsset \_pool, uint256 \_i, uint256 \_j, uint256 \_dx, uint256 \_minDy)** This function allows the user to swap `_dx ` amount of token index `i` to at least `_minDy` amount of token index `j` using the pool `_pool`. -- **redeemProportion(StableAsset \_pool, uint256 \_amount, uint256[] calldata \_minRedeemAmounts)** +- **redeemProportion(SelfPeggingAsset \_pool, uint256 \_amount, uint256[] calldata \_minRedeemAmounts)** -This function allows the user to redeem `_amount `of tapETH from the pool `_pool` in order to receive at least +This function allows the user to redeem `_amount `of lpToken from the pool `_pool` in order to receive at least `_minRedeemAmounts[i]` of each token index i . -- **redeemSingle(StableAsset \_pool, uint256 \_amount, uint256 \_i, uint256 \_minRedeemAmount)** +- **redeemSingle(SelfPeggingAsset \_pool, uint256 \_amount, uint256 \_i, uint256 \_minRedeemAmount)** -This function allows the user to redeem `_amount `of tapETH from the pool `_pool` in order to receive at least +This function allows the user to redeem `_amount `of lpToken from the pool `_pool` in order to receive at least `_minRedeemAmount` of token index i. -- **swapCrossPool(StableAsset \_sourcePool, StableAsset \_destPool, address \_sourceToken, address \_destToken, uint256 - \_amount, uint256 \_minSwapAmount)** +- **swapCrossPool(SelfPeggingAsset \_sourcePool, SelfPeggingAsset \_destPool, address \_sourceToken, address + \_destToken, uint256 \_amount, uint256 \_minSwapAmount)** This function allows the user to swap `_amount ` amount of token `_sourceToken` from the pool `_sourcePool` to at least `_minSwapAmount` amount of token `_destToken` from the pool `_destPool`. @@ -333,19 +299,27 @@ Get a test coverage report: $ forge coverage ``` -### Deploy +### Deploy to Testnet -Deploy to Anvil: +Deploy to Base Testnet: ```sh -$ forge script script/Deploy.s.sol --broadcast --fork-url http://localhost:8545 +$ forge script ./script/Testnet.s.sol -vvv --rpc-url basesepolia --broadcast ``` -For this script to work, you need to have a `MNEMONIC` environment variable set to a valid -[BIP39 mnemonic](https://iancoleman.io/bip39/). +Before deploying make sure you configure the neccessary variables in `.env` file. To just test the scripts with just a +dry run remove the `--broadcast` flag. + +### Verifying Contracts on Testnet Explorer + +Here is an example on how to verify a contract on base sepolia: + +```sh +$ forge verify-contract --watch --etherscan-api-key --chain-id 84532 --constructor-args +``` -For instructions on how to deploy to a testnet or mainnet, check out the -[Solidity Scripting](https://book.getfoundry.sh/tutorials/solidity-scripting.html) tutorial. +You can find the contract name and constructor args in the broadcast directory. To encode the constructor args you can +use: https://abi.hashex.org/ ### Format diff --git a/broadcast/CreatePool.s.sol/84532/run-1735540175.json b/broadcast/CreatePool.s.sol/84532/run-1735540175.json new file mode 100644 index 0000000..73d3c90 --- /dev/null +++ b/broadcast/CreatePool.s.sol/84532/run-1735540175.json @@ -0,0 +1,580 @@ +{ + "transactions": [ + { + "hash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": "createPool((address,address,uint8,address,string,uint8,address,string))", + "arguments": [ + "(0x0B20B851320E526Caa804e4007135057275625a4, 0x31C6A16Ce96Ea8a4940C417144e2E1BC91a45Df2, 0, 0x0000000000000000000000000000000000000000, , 0, 0x0000000000000000000000000000000000000000, )" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "gas": "0x1903cb", + "value": "0x0", + "input": "0xab0d433c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000b20b851320e526caa804e4007135057275625a400000000000000000000000031c6a16ce96ea8a4940c417144e2e1bc91a45df200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xe5", + "chainId": "0x14a34" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c44cd88b7600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001c53656c662050656767696e672041737365742055534443205553445400000000000000000000000000000000000000000000000000000000000000000000000d5350412d555344432d555344540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "transactionType": "CREATE", + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a00000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd9908400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000264bf9dddad00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c3630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b20b851320e526caa804e4007135057275625a400000000000000000000000031c6a16ce96ea8a4940c417144e2e1bc91a45df20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df8138000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df813800000000000000000000000000000000000000000000000000000000" + }, + { + "transactionType": "CREATE", + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c36300000000000000000000000000000000000000000000000000000000" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": "mint(address,uint256)", + "arguments": [ + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "gas": "0x17142", + "value": "0x0", + "input": "0x40c10f1900000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe058900000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe6", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": "mint(address,uint256)", + "arguments": [ + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "gas": "0x17142", + "value": "0x0", + "input": "0x40c10f1900000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe058900000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe7", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": "approve(address,uint256)", + "arguments": [ + "0x373af176094e37A161cdA61b3Fe295B330977188", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "gas": "0xfa4b", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000373af176094e37a161cda61b3fe295b33097718800000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe8", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": "approve(address,uint256)", + "arguments": [ + "0x373af176094e37A161cdA61b3Fe295B330977188", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "gas": "0xfa4b", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000373af176094e37a161cda61b3fe295b33097718800000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe9", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionType": "CALL", + "contractName": "BeaconProxy", + "contractAddress": "0x373af176094e37a161cda61b3fe295b330977188", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x373af176094e37a161cda61b3fe295b330977188", + "gas": "0x68e42", + "value": "0x0", + "input": "0x0bd0624600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xea", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x42d488", + "logs": [ + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x41", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x42", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x43", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x00000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x44", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x45", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x46", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x47", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea6", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x48", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4a", + "removed": false + }, + { + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4b", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x9c5d829b9b23efc461f9aeef91979ec04bb903feb3bee4f26d22114abfc7335b" + ], + "data": "0x000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c363000000000000000000000000373af176094e37a161cda61b3fe295b330977188000000000000000000000000854a2867272f0108b5d5ded9dba03ec50739a2fe", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4c", + "removed": false + } + ], + "logsBloom": "0x00000800008000400000000000000000000100000000000000800000000200000000000000000100000101400000000000000810000000000000000000000000000000140000000002000400001000000005000000000000400000000201000001000000020100000000000000000800000000000000000002000000000000400000000000000000000800001000080000000002000080000000000080000000020000000000040000000000000000000040000000000000000000000000000000000000040000000800000000000200000000000004000000800000000020010000000000000000000000010000002000000000000000080000020000000000", + "type": "0x2", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x121c3c", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xe43bbba0f", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x7b0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x43dfdf", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionIndex": "0x18", + "logIndex": "0x4d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000800000000000000008000001000000000000000000000000000000000001000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionIndex": "0x18", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x10b57", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x44eb36", + "logs": [ + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionIndex": "0x19", + "logIndex": "0x4e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000008000000000000000000000000000000000000000001000000020000000000000000000800000000000000000000000010000000000000080000000000004000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionIndex": "0x19", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x10b57", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x45a06c", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionIndex": "0x1a", + "logIndex": "0x4f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000200000100000800000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionIndex": "0x1a", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0xb536", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4655a2", + "logs": [ + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionIndex": "0x1b", + "logIndex": "0x50", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000200000000000040000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000080000000000004000000000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionIndex": "0x1b", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0xb536", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4b14aa", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x52", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0xd5103f333769455df788908e17b0f6f83838ebeae2cd1ed6f23ec20dad88c9a3", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x000000000000000000000000000000000003da137d5b0f806f1b1cc800000000000000000000000000000000000000000003da137d5b0f806f1b1cc800000000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0xc1258b6f224442b6aa30f317612f0920bb2f76d968200d28d9163ec6aee9ad00", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x000000000000000000000000000000000003da137d5b0f806f1b1cc80000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x54", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000100000200000000000000000000000000000000000000000500400000000000000800000000000000000000000000100000840000000002000008000001000004000000000000000000000001000001000000000000000000000000000000000000000000000000000010000000000000080000000000004000000000000000008000000000000080000000000000000000000000040000020000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000800000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x4bf08", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x373af176094e37a161cda61b3fe295b330977188", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1735540175, + "chain": 84532, + "commit": "1a28658" +} \ No newline at end of file diff --git a/broadcast/CreatePool.s.sol/84532/run-latest.json b/broadcast/CreatePool.s.sol/84532/run-latest.json new file mode 100644 index 0000000..73d3c90 --- /dev/null +++ b/broadcast/CreatePool.s.sol/84532/run-latest.json @@ -0,0 +1,580 @@ +{ + "transactions": [ + { + "hash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": "createPool((address,address,uint8,address,string,uint8,address,string))", + "arguments": [ + "(0x0B20B851320E526Caa804e4007135057275625a4, 0x31C6A16Ce96Ea8a4940C417144e2E1BC91a45Df2, 0, 0x0000000000000000000000000000000000000000, , 0, 0x0000000000000000000000000000000000000000, )" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "gas": "0x1903cb", + "value": "0x0", + "input": "0xab0d433c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000b20b851320e526caa804e4007135057275625a400000000000000000000000031c6a16ce96ea8a4940c417144e2e1bc91a45df200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xe5", + "chainId": "0x14a34" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c44cd88b7600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001c53656c662050656767696e672041737365742055534443205553445400000000000000000000000000000000000000000000000000000000000000000000000d5350412d555344432d555344540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "transactionType": "CREATE", + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a00000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd9908400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000264bf9dddad00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c3630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b20b851320e526caa804e4007135057275625a400000000000000000000000031c6a16ce96ea8a4940c417144e2e1bc91a45df20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df8138000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df813800000000000000000000000000000000000000000000000000000000" + }, + { + "transactionType": "CREATE", + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "initCode": "0x60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c36300000000000000000000000000000000000000000000000000000000" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": "mint(address,uint256)", + "arguments": [ + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "gas": "0x17142", + "value": "0x0", + "input": "0x40c10f1900000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe058900000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe6", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": "mint(address,uint256)", + "arguments": [ + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "gas": "0x17142", + "value": "0x0", + "input": "0x40c10f1900000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe058900000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe7", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": "approve(address,uint256)", + "arguments": [ + "0x373af176094e37A161cdA61b3Fe295B330977188", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "gas": "0xfa4b", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000373af176094e37a161cda61b3fe295b33097718800000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe8", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": "approve(address,uint256)", + "arguments": [ + "0x373af176094e37A161cdA61b3Fe295B330977188", + "10000000000000000000000" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "gas": "0xfa4b", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000373af176094e37a161cda61b3fe295b33097718800000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xe9", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionType": "CALL", + "contractName": "BeaconProxy", + "contractAddress": "0x373af176094e37a161cda61b3fe295b330977188", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x373af176094e37a161cda61b3fe295b330977188", + "gas": "0x68e42", + "value": "0x0", + "input": "0x0bd0624600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000021e19e0c9bab2400000", + "nonce": "0xea", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x42d488", + "logs": [ + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x41", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x42", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x43", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x00000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x44", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x45", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x46", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x47", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea6", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x48", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x000000000000000000000000462498e925b34fdee31b07f38a962e94ce600eab", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "topics": [ + "0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e", + "0x000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee" + ], + "data": "0x", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4a", + "removed": false + }, + { + "address": "0x854a2867272f0108b5d5ded9dba03ec50739a2fe", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4b", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x9c5d829b9b23efc461f9aeef91979ec04bb903feb3bee4f26d22114abfc7335b" + ], + "data": "0x000000000000000000000000cfa6fad32546c7f99cf0417075bc5c2d6a27c363000000000000000000000000373af176094e37a161cda61b3fe295b330977188000000000000000000000000854a2867272f0108b5d5ded9dba03ec50739a2fe", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "logIndex": "0x4c", + "removed": false + } + ], + "logsBloom": "0x00000800008000400000000000000000000100000000000000800000000200000000000000000100000101400000000000000810000000000000000000000000000000140000000002000400001000000005000000000000400000000201000001000000020100000000000000000800000000000000000002000000000000400000000000000000000800001000080000000002000080000000000080000000020000000000040000000000000000000040000000000000000000000000000000000000040000000800000000000200000000000004000000800000000020010000000000000000000000010000002000000000000000080000020000000000", + "type": "0x2", + "transactionHash": "0xe841dd40fae8f9ac35c44432276ad913efe9ac93969b385e03818b732f00802c", + "transactionIndex": "0x17", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x121c3c", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xe43bbba0f", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x7b0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x43dfdf", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionIndex": "0x18", + "logIndex": "0x4d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000800000000000000008000001000000000000000000000000000000000001000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xab197bc16bc1cb8b452ff78811facc318ce2472c5f7f01339d54a31b31eff69c", + "transactionIndex": "0x18", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x10b57", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x44eb36", + "logs": [ + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionIndex": "0x19", + "logIndex": "0x4e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000008000000000000000000000000000000000000000001000000020000000000000000000800000000000000000000000010000000000000080000000000004000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x88447a6a08ceb64751ec6e4770f5a71834d0b76a73a7971b6df4f3d1248c733f", + "transactionIndex": "0x19", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x10b57", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x45a06c", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionIndex": "0x1a", + "logIndex": "0x4f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000200000100000800000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2260961112c7a0bdc91e2aca855b4467526ebb9334889ab15966862fe65eee12", + "transactionIndex": "0x1a", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0xb536", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x0b20b851320e526caa804e4007135057275625a4", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4655a2", + "logs": [ + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionIndex": "0x1b", + "logIndex": "0x50", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000200000000000040000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000080000000000004000000000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfc547d0bdc984dd0f4ac91a663f2843a09c0da9d6e804031517b91c0ca699fbb", + "transactionIndex": "0x1b", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0xb536", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4b14aa", + "logs": [ + { + "address": "0x0b20b851320e526caa804e4007135057275625a4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x000000000000000000000000373af176094e37a161cda61b3fe295b330977188" + ], + "data": "0x00000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x52", + "removed": false + }, + { + "address": "0xcfa6fad32546c7f99cf0417075bc5c2d6a27c363", + "topics": [ + "0xd5103f333769455df788908e17b0f6f83838ebeae2cd1ed6f23ec20dad88c9a3", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x000000000000000000000000000000000003da137d5b0f806f1b1cc800000000000000000000000000000000000000000003da137d5b0f806f1b1cc800000000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x373af176094e37a161cda61b3fe295b330977188", + "topics": [ + "0xc1258b6f224442b6aa30f317612f0920bb2f76d968200d28d9163ec6aee9ad00", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x000000000000000000000000000000000003da137d5b0f806f1b1cc80000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000021e19e0c9bab2400000", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "logIndex": "0x54", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000100000200000000000000000000000000000000000000000500400000000000000800000000000000000000000000100000840000000002000008000001000004000000000000000000000001000001000000000000000000000000000000000000000000000000000010000000000000080000000000004000000000000000008000000000000080000000000000000000000000040000020000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000800000000000010000002000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3d2f8146b81a19a216c1cf4207c06601326f4b139db67062f9f27851e8491168", + "transactionIndex": "0x1c", + "blockHash": "0x3a7ff186fe7d7ca7171d784c594590e2a48611aacf2b137abf2f255cec0be12c", + "blockNumber": "0x12f6f77", + "gasUsed": "0x4bf08", + "effectiveGasPrice": "0xdefd", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x373af176094e37a161cda61b3fe295b330977188", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x6", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb97e3d1c8", + "l1GasPrice": "0x694c4fbe8", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1735540175, + "chain": 84532, + "commit": "1a28658" +} \ No newline at end of file diff --git a/broadcast/Testnet.s.sol/84532/run-1735538942.json b/broadcast/Testnet.s.sol/84532/run-1735538942.json new file mode 100644 index 0000000..e0ba9a8 --- /dev/null +++ b/broadcast/Testnet.s.sol/84532/run-1735538942.json @@ -0,0 +1,588 @@ +{ + "transactions": [ + { + "hash": "0x1d958063b7cf69f1cff86786365ca15dd9c51923ed7c906e7bf5a7ead9709a82", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x7f2735e71ac9ed3837cf84ceada69506463f8605", + "function": null, + "arguments": [ + "USDC", + "USDC", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xd997d", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610cea380380610cea83398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610a07806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100c4575f3560e01c806340c10f191161007d5780639dc29fac116100585780639dc29fac14610195578063a9059cbb146101a8578063dd62ed3e146101bb575f5ffd5b806340c10f191461014357806370a082311461015857806395d89b411461018d575f5ffd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f5ffd5b806306fdde03146100c8578063095ea7b3146100e6575b5f5ffd5b6100d0610200565b6040516100dd919061082d565b60405180910390f35b6100f96100f43660046108be565b610290565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f96101293660046108e6565b6102a9565b60055460405160ff90911681526020016100dd565b6101566101513660046108be565b6102cc565b005b61010d610166366004610920565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6100d06102da565b6101566101a33660046108be565b6102e9565b6100f96101b63660046108be565b6102f3565b61010d6101c9366004610940565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b60606003805461020f90610971565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610971565b80156102865780601f1061025d57610100808354040283529160200191610286565b820191905f5260205f20905b81548152906001019060200180831161026957829003601f168201915b5050505050905090565b5f3361029d818585610300565b60019150505b92915050565b5f336102b6858285610312565b6102c18585856103e4565b506001949350505050565b6102d6828261048d565b5050565b60606004805461020f90610971565b6102d682826104e7565b5f3361029d8185856103e4565b61030d8383836001610541565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103de57818110156103d0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103de84848484035f610541565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610433576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff8216610482576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b61030d838383610686565b73ffffffffffffffffffffffffffffffffffffffff82166104dc576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b6102d65f8383610686565b73ffffffffffffffffffffffffffffffffffffffff8216610536576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b6102d6825f83610686565b73ffffffffffffffffffffffffffffffffffffffff8416610590576040517fe602df050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff83166105df576040517f94280d620000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff8085165f90815260016020908152604080832093871683529290522082905580156103de578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161067891815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166106bd578060025f8282546106b291906109c2565b9091555061076d9050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610742576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103c7565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610796576002805482900390556107c1565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161082091815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b81811015610859576020818601810151604086840101520161083c565b505f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b9575f5ffd5b919050565b5f5f604083850312156108cf575f5ffd5b6108d883610896565b946020939093013593505050565b5f5f5f606084860312156108f8575f5ffd5b61090184610896565b925061090f60208501610896565b929592945050506040919091013590565b5f60208284031215610930575f5ffd5b61093982610896565b9392505050565b5f5f60408385031215610951575f5ffd5b61095a83610896565b915061096860208401610896565b90509250929050565b600181811c9082168061098557607f821691505b6020821081036109bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b808201808211156102a3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0xcd", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc8a8e11337dc0767b6973462ed07ee7d7528a994f9d1c3543c3ed17f715dc794", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0xb36f336bdfc0f5e18f35ecee720df793e152f86f", + "function": null, + "arguments": [ + "USDT", + "USDT", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xd997d", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610cea380380610cea83398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610a07806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100c4575f3560e01c806340c10f191161007d5780639dc29fac116100585780639dc29fac14610195578063a9059cbb146101a8578063dd62ed3e146101bb575f5ffd5b806340c10f191461014357806370a082311461015857806395d89b411461018d575f5ffd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f5ffd5b806306fdde03146100c8578063095ea7b3146100e6575b5f5ffd5b6100d0610200565b6040516100dd919061082d565b60405180910390f35b6100f96100f43660046108be565b610290565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f96101293660046108e6565b6102a9565b60055460405160ff90911681526020016100dd565b6101566101513660046108be565b6102cc565b005b61010d610166366004610920565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6100d06102da565b6101566101a33660046108be565b6102e9565b6100f96101b63660046108be565b6102f3565b61010d6101c9366004610940565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b60606003805461020f90610971565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610971565b80156102865780601f1061025d57610100808354040283529160200191610286565b820191905f5260205f20905b81548152906001019060200180831161026957829003601f168201915b5050505050905090565b5f3361029d818585610300565b60019150505b92915050565b5f336102b6858285610312565b6102c18585856103e4565b506001949350505050565b6102d6828261048d565b5050565b60606004805461020f90610971565b6102d682826104e7565b5f3361029d8185856103e4565b61030d8383836001610541565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103de57818110156103d0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103de84848484035f610541565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610433576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff8216610482576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b61030d838383610686565b73ffffffffffffffffffffffffffffffffffffffff82166104dc576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b6102d65f8383610686565b73ffffffffffffffffffffffffffffffffffffffff8216610536576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b6102d6825f83610686565b73ffffffffffffffffffffffffffffffffffffffff8416610590576040517fe602df050000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff83166105df576040517f94280d620000000000000000000000000000000000000000000000000000000081525f60048201526024016103c7565b73ffffffffffffffffffffffffffffffffffffffff8085165f90815260016020908152604080832093871683529290522082905580156103de578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161067891815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166106bd578060025f8282546106b291906109c2565b9091555061076d9050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610742576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103c7565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610796576002805482900390556107c1565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161082091815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b81811015610859576020818601810151604086840101520161083c565b505f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b9575f5ffd5b919050565b5f5f604083850312156108cf575f5ffd5b6108d883610896565b946020939093013593505050565b5f5f5f606084860312156108f8575f5ffd5b61090184610896565b925061090f60208501610896565b929592945050506040919091013590565b5f60208284031215610930575f5ffd5b61093982610896565b9392505050565b5f5f60408385031215610951575f5ffd5b61095a83610896565b915061096860208401610896565b90509250929050565b600181811c9082168061098557607f821691505b6020821081036109bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b808201808211156102a3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0xce", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc67267dea194c7a3794cb6210a4a7f8a1074c3ff818a8a4e752877c3d2c3da2b", + "transactionType": "CREATE", + "contractName": "SelfPeggingAsset", + "contractAddress": "0xa3b9b51d43275233e8fdf313efaad1d4814fac3b", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x704cc4", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506165c68061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106102ee575f3560e01c80635c975abb11610192578063af14052c116100e8578063cbdf382c11610093578063e01839611161006e578063e0183961146105fd578063eddd0d9c14610606578063f2fde38b14610619575f5ffd5b8063cbdf382c146105cf578063d46300fd146105e2578063d6d657c3146105ea575f5ffd5b8063bf9dddad116100c3578063bf9dddad14610592578063bfab5a72146105a5578063c7ee1500146105c6575f5ffd5b8063af14052c1461056e578063afb690a214610576578063b54b88c314610589575f5ffd5b806386fed024116101485780639389b3e3116101235780639389b3e31461053f578063965fa21e146105525780639f493aa71461055b575f5ffd5b806386fed024146104f35780638da5cb5b146104fc5780638e4d943e1461052c575f5ffd5b80636c511239116101785780636c511239146104da578063715018a6146104e35780638456cb59146104eb575f5ffd5b80635c975abb146104ba5780635d841af5146104c7575f5ffd5b806341ad8e7d116102475780634b0bddd2116101fd57806355024167116101d8578063550241671461048b5780635673b02d1461049e5780635a86bb2e146104b1575f5ffd5b80634b0bddd2146104445780634f64b2be1461045757806354cf2aeb14610482575f5ffd5b806344dedbc71161022d57806344dedbc7146103fe57806345cf2ef61461041e5780634903b0d114610431575f5ffd5b806341ad8e7d146103b9578063429b62e5146103cc575f5ffd5b806319cf4280116102a757806334e199071161028257806334e199071461038b5780633c09e2d41461039e5780633f4ba83a146103b1575f5ffd5b806319cf42801461036757806324cbaf2514610370578063312d6efb14610378575f5ffd5b806313966db5116102d757806313966db51461032d5780631468e98c1461033657806318160ddd1461035e575f5ffd5b806304574dc5146102f25780630bd0624614610307575b5f5ffd5b610305610300366004615dbf565b61062c565b005b61031a610315366004615e17565b610670565b6040519081526020015b60405180910390f35b61031a60035481565b610349610344366004615e5f565b610c16565b60408051928352602083019190915201610324565b61031a60075481565b61031a600f5481565b610305610e8e565b61031a610386366004615e7f565b611219565b610305610399366004615dbf565b611850565b61031a6103ac366004615dbf565b6118cb565b6103056118ea565b6103496103c7366004615ea8565b611998565b6103ee6103da366004615efb565b60086020525f908152604090205460ff1681565b6040519015158152602001610324565b61041161040c366004615e17565b611c4a565b6040516103249190615f50565b61034961042c366004615e7f565b612193565b61031a61043f366004615dbf565b612731565b610305610452366004615f62565b612740565b61046a610465366004615dbf565b6127d0565b6040516001600160a01b039091168152602001610324565b61031a60045481565b610305610499366004615e5f565b6127f7565b61031a6104ac366004615f9d565b6129a5565b61031a600a5481565b6009546103ee9060ff1681565b6103056104d5366004615dbf565b613246565b61031a600d5481565b6103056132c1565b6103056132d4565b61031a60115481565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661046a565b61030561053a366004615dbf565b613386565b61030561054d366004615dbf565b6133c3565b61031a60055481565b610411610569366004615fcc565b613400565b61031a613ac2565b610349610584366004615ea8565b613e02565b61031a600c5481565b6103056105a0366004616191565b61409c565b6105b86105b3366004615dbf565b614796565b604051610324929190616262565b61031a60105481565b60065461046a906001600160a01b031681565b61031a614a5e565b61046a6105f8366004615dbf565b614b24565b61031a600b5481565b610305610614366004615dbf565b614b33565b610305610627366004615efb565b614bae565b610634614c04565b60108190556040518181527f0ee75a27bfe194d086724ff0bdc0f721a795360f3397b23304c71e1561826edf906020015b60405180910390a150565b5f610679614c78565b60095460ff1615806106995750335f9081526008602052604090205460ff165b6106cf576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254831461070a576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107135f614cf9565b505f600280548060200260200160405190810160405280929190818152602001828054801561075f57602002820191905f5260205f20905b81548152602001906001019080831161074b575b505050505090505f61076f614a5e565b6007549091505f5b83518110156109b057620186a088888381811061079657610796616283565b9050602002013510156107dc575f82116107dc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8787828181106107ee576107ee616283565b905060200201355f03156109a8575f88888381811061080f5761080f616283565b905060200201359050600e828154811061082b5761082b616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610876573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089a91906162b0565b6108a590600a61640d565b600e83815481106108b8576108b8616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610903573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092791906162b0565b6109319083616418565b61093b919061642f565b90506001828154811061095057610950616283565b905f5260205f200154816109649190616418565b85838151811061097657610976616283565b60200260200101516109889190616467565b85838151811061099a5761099a616283565b602002602001018181525050505b600101610777565b5f6109bb8585615404565b90505f6109c8848361647a565b6003549091505f9015610a02576402540be400600354836109e99190616418565b6109f3919061642f565b90506109ff818361647a565b91505b88821015610a4b576040517fda97547500000000000000000000000000000000000000000000000000000000815260048101839052602481018a90526044015b60405180910390fd5b5f93505b89841015610b06578a8a85818110610a6957610a69616283565b905060200201355f0315610afb57868481518110610a8957610a89616283565b602002602001015160028581548110610aa457610aa4616283565b5f91825260209091200155610afb33308d8d88818110610ac657610ac6616283565b905060200201355f8881548110610adf57610adf616283565b5f918252602090912001546001600160a01b0316929190615610565b600190930192610a4f565b610b108286616467565b6007556006546040517f528c198a000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039091169063528c198a906044015f604051808303815f87803b158015610b75575f5ffd5b505af1158015610b87573d5f5f3e3d5ffd5b50505050610b956001614cf9565b9050336001600160a01b03167fc1258b6f224442b6aa30f317612f0920bb2f76d968200d28d9163ec6aee9ad00838d8d85604051610bd6949392919061648d565b60405180910390a25095505050505050610c0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b9392505050565b5f5f60605f610c236156b8565b909250905085610c5f576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81518510610c99576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ca2614a5e565b60055490915082905f90899015610ce0576402540be4006005548b610cc79190616418565b610cd1919061642f565b9150610cdd828b61647a565b90505b5f610cf6878b610cf0858861647a565b8861594d565b90505f60018b81548110610d0c57610d0c616283565b905f5260205f2001546001838a8e81518110610d2a57610d2a616283565b6020026020010151610d3c919061647a565b610d46919061647a565b610d50919061642f565b90505f819050600e8c81548110610d6957610d69616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610db4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd891906162b0565b600e8d81548110610deb57610deb616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610e36573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5a91906162b0565b610e6590600a61640d565b610e6f9083616418565b610e79919061642f565b9a5093985050505050505050505b9250929050565b610e96614c04565b60095460ff16610ed2576040517f6cd6020100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6002805480602002602001604051908101604052809291908181526020018280548015610f1d57602002820191905f5260205f20905b815481526020019060010190808311610f09575b505050505090505f610f2d614a5e565b6007549091505f5b8351811015611150575f5f8281548110610f5157610f51616283565b5f918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610fb8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdc91906162b0565b9050600e8281548110610ff157610ff1616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561103c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061106091906162b0565b61106b90600a61640d565b600e838154811061107e5761107e616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156110c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ed91906162b0565b6110f79083616418565b611101919061642f565b90506001828154811061111657611116616283565b905f5260205f2001548161112a9190616418565b85838151811061113c5761113c616283565b602090810291909101015250600101610f35565b505f61115c8484615404565b9050818110611197576040517f92e451de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b031663fd71a2376111b2838561647a565b6040518263ffffffff1660e01b81526004016111d091815260200190565b5f604051808303815f87803b1580156111e7575f5ffd5b505af11580156111f9573d5f5f3e3d5ffd5b505085516112109250600291506020870190615cfb565b50600755505050565b5f611222614c78565b60095460ff1615806112425750335f9081526008602052604090205460ff165b611278576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84116112b1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025483106112ec576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f55f614cf9565b505f600280548060200260200160405190810160405280929190818152602001828054801561134157602002820191905f5260205f20905b81548152602001906001019080831161132d575b505050505090505f611351614a5e565b600754600554919250905f90889015611391576402540be4006005548a6113789190616418565b611382919061642f565b915061138e828a61647a565b90505b600e88815481106113a4576113a4616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156113ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141391906162b0565b61141e90600a61640d565b600e898154811061143157611431616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561147c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a091906162b0565b6114aa9089616418565b6114b4919061642f565b96505f6114c6868a610cf0858861647a565b90505f60018a815481106114dc576114dc616283565b905f5260205f200154600183898d815181106114fa576114fa616283565b602002602001015161150c919061647a565b611516919061647a565b611520919061642f565b905088811015611566576040517f369b7e4100000000000000000000000000000000000000000000000000000000815260048101829052602481018a9052604401610a42565b8160028b8154811061157a5761157a616283565b905f5260205f2001819055505f875167ffffffffffffffff8111156115a1576115a1616014565b6040519080825280602002602001820160405280156115ca578160200160208202803683370190505b5090505f829050600e8c815481106115e4576115e4616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561162f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165391906162b0565b600e8d8154811061166657611666616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156116b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d591906162b0565b6116e090600a61640d565b6116ea9083616418565b6116f4919061642f565b905080828d8151811061170957611709616283565b60200260200101818152505061174733825f8f8154811061172c5761172c616283565b5f918252602090912001546001600160a01b03169190615b20565b6117518d8861647a565b6007556006546040517f33fce74b000000000000000000000000000000000000000000000000000000008152336004820152602481018f90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b1580156117b6575f5ffd5b505af11580156117c8573d5f5f3e3d5ffd5b505050506117d66001614cf9565b9550336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8e8489604051611815939291906164e9565b60405180910390a298505050505050505050610c0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611858614c04565b6402540be4008110611896576040517f3261c79200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb890602001610665565b600181815481106118da575f80fd5b5f91825260209091200154905081565b60095460ff16611926576040517f6cd6020100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526008602052604090205460ff1661196e576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f5f60605f6119a56156b8565b600254919350915085146119e5576040517f1501f6a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6119ee614a5e565b9050815f5b8451811015611bd057888882818110611a0e57611a0e616283565b905060200201355f0315611bc8575f898983818110611a2f57611a2f616283565b905060200201359050600e8281548110611a4b57611a4b616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aba91906162b0565b611ac590600a61640d565b600e8381548110611ad857611ad8616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611b23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4791906162b0565b611b519083616418565b611b5b919061642f565b905060018281548110611b7057611b70616283565b905f5260205f20015481611b849190616418565b868381518110611b9657611b96616283565b6020026020010151611ba8919061647a565b868381518110611bba57611bba616283565b602002602001018181525050505b6001016119f3565b505f611bdc8584615404565b90505f611be9828461647a565b6005549091505f9015611c3a57600554611c08906402540be40061647a565b611c176402540be40084616418565b611c21919061642f565b9150611c2d838561647a565b611c37908361647a565b90505b909a909950975050505050505050565b6060611c54614c78565b6002548314611c8f576040517f1501f6a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095460ff161580611caf5750335f9081526008602052604090205460ff165b611ce5576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cee5f614cf9565b505f6002805480602002602001604051908101604052809291908181526020018280548015611d3a57602002820191905f5260205f20905b815481526020019060010190808311611d26575b505050505090505f611d4a614a5e565b6007549091505f5b8351811015611f2f57878782818110611d6d57611d6d616283565b905060200201355f0315611f27575f888883818110611d8e57611d8e616283565b905060200201359050600e8281548110611daa57611daa616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611df5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1991906162b0565b611e2490600a61640d565b600e8381548110611e3757611e37616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611e82573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea691906162b0565b611eb09083616418565b611eba919061642f565b905060018281548110611ecf57611ecf616283565b905f5260205f20015481611ee39190616418565b858381518110611ef557611ef5616283565b6020026020010151611f07919061647a565b858381518110611f1957611f19616283565b602002602001018181525050505b600101611d52565b5f611f3a8585615404565b90505f611f47828561647a565b6005549091505f9015611f9857600554611f66906402540be40061647a565b611f756402540be40084616418565b611f7f919061642f565b9150611f8b838661647a565b611f95908361647a565b90505b88821115611fdc576040517fdeefd46d00000000000000000000000000000000000000000000000000000000815260048101839052602481018a9052604401610a42565b8651611fef9060029060208a0190615cfb565b50611ffa828661647a565b6007556006546040517f33fce74b000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b03909116906333fce74b906044015f604051808303815f87803b15801561205f575f5ffd5b505af1158015612071573d5f5f3e3d5ffd5b505050505f8b8b808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525098509293505050505b8751851015612110578b8b868181106120c8576120c8616283565b905060200201355f031561210557612105338d8d888181106120ec576120ec616283565b905060200201355f888154811061172c5761172c616283565b6001909401936120ad565b61211a6001614cf9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce848385604051612159939291906164e9565b60405180910390a2975050505050505050610c0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f5f60605f6121a06156b8565b90925090508587036121de576040517f201b580a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81518710612218576040517f5470613800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81518610612252576040517f9cacfa7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f851161228b576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612294614a5e565b600e805491925083918891908b9081106122b0576122b0616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156122fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231f91906162b0565b61232a90600a61640d565b600e8b8154811061233d5761233d616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612388573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ac91906162b0565b6123b69083616418565b6123c0919061642f565b905060018a815481106123d5576123d5616283565b905f5260205f200154816123e99190616418565b858b815181106123fb576123fb616283565b602002602001015161240d9190616467565b858b8151811061241f5761241f616283565b6020026020010181815250505f612438868b858761594d565b90505f60018b8154811061244e5761244e616283565b905f5260205f200154600183898e8151811061246c5761246c616283565b602002602001015161247e919061647a565b612488919061647a565b612492919061642f565b6004549091505f90156124cc576402540be400600454836124b39190616418565b6124bd919061642f565b90506124c9818361647a565b91505b600e8054839183918f9081106124e4576124e4616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561252f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061255391906162b0565b600e8f8154811061256657612566616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156125b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d591906162b0565b6125e090600a61640d565b6125ea9084616418565b6125f4919061642f565b9150600e8e8154811061260957612609616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612654573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267891906162b0565b600e8f8154811061268b5761268b616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156126d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126fa91906162b0565b61270590600a61640d565b61270f9083616418565b612719919061642f565b919b509099505050505050505050505b935093915050565b600281815481106118da575f80fd5b612748614c04565b6001600160a01b038216612788576040517f678099ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03919091165f90815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b5f81815481106127de575f80fd5b5f918252602090912001546001600160a01b0316905081565b6127ff614c04565b5f821180156128105750620f424082105b612846576040517f19e580c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43811161287f576040517f68dae2b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612887614a5e565b600a5543600b55600c829055600d8190556128a15f614cf9565b505f6128fd60028054806020026020016040519081016040528092919081815260200182805480156128f057602002820191905f5260205f20905b8154815260200190600101908083116128dc575b5050505050600c54615404565b90505f816007541161291b57600754612916908361647a565b612929565b81600754612929919061647a565b90506011548110612966576040517fef0750c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051858152602081018590527ffc451bbe450f43d894c85911791028d71f61cde18fbe7d5caa282d982ab29aca910160405180910390a150505050565b5f6129ae614c78565b60095460ff1615806129ce5750335f9081526008602052604090205460ff165b612a04576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838503612a3d576040517f201b580a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548510612a78576040517f5470613800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548410612ab3576040517f9cacfa7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03612aec576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af55f614cf9565b505f6002805480602002602001604051908101604052809291908181526020018280548015612b4157602002820191905f5260205f20905b815481526020019060010190808311612b2d575b505050505090505f612b51614a5e565b90505f859050600e8881548110612b6a57612b6a616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612bb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd991906162b0565b612be490600a61640d565b600e8981548110612bf757612bf7616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612c42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6691906162b0565b612c709083616418565b612c7a919061642f565b905060018881548110612c8f57612c8f616283565b905f5260205f20015481612ca39190616418565b838981518110612cb557612cb5616283565b6020026020010151612cc79190616467565b838981518110612cd957612cd9616283565b6020026020010181815250505f612cf484896007548661594d565b90505f60018981548110612d0a57612d0a616283565b905f5260205f200154600183878c81518110612d2857612d28616283565b6020026020010151612d3a919061647a565b612d44919061647a565b612d4e919061642f565b90508160028a81548110612d6457612d64616283565b905f5260205f200181905550848a81518110612d8257612d82616283565b602002602001015160028b81548110612d9d57612d9d616283565b5f91825260208220019190915560045415612ddf576402540be40060045483612dc69190616418565b612dd0919061642f565b9050612ddc818361647a565b91505b600e8a81548110612df257612df2616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e6191906162b0565b612e6c90600a61640d565b600e8b81548110612e7f57612e7f616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612eca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eee91906162b0565b612ef8908a616418565b612f02919061642f565b975087821015612f48576040517f9d2e2cc50000000000000000000000000000000000000000000000000000000081526004810183905260248101899052604401610a42565b612f6033308b5f8f81548110610adf57610adf616283565b5f829050600e8b81548110612f7757612f77616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612fc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fe691906162b0565b600e8c81548110612ff957612ff9616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613044573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306891906162b0565b61307390600a61640d565b61307d9083616418565b613087919061642f565b90506130a033825f8e8154811061172c5761172c616283565b5f875167ffffffffffffffff8111156130bb576130bb616014565b6040519080825280602002602001820160405280156130e4578160200160208202803683370190505b5090505f885167ffffffffffffffff81111561310257613102616014565b60405190808252806020026020018201604052801561312b578160200160208202803683370190505b5090508b828f8151811061314157613141616283565b60200260200101818152505082828e8151811061316057613160616283565b6020026020010181815250505f818f8151811061317f5761317f616283565b6020026020010190151590811515815250506001818e815181106131a5576131a5616283565b911515602092830291909101909101525f6131c06001614cf9565b9050336001600160a01b03167fcd7a62fee01c7edcaea3ced055fa3c650872e7b381ec5f1fa282e9e47db4e395858585856040516132019493929190616511565b60405180910390a250919850505050505050505061323e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b949350505050565b61324e614c04565b6402540be400811061328c576040517f3261c79200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc108490602001610665565b6132c9614c04565b6132d25f615b56565b565b60095460ff1615613311576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526008602052604090205460ff16613359576040517f7bfa4b9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61338e614c04565b600f8190556040518181527fc468beba3fc0a36cd690d9b68e45775b36bb8cb29703829e8393a907814907f190602001610665565b6133cb614c04565b60118190556040518181527f99ea5e64b4c3a2f96657b182aec44c50497ec3102eb58eafdd24367bf16080e390602001610665565b606061340a614c78565b60095460ff16158061342a5750335f9081526008602052604090205460ff165b613460576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f03613499576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025482146134d4576040517f0947aa2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134dd5f614cf9565b505f600280548060200260200160405190810160405280929190818152602001828054801561352957602002820191905f5260205f20905b815481526020019060010190808311613515575b505050505090505f60075490505f825167ffffffffffffffff81111561355157613551616014565b60405190808252806020026020018201604052801561357a578160200160208202803683370190505b506005549091505f908890156135b7576402540be4006005548a61359e9190616418565b6135a8919061642f565b91506135b4828a61647a565b90505b5f5b85518110156139bb575f85838884815181106135d7576135d7616283565b60200260200101516135e99190616418565b6135f3919061642f565b90506001828154811061360857613608616283565b905f5260205f2001548161361c919061642f565b85838151811061362e5761362e616283565b6020026020010181815250505f8a8a8481811061364d5761364d616283565b905060200201359050600e838154811061366957613669616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156136b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136d891906162b0565b6136e390600a61640d565b600e84815481106136f6576136f6616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613741573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376591906162b0565b61376f9083616418565b613779919061642f565b90508086848151811061378e5761378e616283565b602002602001015110156137f4578583815181106137ae576137ae616283565b6020026020010151816040517f369b7e41000000000000000000000000000000000000000000000000000000008152600401610a42929190918252602082015260400190565b8188848151811061380757613807616283565b6020026020010151613819919061647a565b6002848154811061382c5761382c616283565b905f5260205f2001819055505f86848151811061384b5761384b616283565b60200260200101519050600e848154811061386857613868616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156138b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138d791906162b0565b600e85815481106138ea576138ea616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613935573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061395991906162b0565b61396490600a61640d565b61396e9083616418565b613978919061642f565b90508087858151811061398d5761398d616283565b6020026020010181815250506139b033825f878154811061172c5761172c616283565b5050506001016135b9565b506139c6898561647a565b6007556006546040517f33fce74b000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b158015613a2b575f5ffd5b505af1158015613a3d573d5f5f3e3d5ffd5b50505050613a4b6001614cf9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8a8585604051613a8a939291906164e9565b60405180910390a250909350505050610c0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f5f6002805480602002602001604051908101604052809291908181526020018280548015613b0e57602002820191905f5260205f20905b815481526020019060010190808311613afa575b505050505090505f613b1e614a5e565b6007549091505f5b8351811015613d41575f5f8281548110613b4257613b42616283565b5f918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613ba9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bcd91906162b0565b9050600e8281548110613be257613be2616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613c2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c5191906162b0565b613c5c90600a61640d565b600e8381548110613c6f57613c6f616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613cba573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cde91906162b0565b613ce89083616418565b613cf2919061642f565b905060018281548110613d0757613d07616283565b905f5260205f20015481613d1b9190616418565b858381518110613d2d57613d2d616283565b602090810291909101015250600101613b26565b505f613d4d8484615404565b905080821115613d61575f94505050505090565b8351613d74906002906020870190615cfb565b5060078190555f613d85838361647a565b6006546040517fe468688e000000000000000000000000000000000000000000000000000000008152600481018390529192506001600160a01b03169063e468688e906024015f604051808303815f87803b158015613de2575f5ffd5b505af1158015613df4573d5f5f3e3d5ffd5b509298975050505050505050565b5f5f60605f613e0f6156b8565b815191935091508514613e4e576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613e57614a5e565b9050815f5b845181101561403957888882818110613e7757613e77616283565b905060200201355f0315614031575f898983818110613e9857613e98616283565b905060200201359050600e8281548110613eb457613eb4616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613eff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2391906162b0565b613f2e90600a61640d565b600e8381548110613f4157613f41616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613f8c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fb091906162b0565b613fba9083616418565b613fc4919061642f565b905060018281548110613fd957613fd9616283565b905f5260205f20015481613fed9190616418565b868381518110613fff57613fff616283565b60200260200101516140119190616467565b86838151811061402357614023616283565b602002602001018181525050505b600101613e5c565b5f6140448685615404565b90505f614051848361647a565b6003549091505f901561408b576402540be400600354836140729190616418565b61407c919061642f565b9050614088818361647a565b91505b909b909a5098505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156140e65750825b90505f8267ffffffffffffffff1660011480156141025750303b155b905081158015614110575080155b15614147576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156141a85784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b60028b51101580156141bb575089518b51145b80156141c8575085518b51145b6141fe576040517f1501f6a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8851600314614239576040517f7f7d9be000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b60038110156142a3576402540be4008a828151811061425c5761425c616283565b60200260200101511061429b576040517fda8ec34600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60010161423b565b505f5b8b518110156144c0575f6001600160a01b03168c82815181106142cb576142cb616283565b60200260200101516001600160a01b031603614313576040517f4b62f01300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001600160a01b031687828151811061432f5761432f616283565b60200260200101516001600160a01b031603614377576040517f2a47a99300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8c828151811061438a5761438a616283565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156143cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143f19190616575565b60ff1690508b828151811061440857614408616283565b60200260200101515f1415801561444c575061442581601261647a565b61443090600a61640d565b8c838151811061444257614442616283565b6020026020010151145b614482576040517fb522254600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060028054600181810183555f9283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910191909155016142a6565b505f5b8b51811015614572575f6144d8826001616467565b90505b8c51811015614569578c81815181106144f6576144f6616283565b60200260200101516001600160a01b03168d838151811061451957614519616283565b60200260200101516001600160a01b031603614561576040517f464e3f6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001016144db565b506001016144c3565b506001600160a01b0388166145b3576040517fbfc8732f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f871180156145c45750620f424087105b6145fa576040517f19e580c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614602615bde565b61460b33615bee565b8a5161461d905f9060208e0190615d40565b5089516146319060019060208d0190615cfb565b50885f8151811061464457614644616283565b60200260200101516003819055508860018151811061466557614665616283565b60200260200101516004819055508860028151811061468657614686616283565b602090810291909101810151600555600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b1617905586516146da91600e9190890190615d40565b50600a879055600c87905543600b819055600d55620186a0600f819055612710601055601155600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905583156147895784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60605f60605f6147a46156b8565b90925090505f8590036147e3576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815181905f9067ffffffffffffffff81111561480157614801616014565b60405190808252806020026020018201604052801561482a578160200160208202803683370190505b506005549091505f90889015614867576402540be4006005548a61484e9190616418565b614858919061642f565b9150614864828a61647a565b90505b5f5b8651811015614a4f576001818154811061488557614885616283565b905f5260205f20015485838984815181106148a2576148a2616283565b60200260200101516148b49190616418565b6148be919061642f565b6148c8919061642f565b8482815181106148da576148da616283565b6020026020010181815250505f8482815181106148f9576148f9616283565b60200260200101519050600e828154811061491657614916616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614961573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498591906162b0565b600e838154811061499857614998616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156149e3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0791906162b0565b614a1290600a61640d565b614a1c9083616418565b614a26919061642f565b905080858381518110614a3b57614a3b616283565b602090810291909101015250600101614869565b50919890975095505050505050565b600d545f904390811015614b18575f600b5482614a7b919061647a565b90505f600b54600d54614a8e919061647a565b9050600a54600c541115614adf575f600a54600c54614aad919061647a565b90505f82614abb8584616418565b614ac5919061642f565b905080600a54614ad59190616467565b9550505050505090565b5f600c54600a54614af0919061647a565b90505f82614afe8584616418565b614b08919061642f565b905080600a54614ad5919061647a565b5050600c5490565b5090565b600e81815481106127de575f80fd5b614b3b614c04565b6402540be4008110614b79576040517f3261c79200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e85546890602001610665565b614bb6614c04565b6001600160a01b038116614bf8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610a42565b614c0181615b56565b50565b33614c367f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146132d2576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a42565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01614cf3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b5f5f6002805480602002602001604051908101604052809291908181526020018280548015614d4557602002820191905f5260205f20905b815481526020019060010190808311614d31575b505050505090505f6002805480602002602001604051908101604052809291908181526020018280548015614d9757602002820191905f5260205f20905b815481526020019060010190808311614d83575b505050505090505f614da7614a5e565b6007549091505f5b8351811015614fca575f5f8281548110614dcb57614dcb616283565b5f918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614e32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e5691906162b0565b9050600e8281548110614e6b57614e6b616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614eb6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614eda91906162b0565b614ee590600a61640d565b600e8381548110614ef857614ef8616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614f43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f6791906162b0565b614f719083616418565b614f7b919061642f565b905060018281548110614f9057614f90616283565b905f5260205f20015481614fa49190616418565b858381518110614fb657614fb6616283565b602090810291909101015250600101614daf565b505f614fd68484615404565b8451909150614fec906002906020870190615cfb565b506007819055861561506b5780821180156150115750600f5461500f828461647a565b105b1561502257505f9695505050505050565b80821115615066576040517fc83e21440000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610a42565b6150d9565b80821180156150845750601054615082828461647a565b105b1561509557505f9695505050505050565b808211156150d9576040517fc83e21440000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610a42565b5f6150e4838361647a565b9050805f036150fa57505f979650505050505050565b6006546040517fe468688e000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063e468688e906024015f604051808303815f87803b158015615156575f5ffd5b505af1158015615168573d5f5f3e3d5ffd5b5050505087156151b4576007546040805183815260208101929092527faf7c505ee772ec188af7067e1f73db08ab028e3d564273442b907742b9c41fa0910160405180910390a16153f9565b5f855167ffffffffffffffff8111156151cf576151cf616014565b6040519080825280602002602001820160405280156151f8578160200160208202803683370190505b5090505f5b86518110156153b9575f88828151811061521957615219616283565b602002602001015188838151811061523357615233616283565b6020026020010151615245919061647a565b9050600e828154811061525a5761525a616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156152a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906152c991906162b0565b600e83815481106152dc576152dc616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015615327573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061534b91906162b0565b61535690600a61640d565b6153609083616418565b61536a919061642f565b90506001828154811061537f5761537f616283565b905f5260205f20015481615393919061642f565b8383815181106153a5576153a5616283565b6020908102919091010152506001016151fd565b507fd65be40a3578d69ed7f74db1bac74a654f59f9ef9f0552c21466202ad03ff66181836007546040516153ef93929190616595565b60405180910390a1505b979650505050505050565b5f80808360015b865183101561546c575f87848151811061542757615427616283565b60200260200101519050805f14615440575f9150615444565b5060015b61544e8186616467565b945087518361545d9190616418565b600190940193925061540b9050565b801561547e575f94505050505061560a565b5f925082845b60ff85101561559857805f5b8a518110156154dc578a518b828281106154ac576154ac616283565b60200260200101516154be9190616418565b6154c88484616418565b6154d2919061642f565b9150600101615490565b50819250808a5160016154ef9190616467565b6154f99190616418565b8261550560018861647a565b61550f9190616418565b6155199190616467565b828b51836155279190616418565b6155318a89616418565b61553b9190616467565b6155459190616418565b61554f919061642f565b915082821115615575576001615565848461647a565b116155705750615598565b61558c565b6001615581838561647a565b1161558c5750615598565b50600190940193615484565b8460ff03615602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f646f65736e277420636f6e7665726765000000000000000000000000000000006044820152606401610a42565b955050505050505b92915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261568c9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615bff565b50505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60605f5f600280548060200260200160405190810160405280929190818152602001828054801561570657602002820191905f5260205f20905b8154815260200190600101908083116156f2575b505050505090505f615716614a5e565b90505f5b8251811015615935575f5f828154811061573657615736616283565b5f918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561579d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906157c191906162b0565b9050600e82815481106157d6576157d6616283565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015615821573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061584591906162b0565b61585090600a61640d565b600e838154811061586357615863616283565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156158ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158d291906162b0565b6158dc9083616418565b6158e6919061642f565b9050600182815481106158fb576158fb616283565b905f5260205f2001548161590f9190616418565b84838151811061592157615921616283565b60209081029190910101525060010161571a565b505f6159418383615404565b92959294509192505050565b5f828183815b88518110156159dd5788516159689083616418565b91508088146159d55788818151811061598357615983616283565b6020026020010151836159969190616467565b925088518982815181106159ac576159ac616283565b60200260200101516159be9190616418565b6159c88886616418565b6159d2919061642f565b93505b600101615953565b88516159e99083616418565b6159f38886616418565b6159fd919061642f565b93505f615a0a838961642f565b615a149085616467565b5f9250905081885b60ff841015615aa7579050808983615a35836002616418565b615a3f9190616467565b615a49919061647a565b87615a548380616418565b615a5e9190616467565b615a68919061642f565b905081811115615a89576001615a7e838361647a565b1115615aa757615a9c565b6001615a95828461647a565b1115615aa7575b600190930192615a1c565b8360ff03615b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f646f65736e277420636f6e7665726765000000000000000000000000000000006044820152606401610a42565b9b9a5050505050505050505050565b6040516001600160a01b03838116602483015260448201839052615b5191859182169063a9059cbb90606401615645565b505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b615be6615c84565b6132d2615ceb565b615bf6615c84565b614c0181615cf3565b5f5f60205f8451602086015f885af180615c1e576040513d5f823e3d81fd5b50505f513d91508115615c35578060011415615c42565b6001600160a01b0384163b155b1561568c576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a42565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166132d2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615692615c84565b614bb6615c84565b828054828255905f5260205f20908101928215615d34579160200282015b82811115615d34578251825591602001919060010190615d19565b50614b20929150615dab565b828054828255905f5260205f20908101928215615d34579160200282015b82811115615d3457825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190615d5e565b5b80821115614b20575f8155600101615dac565b5f60208284031215615dcf575f5ffd5b5035919050565b5f5f83601f840112615de6575f5ffd5b50813567ffffffffffffffff811115615dfd575f5ffd5b6020830191508360208260051b8501011115610e87575f5ffd5b5f5f5f60408486031215615e29575f5ffd5b833567ffffffffffffffff811115615e3f575f5ffd5b615e4b86828701615dd6565b909790965060209590950135949350505050565b5f5f60408385031215615e70575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215615e91575f5ffd5b505081359360208301359350604090920135919050565b5f5f60208385031215615eb9575f5ffd5b823567ffffffffffffffff811115615ecf575f5ffd5b615edb85828601615dd6565b90969095509350505050565b6001600160a01b0381168114614c01575f5ffd5b5f60208284031215615f0b575f5ffd5b8135610c0f81615ee7565b5f8151808452602084019350602083015f5b82811015615f46578151865260209586019590910190600101615f28565b5093949350505050565b602081525f610c0f6020830184615f16565b5f5f60408385031215615f73575f5ffd5b8235615f7e81615ee7565b915060208301358015158114615f92575f5ffd5b809150509250929050565b5f5f5f5f60808587031215615fb0575f5ffd5b5050823594602084013594506040840135936060013592509050565b5f5f5f60408486031215615fde575f5ffd5b83359250602084013567ffffffffffffffff811115615ffb575f5ffd5b61600786828701615dd6565b9497909650939450505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561608857616088616014565b604052919050565b5f67ffffffffffffffff8211156160a9576160a9616014565b5060051b60200190565b5f82601f8301126160c2575f5ffd5b81356160d56160d082616090565b616041565b8082825260208201915060208360051b8601019250858311156160f6575f5ffd5b602085015b8381101561611c57803561610e81615ee7565b8352602092830192016160fb565b5095945050505050565b5f82601f830112616135575f5ffd5b81356161436160d082616090565b8082825260208201915060208360051b860101925085831115616164575f5ffd5b602085015b8381101561611c578035835260209283019201616169565b803561618c81615ee7565b919050565b5f5f5f5f5f5f60c087890312156161a6575f5ffd5b863567ffffffffffffffff8111156161bc575f5ffd5b6161c889828a016160b3565b965050602087013567ffffffffffffffff8111156161e4575f5ffd5b6161f089828a01616126565b955050604087013567ffffffffffffffff81111561620c575f5ffd5b61621889828a01616126565b94505061622760608801616181565b92506080870135915060a087013567ffffffffffffffff811115616249575f5ffd5b61625589828a016160b3565b9150509295509295509295565b604081525f6162746040830185615f16565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156162c0575f5ffd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001815b600184111561272957808504811115616313576163136162c7565b600184161561632157908102905b60019390931c9280026162f8565b5f8261633d5750600161560a565b8161634957505f61560a565b816001811461635f576002811461636957616385565b600191505061560a565b60ff84111561637a5761637a6162c7565b50506001821b61560a565b5060208310610133831016604e8410600b84101617156163a8575081810a61560a565b6163d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846162f4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115616405576164056162c7565b029392505050565b5f610c0f838361632f565b808202811582820484141761560a5761560a6162c7565b5f82616462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8082018082111561560a5761560a6162c7565b8181038181111561560a5761560a6162c7565b848152606060208201528260608201525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156164ca575f5ffd5b8360051b80866080850137604083019390935250016080019392505050565b838152606060208201525f6165016060830185615f16565b9050826040830152949350505050565b848152608060208201525f6165296080830186615f16565b8281036040840152845180825260208087019201905f5b818110156165605783511515835260209384019390920191600101616540565b50506060939093019390935250949350505050565b5f60208284031215616585575f5ffd5b815160ff81168114610c0f575f5ffd5b606081525f6165a76060830186615f16565b6020830194909452506040015291905056fea164736f6c634300081c000a", + "nonce": "0xcf", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb07e440926f7bf59f4bb55e78706852160a4da479ef4bccb193a4b52df1a0024", + "transactionType": "CREATE", + "contractName": "LPToken", + "contractAddress": "0x19e3f2260b0f74d2b186fd30fe6ec5653f7e7ad3", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x241f78", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b5061200c8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610269575f3560e01c80638da5cb5b11610157578063ce7c2ac2116100d2578063f2fde38b11610088578063f5eb42dc1161006e578063f5eb42dc14610562578063f9bdea4214610575578063fd71a23714610588575f5ffd5b8063f2fde38b1461053c578063f476d1451461054f575f5ffd5b8063da76ed93116100b8578063da76ed93146104d8578063dd62ed3e146104e4578063e468688e14610529575f5ffd5b8063ce7c2ac2146104a6578063d914cd4b146104c5575f5ffd5b8063a457c2d711610127578063adc7ea371161010d578063adc7ea3714610477578063b84c82461461048a578063c18e2a5c1461049d575f5ffd5b8063a457c2d714610451578063a9059cbb14610464575f5ffd5b80638da5cb5b146103cd5780638fcb4e5b1461041457806395d89b4114610427578063a4063dbc1461042f575f5ffd5b80633b7d0946116101e75780635c5d4417116101b757806370a082311161019d57806370a082311461039f578063715018a6146103b2578063853c637d146103ba575f5ffd5b80635c5d4417146103835780636d7804591461038c575f5ffd5b80633b7d0946146103205780634cd88b7614610333578063528c198a1461034657806355b6ed5c14610359575f5ffd5b806323b872dd1161023c57806333fce74b1161022257806333fce74b146102f057806339509351146103055780633a98ef3914610318575f5ffd5b806323b872dd146102ce578063313ce567146102e1575f5ffd5b806306fdde031461026d578063095ea7b31461028b5780630e15561a146102ae57806318160ddd146102c5575b5f5ffd5b61027561059b565b6040516102829190611acf565b60405180910390f35b61029e610299366004611b5b565b61062b565b6040519015158152602001610282565b6102b760025481565b604051908152602001610282565b6102b760015481565b61029e6102dc366004611b83565b610641565b60405160128152602001610282565b6103036102fe366004611b5b565b610662565b005b61029e610313366004611b5b565b61067c565b6102b75f5481565b61030361032e366004611bbd565b6106d2565b610303610341366004611ccb565b6107c6565b610303610354366004611b5b565b61095f565b6102b7610367366004611d30565b600460209081525f928352604080842090915290825290205481565b6102b760065481565b6102b761039a366004611b83565b6109c7565b6102b76103ad366004611bbd565b6109fe565b610303610a2c565b6103036103c8366004611d61565b610a3f565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610282565b6102b7610422366004611b5b565b610a4d565b610275610a78565b61029e61043d366004611bbd565b60056020525f908152604090205460ff1681565b61029e61045f366004611b5b565b610a87565b61029e610472366004611b5b565b610b1b565b610303610485366004611d61565b610b27565b610303610498366004611d78565b610bbf565b6102b760075481565b6102b76104b4366004611bbd565b60036020525f908152604090205481565b6103036104d3366004611bbd565b610c03565b6102b76402540be40081565b6102b76104f2366004611d30565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b610303610537366004611d61565b610d59565b61030361054a366004611bbd565b610ef5565b6102b761055d366004611d61565b610f58565b6102b7610570366004611bbd565b610f87565b6102b7610583366004611d61565b610fb1565b610303610596366004611d61565b610fd0565b6060600880546105aa90611daa565b80601f01602080910402602001604051908101604052809291908181526020018280546105d690611daa565b80156106215780601f106105f857610100808354040283529160200191610621565b820191905f5260205f20905b81548152906001019060200180831161060457829003601f168201915b5050505050905090565b5f61063733848461111f565b5060015b92915050565b5f61064d843384611252565b610658848484611304565b5060019392505050565b61066d823383611252565b6106778282611327565b505050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812080549192610637929091869186919086906106c7908490611e28565b92505081905561111f565b6106da6114d3565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526005602052604090205460ff166107535760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20706f6f6c20646f65736e2774206578697374000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f9190a250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156108105750825b90505f8267ffffffffffffffff16600114801561082c5750303b155b90508115801561083a575080155b15610871576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156108d25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b60086108de8882611e86565b5060096108eb8782611e86565b506108f533611561565b83156109565784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b335f9081526005602052604090205460ff166109bd5760405162461bcd60e51b815260206004820152601060248201527f4c50546f6b656e3a206e6f20706f6f6c00000000000000000000000000000000604482015260640161074a565b6106778282611572565b5f5f6109d283610fb1565b90506109df853383611252565b6109ea8585856116c5565b6109f6858583866118f7565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604081205461063b90610fb1565b610a346114d3565b610a3d5f6119cb565b565b610a493382611327565b5050565b5f610a593384846116c5565b5f610a6383610fb1565b9050610a71338583866118f7565b9392505050565b6060600980546105aa90611daa565b335f90815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015610b075760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a414c4c4f57414e43455f42454c4f575f5a45524f00000000604482015260640161074a565b6106583385610b168685611f9d565b61111f565b5f610637338484611304565b610b2f6114d3565b6402540be4008110610b835760405162461bcd60e51b815260206004820152601560248201527f4c50546f6b656e3a206f7574206f662072616e67650000000000000000000000604482015260640161074a565b60068190556040518181527f11e3209d0ae07ce8613db0c067c493a7230fca326aaae2383e09cf738d923871906020015b60405180910390a150565b610bc76114d3565b6009610bd38282611e86565b507fd7ac43020a860396b99c06d6cea4b050bef19c5c43f9a8bd3932066c60e11c4e81604051610bb49190611acf565b610c0b6114d3565b73ffffffffffffffffffffffffffffffffffffffff8116610c6e5760405162461bcd60e51b815260206004820152601560248201527f4c50546f6b656e3a207a65726f20616464726573730000000000000000000000604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526005602052604090205460ff1615610ce35760405162461bcd60e51b815260206004820152601e60248201527f4c50546f6b656e3a20706f6f6c20697320616c72656164792061646465640000604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69190a250565b335f9081526005602052604090205460ff16610db75760405162461bcd60e51b815260206004820152601060248201527f4c50546f6b656e3a206e6f20706f6f6c00000000000000000000000000000000604482015260640161074a565b805f03610e065760405162461bcd60e51b815260206004820152601260248201527f4c50546f6b656e3a206e6f20616d6f756e740000000000000000000000000000604482015260640161074a565b5f6402540be40082600654610e1b9190611fb0565b610e259190611fc7565b90505f610e328284611f9d565b90508060015f828254610e459190611e28565b925050819055508060025f828254610e5d9190611e28565b925050819055508160075f828254610e759190611e28565b90915550506007546040805184815260208101929092527fa5e8bf15c46a47065bbdc3023e67f56cb553e0bdbc3076775f41fb63240b863c910160405180910390a160408051848152602081018390527f9149335f0abe9ee631f35156bcb8e266e1eab4f22242f2e07707e4c1cdbec3ce910160405180910390a1505050565b610efd6114d3565b73ffffffffffffffffffffffffffffffffffffffff8116610f4c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161074a565b610f55816119cb565b50565b5f6001545f03610f6957505f919050565b6001545f54610f789084611fb0565b61063b9190611fc7565b919050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604081205461063b565b5f5f545f03610fc157505f919050565b5f54600154610f789084611fb0565b335f9081526005602052604090205460ff1661102e5760405162461bcd60e51b815260206004820152601060248201527f4c50546f6b656e3a206e6f20706f6f6c00000000000000000000000000000000604482015260640161074a565b805f0361107d5760405162461bcd60e51b815260206004820152601260248201527f4c50546f6b656e3a206e6f20616d6f756e740000000000000000000000000000604482015260640161074a565b6007548111156110cf5760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20696e737566666369656e74206275666665720000000000604482015260640161074a565b8060075f8282546110e09190611f9d565b90915550506007546040805183815260208101929092527f41f7a6194921888a19dff325a631c0f2f64415d7825efdeb68a4e8ab0635b6209101610bb4565b73ffffffffffffffffffffffffffffffffffffffff83166111825760405162461bcd60e51b815260206004820152601f60248201527f4c50546f6b656e3a20415050524f56455f46524f4d5f5a45524f5f4144445200604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff82166111e55760405162461bcd60e51b815260206004820152601d60248201527f4c50546f6b656e3a20415050524f56455f544f5f5a45524f5f41444452000000604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152600460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112fe57818110156112ef576040517f2a1b2dd8000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161074a565b6112fe8484610b168585611f9d565b50505050565b5f61130e82610f58565b905061131b8484836116c5565b6112fe848484846118f7565b5f73ffffffffffffffffffffffffffffffffffffffff831661138b5760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a204255524e5f46524f4d5f5a45524f5f4144445200000000604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600360205260408120546113b990610fb1565b9050808311156113ff576040517fcf479181000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440161074a565b5f61140984610f58565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260036020526040812080549293508392909190611442908490611f9d565b92505081905550805f5f8282546114599190611f9d565b925050819055505f5492508360015f8282546114759190611f9d565b9091555050604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff8716917f9228b7e435f7ca9ea03da268ef3e8d57d72b10fd771f32c7a2eb095fb58f6897910160405180910390a2505092915050565b336115127f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610a3d576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161074a565b611569611a60565b610f5581611ac7565b5f73ffffffffffffffffffffffffffffffffffffffff83166115d65760405162461bcd60e51b815260206004820152601a60248201527f4c50546f6b656e3a204d494e545f544f5f5a45524f5f41444452000000000000604482015260640161074a565b5f6001545f141580156115e957505f5415155b156115fe576115f783610f58565b9050611601565b50815b73ffffffffffffffffffffffffffffffffffffffff84165f9081526003602052604081208054839290611635908490611e28565b92505081905550805f5f82825461164c9190611e28565b925050819055505f5491508260015f8282546116689190611e28565b9091555050604080518481526020810183905273ffffffffffffffffffffffffffffffffffffffff8616917fd5103f333769455df788908e17b0f6f83838ebeae2cd1ed6f23ec20dad88c9a3910160405180910390a25092915050565b73ffffffffffffffffffffffffffffffffffffffff83166117285760405162461bcd60e51b815260206004820152601560248201527f4c50546f6b656e3a207a65726f20616464726573730000000000000000000000604482015260640161074a565b73ffffffffffffffffffffffffffffffffffffffff821661178b5760405162461bcd60e51b815260206004820152601560248201527f4c50546f6b656e3a207a65726f20616464726573730000000000000000000000604482015260640161074a565b3073ffffffffffffffffffffffffffffffffffffffff8316036118165760405162461bcd60e51b815260206004820152602560248201527f4c50546f6b656e3a205452414e534645525f544f5f6c70546f6b656e5f434f4e60448201527f5452414354000000000000000000000000000000000000000000000000000000606482015260840161074a565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600360205260409020548082111561187f576040517fcf479181000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161074a565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020526040812080548492906118b3908490611f9d565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040812080548492906118ec908490611e28565b909155505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161195691815260200190565b60405180910390a38273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb836040516119bd91815260200190565b60405180910390a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610a3d576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efd611a60565b602081525f82518060208401525f5b81811015611afb5760208186018101516040868401015201611ade565b505f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f82575f5ffd5b5f5f60408385031215611b6c575f5ffd5b611b7583611b38565b946020939093013593505050565b5f5f5f60608486031215611b95575f5ffd5b611b9e84611b38565b9250611bac60208501611b38565b929592945050506040919091013590565b5f60208284031215611bcd575f5ffd5b610a7182611b38565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611c12575f5ffd5b813567ffffffffffffffff811115611c2c57611c2c611bd6565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715611c9857611c98611bd6565b604052818152838201602001851015611caf575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611cdc575f5ffd5b823567ffffffffffffffff811115611cf2575f5ffd5b611cfe85828601611c03565b925050602083013567ffffffffffffffff811115611d1a575f5ffd5b611d2685828601611c03565b9150509250929050565b5f5f60408385031215611d41575f5ffd5b611d4a83611b38565b9150611d5860208401611b38565b90509250929050565b5f60208284031215611d71575f5ffd5b5035919050565b5f60208284031215611d88575f5ffd5b813567ffffffffffffffff811115611d9e575f5ffd5b6109f684828501611c03565b600181811c90821680611dbe57607f821691505b602082108103611df5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561063b5761063b611dfb565b601f82111561067757805f5260205f20601f840160051c81016020851015611e605750805b601f840160051c820191505b81811015611e7f575f8155600101611e6c565b5050505050565b815167ffffffffffffffff811115611ea057611ea0611bd6565b611eb481611eae8454611daa565b84611e3b565b6020601f821160018114611f05575f8315611ecf5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455611e7f565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015611f525787850151825560209485019460019092019101611f32565b5084821015611f8e57868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b8181038181111561063b5761063b611dfb565b808202811582820484141761063b5761063b611dfb565b5f82611ffa577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c634300081c000a", + "nonce": "0xd0", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x982c2fefcd4d940c166e91a10fbd0b204752afdc04ddceed0781ece46c94efc1", + "transactionType": "CREATE", + "contractName": "WLPToken", + "contractAddress": "0x8eefaf4b4d2d8847852e6ee94c7136f51185435f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x253c17", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b5061212b8061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb771461041b578063d905777e1461042e578063dd62ed3e14610441578063ef8b30f7146104a5575f5ffd5b8063c4d66de8146103f3578063c63d75b6146102df578063c6e6f59214610408575f5ffd5b8063a9059cbb116100ce578063a9059cbb146103a7578063b3d7f6b9146103ba578063b460af94146103cd578063ba087652146103e0575f5ffd5b806370a082311461033857806394bf804d1461038c57806395d89b411461039f575f5ffd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102df5780634cdad506146102f35780635fcbd285146103065780636e553f6514610325575f5ffd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f5ffd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f5ffd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f5ffd5b6101bc6104b8565b6040519081526020015b60405180910390f35b6101d761054d565b6040516101c69190611b91565b6101bc6101f2366004611be1565b610620565b61020a610205366004611c19565b6106b8565b60405190151581526020016101c6565b6101bc610228366004611be1565b6106cf565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a610262366004611c43565b6106db565b61026f610700565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b6101bc6102ed366004611c81565b505f1990565b6101bc610301366004611be1565b610753565b5f546102ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6101bc610333366004611c9c565b61075e565b6101bc610346366004611c81565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc61039a366004611c9c565b61084a565b6101d761087b565b61020a6103b5366004611c19565b6108cc565b6101bc6103c8366004611be1565b6108d9565b6101bc6103db366004611cca565b6108e5565b6101bc6103ee366004611cca565b610ac2565b610406610401366004611c81565b610c26565b005b6101bc610416366004611be1565b610e57565b6101bc610429366004611c81565b610eae565b6101bc61043c366004611c81565b610efc565b6101bc61044f366004611d09565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6101bc6104b3366004611be1565b610f45565b5f80546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015610524573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105489190611d35565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace009161059e90611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ca90611d4c565b80156106155780601f106105ec57610100808354040283529160200191610615565b820191905f5260205f20905b8154815290600101906020018083116105f857829003601f168201915b505050505091505090565b5f80546040517ff9bdea420000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff9091169063f9bdea42906024015b602060405180830381865afa15801561068e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b29190611d35565b92915050565b5f336106c5818585610f50565b5060019392505050565b5f6106b2826001610f62565b5f336106e8858285610fb9565b6106f3858585611086565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f815461074d919074010000000000000000000000000000000000000000900460ff16611dca565b91505090565b5f6106b2825f61112f565b5f5f8311610798576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a183610e57565b5f546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905291925073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561081b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083f9190611de3565b506106b2828261117d565b5f5f1961085b565b60405180910390fd5b5f610865856108d9565b9050610873338583886111db565b949350505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace009161059e90611d4c565b5f336106c5818585611086565b5f6106b282600161112f565b5f5f841161091f576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61092884610e57565b90503373ffffffffffffffffffffffffffffffffffffffff831614610a165773ffffffffffffffffffffffffffffffffffffffff82165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832033845290915290205481811015610a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243343632363a20696e73756666696369656e7420616c6c6f77616e6365006044820152606401610852565b610a148333610a0f8585611e02565b610f50565b505b610a2082826112a1565b5f546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018790529091169063a9059cbb906044015b6020604051808303815f875af1158015610a96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba9190611de3565b509392505050565b5f5f8411610afc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b0584610620565b90503373ffffffffffffffffffffffffffffffffffffffff831614610bbe5773ffffffffffffffffffffffffffffffffffffffff82165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832033845290915290205484811015610bad576040517f13be252b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bbc8333610a0f8885611e02565b505b610bc882856112a1565b5f546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018490529091169063a9059cbb90604401610a7a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610c705750825b90505f8267ffffffffffffffff166001148015610c8c5750303b155b905081158015610c9a575080155b15610cd1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610d325784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b610da66040518060400160405280601081526020017f57726170706564204c5020546f6b656e000000000000000000000000000000008152506040518060400160405280600881526020017f776c70546f6b656e0000000000000000000000000000000000000000000000008152506112fb565b610daf8661130d565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790558315610e4f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f80546040517ff476d1450000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff9091169063f476d14590602401610673565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0060205260408120546106b2905f61112f565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0060205260408120546106b2565b5f6106b2825f610f62565b610f5d8383836001611321565b505050565b5f6106f9610f7182600a611ef8565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610f9d9190611f06565b610fa56104b8565b610fb0906001611f06565b85919085611482565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f1981146110805781811015611072576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610852565b61108084848484035f611321565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166110d5576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b73ffffffffffffffffffffffffffffffffffffffff8216611124576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b610f5d8383836114cd565b5f6106f961113b6104b8565b611146906001611f06565b6111515f600a611ef8565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610fb09190611f06565b73ffffffffffffffffffffffffffffffffffffffff82166111cc576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b6111d75f83836114cd565b5050565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0080546112209073ffffffffffffffffffffffffffffffffffffffff1686308661169a565b61122a848361117d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611292929190918252602082015260400190565b60405180910390a35050505050565b73ffffffffffffffffffffffffffffffffffffffff82166112f0576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b6111d7825f836114cd565b61130361172f565b6111d78282611798565b61131561172f565b61131e816117fb565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff8516611391576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b73ffffffffffffffffffffffffffffffffffffffff84166113e0576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610852565b73ffffffffffffffffffffffffffffffffffffffff8086165f9081526001830160209081526040808320938816835292905220839055811561147b578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161129291815260200190565b5050505050565b5f6114af61148f836118cc565b80156114aa57505f84806114a5576114a5611f19565b868809115b151590565b6114ba8686866118f8565b6114c49190611f06565b95945050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff84166115275781816002015f82825461151c9190611f06565b909155506115d79050565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260208290526040902054828110156115ac576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905260448101849052606401610852565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526020839052604090209083900390555b73ffffffffffffffffffffffffffffffffffffffff831661160257600281018054839003905561162d565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020829052604090208054830190555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161168c91815260200190565b60405180910390a350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526110809085906119ae565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611796576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6117a061172f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036117ec8482611fb7565b50600481016110808382611fb7565b61180361172f565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f8061182f84611a4d565b915091508161183f576012611841565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff94909416939093179091555050565b5f60028260038111156118e1576118e1612090565b6118eb91906120bd565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361192c5783828161192257611922611f19565b04925050506106f9565b808411611943576119436003851502601118611b5e565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f60205f8451602086015f885af1806119cd576040513d5f823e3d81fd5b50505f513d915081156119e45780600114156119fe565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15611080576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610852565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f9182918291829173ffffffffffffffffffffffffffffffffffffffff871691611ace91612103565b5f60405180830381855afa9150503d805f8114611b06576040519150601f19603f3d011682016040523d82523d5f602084013e611b0b565b606091505b5091509150818015611b1f57506020815110155b15611b52575f81806020019051810190611b399190611d35565b905060ff8111611b50576001969095509350505050565b505b505f9485945092505050565b634e487b715f52806020526024601cfd5b5f5b83811015611b89578181015183820152602001611b71565b50505f910152565b602081525f8251806020840152611baf816040850160208701611b6f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215611bf1575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461131e575f5ffd5b5f5f60408385031215611c2a575f5ffd5b8235611c3581611bf8565b946020939093013593505050565b5f5f5f60608486031215611c55575f5ffd5b8335611c6081611bf8565b92506020840135611c7081611bf8565b929592945050506040919091013590565b5f60208284031215611c91575f5ffd5b81356106f981611bf8565b5f5f60408385031215611cad575f5ffd5b823591506020830135611cbf81611bf8565b809150509250929050565b5f5f5f60608486031215611cdc575f5ffd5b833592506020840135611cee81611bf8565b91506040840135611cfe81611bf8565b809150509250925092565b5f5f60408385031215611d1a575f5ffd5b8235611d2581611bf8565b91506020830135611cbf81611bf8565b5f60208284031215611d45575f5ffd5b5051919050565b600181811c90821680611d6057607f821691505b602082108103611d97577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff81811683821601908111156106b2576106b2611d9d565b5f60208284031215611df3575f5ffd5b815180151581146106f9575f5ffd5b818103818111156106b2576106b2611d9d565b6001815b6001841115611e5057808504811115611e3457611e34611d9d565b6001841615611e4257908102905b60019390931c928002611e19565b935093915050565b5f82611e66575060016106b2565b81611e7257505f6106b2565b8160018114611e885760028114611e9257611eae565b60019150506106b2565b60ff841115611ea357611ea3611d9d565b50506001821b6106b2565b5060208310610133831016604e8410600b8410161715611ed1575081810a6106b2565b611edd5f198484611e15565b805f1904821115611ef057611ef0611d9d565b029392505050565b5f6106f960ff841683611e58565b808201808211156106b2576106b2611d9d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115610f5d57805f5260205f20601f840160051c81016020851015611f985750805b601f840160051c820191505b8181101561147b575f8155600101611fa4565b815167ffffffffffffffff811115611fd157611fd1611f46565b611fe581611fdf8454611d4c565b84611f73565b6020601f821160018114612017575f83156120005750848201515b5f19600385901b1c1916600184901b17845561147b565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156120645787850151825560209485019460019092019101612044565b508482101561208157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff8316806120f4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff84160691505092915050565b5f8251612114818460208701611b6f565b919091019291505056fea164736f6c634300081c000a", + "nonce": "0xd1", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x24d95d2cd7522da9abe5f48b0ac20afe9b358bb5abc33cf3b9cf96bc40712380", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0xac419e6519611aa7a30d093e936c925bf38b16e4", + "function": null, + "arguments": [ + "0xA3B9b51D43275233E8FdF313efaAd1d4814fAC3b", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x5e454", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5060405161050438038061050483398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b6103678061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f5ffd5b80633659cfe6146100685780635c60da1b1461007d575b5f5ffd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000a3b9b51d43275233e8fdf313efaad1d4814fac3b00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xd2", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7e283d0b4c42e17b54ef339c3a3c0bd60f9a4c65d84a027b2c4ab896d14c086d", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x6b542164a4d143148477198274528f8dc101094f", + "function": null, + "arguments": [ + "0x19E3f2260B0f74D2B186FD30fe6EC5653F7e7Ad3", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x5e454", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5060405161050438038061050483398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b6103678061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f5ffd5b80633659cfe6146100685780635c60da1b1461007d575b5f5ffd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f5ffd5b939250505056fea164736f6c634300081c000a00000000000000000000000019e3f2260b0f74d2b186fd30fe6ec5653f7e7ad300000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xd3", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa55c778ad0352bc0791467d54bf4b7f3192767655c2914d69259d2be8241e631", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x1722a957f4ddbf88e4f0b6d09d82d47b58a0427d", + "function": null, + "arguments": [ + "0x8Eefaf4b4d2d8847852E6EE94c7136f51185435F", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x5e454", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5060405161050438038061050483398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b6103678061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f5ffd5b80633659cfe6146100685780635c60da1b1461007d575b5f5ffd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f5ffd5b939250505056fea164736f6c634300081c000a0000000000000000000000008eefaf4b4d2d8847852e6ee94c7136f51185435f00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xd4", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x064393c08287ae5679d64c5ac117109f50ef241fe066480a6a218366dc70ce5b", + "transactionType": "CREATE", + "contractName": "ConstantExchangeRateProvider", + "contractAddress": "0xbd1ebab139fd306a7a0dbb4e33da03fd003c7895", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x17c02", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50606380601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b670de0b6b3a7640000603756fea164736f6c634300081c000a", + "nonce": "0xd5", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x69a3d6123e541116f3b77963ff1b21f60e96b5ba20159871f6fe9f12647e35ac", + "transactionType": "CREATE", + "contractName": "SelfPeggingAssetFactory", + "contractAddress": "0xb30bf4fedbbca2cf9313940ab55aefc8aa29e8ac", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x3d3443", + "value": "0x0", + "input": "0x60a0604052306080523480156012575f5ffd5b5060805161371d6100395f395f81816119c5015281816119ee0152611ba3015261371d5ff3fe60806040526004361061016d575f3560e01c80638da5cb5b116100c6578063b86bc2a21161007c578063ee919d5011610057578063ee919d50146103fd578063f2fde38b1461041c578063f446c1d01461043b575f5ffd5b8063b86bc2a2146103a0578063c42cf535146103bf578063eddd0d9c146103de575f5ffd5b8063a17fcbc8116100ac578063a17fcbc81461030d578063ab0d433c1461032c578063ad3cb1cc1461034b575f5ffd5b80638da5cb5b146102bc578063965fa21e146102f8575f5ffd5b80634f1ef286116101265780635d841af5116101015780635d841af51461026a5780636cd2433814610289578063715018a6146102a8575f5ffd5b80634f1ef2861461022e57806352d1902d1461024157806354cf2aeb14610255575f5ffd5b80630c340a24116101565780630c340a24146101ce57806313966db5146101ec57806334e199071461020f575f5ffd5b80630208fedc146101715780630810a13214610192575b5f5ffd5b34801561017c575f5ffd5b5061019061018b366004611fcc565b610450565b005b34801561019d575f5ffd5b506008546101b1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d9575f5ffd5b505f546101b1906001600160a01b031681565b3480156101f7575f5ffd5b5061020160015481565b6040519081526020016101c5565b34801561021a575f5ffd5b5061019061022936600461205e565b610830565b61019061023c36600461215f565b610874565b34801561024c575f5ffd5b50610201610893565b348015610260575f5ffd5b5061020160025481565b348015610275575f5ffd5b5061019061028436600461205e565b6108c1565b348015610294575f5ffd5b506006546101b1906001600160a01b031681565b3480156102b3575f5ffd5b506101906108fe565b3480156102c7575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101b1565b348015610303575f5ffd5b5061020160035481565b348015610318575f5ffd5b506005546101b1906001600160a01b031681565b348015610337575f5ffd5b506101906103463660046121eb565b610911565b348015610356575f5ffd5b506103936040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101c59190612336565b3480156103ab575f5ffd5b506007546101b1906001600160a01b031681565b3480156103ca575f5ffd5b506101906103d9366004612348565b61176a565b3480156103e9575f5ffd5b506101906103f836600461205e565b611817565b348015610408575f5ffd5b5061019061041736600461205e565b611854565b348015610427575f5ffd5b50610190610436366004612348565b6118ca565b348015610446575f5ffd5b5061020160045481565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f8115801561049a5750825b90505f8267ffffffffffffffff1660011480156104b65750303b155b9050811580156104c4575080155b156104fb576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561055c5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038e1661059c576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8a116105d5576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038916610615576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038816610655576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716610695576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386166106d5576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106dd611925565b6106e633611935565b8d5f5f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508860055f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508760065f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508660075f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560085f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508c6001819055508b6002819055508a6003819055508960048190555083156108205784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050505050565b610838611946565b60028190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb8906020015b60405180910390a150565b61087c6119ba565b61088582611a8a565b61088f8282611a92565b5050565b5f61089c611b98565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6108c9611946565b60038190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc108490602001610869565b610906611946565b61090f5f611bfa565b565b80516001600160a01b0316610952576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516001600160a01b0316610996576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001516001600160a01b0316815f01516001600160a01b0316036109e8576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f01516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a27573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a4e9190810190612363565b90505f82602001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a90573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ab79190810190612363565b90505f82604051602001610acb91906123d5565b60408051601f1981840301815290829052610ae891602001612419565b60408051601f1981840301815290829052610b07918490602001612459565b60405160208183030381529060405290505f83604051602001610b2a9190612487565b60408051601f1981840301815290829052610b47916020016124cb565b60408051601f1981840301815290829052610b66918590602001612459565b60405160208183030381529060405290505f8183604051602401610b8b92919061250b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4cd88b760000000000000000000000000000000000000000000000000000000017905260065490519192505f916001600160a01b03909116908390610c0490611f81565b610c0f92919061252f565b604051809103905ff080158015610c28573d5f5f3e3d5ffd5b506040805160018082528183019092529192505f91906020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750505f805485519394506001600160a01b031692859250610c8d57610c8d612558565b6001600160a01b0392831660209182029290920101525f80548351921691839190610cba57610cba612558565b6001600160a01b03929092166020928302919091018201526040805160028082526060820183525f93919290918301908036833750506040805160028082526060820183529394505f93909250906020830190803683375050604080516003808252608082019092529293505f929150602082016060803683370190505090508b5f0151835f81518110610d5057610d50612558565b60200260200101906001600160a01b031690816001600160a01b0316815250508b6020015183600181518110610d8857610d88612558565b60200260200101906001600160a01b031690816001600160a01b0316815250508b5f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0b9190612585565b610e169060126125d2565b610e2190600a61270c565b825f81518110610e3357610e33612558565b6020026020010181815250508b602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea39190612585565b610eae9060126125d2565b610eb990600a61270c565b82600181518110610ecc57610ecc612558565b602002602001018181525050600154815f81518110610eed57610eed612558565b60200260200101818152505060025481600181518110610f0f57610f0f612558565b60200260200101818152505060035481600281518110610f3157610f31612558565b6020908102919091010152604080516002808252606082019092525f918160200160208202803683370190505090505f8d604001516003811115610f7757610f7761271a565b1480610f98575060028d604001516003811115610f9657610f9661271a565b145b15610fe35760085481516001600160a01b039091169082905f90610fbe57610fbe612558565b60200260200101906001600160a01b031690816001600160a01b031681525050611188565b60018d604001516003811115610ffb57610ffb61271a565b036110f95760608d01516001600160a01b0316611044576040517f9589a27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8d608001515111611082576040517fa652dcb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8d606001518e6080015160405161109990611f8e565b6110a492919061252f565b604051809103905ff0801580156110bd573d5f5f3e3d5ffd5b50905080825f815181106110d3576110d3612558565b60200260200101906001600160a01b031690816001600160a01b03168152505050611188565b60038d6040015160038111156111115761111161271a565b03611188575f8d5f015160405161112790611f9b565b6001600160a01b039091168152602001604051809103905ff080158015611150573d5f5f3e3d5ffd5b50905080825f8151811061116657611166612558565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8d60a00151600381111561119f5761119f61271a565b14806111c0575060028d60a0015160038111156111be576111be61271a565b145b1561120e5760085481516001600160a01b0390911690829060019081106111e9576111e9612558565b60200260200101906001600160a01b031690816001600160a01b0316815250506113b6565b60018d60a0015160038111156112265761122661271a565b036113255760c08d01516001600160a01b031661126f576040517f9589a27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8d60e0015151116112ad576040517fa652dcb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8d60c001518e60e001516040516112c490611f8e565b6112cf92919061252f565b604051809103905ff0801580156112e8573d5f5f3e3d5ffd5b50905080826001815181106112ff576112ff612558565b60200260200101906001600160a01b031690816001600160a01b031681525050506113b6565b60038d60a00151600381111561133d5761133d61271a565b036113b6575f8d6020015160405161135490611f9b565b6001600160a01b039091168152602001604051809103905ff08015801561137d573d5f5f3e3d5ffd5b509050808260018151811061139457611394612558565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8484848a600454866040516024016113d4969594939291906127ba565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fbf9dddad0000000000000000000000000000000000000000000000000000000017905260055490519192505f916001600160a01b0390911690839061144d90611f81565b61145892919061252f565b604051809103905ff080158015611471573d5f5f3e3d5ffd5b505f546040517f4b0bddd20000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526001602482015291925082918b91831690634b0bddd2906044015f604051808303815f87803b1580156114db575f5ffd5b505af11580156114ed573d5f5f3e3d5ffd5b50505f546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908516925063f2fde38b91506024015f604051808303815f87803b15801561154d575f5ffd5b505af115801561155f573d5f5f3e3d5ffd5b50506040517fd914cd4b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528416925063d914cd4b91506024015f604051808303815f87803b1580156115bc575f5ffd5b505af11580156115ce573d5f5f3e3d5ffd5b50505f546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908416925063f2fde38b91506024015f604051808303815f87803b15801561162e575f5ffd5b505af1158015611640573d5f5f3e3d5ffd5b50506040516001600160a01b03841660248201525f9250604401905060408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260075490519192505f916001600160a01b039091169083906116d590611f81565b6116e092919061252f565b604051809103905ff0801580156116f9573d5f5f3e3d5ffd5b5090507f9c5d829b9b23efc461f9aeef91979ec04bb903feb3bee4f26d22114abfc7335b8d868360405161174d939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60405180910390a150505050505050505050505050505050505050565b611772611946565b6001600160a01b0381166117b2576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527fb607f57f46e59880ba44c1571bc4aef5ef0e09f8a981adddbfb3dd1189d3568390602001610869565b61181f611946565b60018190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e85546890602001610869565b61185c611946565b5f8111611895576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048190556040518181527f408aa8ab61e953b559cf60fcd74348414e42226217aaec52f5eaa420a0949a7990602001610869565b6118d2611946565b6001600160a01b038116611919576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61192281611bfa565b50565b61192d611c82565b61090f611ce9565b61193d611c82565b61192281611d17565b336119787f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461090f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401611910565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a5357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a477f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b1561090f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611922611946565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611aec575060408051601f3d908101601f19168201909252611ae99181019061285b565b60015b611b2d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401611910565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611b89576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611910565b611b938383611d1f565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461090f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661090f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf1611c82565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6118d2611c82565b611d2882611d74565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611d6c57611b938282611e1b565b61088f611e8f565b806001600160a01b03163b5f03611dc2576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401611910565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051611e379190612872565b5f60405180830381855af49150503d805f8114611e6f576040519150601f19603f3d011682016040523d82523d5f602084013e611e74565b606091505b5091509150611e84858383611ec7565b925050505b92915050565b341561090f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082611edc57611ed782611f3f565b611f38565b8151158015611ef357506001600160a01b0384163b155b15611f35576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611910565b50805b9392505050565b805115611f4f5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61059a8061288e83390190565b61075b80612e2883390190565b61018e8061358383390190565b6001600160a01b0381168114611922575f5ffd5b8035611fc781611fa8565b919050565b5f5f5f5f5f5f5f5f5f6101208a8c031215611fe5575f5ffd5b8935611ff081611fa8565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a013561201c81611fa8565b935060c08a013561202c81611fa8565b925060e08a013561203c81611fa8565b91506101008a013561204d81611fa8565b809150509295985092959850929598565b5f6020828403121561206e575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156120c6576120c6612075565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156120f5576120f5612075565b604052919050565b5f67ffffffffffffffff82111561211657612116612075565b50601f01601f191660200190565b5f612136612131846120fd565b6120cc565b9050828152838383011115612149575f5ffd5b828260208301375f602084830101529392505050565b5f5f60408385031215612170575f5ffd5b823561217b81611fa8565b9150602083013567ffffffffffffffff811115612196575f5ffd5b8301601f810185136121a6575f5ffd5b6121b585823560208401612124565b9150509250929050565b803560048110611fc7575f5ffd5b5f82601f8301126121dc575f5ffd5b611f3883833560208501612124565b5f602082840312156121fb575f5ffd5b813567ffffffffffffffff811115612211575f5ffd5b82016101008185031215612223575f5ffd5b61222b6120a2565b61223482611fbc565b815261224260208301611fbc565b6020820152612253604083016121bf565b604082015261226460608301611fbc565b6060820152608082013567ffffffffffffffff811115612282575f5ffd5b61228e868285016121cd565b6080830152506122a060a083016121bf565b60a08201526122b160c08301611fbc565b60c082015260e082013567ffffffffffffffff8111156122cf575f5ffd5b6122db868285016121cd565b60e083015250949350505050565b5f5b838110156123035781810151838201526020016122eb565b50505f910152565b5f81518084526123228160208601602086016122e9565b601f01601f19169290920160200192915050565b602081525f611f38602083018461230b565b5f60208284031215612358575f5ffd5b8135611f3881611fa8565b5f60208284031215612373575f5ffd5b815167ffffffffffffffff811115612389575f5ffd5b8201601f81018413612399575f5ffd5b80516123a7612131826120fd565b8181528560208385010111156123bb575f5ffd5b6123cc8260208301602086016122e9565b95945050505050565b7f5350412d0000000000000000000000000000000000000000000000000000000081525f825161240c8160048501602087016122e9565b9190910160040192915050565b5f825161242a8184602087016122e9565b7f2d00000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b5f835161246a8184602088016122e9565b83519083019061247e8183602088016122e9565b01949350505050565b7f53656c662050656767696e67204173736574200000000000000000000000000081525f82516124be8160138501602087016122e9565b9190910160130192915050565b5f82516124dc8184602087016122e9565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b604081525f61251d604083018561230b565b82810360208401526123cc818561230b565b6001600160a01b0383168152604060208201525f612550604083018461230b565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612595575f5ffd5b815160ff81168114611f38575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff8281168282160390811115611e8957611e896125a5565b6001815b60018411156126265780850481111561260a5761260a6125a5565b600184161561261857908102905b60019390931c9280026125ef565b935093915050565b5f8261263c57506001611e89565b8161264857505f611e89565b816001811461265e576002811461266857612684565b6001915050611e89565b60ff841115612679576126796125a5565b50506001821b611e89565b5060208310610133831016604e8410600b84101617156126a7575081810a611e89565b6126d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846125eb565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612704576127046125a5565b029392505050565b5f611f3860ff84168361262e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8151808452602084019350602083015f5b82811015612777578151865260209586019590910190600101612759565b5093949350505050565b5f8151808452602084019350602083015f5b828110156127775781516001600160a01b0316865260209586019590910190600101612793565b60c080825287519082018190525f90602089019060e0840190835b818110156127fc5783516001600160a01b03168352602093840193909201916001016127d5565b50508381036020850152612810818a612747565b91505082810360408401526128258188612747565b6001600160a01b0387166060850152905084608084015282810360a084015261284e8185612781565b9998505050505050505050565b5f6020828403121561286b575f5ffd5b5051919050565b5f82516128838184602087016122e9565b919091019291505056fe60a060405260405161059a38038061059a83398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b6080516101186104825f395f602301526101185ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f5f375f5f365f845af43d5f5f3e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f5ffd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f5ffd5b939250505056fea164736f6c634300081c000a608060405234801561000f575f5ffd5b5060405161075b38038061075b83398101604081905261002e91610070565b5f80546001600160a01b0319166001600160a01b038416179055600161005482826101d8565b505050610292565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610081575f5ffd5b82516001600160a01b0381168114610097575f5ffd5b60208401519092506001600160401b038111156100b2575f5ffd5b8301601f810185136100c2575f5ffd5b80516001600160401b038111156100db576100db61005c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101095761010961005c565b604052818152828201602001871015610120575f5ffd5b5f5b8281101561013e57602081850181015183830182015201610122565b505f602083830101528093505050509250929050565b600181811c9082168061016857607f821691505b60208210810361018657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101d357805f5260205f20601f840160051c810160208510156101b15750805b601f840160051c820191505b818110156101d0575f81556001016101bd565b50505b505050565b81516001600160401b038111156101f1576101f161005c565b610205816101ff8454610154565b8461018c565b6020601f821160018114610237575f83156102205750848201515b5f19600385901b1c1916600184901b1784556101d0565b5f84815260208120601f198516915b828110156102665787850151825560209485019460019092019101610246565b508482101561028357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6104bc8061029f5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80632b5136011461004e5780633ba0b9a9146100645780637dc0d1d01461006c578063bfa814b5146100b0575b5f5ffd5b60125b6040519081526020015b60405180910390f35b6100516100c5565b5f5461008b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161005b565b6100b8610236565b60405161005b91906102e4565b5f5f60016040516020016100d99190610385565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181526004835260248301918290526101199161047d565b60408051918290039091206020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009092169190911790525f8054915192935091829173ffffffffffffffffffffffffffffffffffffffff169061019f90859061047d565b5f60405180830381855afa9150503d805f81146101d7576040519150601f19603f3d011682016040523d82523d5f602084013e6101dc565b606091505b509150915081610218576040517f52760cdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8180602001905181019061022d9190610498565b95945050505050565b6001805461024390610334565b80601f016020809104026020016040519081016040528092919081815260200182805461026f90610334565b80156102ba5780601f10610291576101008083540402835291602001916102ba565b820191905f5260205f20905b81548152906001019060200180831161029d57829003601f168201915b505050505081565b5f5b838110156102dc5781810151838201526020016102c4565b50505f910152565b602081525f82518060208401526103028160408501602087016102c2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600181811c9082168061034857607f821691505b60208210810361037f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f5f83545f8160011c905060018216806103a057607f821691505b6020821081036103d7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b8080156103eb576001811461041e5761044c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061044c565b5f888152602090205f5b8481101561044457815489820152600190910190602001610428565b505082870194505b50507f2829000000000000000000000000000000000000000000000000000000000000835250506002019392505050565b5f825161048e8184602087016102c2565b9190910192915050565b5f602082840312156104a8575f5ffd5b505191905056fea164736f6c634300081c000a6080604052348015600e575f5ffd5b5060405161018e38038061018e833981016040819052602b91604e565b5f80546001600160a01b0319166001600160a01b03929092169190911790556079565b5f60208284031215605d575f5ffd5b81516001600160a01b03811681146072575f5ffd5b9392505050565b610108806100865f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b60375f80546040517f07a2d13a000000000000000000000000000000000000000000000000000000008152670de0b6b3a7640000600482015273ffffffffffffffffffffffffffffffffffffffff909116906307a2d13a90602401602060405180830381865afa15801560be573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060e0919060e5565b905090565b5f6020828403121560f4575f5ffd5b505191905056fea164736f6c634300081c000aa164736f6c634300081c000a", + "nonce": "0xd6", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb0bd3f25a5c6329f018edc692b0f003b0ed6e2603fd70b556e081ec2dffcc469", + "transactionType": "CREATE", + "contractName": "ERC1967Proxy", + "contractAddress": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "function": null, + "arguments": [ + "0xB30bF4fEdBBcA2Cf9313940AB55aefC8aa29e8AC", + "0x0208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe05890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000ac419e6519611aa7a30d093e936c925bf38b16e40000000000000000000000006b542164a4d143148477198274528f8dc101094f0000000000000000000000001722a957f4ddbf88e4f0b6d09d82d47b58a0427d000000000000000000000000bd1ebab139fd306a7a0dbb4e33da03fd003c7895" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x6b935", + "value": "0x0", + "input": "0x60806040526040516103da3803806103da8339810160408190526100229161025e565b61002c8282610033565b5050610347565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051610128919061032c565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f5f6040838503121561026f575f5ffd5b82516001600160a01b0381168114610285575f5ffd5b60208401519092506001600160401b038111156102a0575f5ffd5b8301601f810185136102b0575f5ffd5b80516001600160401b038111156102c9576102c9610228565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f7576102f7610228565b60405281815282820160200187101561030e575f5ffd5b61031f82602083016020860161023c565b8093505050509250929050565b5f825161033d81846020870161023c565b9190910192915050565b6087806103535f395ff3fe6080604052600a600c565b005b60186014601a565b605d565b565b5f60587f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156076573d5ff35b3d5ffdfea164736f6c634300081c000a000000000000000000000000b30bf4fedbbca2cf9313940ab55aefc8aa29e8ac000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001240208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe05890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000ac419e6519611aa7a30d093e936c925bf38b16e40000000000000000000000006b542164a4d143148477198274528f8dc101094f0000000000000000000000001722a957f4ddbf88e4f0b6d09d82d47b58a0427d000000000000000000000000bd1ebab139fd306a7a0dbb4e33da03fd003c789500000000000000000000000000000000000000000000000000000000", + "nonce": "0xd7", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x00be35b981994f6469d10f5e83e1cb5fdb86363a1c965afde332092713adf320", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "gas": "0xa5b3", + "value": "0x0", + "input": "0xf2fde38b00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xd8", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x4778f0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1d958063b7cf69f1cff86786365ca15dd9c51923ed7c906e7bf5a7ead9709a82", + "transactionIndex": "0x15", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0xa7612", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x7f2735e71ac9ed3837cf84ceada69506463f8605", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xe4b6f1c4e2", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x6c6f" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x51ef02", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc8a8e11337dc0767b6973462ed07ee7d7528a994f9d1c3543c3ed17f715dc794", + "transactionIndex": "0x16", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0xa7612", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xb36f336bdfc0f5e18f35ecee720df793e152f86f", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xe4b6f1c4e2", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x6c6f" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xde0536", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb07e440926f7bf59f4bb55e78706852160a4da479ef4bccb193a4b52df1a0024", + "transactionIndex": "0x18", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x1bc970", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x19e3f2260b0f74d2b186fd30fe6ec5653f7e7ad3", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1fe75cf45ba", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0xf203" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xfaa997", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x982c2fefcd4d940c166e91a10fbd0b204752afdc04ddceed0781ece46c94efc1", + "transactionIndex": "0x19", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x1ca461", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x8eefaf4b4d2d8847852e6ee94c7136f51185435f", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1f92ac8ce7b", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0xef81" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x100b635", + "logs": [ + { + "address": "0x6b542164a4d143148477198274528f8dc101094f", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0x7e283d0b4c42e17b54ef339c3a3c0bd60f9a4c65d84a027b2c4ab896d14c086d", + "transactionIndex": "0x1b", + "logIndex": "0x2e", + "removed": false + }, + { + "address": "0x6b542164a4d143148477198274528f8dc101094f", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000019e3f2260b0f74d2b186fd30fe6ec5653f7e7ad3" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0x7e283d0b4c42e17b54ef339c3a3c0bd60f9a4c65d84a027b2c4ab896d14c086d", + "transactionIndex": "0x1b", + "logIndex": "0x2f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000020800000020000040000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000002000001000000000000000000000000000001000000020000000000000000000800000000000000000000000000010000400000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7e283d0b4c42e17b54ef339c3a3c0bd60f9a4c65d84a027b2c4ab896d14c086d", + "transactionIndex": "0x1b", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x48841", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x6b542164a4d143148477198274528f8dc101094f", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x5b6cfa0fdf", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x2b58" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1053e76", + "logs": [ + { + "address": "0x1722a957f4ddbf88e4f0b6d09d82d47b58a0427d", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0xa55c778ad0352bc0791467d54bf4b7f3192767655c2914d69259d2be8241e631", + "transactionIndex": "0x1c", + "logIndex": "0x30", + "removed": false + }, + { + "address": "0x1722a957f4ddbf88e4f0b6d09d82d47b58a0427d", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000008eefaf4b4d2d8847852e6ee94c7136f51185435f" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0xa55c778ad0352bc0791467d54bf4b7f3192767655c2914d69259d2be8241e631", + "transactionIndex": "0x1c", + "logIndex": "0x31", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000100000000000000080000000000000000000000000040000000002000001000000000000000000000000000001000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000020000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000020000000000000000000000000000000000020000000000000000000000000010000000000000000000200000000000000000000", + "type": "0x2", + "transactionHash": "0xa55c778ad0352bc0791467d54bf4b7f3192767655c2914d69259d2be8241e631", + "transactionIndex": "0x1c", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x48841", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x1722a957f4ddbf88e4f0b6d09d82d47b58a0427d", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x5b6cfa0fdf", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x2b58" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10662c7", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x064393c08287ae5679d64c5ac117109f50ef241fe066480a6a218366dc70ce5b", + "transactionIndex": "0x1d", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x12451", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xbd1ebab139fd306a7a0dbb4e33da03fd003c7895", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x111a29f016", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x81b" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x135774a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x69a3d6123e541116f3b77963ff1b21f60e96b5ba20159871f6fe9f12647e35ac", + "transactionIndex": "0x1e", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x2f1483", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xb30bf4fedbbca2cf9313940ab55aefc8aa29e8ac", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x3552fb1ef15", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x19481" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13aa34c", + "logs": [ + { + "address": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000b30bf4fedbbca2cf9313940ab55aefc8aa29e8ac" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0xb0bd3f25a5c6329f018edc692b0f003b0ed6e2603fd70b556e081ec2dffcc469", + "transactionIndex": "0x1f", + "logIndex": "0x32", + "removed": false + }, + { + "address": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0xb0bd3f25a5c6329f018edc692b0f003b0ed6e2603fd70b556e081ec2dffcc469", + "transactionIndex": "0x1f", + "logIndex": "0x33", + "removed": false + }, + { + "address": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0xb0bd3f25a5c6329f018edc692b0f003b0ed6e2603fd70b556e081ec2dffcc469", + "transactionIndex": "0x1f", + "logIndex": "0x34", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000006000001000000000000000000000000020001000000020000000000000000000800000000000000000000000000040000400000000000000000000800000000000000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000002000000000020000000000000000000010000000000000004000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb0bd3f25a5c6329f018edc692b0f003b0ed6e2603fd70b556e081ec2dffcc469", + "transactionIndex": "0x1f", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x52c02", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x7458e32c00", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x3729" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13b1b43", + "logs": [ + { + "address": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "transactionHash": "0x00be35b981994f6469d10f5e83e1cb5fdb86363a1c965afde332092713adf320", + "transactionIndex": "0x20", + "logIndex": "0x35", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000020001000000000000000000000000000000000000000000000000000000040000400000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x00be35b981994f6469d10f5e83e1cb5fdb86363a1c965afde332092713adf320", + "transactionIndex": "0x20", + "blockHash": "0xadd85d49ee50f50e67d2e2a6e31036deb74b326a78c15fe6e6eab9773ba804d3", + "blockNumber": "0x12f6d0e", + "gasUsed": "0x77f7", + "effectiveGasPrice": "0x3746", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0xc2d2a9fe5472fe0ec7954532658b17d31a38f25c", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xd2ebd37e3", + "l1GasPrice": "0x77bb94e15", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1735538942, + "chain": 84532, + "commit": "cfe6617" +} \ No newline at end of file diff --git a/broadcast/Testnet.s.sol/84532/run-1735538998.json b/broadcast/Testnet.s.sol/84532/run-1735538998.json new file mode 100644 index 0000000..eb45c4e --- /dev/null +++ b/broadcast/Testnet.s.sol/84532/run-1735538998.json @@ -0,0 +1,662 @@ +{ + "transactions": [ + { + "hash": "0x1c209791c39d1106df7cb5e72df8dfd6536657249d260fc1182252da55b31dee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": null, + "arguments": [ + "USDC", + "USDC", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xaf9f9", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610a77380380610a7783398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610794806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c806340c10f191161006e57806340c10f191461012557806370a082311461013a57806395d89b41146101625780639dc29fac1461016a578063a9059cbb1461017d578063dd62ed3e14610190575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b26101c8565b6040516100bf9190610617565b60405180910390f35b6100db6100d636600461067d565b610258565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b3660046106a5565b610271565b60055460405160ff90911681526020016100bf565b61013861013336600461067d565b610294565b005b6100ef6101483660046106df565b6001600160a01b03165f9081526020819052604090205490565b6100b26102a2565b61013861017836600461067d565b6102b1565b6100db61018b36600461067d565b6102bb565b6100ef61019e3660046106ff565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101d790610730565b80601f016020809104026020016040519081016040528092919081815260200182805461020390610730565b801561024e5780601f106102255761010080835404028352916020019161024e565b820191905f5260205f20905b81548152906001019060200180831161023157829003601f168201915b5050505050905090565b5f336102658185856102c8565b60019150505b92915050565b5f3361027e8582856102da565b61028985858561035a565b506001949350505050565b61029e82826103b7565b5050565b6060600480546101d790610730565b61029e82826103eb565b5f3361026581858561035a565b6102d5838383600161041f565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610354578181101561034657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61035484848484035f61041f565b50505050565b6001600160a01b03831661038357604051634b637e8f60e11b81525f600482015260240161033d565b6001600160a01b0382166103ac5760405163ec442f0560e01b81525f600482015260240161033d565b6102d58383836104f1565b6001600160a01b0382166103e05760405163ec442f0560e01b81525f600482015260240161033d565b61029e5f83836104f1565b6001600160a01b03821661041457604051634b637e8f60e11b81525f600482015260240161033d565b61029e825f836104f1565b6001600160a01b0384166104485760405163e602df0560e01b81525f600482015260240161033d565b6001600160a01b03831661047157604051634a1406b160e11b81525f600482015260240161033d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561035457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104e391815260200190565b60405180910390a350505050565b6001600160a01b03831661051b578060025f8282546105109190610768565b9091555061058b9050565b6001600160a01b0383165f908152602081905260409020548181101561056d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161033d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166105a7576002805482900390556105c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161060a91815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b818110156106435760208186018101516040868401015201610626565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610678575f5ffd5b919050565b5f5f6040838503121561068e575f5ffd5b61069783610662565b946020939093013593505050565b5f5f5f606084860312156106b7575f5ffd5b6106c084610662565b92506106ce60208501610662565b929592945050506040919091013590565b5f602082840312156106ef575f5ffd5b6106f882610662565b9392505050565b5f5f60408385031215610710575f5ffd5b61071983610662565b915061072760208401610662565b90509250929050565b600181811c9082168061074457607f821691505b60208210810361076257634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561026b57634e487b7160e01b5f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0xd9", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd3f181ce056cb4831d71256eafd68f18a30f6862d12ec6e73078fbc16e4daa18", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": null, + "arguments": [ + "USDT", + "USDT", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xaf9f9", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610a77380380610a7783398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610794806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c806340c10f191161006e57806340c10f191461012557806370a082311461013a57806395d89b41146101625780639dc29fac1461016a578063a9059cbb1461017d578063dd62ed3e14610190575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b26101c8565b6040516100bf9190610617565b60405180910390f35b6100db6100d636600461067d565b610258565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b3660046106a5565b610271565b60055460405160ff90911681526020016100bf565b61013861013336600461067d565b610294565b005b6100ef6101483660046106df565b6001600160a01b03165f9081526020819052604090205490565b6100b26102a2565b61013861017836600461067d565b6102b1565b6100db61018b36600461067d565b6102bb565b6100ef61019e3660046106ff565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101d790610730565b80601f016020809104026020016040519081016040528092919081815260200182805461020390610730565b801561024e5780601f106102255761010080835404028352916020019161024e565b820191905f5260205f20905b81548152906001019060200180831161023157829003601f168201915b5050505050905090565b5f336102658185856102c8565b60019150505b92915050565b5f3361027e8582856102da565b61028985858561035a565b506001949350505050565b61029e82826103b7565b5050565b6060600480546101d790610730565b61029e82826103eb565b5f3361026581858561035a565b6102d5838383600161041f565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610354578181101561034657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61035484848484035f61041f565b50505050565b6001600160a01b03831661038357604051634b637e8f60e11b81525f600482015260240161033d565b6001600160a01b0382166103ac5760405163ec442f0560e01b81525f600482015260240161033d565b6102d58383836104f1565b6001600160a01b0382166103e05760405163ec442f0560e01b81525f600482015260240161033d565b61029e5f83836104f1565b6001600160a01b03821661041457604051634b637e8f60e11b81525f600482015260240161033d565b61029e825f836104f1565b6001600160a01b0384166104485760405163e602df0560e01b81525f600482015260240161033d565b6001600160a01b03831661047157604051634a1406b160e11b81525f600482015260240161033d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561035457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104e391815260200190565b60405180910390a350505050565b6001600160a01b03831661051b578060025f8282546105109190610768565b9091555061058b9050565b6001600160a01b0383165f908152602081905260409020548181101561056d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161033d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166105a7576002805482900390556105c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161060a91815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b818110156106435760208186018101516040868401015201610626565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610678575f5ffd5b919050565b5f5f6040838503121561068e575f5ffd5b61069783610662565b946020939093013593505050565b5f5f5f606084860312156106b7575f5ffd5b6106c084610662565b92506106ce60208501610662565b929592945050506040919091013590565b5f602082840312156106ef575f5ffd5b6106f882610662565b9392505050565b5f5f60408385031215610710575f5ffd5b61071983610662565b915061072760208401610662565b90509250929050565b600181811c9082168061074457607f821691505b60208210810361076257634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561026b57634e487b7160e01b5f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0xda", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1c82721bc64373b4e2fc7580a638d39835ef5e3eb4fa5c1c91f39889c9af5ebd", + "transactionType": "CREATE", + "contractName": "SelfPeggingAsset", + "contractAddress": "0x10172bcc93a7fbde0ec4318e4aab2211f8858c17", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x6597a8", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50615b898061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610276575f3560e01c80635c975abb11610156578063af14052c116100ca578063cbdf382c11610084578063cbdf382c14610557578063d46300fd1461056a578063d6d657c314610572578063e018396114610585578063eddd0d9c1461058e578063f2fde38b146105a1575f5ffd5b8063af14052c146104f6578063afb690a2146104fe578063b54b88c314610511578063bf9dddad1461051a578063bfab5a721461052d578063c7ee15001461054e575f5ffd5b806386fed0241161011b57806386fed0241461047b5780638da5cb5b146104845780638e4d943e146104b45780639389b3e3146104c7578063965fa21e146104da5780639f493aa7146104e3575f5ffd5b80635c975abb146104425780635d841af51461044f5780636c51123914610462578063715018a61461046b5780638456cb5914610473575f5ffd5b806341ad8e7d116101ed5780634b0bddd2116101b25780634b0bddd2146103cc5780634f64b2be146103df57806354cf2aeb1461040a57806355024167146104135780635673b02d146104265780635a86bb2e14610439575f5ffd5b806341ad8e7d14610341578063429b62e51461035457806344dedbc71461038657806345cf2ef6146103a65780634903b0d1146103b9575f5ffd5b806319cf42801161023e57806319cf4280146102ef57806324cbaf25146102f8578063312d6efb1461030057806334e19907146103135780633c09e2d4146103265780633f4ba83a14610339575f5ffd5b806304574dc51461027a5780630bd062461461028f57806313966db5146102b55780631468e98c146102be57806318160ddd146102e6575b5f5ffd5b61028d610288366004615444565b6105b4565b005b6102a261029d36600461549b565b6105f8565b6040519081526020015b60405180910390f35b6102a260035481565b6102d16102cc3660046154e2565b610b0e565b604080519283526020830191909152016102ac565b6102a260075481565b6102a2600f5481565b61028d610d54565b6102a261030e366004615502565b611094565b61028d610321366004615444565b61163a565b6102a2610334366004615444565b61169c565b61028d6116bb565b6102d161034f36600461552b565b611719565b61037661036236600461557d565b60086020525f908152604090205460ff1681565b60405190151581526020016102ac565b61039961039436600461549b565b6119b1565b6040516102ac91906155d2565b6102d16103b4366004615502565b611e82565b6102a26103c7366004615444565b6123bc565b61028d6103da3660046155e4565b6123cb565b6103f26103ed366004615444565b612424565b6040516001600160a01b0390911681526020016102ac565b6102a260045481565b61028d6104213660046154e2565b61244b565b6102a261043436600461561f565b6125ae565b6102a2600a5481565b6009546103769060ff1681565b61028d61045d366004615444565b612da4565b6102a2600d5481565b61028d612e06565b61028d612e19565b6102a260115481565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166103f2565b61028d6104c2366004615444565b612e7b565b61028d6104d5366004615444565b612eb8565b6102a260055481565b6103996104f136600461564e565b612ef5565b6102a2613526565b6102d161050c36600461552b565b613834565b6102a2600c5481565b61028d6105283660046157d9565b613ab5565b61054061053b366004615444565b614025565b6040516102ac9291906158a6565b6102a260105481565b6006546103f2906001600160a01b031681565b6102a26142d3565b6103f2610580366004615444565b614399565b6102a2600b5481565b61028d61059c366004615444565b6143a8565b61028d6105af36600461557d565b61440a565b6105bc614447565b60108190556040518181527f0ee75a27bfe194d086724ff0bdc0f721a795360f3397b23304c71e1561826edf906020015b60405180910390a150565b5f6106016144a2565b60095460ff1615806106215750335f9081526008602052604090205460ff165b61063e576040516313d0ff5960e31b815260040160405180910390fd5b60025483146106605760405163162908e360e11b815260040160405180910390fd5b6106695f6144d9565b505f60028054806020026020016040519081016040528092919081815260200182805480156106b557602002820191905f5260205f20905b8154815260200190600101908083116106a1575b505050505090505f6106c56142d3565b6007549091505f5b83518110156108ed57620186a08888838181106106ec576106ec6158c7565b905060200201351015610719575f821161071957604051631f2a200560e01b815260040160405180910390fd5b87878281811061072b5761072b6158c7565b905060200201355f03156108e5575f88888381811061074c5761074c6158c7565b905060200201359050600e8281548110610768576107686158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156107b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d791906158db565b6107e290600a6159e1565b600e83815481106107f5576107f56158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610840573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086491906158db565b61086e90836159ec565b6108789190615a03565b90506001828154811061088d5761088d6158c7565b905f5260205f200154816108a191906159ec565b8583815181106108b3576108b36158c7565b60200260200101516108c59190615a22565b8583815181106108d7576108d76158c7565b602002602001018181525050505b6001016106cd565b5f6108f88585614b7f565b90505f6109058483615a35565b6003549091505f901561093f576402540be4006003548361092691906159ec565b6109309190615a03565b905061093c8183615a35565b91505b8882101561096f5760405163da97547560e01b815260048101839052602481018a90526044015b60405180910390fd5b5f93505b89841015610a2a578a8a8581811061098d5761098d6158c7565b905060200201355f0315610a1f578684815181106109ad576109ad6158c7565b6020026020010151600285815481106109c8576109c86158c7565b5f91825260209091200155610a1f33308d8d888181106109ea576109ea6158c7565b905060200201355f8881548110610a0357610a036158c7565b5f918252602090912001546001600160a01b0316929190614d64565b600190930192610973565b610a348286615a22565b6007556006546040516329460cc560e11b8152336004820152602481018490526001600160a01b039091169063528c198a906044015f604051808303815f87803b158015610a80575f5ffd5b505af1158015610a92573d5f5f3e3d5ffd5b50505050610aa060016144d9565b9050336001600160a01b03167fc1258b6f224442b6aa30f317612f0920bb2f76d968200d28d9163ec6aee9ad00838d8d85604051610ae19493929190615a48565b60405180910390a25095505050505050610b0760015f516020615b5d5f395f51905f5255565b9392505050565b5f5f60605f610b1b614de4565b909250905085610b3e57604051631f2a200560e01b815260040160405180910390fd5b81518510610b5f5760405163c1ab6dc160e01b815260040160405180910390fd5b5f610b686142d3565b60055490915082905f90899015610ba6576402540be4006005548b610b8d91906159ec565b610b979190615a03565b9150610ba3828b615a35565b90505b5f610bbc878b610bb68588615a35565b88615060565b90505f60018b81548110610bd257610bd26158c7565b905f5260205f2001546001838a8e81518110610bf057610bf06158c7565b6020026020010151610c029190615a35565b610c0c9190615a35565b610c169190615a03565b90505f819050600e8c81548110610c2f57610c2f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9e91906158db565b600e8d81548110610cb157610cb16158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610cfc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2091906158db565b610d2b90600a6159e1565b610d3590836159ec565b610d3f9190615a03565b9a5093985050505050505050505b9250929050565b610d5c614447565b60095460ff16610d7f57604051636cd6020160e01b815260040160405180910390fd5b5f6002805480602002602001604051908101604052809291908181526020018280548015610dca57602002820191905f5260205f20905b815481526020019060010190808311610db6575b505050505090505f610dda6142d3565b6007549091505f5b8351811015610fe4575f5f8281548110610dfe57610dfe6158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7091906158db565b9050600e8281548110610e8557610e856158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610ed0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef491906158db565b610eff90600a6159e1565b600e8381548110610f1257610f126158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610f5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8191906158db565b610f8b90836159ec565b610f959190615a03565b905060018281548110610faa57610faa6158c7565b905f5260205f20015481610fbe91906159ec565b858381518110610fd057610fd06158c7565b602090810291909101015250600101610de2565b505f610ff08484614b7f565b90508181106110125760405163497228ef60e11b815260040160405180910390fd5b6006546001600160a01b031663fd71a23761102d8385615a35565b6040518263ffffffff1660e01b815260040161104b91815260200190565b5f604051808303815f87803b158015611062575f5ffd5b505af1158015611074573d5f5f3e3d5ffd5b5050855161108b9250600291506020870190615398565b50600755505050565b5f61109d6144a2565b60095460ff1615806110bd5750335f9081526008602052604090205460ff165b6110da576040516313d0ff5960e31b815260040160405180910390fd5b5f84116110fa57604051631f2a200560e01b815260040160405180910390fd5b600254831061111c5760405163c1ab6dc160e01b815260040160405180910390fd5b6111255f6144d9565b505f600280548060200260200160405190810160405280929190818152602001828054801561117157602002820191905f5260205f20905b81548152602001906001019080831161115d575b505050505090505f6111816142d3565b600754600554919250905f908890156111c1576402540be4006005548a6111a891906159ec565b6111b29190615a03565b91506111be828a615a35565b90505b600e88815481106111d4576111d46158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561121f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124391906158db565b61124e90600a6159e1565b600e8981548110611261576112616158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156112ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d091906158db565b6112da90896159ec565b6112e49190615a03565b96505f6112f6868a610bb68588615a35565b90505f60018a8154811061130c5761130c6158c7565b905f5260205f200154600183898d8151811061132a5761132a6158c7565b602002602001015161133c9190615a35565b6113469190615a35565b6113509190615a03565b90508881101561137d5760405163369b7e4160e01b815260048101829052602481018a9052604401610966565b8160028b81548110611391576113916158c7565b905f5260205f2001819055505f87516001600160401b038111156113b7576113b7615695565b6040519080825280602002602001820160405280156113e0578160200160208202803683370190505b5090505f829050600e8c815481106113fa576113fa6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611445573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146991906158db565b600e8d8154811061147c5761147c6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156114c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114eb91906158db565b6114f690600a6159e1565b61150090836159ec565b61150a9190615a03565b905080828d8151811061151f5761151f6158c7565b60200260200101818152505061155d33825f8f81548110611542576115426158c7565b5f918252602090912001546001600160a01b0316919061520c565b6115678d88615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018f90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b1580156115b3575f5ffd5b505af11580156115c5573d5f5f3e3d5ffd5b505050506115d360016144d9565b9550336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8e848960405161161293929190615a8c565b60405180910390a298505050505050505050610b0760015f516020615b5d5f395f51905f5255565b611642614447565b6402540be400811061166757604051631930e3c960e11b815260040160405180910390fd5b60048190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb8906020016105ed565b600181815481106116ab575f80fd5b5f91825260209091200154905081565b60095460ff166116de57604051636cd6020160e01b815260040160405180910390fd5b335f9081526008602052604090205460ff1661170d57604051637bfa4b9f60e01b815260040160405180910390fd5b6009805460ff19169055565b5f5f60605f611726614de4565b6002549193509150851461174c5760405162a80fb560e51b815260040160405180910390fd5b5f6117556142d3565b9050815f5b845181101561193757888882818110611775576117756158c7565b905060200201355f031561192f575f898983818110611796576117966158c7565b905060200201359050600e82815481106117b2576117b26158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156117fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182191906158db565b61182c90600a6159e1565b600e838154811061183f5761183f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561188a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ae91906158db565b6118b890836159ec565b6118c29190615a03565b9050600182815481106118d7576118d76158c7565b905f5260205f200154816118eb91906159ec565b8683815181106118fd576118fd6158c7565b602002602001015161190f9190615a35565b868381518110611921576119216158c7565b602002602001018181525050505b60010161175a565b505f6119438584614b7f565b90505f6119508284615a35565b6005549091505f90156119a15760055461196f906402540be400615a35565b61197e6402540be400846159ec565b6119889190615a03565b91506119948385615a35565b61199e9083615a35565b90505b909a909950975050505050505050565b60606119bb6144a2565b60025483146119dc5760405162a80fb560e51b815260040160405180910390fd5b60095460ff1615806119fc5750335f9081526008602052604090205460ff165b611a19576040516313d0ff5960e31b815260040160405180910390fd5b611a225f6144d9565b505f6002805480602002602001604051908101604052809291908181526020018280548015611a6e57602002820191905f5260205f20905b815481526020019060010190808311611a5a575b505050505090505f611a7e6142d3565b6007549091505f5b8351811015611c6357878782818110611aa157611aa16158c7565b905060200201355f0315611c5b575f888883818110611ac257611ac26158c7565b905060200201359050600e8281548110611ade57611ade6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611b29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4d91906158db565b611b5890600a6159e1565b600e8381548110611b6b57611b6b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611bb6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bda91906158db565b611be490836159ec565b611bee9190615a03565b905060018281548110611c0357611c036158c7565b905f5260205f20015481611c1791906159ec565b858381518110611c2957611c296158c7565b6020026020010151611c3b9190615a35565b858381518110611c4d57611c4d6158c7565b602002602001018181525050505b600101611a86565b5f611c6e8585614b7f565b90505f611c7b8285615a35565b6005549091505f9015611ccc57600554611c9a906402540be400615a35565b611ca96402540be400846159ec565b611cb39190615a03565b9150611cbf8386615a35565b611cc99083615a35565b90505b88821115611cf75760405163deefd46d60e01b815260048101839052602481018a9052604401610966565b8651611d0a9060029060208a0190615398565b50611d158286615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018490526001600160a01b03909116906333fce74b906044015f604051808303815f87803b158015611d61575f5ffd5b505af1158015611d73573d5f5f3e3d5ffd5b505050505f8b8b808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525098509293505050505b8751851015611e12578b8b86818110611dca57611dca6158c7565b905060200201355f0315611e0757611e07338d8d88818110611dee57611dee6158c7565b905060200201355f8881548110611542576115426158c7565b600190940193611daf565b611e1c60016144d9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce848385604051611e5b93929190615a8c565b60405180910390a2975050505050505050610b0760015f516020615b5d5f395f51905f5255565b5f5f60605f611e8f614de4565b9092509050858703611eb45760405163100dac0560e11b815260040160405180910390fd5b81518710611ed557604051630a8e0c2760e31b815260040160405180910390fd5b81518610611ef65760405163272b3e9d60e21b815260040160405180910390fd5b5f8511611f165760405163162908e360e11b815260040160405180910390fd5b5f611f1f6142d3565b600e805491925083918891908b908110611f3b57611f3b6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611f86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611faa91906158db565b611fb590600a6159e1565b600e8b81548110611fc857611fc86158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612013573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203791906158db565b61204190836159ec565b61204b9190615a03565b905060018a81548110612060576120606158c7565b905f5260205f2001548161207491906159ec565b858b81518110612086576120866158c7565b60200260200101516120989190615a22565b858b815181106120aa576120aa6158c7565b6020026020010181815250505f6120c3868b8587615060565b90505f60018b815481106120d9576120d96158c7565b905f5260205f200154600183898e815181106120f7576120f76158c7565b60200260200101516121099190615a35565b6121139190615a35565b61211d9190615a03565b6004549091505f9015612157576402540be4006004548361213e91906159ec565b6121489190615a03565b90506121548183615a35565b91505b600e8054839183918f90811061216f5761216f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156121ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121de91906158db565b600e8f815481106121f1576121f16158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561223c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226091906158db565b61226b90600a6159e1565b61227590846159ec565b61227f9190615a03565b9150600e8e81548110612294576122946158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156122df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230391906158db565b600e8f81548110612316576123166158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612361573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238591906158db565b61239090600a6159e1565b61239a90836159ec565b6123a49190615a03565b919b509099505050505050505050505b935093915050565b600281815481106116ab575f80fd5b6123d3614447565b6001600160a01b0382166123fa576040516319e0266b60e21b815260040160405180910390fd5b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b5f8181548110612432575f80fd5b5f918252602090912001546001600160a01b0316905081565b612453614447565b5f821180156124645750620f424082105b612481576040516319e580c160e01b815260040160405180910390fd5b4381116124a15760405163346d715b60e11b815260040160405180910390fd5b6124a96142d3565b600a5543600b55600c829055600d8190556124c35f6144d9565b505f61251f600280548060200260200160405190810160405280929190818152602001828054801561251257602002820191905f5260205f20905b8154815260200190600101908083116124fe575b5050505050600c54614b7f565b90505f816007541161253d576007546125389083615a35565b61254b565b8160075461254b9190615a35565b9050601154811061256f57604051633bc1d43160e21b815260040160405180910390fd5b60408051858152602081018590527ffc451bbe450f43d894c85911791028d71f61cde18fbe7d5caa282d982ab29aca910160405180910390a150505050565b5f6125b76144a2565b60095460ff1615806125d75750335f9081526008602052604090205460ff165b6125f4576040516313d0ff5960e31b815260040160405180910390fd5b8385036126145760405163100dac0560e11b815260040160405180910390fd5b600254851061263657604051630a8e0c2760e31b815260040160405180910390fd5b60025484106126585760405163272b3e9d60e21b815260040160405180910390fd5b825f036126785760405163162908e360e11b815260040160405180910390fd5b6126815f6144d9565b505f60028054806020026020016040519081016040528092919081815260200182805480156126cd57602002820191905f5260205f20905b8154815260200190600101908083116126b9575b505050505090505f6126dd6142d3565b90505f859050600e88815481106126f6576126f66158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612741573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276591906158db565b61277090600a6159e1565b600e8981548110612783576127836158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156127ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f291906158db565b6127fc90836159ec565b6128069190615a03565b90506001888154811061281b5761281b6158c7565b905f5260205f2001548161282f91906159ec565b838981518110612841576128416158c7565b60200260200101516128539190615a22565b838981518110612865576128656158c7565b6020026020010181815250505f612880848960075486615060565b90505f60018981548110612896576128966158c7565b905f5260205f200154600183878c815181106128b4576128b46158c7565b60200260200101516128c69190615a35565b6128d09190615a35565b6128da9190615a03565b90508160028a815481106128f0576128f06158c7565b905f5260205f200181905550848a8151811061290e5761290e6158c7565b602002602001015160028b81548110612929576129296158c7565b5f9182526020822001919091556004541561296b576402540be4006004548361295291906159ec565b61295c9190615a03565b90506129688183615a35565b91505b600e8a8154811061297e5761297e6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156129c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ed91906158db565b6129f890600a6159e1565b600e8b81548110612a0b57612a0b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612a56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a7a91906158db565b612a84908a6159ec565b612a8e9190615a03565b975087821015612abb57604051639d2e2cc560e01b81526004810183905260248101899052604401610966565b612ad333308b5f8f81548110610a0357610a036158c7565b5f829050600e8b81548110612aea57612aea6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612b35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5991906158db565b600e8c81548110612b6c57612b6c6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612bb7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bdb91906158db565b612be690600a6159e1565b612bf090836159ec565b612bfa9190615a03565b9050612c1333825f8e81548110611542576115426158c7565b5f87516001600160401b03811115612c2d57612c2d615695565b604051908082528060200260200182016040528015612c56578160200160208202803683370190505b5090505f88516001600160401b03811115612c7357612c73615695565b604051908082528060200260200182016040528015612c9c578160200160208202803683370190505b5090508b828f81518110612cb257612cb26158c7565b60200260200101818152505082828e81518110612cd157612cd16158c7565b6020026020010181815250505f818f81518110612cf057612cf06158c7565b6020026020010190151590811515815250506001818e81518110612d1657612d166158c7565b911515602092830291909101909101525f612d3160016144d9565b9050336001600160a01b03167fcd7a62fee01c7edcaea3ced055fa3c650872e7b381ec5f1fa282e9e47db4e39585858585604051612d729493929190615ab4565b60405180910390a2509198505050505050505050612d9c60015f516020615b5d5f395f51905f5255565b949350505050565b612dac614447565b6402540be4008110612dd157604051631930e3c960e11b815260040160405180910390fd5b60058190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc1084906020016105ed565b612e0e614447565b612e175f615242565b565b60095460ff1615612e3d576040516313d0ff5960e31b815260040160405180910390fd5b335f9081526008602052604090205460ff16612e6c57604051637bfa4b9f60e01b815260040160405180910390fd5b6009805460ff19166001179055565b612e83614447565b600f8190556040518181527fc468beba3fc0a36cd690d9b68e45775b36bb8cb29703829e8393a907814907f1906020016105ed565b612ec0614447565b60118190556040518181527f99ea5e64b4c3a2f96657b182aec44c50497ec3102eb58eafdd24367bf16080e3906020016105ed565b6060612eff6144a2565b60095460ff161580612f1f5750335f9081526008602052604090205460ff165b612f3c576040516313d0ff5960e31b815260040160405180910390fd5b835f03612f5c57604051631f2a200560e01b815260040160405180910390fd5b6002548214612f7e57604051630947aa2560e01b815260040160405180910390fd5b612f875f6144d9565b505f6002805480602002602001604051908101604052809291908181526020018280548015612fd357602002820191905f5260205f20905b815481526020019060010190808311612fbf575b505050505090505f60075490505f82516001600160401b03811115612ffa57612ffa615695565b604051908082528060200260200182016040528015613023578160200160208202803683370190505b506005549091505f90889015613060576402540be4006005548a61304791906159ec565b6130519190615a03565b915061305d828a615a35565b90505b5f5b855181101561344b575f8583888481518110613080576130806158c7565b602002602001015161309291906159ec565b61309c9190615a03565b9050600182815481106130b1576130b16158c7565b905f5260205f200154816130c59190615a03565b8583815181106130d7576130d76158c7565b6020026020010181815250505f8a8a848181106130f6576130f66158c7565b905060200201359050600e8381548110613112576131126158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561315d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061318191906158db565b61318c90600a6159e1565b600e848154811061319f5761319f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156131ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061320e91906158db565b61321890836159ec565b6132229190615a03565b905080868481518110613237576132376158c7565b6020026020010151101561328457858381518110613257576132576158c7565b60200260200101518160405163369b7e4160e01b8152600401610966929190918252602082015260400190565b81888481518110613297576132976158c7565b60200260200101516132a99190615a35565b600284815481106132bc576132bc6158c7565b905f5260205f2001819055505f8684815181106132db576132db6158c7565b60200260200101519050600e84815481106132f8576132f86158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613343573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061336791906158db565b600e858154811061337a5761337a6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156133c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e991906158db565b6133f490600a6159e1565b6133fe90836159ec565b6134089190615a03565b90508087858151811061341d5761341d6158c7565b60200260200101818152505061344033825f8781548110611542576115426158c7565b505050600101613062565b506134568985615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018b90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b1580156134a2575f5ffd5b505af11580156134b4573d5f5f3e3d5ffd5b505050506134c260016144d9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8a858560405161350193929190615a8c565b60405180910390a250909350505050610b0760015f516020615b5d5f395f51905f5255565b5f5f600280548060200260200160405190810160405280929190818152602001828054801561357257602002820191905f5260205f20905b81548152602001906001019080831161355e575b505050505090505f6135826142d3565b6007549091505f5b835181101561378c575f5f82815481106135a6576135a66158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135f4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361891906158db565b9050600e828154811061362d5761362d6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613678573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369c91906158db565b6136a790600a6159e1565b600e83815481106136ba576136ba6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613705573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061372991906158db565b61373390836159ec565b61373d9190615a03565b905060018281548110613752576137526158c7565b905f5260205f2001548161376691906159ec565b858381518110613778576137786158c7565b60209081029190910101525060010161358a565b505f6137988484614b7f565b9050808211156137ac575f94505050505090565b83516137bf906002906020870190615398565b5060078190555f6137d08383615a35565b600654604051637234344760e11b8152600481018390529192506001600160a01b03169063e468688e906024015f604051808303815f87803b158015613814575f5ffd5b505af1158015613826573d5f5f3e3d5ffd5b509298975050505050505050565b5f5f60605f613841614de4565b8151919350915085146138675760405163162908e360e11b815260040160405180910390fd5b5f6138706142d3565b9050815f5b8451811015613a5257888882818110613890576138906158c7565b905060200201355f0315613a4a575f8989838181106138b1576138b16158c7565b905060200201359050600e82815481106138cd576138cd6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613918573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393c91906158db565b61394790600a6159e1565b600e838154811061395a5761395a6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156139a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c991906158db565b6139d390836159ec565b6139dd9190615a03565b9050600182815481106139f2576139f26158c7565b905f5260205f20015481613a0691906159ec565b868381518110613a1857613a186158c7565b6020026020010151613a2a9190615a22565b868381518110613a3c57613a3c6158c7565b602002602001018181525050505b600101613875565b5f613a5d8685614b7f565b90505f613a6a8483615a35565b6003549091505f9015613aa4576402540be40060035483613a8b91906159ec565b613a959190615a03565b9050613aa18183615a35565b91505b909b909a5098505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015613af95750825b90505f826001600160401b03166001148015613b145750303b155b905081158015613b22575080155b15613b405760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315613b6a57845460ff60401b1916600160401b1785555b60028b5110158015613b7d575089518b51145b8015613b8a575085518b51145b613ba65760405162a80fb560e51b815260040160405180910390fd5b8851600314613bc8576040516303fbecdf60e51b815260040160405180910390fd5b5f5b6003811015613c19576402540be4008a8281518110613beb57613beb6158c7565b602002602001015110613c1157604051636d4761a360e11b815260040160405180910390fd5b600101613bca565b505f5b8b51811015613deb575f6001600160a01b03168c8281518110613c4157613c416158c7565b60200260200101516001600160a01b031603613c7057604051634b62f01360e01b815260040160405180910390fd5b5f6001600160a01b0316878281518110613c8c57613c8c6158c7565b60200260200101516001600160a01b031603613cbb57604051632a47a99360e01b815260040160405180910390fd5b5f8c8281518110613cce57613cce6158c7565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d359190615b18565b60ff1690508b8281518110613d4c57613d4c6158c7565b60200260200101515f14158015613d905750613d69816012615a35565b613d7490600a6159e1565b8c8381518110613d8657613d866158c7565b6020026020010151145b613dad57604051635a9112a360e11b815260040160405180910390fd5b5060028054600181810183555f9283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091019190915501613c1c565b505f5b8b51811015613e84575f613e03826001615a22565b90505b8c51811015613e7b578c8181518110613e2157613e216158c7565b60200260200101516001600160a01b03168d8381518110613e4457613e446158c7565b60200260200101516001600160a01b031603613e73576040516323271fb560e11b815260040160405180910390fd5b600101613e06565b50600101613dee565b506001600160a01b038816613eac5760405163bfc8732f60e01b815260040160405180910390fd5b5f87118015613ebd5750620f424087105b613eda576040516319e580c160e01b815260040160405180910390fd5b613ee26152b2565b613eeb336152c2565b8a51613efd905f9060208e01906153dd565b508951613f119060019060208d0190615398565b50885f81518110613f2457613f246158c7565b602002602001015160038190555088600181518110613f4557613f456158c7565b602002602001015160048190555088600281518110613f6657613f666158c7565b602090810291909101810151600555600680546001600160a01b0319166001600160a01b038b161790558651613fa291600e91908901906153dd565b50600a879055600c87905543600b819055600d55620186a0600f8190556127106010556011556009805460ff19169055831561401857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60605f60605f614033614de4565b90925090505f85900361405957604051631f2a200560e01b815260040160405180910390fd5b815181905f906001600160401b0381111561407657614076615695565b60405190808252806020026020018201604052801561409f578160200160208202803683370190505b506005549091505f908890156140dc576402540be4006005548a6140c391906159ec565b6140cd9190615a03565b91506140d9828a615a35565b90505b5f5b86518110156142c457600181815481106140fa576140fa6158c7565b905f5260205f2001548583898481518110614117576141176158c7565b602002602001015161412991906159ec565b6141339190615a03565b61413d9190615a03565b84828151811061414f5761414f6158c7565b6020026020010181815250505f84828151811061416e5761416e6158c7565b60200260200101519050600e828154811061418b5761418b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156141d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141fa91906158db565b600e838154811061420d5761420d6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614258573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061427c91906158db565b61428790600a6159e1565b61429190836159ec565b61429b9190615a03565b9050808583815181106142b0576142b06158c7565b6020908102919091010152506001016140de565b50919890975095505050505050565b600d545f90439081101561438d575f600b54826142f09190615a35565b90505f600b54600d546143039190615a35565b9050600a54600c541115614354575f600a54600c546143229190615a35565b90505f8261433085846159ec565b61433a9190615a03565b905080600a5461434a9190615a22565b9550505050505090565b5f600c54600a546143659190615a35565b90505f8261437385846159ec565b61437d9190615a03565b905080600a5461434a9190615a35565b5050600c5490565b5090565b600e8181548110612432575f80fd5b6143b0614447565b6402540be40081106143d557604051631930e3c960e11b815260040160405180910390fd5b60038190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e855468906020016105ed565b614412614447565b6001600160a01b03811661443b57604051631e4fbdf760e01b81525f6004820152602401610966565b61444481615242565b50565b336144797f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614612e175760405163118cdaa760e01b8152336004820152602401610966565b5f516020615b5d5f395f51905f528054600119016144d357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f600280548060200260200160405190810160405280929190818152602001828054801561452557602002820191905f5260205f20905b815481526020019060010190808311614511575b505050505090505f600280548060200260200160405190810160405280929190818152602001828054801561457757602002820191905f5260205f20905b815481526020019060010190808311614563575b505050505090505f6145876142d3565b6007549091505f5b8351811015614791575f5f82815481106145ab576145ab6158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156145f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461d91906158db565b9050600e8281548110614632576146326158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561467d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a191906158db565b6146ac90600a6159e1565b600e83815481106146bf576146bf6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561470a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472e91906158db565b61473890836159ec565b6147429190615a03565b905060018281548110614757576147576158c7565b905f5260205f2001548161476b91906159ec565b85838151811061477d5761477d6158c7565b60209081029190910101525060010161458f565b505f61479d8484614b7f565b84519091506147b3906002906020870190615398565b50600781905586156148195780821180156147d85750600f546147d68284615a35565b105b156147e957505f9695505050505050565b808211156148145760405163320f885160e21b81526004810183905260248101829052604401610966565b61486e565b808211801561483257506010546148308284615a35565b105b1561484357505f9695505050505050565b8082111561486e5760405163320f885160e21b81526004810183905260248101829052604401610966565b5f6148798383615a35565b9050805f0361488f57505f979650505050505050565b600654604051637234344760e11b8152600481018390526001600160a01b039091169063e468688e906024015f604051808303815f87803b1580156148d2575f5ffd5b505af11580156148e4573d5f5f3e3d5ffd5b505050508715614930576007546040805183815260208101929092527faf7c505ee772ec188af7067e1f73db08ab028e3d564273442b907742b9c41fa0910160405180910390a1614b74565b5f85516001600160401b0381111561494a5761494a615695565b604051908082528060200260200182016040528015614973578160200160208202803683370190505b5090505f5b8651811015614b34575f888281518110614994576149946158c7565b60200260200101518883815181106149ae576149ae6158c7565b60200260200101516149c09190615a35565b9050600e82815481106149d5576149d56158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614a20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a4491906158db565b600e8381548110614a5757614a576158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac691906158db565b614ad190600a6159e1565b614adb90836159ec565b614ae59190615a03565b905060018281548110614afa57614afa6158c7565b905f5260205f20015481614b0e9190615a03565b838381518110614b2057614b206158c7565b602090810291909101015250600101614978565b507fd65be40a3578d69ed7f74db1bac74a654f59f9ef9f0552c21466202ad03ff6618183600754604051614b6a93929190615b38565b60405180910390a1505b979650505050505050565b5f80808360015b8651831015614be7575f878481518110614ba257614ba26158c7565b60200260200101519050805f14614bbb575f9150614bbf565b5060015b614bc98186615a22565b9450875183614bd891906159ec565b6001909401939250614b869050565b8015614bf9575f945050505050614d5e565b5f925082845b60ff851015614d1357805f5b8a51811015614c57578a518b82828110614c2757614c276158c7565b6020026020010151614c3991906159ec565b614c4384846159ec565b614c4d9190615a03565b9150600101614c0b565b50819250808a516001614c6a9190615a22565b614c7491906159ec565b82614c80600188615a35565b614c8a91906159ec565b614c949190615a22565b828b5183614ca291906159ec565b614cac8a896159ec565b614cb69190615a22565b614cc091906159ec565b614cca9190615a03565b915082821115614cf0576001614ce08484615a35565b11614ceb5750614d13565b614d07565b6001614cfc8385615a35565b11614d075750614d13565b50600190940193614bff565b8460ff03614d565760405162461bcd60e51b815260206004820152601060248201526f646f65736e277420636f6e766572676560801b6044820152606401610966565b955050505050505b92915050565b6040516001600160a01b038481166024830152838116604483015260648201839052614dcb9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506152d3565b50505050565b60015f516020615b5d5f395f51905f5255565b60605f5f6002805480602002602001604051908101604052809291908181526020018280548015614e3257602002820191905f5260205f20905b815481526020019060010190808311614e1e575b505050505090505f614e426142d3565b90505f5b8251811015615048575f5f8281548110614e6257614e626158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ed491906158db565b9050600e8281548110614ee957614ee96158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614f34573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f5891906158db565b614f6390600a6159e1565b600e8381548110614f7657614f766158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614fe591906158db565b614fef90836159ec565b614ff99190615a03565b90506001828154811061500e5761500e6158c7565b905f5260205f2001548161502291906159ec565b848381518110615034576150346158c7565b602090810291909101015250600101614e46565b505f6150548383614b7f565b92959294509192505050565b5f828183815b88518110156150f057885161507b90836159ec565b91508088146150e857888181518110615096576150966158c7565b6020026020010151836150a99190615a22565b925088518982815181106150bf576150bf6158c7565b60200260200101516150d191906159ec565b6150db88866159ec565b6150e59190615a03565b93505b600101615066565b88516150fc90836159ec565b61510688866159ec565b6151109190615a03565b93505f61511d8389615a03565b6151279085615a22565b5f9250905081885b60ff8410156151ba5790508089836151488360026159ec565b6151529190615a22565b61515c9190615a35565b8761516783806159ec565b6151719190615a22565b61517b9190615a03565b90508181111561519c5760016151918383615a35565b11156151ba576151af565b60016151a88284615a35565b11156151ba575b60019093019261512f565b8360ff036151fd5760405162461bcd60e51b815260206004820152601060248201526f646f65736e277420636f6e766572676560801b6044820152606401610966565b9b9a5050505050505050505050565b6040516001600160a01b0383811660248301526044820183905261523d91859182169063a9059cbb90606401614d99565b505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6152ba61533f565b612e17615388565b6152ca61533f565b61444481615390565b5f5f60205f8451602086015f885af1806152f2576040513d5f823e3d81fd5b50505f513d91508115615309578060011415615316565b6001600160a01b0384163b155b15614dcb57604051635274afe760e01b81526001600160a01b0385166004820152602401610966565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612e1757604051631afcd79f60e31b815260040160405180910390fd5b614dd161533f565b61441261533f565b828054828255905f5260205f209081019282156153d1579160200282015b828111156153d15782518255916020019190600101906153b6565b50614395929150615430565b828054828255905f5260205f209081019282156153d1579160200282015b828111156153d157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906153fb565b5b80821115614395575f8155600101615431565b5f60208284031215615454575f5ffd5b5035919050565b5f5f83601f84011261546b575f5ffd5b5081356001600160401b03811115615481575f5ffd5b6020830191508360208260051b8501011115610d4d575f5ffd5b5f5f5f604084860312156154ad575f5ffd5b83356001600160401b038111156154c2575f5ffd5b6154ce8682870161545b565b909790965060209590950135949350505050565b5f5f604083850312156154f3575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215615514575f5ffd5b505081359360208301359350604090920135919050565b5f5f6020838503121561553c575f5ffd5b82356001600160401b03811115615551575f5ffd5b61555d8582860161545b565b90969095509350505050565b6001600160a01b0381168114614444575f5ffd5b5f6020828403121561558d575f5ffd5b8135610b0781615569565b5f8151808452602084019350602083015f5b828110156155c85781518652602095860195909101906001016155aa565b5093949350505050565b602081525f610b076020830184615598565b5f5f604083850312156155f5575f5ffd5b823561560081615569565b915060208301358015158114615614575f5ffd5b809150509250929050565b5f5f5f5f60808587031215615632575f5ffd5b5050823594602084013594506040840135936060013592509050565b5f5f5f60408486031215615660575f5ffd5b8335925060208401356001600160401b0381111561567c575f5ffd5b6156888682870161545b565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156156d1576156d1615695565b604052919050565b5f6001600160401b038211156156f1576156f1615695565b5060051b60200190565b5f82601f83011261570a575f5ffd5b813561571d615718826156d9565b6156a9565b8082825260208201915060208360051b86010192508583111561573e575f5ffd5b602085015b8381101561576457803561575681615569565b835260209283019201615743565b5095945050505050565b5f82601f83011261577d575f5ffd5b813561578b615718826156d9565b8082825260208201915060208360051b8601019250858311156157ac575f5ffd5b602085015b838110156157645780358352602092830192016157b1565b80356157d481615569565b919050565b5f5f5f5f5f5f60c087890312156157ee575f5ffd5b86356001600160401b03811115615803575f5ffd5b61580f89828a016156fb565b96505060208701356001600160401b0381111561582a575f5ffd5b61583689828a0161576e565b95505060408701356001600160401b03811115615851575f5ffd5b61585d89828a0161576e565b94505061586c606088016157c9565b92506080870135915060a08701356001600160401b0381111561588d575f5ffd5b61589989828a016156fb565b9150509295509295509295565b604081525f6158b86040830185615598565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156158eb575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156123b457808504811115615925576159256158f2565b600184161561593357908102905b60019390931c92800261590a565b5f8261594f57506001614d5e565b8161595b57505f614d5e565b8160018114615971576002811461597b57615997565b6001915050614d5e565b60ff84111561598c5761598c6158f2565b50506001821b614d5e565b5060208310610133831016604e8410600b84101617156159ba575081810a614d5e565b6159c65f198484615906565b805f19048211156159d9576159d96158f2565b029392505050565b5f610b078383615941565b8082028115828204841417614d5e57614d5e6158f2565b5f82615a1d57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115614d5e57614d5e6158f2565b81810381811115614d5e57614d5e6158f2565b84815260606020820181905281018390525f6001600160fb1b03841115615a6d575f5ffd5b8360051b80866080850137604083019390935250016080019392505050565b838152606060208201525f615aa46060830185615598565b9050826040830152949350505050565b848152608060208201525f615acc6080830186615598565b8281036040840152845180825260208087019201905f5b81811015615b035783511515835260209384019390920191600101615ae3565b50506060939093019390935250949350505050565b5f60208284031215615b28575f5ffd5b815160ff81168114610b07575f5ffd5b606081525f615b4a6060830186615598565b6020830194909452506040015291905056fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081c000a", + "nonce": "0xdb", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4cd1f0d98ac1019e733e14c957c8707ebd59888857af3742dff240179e078612", + "transactionType": "CREATE", + "contractName": "LPToken", + "contractAddress": "0x5b9b00e3ccb5b4bb77cb398c539afb69ebbead96", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x1debc9", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50611a4a8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638da5cb5b1161012a578063ce7c2ac2116100b4578063f2fde38b11610079578063f2fde38b146104d7578063f476d145146104ea578063f5eb42dc146104fd578063f9bdea4214610510578063fd71a23714610523575f5ffd5b8063ce7c2ac21461044e578063d914cd4b1461046d578063da76ed9314610480578063dd62ed3e1461048c578063e468688e146104c4575f5ffd5b8063a457c2d7116100fa578063a457c2d7146103f9578063a9059cbb1461040c578063adc7ea371461041f578063b84c824614610432578063c18e2a5c14610445575f5ffd5b80638da5cb5b146103825780638fcb4e5b146103bc57806395d89b41146103cf578063a4063dbc146103d7575f5ffd5b80633b7d0946116101ab5780635c5d44171161017b5780635c5d4417146103385780636d7804591461034157806370a0823114610354578063715018a614610367578063853c637d1461036f575f5ffd5b80633b7d0946146102d55780634cd88b76146102e8578063528c198a146102fb57806355b6ed5c1461030e575f5ffd5b806323b872dd116101f157806323b872dd14610283578063313ce5671461029657806333fce74b146102a557806339509351146102ba5780633a98ef39146102cd575f5ffd5b806306fdde0314610222578063095ea7b3146102405780630e15561a1461026357806318160ddd1461027a575b5f5ffd5b61022a610536565b60405161023791906115dc565b60405180910390f35b61025361024e36600461163d565b6105c6565b6040519015158152602001610237565b61026c60025481565b604051908152602001610237565b61026c60015481565b610253610291366004611665565b6105dc565b60405160128152602001610237565b6102b86102b336600461163d565b6105fd565b005b6102536102c836600461163d565b610617565b61026c5f5481565b6102b86102e336600461169f565b610660565b6102b86102f6366004611757565b61071c565b6102b861030936600461163d565b610845565b61026c61031c3660046117bc565b600460209081525f928352604080842090915290825290205481565b61026c60065481565b61026c61034f366004611665565b61087d565b61026c61036236600461169f565b6108b4565b6102b86108d5565b6102b861037d3660046117ed565b6108e8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610237565b61026c6103ca36600461163d565b6108f6565b61022a610921565b6102536103e536600461169f565b60056020525f908152604090205460ff1681565b61025361040736600461163d565b610930565b61025361041a36600461163d565b6109b7565b6102b861042d3660046117ed565b6109c3565b6102b8610440366004611804565b610a53565b61026c60075481565b61026c61045c36600461169f565b60036020525f908152604090205481565b6102b861047b36600461169f565b610a97565b61026c6402540be40081565b61026c61049a3660046117bc565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b6102b86104d23660046117ed565b610b78565b6102b86104e536600461169f565b610cd9565b61026c6104f83660046117ed565b610d16565b61026c61050b36600461169f565b610d45565b61026c61051e3660046117ed565b610d62565b6102b86105313660046117ed565b610d81565b60606008805461054590611836565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611836565b80156105bc5780601f10610593576101008083540402835291602001916105bc565b820191905f5260205f20905b81548152906001019060200180831161059f57829003601f168201915b5050505050905090565b5f6105d2338484610e95565b5060015b92915050565b5f6105e8843384610fa1565b6105f384848461100e565b5060019392505050565b610608823383610fa1565b6106128282611031565b505050565b335f8181526004602090815260408083206001600160a01b03871684529091528120805491926105d292909186918691908690610655908490611882565b925050819055610e95565b610668611190565b6001600160a01b0381165f9081526005602052604090205460ff166106d45760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20706f6f6c20646f65736e2774206578697374000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f81815260056020526040808220805460ff19169055517f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f9190a250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156107615750825b90505f8267ffffffffffffffff16600114801561077d5750303b155b90508115801561078b575080155b156107a95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107d357845460ff60401b1916600160401b1785555b60086107df88826118e0565b5060096107ec87826118e0565b506107f6336111eb565b831561083c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b335f9081526005602052604090205460ff166108735760405162461bcd60e51b81526004016106cb9061199b565b61061282826111fc565b5f5f61088883610d62565b9050610895853383610fa1565b6108a0858585611328565b6108ac8585838661147b565b949350505050565b6001600160a01b0381165f908152600360205260408120546105d690610d62565b6108dd611190565b6108e65f61151b565b565b6108f23382611031565b5050565b5f610902338484611328565b5f61090c83610d62565b905061091a3385838661147b565b9392505050565b60606009805461054590611836565b335f9081526004602090815260408083206001600160a01b0386168452909152812054828110156109a35760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a414c4c4f57414e43455f42454c4f575f5a45524f0000000060448201526064016106cb565b6105f333856109b286856119c5565b610e95565b5f6105d233848461100e565b6109cb611190565b6402540be4008110610a175760405162461bcd60e51b81526020600482015260156024820152744c50546f6b656e3a206f7574206f662072616e676560581b60448201526064016106cb565b60068190556040518181527f11e3209d0ae07ce8613db0c067c493a7230fca326aaae2383e09cf738d923871906020015b60405180910390a150565b610a5b611190565b6009610a6782826118e0565b507fd7ac43020a860396b99c06d6cea4b050bef19c5c43f9a8bd3932066c60e11c4e81604051610a4891906115dc565b610a9f611190565b6001600160a01b038116610ac55760405162461bcd60e51b81526004016106cb906119d8565b6001600160a01b0381165f9081526005602052604090205460ff1615610b2d5760405162461bcd60e51b815260206004820152601e60248201527f4c50546f6b656e3a20706f6f6c20697320616c7265616479206164646564000060448201526064016106cb565b6001600160a01b0381165f81815260056020526040808220805460ff19166001179055517f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69190a250565b335f9081526005602052604090205460ff16610ba65760405162461bcd60e51b81526004016106cb9061199b565b805f03610bea5760405162461bcd60e51b81526020600482015260126024820152711314151bdad95b8e881b9bc8185b5bdd5b9d60721b60448201526064016106cb565b5f6402540be40082600654610bff9190611a07565b610c099190611a1e565b90505f610c1682846119c5565b90508060015f828254610c299190611882565b925050819055508060025f828254610c419190611882565b925050819055508160075f828254610c599190611882565b90915550506007546040805184815260208101929092527fa5e8bf15c46a47065bbdc3023e67f56cb553e0bdbc3076775f41fb63240b863c910160405180910390a160408051848152602081018390527f9149335f0abe9ee631f35156bcb8e266e1eab4f22242f2e07707e4c1cdbec3ce910160405180910390a1505050565b610ce1611190565b6001600160a01b038116610d0a57604051631e4fbdf760e01b81525f60048201526024016106cb565b610d138161151b565b50565b5f6001545f03610d2757505f919050565b6001545f54610d369084611a07565b6105d69190611a1e565b919050565b6001600160a01b0381165f908152600360205260408120546105d6565b5f5f545f03610d7257505f919050565b5f54600154610d369084611a07565b335f9081526005602052604090205460ff16610daf5760405162461bcd60e51b81526004016106cb9061199b565b805f03610df35760405162461bcd60e51b81526020600482015260126024820152711314151bdad95b8e881b9bc8185b5bdd5b9d60721b60448201526064016106cb565b600754811115610e455760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20696e737566666369656e7420627566666572000000000060448201526064016106cb565b8060075f828254610e5691906119c5565b90915550506007546040805183815260208101929092527f41f7a6194921888a19dff325a631c0f2f64415d7825efdeb68a4e8ab0635b6209101610a48565b6001600160a01b038316610eeb5760405162461bcd60e51b815260206004820152601f60248201527f4c50546f6b656e3a20415050524f56455f46524f4d5f5a45524f5f414444520060448201526064016106cb565b6001600160a01b038216610f415760405162461bcd60e51b815260206004820152601d60248201527f4c50546f6b656e3a20415050524f56455f544f5f5a45524f5f4144445200000060448201526064016106cb565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038084165f908152600460209081526040808320938616835292905220545f1981146110085781811015610ff95760405163054365bb60e31b815260048101829052602481018390526044016106cb565b61100884846109b285856119c5565b50505050565b5f61101882610d16565b9050611025848483611328565b6110088484848461147b565b5f6001600160a01b0383166110885760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a204255524e5f46524f4d5f5a45524f5f414444520000000060448201526064016106cb565b6001600160a01b0383165f908152600360205260408120546110a990610d62565b9050808311156110d65760405163cf47918160e01b815260048101829052602481018490526044016106cb565b5f6110e084610d16565b6001600160a01b0386165f9081526003602052604081208054929350839290919061110c9084906119c5565b92505081905550805f5f82825461112391906119c5565b925050819055505f5492508360015f82825461113f91906119c5565b909155505060408051858152602081018390526001600160a01b038716917f9228b7e435f7ca9ea03da268ef3e8d57d72b10fd771f32c7a2eb095fb58f6897910160405180910390a2505092915050565b336111c27f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108e65760405163118cdaa760e01b81523360048201526024016106cb565b6111f361158b565b610d13816115d4565b5f6001600160a01b0383166112535760405162461bcd60e51b815260206004820152601a60248201527f4c50546f6b656e3a204d494e545f544f5f5a45524f5f4144445200000000000060448201526064016106cb565b5f6001545f1415801561126657505f5415155b1561127b5761127483610d16565b905061127e565b50815b6001600160a01b0384165f90815260036020526040812080548392906112a5908490611882565b92505081905550805f5f8282546112bc9190611882565b925050819055505f5491508260015f8282546112d89190611882565b909155505060408051848152602081018390526001600160a01b038616917fd5103f333769455df788908e17b0f6f83838ebeae2cd1ed6f23ec20dad88c9a3910160405180910390a25092915050565b6001600160a01b03831661134e5760405162461bcd60e51b81526004016106cb906119d8565b6001600160a01b0382166113745760405162461bcd60e51b81526004016106cb906119d8565b306001600160a01b038316036113da5760405162461bcd60e51b815260206004820152602560248201527f4c50546f6b656e3a205452414e534645525f544f5f6c70546f6b656e5f434f4e60448201526415149050d560da1b60648201526084016106cb565b6001600160a01b0383165f908152600360205260409020548082111561141d5760405163cf47918160e01b815260048101829052602481018390526044016106cb565b6001600160a01b0384165f90815260036020526040812080548492906114449084906119c5565b90915550506001600160a01b0383165f9081526003602052604081208054849290611470908490611882565b909155505050505050565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c091815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb8360405161150d91815260200190565b60405180910390a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108e657604051631afcd79f60e31b815260040160405180910390fd5b610ce161158b565b602081525f82518060208401525f5b8181101561160857602081860181015160408684010152016115eb565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610d40575f5ffd5b5f5f6040838503121561164e575f5ffd5b61165783611627565b946020939093013593505050565b5f5f5f60608486031215611677575f5ffd5b61168084611627565b925061168e60208501611627565b929592945050506040919091013590565b5f602082840312156116af575f5ffd5b61091a82611627565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126116db575f5ffd5b813567ffffffffffffffff8111156116f5576116f56116b8565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611724576117246116b8565b60405281815283820160200185101561173b575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611768575f5ffd5b823567ffffffffffffffff81111561177e575f5ffd5b61178a858286016116cc565b925050602083013567ffffffffffffffff8111156117a6575f5ffd5b6117b2858286016116cc565b9150509250929050565b5f5f604083850312156117cd575f5ffd5b6117d683611627565b91506117e460208401611627565b90509250929050565b5f602082840312156117fd575f5ffd5b5035919050565b5f60208284031215611814575f5ffd5b813567ffffffffffffffff81111561182a575f5ffd5b6108ac848285016116cc565b600181811c9082168061184a57607f821691505b60208210810361186857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105d6576105d661186e565b601f82111561061257805f5260205f20601f840160051c810160208510156118ba5750805b601f840160051c820191505b818110156118d9575f81556001016118c6565b5050505050565b815167ffffffffffffffff8111156118fa576118fa6116b8565b61190e816119088454611836565b84611895565b6020601f821160018114611940575f83156119295750848201515b5f19600385901b1c1916600184901b1784556118d9565b5f84815260208120601f198516915b8281101561196f578785015182556020948501946001909201910161194f565b508482101561198c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60208082526010908201526f1314151bdad95b8e881b9bc81c1bdbdb60821b604082015260600190565b818103818111156105d6576105d661186e565b6020808252601590820152744c50546f6b656e3a207a65726f206164647265737360581b604082015260600190565b80820281158282048414176105d6576105d661186e565b5f82611a3857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", + "nonce": "0xdc", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf80c957117a3d66fe58df0d7fa8ffd726c8aa7816ad259af5a8cd10bd0fc613f", + "transactionType": "CREATE", + "contractName": "WLPToken", + "contractAddress": "0x640959ecedb9ca512af716a1f770fffd3df81774", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x1c98a6", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506119148061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106101a1575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb7714610391578063d905777e146103a4578063dd62ed3e146103b7578063ef8b30f7146103ca575f5ffd5b8063c4d66de814610369578063c63d75b6146102a3578063c6e6f5921461037e575f5ffd5b8063a9059cbb116100ce578063a9059cbb1461031d578063b3d7f6b914610330578063b460af9414610343578063ba08765214610356575f5ffd5b806370a08231146102ef57806394bf804d1461030257806395d89b4114610315575f5ffd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102a35780634cdad506146102b75780635fcbd285146102ca5780636e553f65146102dc575f5ffd5b806323b872dd14610245578063313ce5671461025857806338d52e0f14610272575f5ffd5b806301e1d114146101a557806306fdde03146101c057806307a2d13a146101d5578063095ea7b3146101e85780630a28a4771461020b57806318160ddd1461021e575b5f5ffd5b6101ad6103dd565b6040519081526020015b60405180910390f35b6101c861044c565b6040516101b79190611419565b6101ad6101e336600461144b565b61050c565b6101fb6101f6366004611476565b61057e565b60405190151581526020016101b7565b6101ad61021936600461144b565b610595565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101ad565b6101fb6102533660046114a0565b6105a1565b6102606105c6565b60405160ff90911681526020016101b7565b5f5160206118e85f395f51905f52546001600160a01b03165b6040516001600160a01b0390911681526020016101b7565b6101ad6102b13660046114de565b505f1990565b6101ad6102c536600461144b565b6105f5565b5f5461028b906001600160a01b031681565b6101ad6102ea3660046114f9565b610600565b6101ad6102fd3660046114de565b6106ad565b6101ad6103103660046114f9565b6106d3565b6101c8610704565b6101fb61032b366004611476565b610742565b6101ad61033e36600461144b565b61074f565b6101ad610351366004611527565b61075b565b6101ad610364366004611527565b610890565b61037c6103773660046114de565b61094d565b005b6101ad61038c36600461144b565b610ac7565b6101ad61039f3660046114de565b610af8565b6101ad6103b23660046114de565b610b0b565b6101ad6103c5366004611566565b610b15565b6101ad6103d836600461144b565b610b5e565b5f80546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610423573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104479190611592565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206118c85f395f51905f529161048a906115a9565b80601f01602080910402602001604051908101604052809291908181526020018280546104b6906115a9565b80156105015780601f106104d857610100808354040283529160200191610501565b820191905f5260205f20905b8154815290600101906020018083116104e457829003601f168201915b505050505091505090565b5f8054604051637cdef52160e11b8152600481018490526001600160a01b039091169063f9bdea42906024015b602060405180830381865afa158015610554573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105789190611592565b92915050565b5f3361058b818585610b69565b5060019392505050565b5f610578826001610b7b565b5f336105ae858285610bd2565b6105b9858585610c35565b60019150505b9392505050565b5f805f5160206118e85f395f51905f5290505f81546105ef9190600160a01b900460ff166115f5565b91505090565b5f610578825f610c92565b5f5f831161062157604051631f2a200560e01b815260040160405180910390fd5b61062a83610ac7565b5f546040516323b872dd60e01b8152336004820152306024820152604481018690529192506001600160a01b0316906323b872dd906064016020604051808303815f875af115801561067e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a2919061160e565b506105788282610ce0565b6001600160a01b03165f9081525f5160206118c85f395f51905f52602052604090205490565b5f5f196106e4565b60405180910390fd5b5f6106ee8561074f565b90506106fc33858388610d18565b949350505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206118c85f395f51905f529161048a906115a9565b5f3361058b818585610c35565b5f610578826001610c92565b5f5f841161077c57604051631f2a200560e01b815260040160405180910390fd5b61078584610ac7565b9050336001600160a01b0383161461080a575f6107a28333610b15565b9050818110156107f45760405162461bcd60e51b815260206004820152601f60248201527f455243343632363a20696e73756666696369656e7420616c6c6f77616e63650060448201526064016106db565b6108088333610803858561162d565b610b69565b505b6108148282610da4565b5f5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529091169063a9059cbb906044015b6020604051808303815f875af1158015610864573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610888919061160e565b509392505050565b5f5f84116108b157604051631f2a200560e01b815260040160405180910390fd5b6108ba8461050c565b9050336001600160a01b0383161461090b575f6108d78333610b15565b9050848110156108fa576040516313be252b60e01b815260040160405180910390fd5b6109098333610803888561162d565b505b6109158285610da4565b5f5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb90604401610848565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156109925750825b90505f8267ffffffffffffffff1660011480156109ae5750303b155b9050811580156109bc575080155b156109da5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a0457845460ff60401b1916600160401b1785555b610a566040518060400160405280601081526020016f2bb930b83832b2102628102a37b5b2b760811b815250604051806040016040528060088152602001673bb6382a37b5b2b760c11b815250610dd8565b610a5f86610dea565b5f80546001600160a01b0319166001600160a01b0388161790558315610abf57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f805460405163f476d14560e01b8152600481018490526001600160a01b039091169063f476d14590602401610539565b5f610578610b05836106ad565b5f610c92565b5f610578826106ad565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610578825f610b7b565b610b768383836001610dfe565b505050565b5f6105bf610b8a82600a611723565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bb69190611731565b610bbe6103dd565b610bc9906001611731565b85919085610ed9565b5f610bdd8484610b15565b90505f198114610c2f5781811015610c2157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106db565b610c2f84848484035f610dfe565b50505050565b6001600160a01b038316610c5e57604051634b637e8f60e11b81525f60048201526024016106db565b6001600160a01b038216610c875760405163ec442f0560e01b81525f60048201526024016106db565b610b76838383610f24565b5f6105bf610c9e6103dd565b610ca9906001611731565b610cb45f600a611723565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bc99190611731565b6001600160a01b038216610d095760405163ec442f0560e01b81525f60048201526024016106db565b610d145f8383610f24565b5050565b5f5160206118e85f395f51905f528054610d3d906001600160a01b031686308661105d565b610d478483610ce0565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051610d95929190918252602082015260400190565b60405180910390a35050505050565b6001600160a01b038216610dcd57604051634b637e8f60e11b81525f60048201526024016106db565b610d14825f83610f24565b610de06110b7565b610d148282611102565b610df26110b7565b610dfb81611152565b50565b5f5160206118c85f395f51905f526001600160a01b038516610e355760405163e602df0560e01b81525f60048201526024016106db565b6001600160a01b038416610e5e57604051634a1406b160e11b81525f60048201526024016106db565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115610ed257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d9591815260200190565b5050505050565b5f610f06610ee6836111c2565b8015610f0157505f8480610efc57610efc611744565b868809115b151590565b610f118686866111ee565b610f1b9190611731565b95945050505050565b5f5160206118c85f395f51905f526001600160a01b038416610f5e5781816002015f828254610f539190611731565b90915550610fce9050565b6001600160a01b0384165f9081526020829052604090205482811015610fb05760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016106db565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316610fec57600281018054839003905561100a565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161104f91815260200190565b60405180910390a350505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c2f9085906112a4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661110057604051631afcd79f60e31b815260040160405180910390fd5b565b61110a6110b7565b5f5160206118c85f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361114384826117b0565b5060048101610c2f83826117b0565b61115a6110b7565b5f5160206118e85f395f51905f525f8061117384611310565b9150915081611183576012611185565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f60028260038111156111d7576111d761186b565b6111e1919061187f565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036112225783828161121857611218611744565b04925050506105bf565b8084116112395761123960038515026011186113e6565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f60205f8451602086015f885af1806112c3576040513d5f823e3d81fd5b50505f513d915081156112da5780600114156112e7565b6001600160a01b0384163b155b15610c2f57604051635274afe760e01b81526001600160a01b03851660048201526024016106db565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b03871691611356916118ac565b5f60405180830381855afa9150503d805f811461138e576040519150601f19603f3d011682016040523d82523d5f602084013e611393565b606091505b50915091508180156113a757506020815110155b156113da575f818060200190518101906113c19190611592565b905060ff81116113d8576001969095509350505050565b505b505f9485945092505050565b634e487b715f52806020526024601cfd5b5f5b838110156114115781810151838201526020016113f9565b50505f910152565b602081525f82518060208401526114378160408501602087016113f7565b601f01601f19169190910160400192915050565b5f6020828403121561145b575f5ffd5b5035919050565b6001600160a01b0381168114610dfb575f5ffd5b5f5f60408385031215611487575f5ffd5b823561149281611462565b946020939093013593505050565b5f5f5f606084860312156114b2575f5ffd5b83356114bd81611462565b925060208401356114cd81611462565b929592945050506040919091013590565b5f602082840312156114ee575f5ffd5b81356105bf81611462565b5f5f6040838503121561150a575f5ffd5b82359150602083013561151c81611462565b809150509250929050565b5f5f5f60608486031215611539575f5ffd5b83359250602084013561154b81611462565b9150604084013561155b81611462565b809150509250925092565b5f5f60408385031215611577575f5ffd5b823561158281611462565b9150602083013561151c81611462565b5f602082840312156115a2575f5ffd5b5051919050565b600181811c908216806115bd57607f821691505b6020821081036115db57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610578576105786115e1565b5f6020828403121561161e575f5ffd5b815180151581146105bf575f5ffd5b81810381811115610578576105786115e1565b6001815b600184111561167b5780850481111561165f5761165f6115e1565b600184161561166d57908102905b60019390931c928002611644565b935093915050565b5f8261169157506001610578565b8161169d57505f610578565b81600181146116b357600281146116bd576116d9565b6001915050610578565b60ff8411156116ce576116ce6115e1565b50506001821b610578565b5060208310610133831016604e8410600b84101617156116fc575081810a610578565b6117085f198484611640565b805f190482111561171b5761171b6115e1565b029392505050565b5f6105bf60ff841683611683565b80820180821115610578576105786115e1565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b601f821115610b7657805f5260205f20601f840160051c810160208510156117915750805b601f840160051c820191505b81811015610ed2575f815560010161179d565b815167ffffffffffffffff8111156117ca576117ca611758565b6117de816117d884546115a9565b8461176c565b6020601f821160018114611810575f83156117f95750848201515b5f19600385901b1c1916600184901b178455610ed2565b5f84815260208120601f198516915b8281101561183f578785015182556020948501946001909201910161181f565b508482101561185c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061189d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82516118bd8184602087016113f7565b919091019291505056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a164736f6c634300081c000a", + "nonce": "0xdd", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "function": null, + "arguments": [ + "0x10172bCC93a7fBde0EC4318e4aAb2211F8858c17", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c520", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a00000000000000000000000010172bcc93a7fbde0ec4318e4aab2211f8858c1700000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xde", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "function": null, + "arguments": [ + "0x5B9b00E3CCb5b4BB77cB398c539Afb69EbbeaD96", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c510", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a0000000000000000000000005b9b00e3ccb5b4bb77cb398c539afb69ebbead9600000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xdf", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "function": null, + "arguments": [ + "0x640959eCEdb9Ca512aF716a1f770Fffd3Df81774", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c520", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000640959ecedb9ca512af716a1f770fffd3df8177400000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xe0", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x97884dada719ab2a4d04fc19b6b926d67ea7a687ad6cc7ec68249038da596846", + "transactionType": "CREATE", + "contractName": "ConstantExchangeRateProvider", + "contractAddress": "0xeb47d13e805c64d00e9ea0b3eee5a02a69df8138", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x17c02", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50606380601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b670de0b6b3a7640000603756fea164736f6c634300081c000a", + "nonce": "0xe1", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3436de2f09a2ae216b0d6f77cbeb0897d46496d063869f57bc279619e8cbda7a", + "transactionType": "CREATE", + "contractName": "SelfPeggingAssetFactory", + "contractAddress": "0x2bd95ae42d848ac93f6fa2a4b988af5a32e6ada9", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x35c87c", + "value": "0x0", + "input": "0x60a0604052306080523480156012575f5ffd5b5060805161300a6100395f395f818161163f0152818161166801526117ac015261300a5ff3fe608060405260043610610131575f3560e01c80638da5cb5b116100a8578063b86bc2a21161006d578063b86bc2a21461034c578063c42cf5351461036b578063eddd0d9c1461038a578063ee919d50146103a9578063f2fde38b146103c8578063f446c1d0146103e7575f5ffd5b80638da5cb5b14610280578063965fa21e146102bc578063a17fcbc8146102d1578063ab0d433c146102f0578063ad3cb1cc1461030f575f5ffd5b80634f1ef286116100f95780634f1ef286146101f257806352d1902d1461020557806354cf2aeb146102195780635d841af51461022e5780636cd243381461024d578063715018a61461026c575f5ffd5b80630208fedc146101355780630810a132146101565780630c340a241461019257806313966db5146101b057806334e19907146101d3575b5f5ffd5b348015610140575f5ffd5b5061015461014f366004611af7565b6103fc565b005b348015610161575f5ffd5b50600854610175906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019d575f5ffd5b505f54610175906001600160a01b031681565b3480156101bb575f5ffd5b506101c560015481565b604051908152602001610189565b3480156101de575f5ffd5b506101546101ed366004611b89565b6106d6565b610154610200366004611c71565b61071a565b348015610210575f5ffd5b506101c5610739565b348015610224575f5ffd5b506101c560025481565b348015610239575f5ffd5b50610154610248366004611b89565b610754565b348015610258575f5ffd5b50600654610175906001600160a01b031681565b348015610277575f5ffd5b50610154610791565b34801561028b575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610175565b3480156102c7575f5ffd5b506101c560035481565b3480156102dc575f5ffd5b50600554610175906001600160a01b031681565b3480156102fb575f5ffd5b5061015461030a366004611cfd565b6107a4565b34801561031a575f5ffd5b5061033f604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101899190611e48565b348015610357575f5ffd5b50600754610175906001600160a01b031681565b348015610376575f5ffd5b50610154610385366004611e5a565b611460565b348015610395575f5ffd5b506101546103a4366004611b89565b6114dc565b3480156103b4575f5ffd5b506101546103c3366004611b89565b611519565b3480156103d3575f5ffd5b506101546103e2366004611e5a565b611576565b3480156103f2575f5ffd5b506101c560045481565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156104415750825b90505f8267ffffffffffffffff16600114801561045d5750303b155b90508115801561046b575080155b156104895760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104b357845460ff60401b1916600160401b1785555b6001600160a01b038e166104da5760405163e6c4247b60e01b815260040160405180910390fd5b5f8a116104fa57604051632a9ffab760e21b815260040160405180910390fd5b6001600160a01b0389166105215760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0388166105485760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03871661056f5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166105965760405163e6c4247b60e01b815260040160405180910390fd5b61059e6115b8565b6105a7336115c8565b8d5f5f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508860055f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508760065f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508660075f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560085f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508c6001819055508b6002819055508a6003819055508960048190555083156106c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050505050565b6106de6115d9565b60028190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb8906020015b60405180910390a150565b610722611634565b61072b826116d8565b61073582826116e0565b5050565b5f6107426117a1565b505f516020612fde5f395f51905f5290565b61075c6115d9565b60038190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc10849060200161070f565b6107996115d9565b6107a25f6117ea565b565b80516001600160a01b03166107cc5760405163e6c4247b60e01b815260040160405180910390fd5b60208101516001600160a01b03166107f75760405163e6c4247b60e01b815260040160405180910390fd5b80602001516001600160a01b0316815f01516001600160a01b03160361083057604051632a9ffab760e21b815260040160405180910390fd5b5f815f01516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561086f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108969190810190611e75565b90505f82602001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156108d8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ff9190810190611e75565b90505f826040516020016109139190611ee7565b60408051601f198184030181529082905261093091602001611f12565b60408051601f198184030181529082905261094f918490602001611f36565b60405160208183030381529060405290505f836040516020016109729190611f64565b60408051601f198184030181529082905261098f91602001611f9e565b60408051601f19818403018152908290526109ae918590602001611f36565b60405160208183030381529060405290505f81836040516024016109d3929190611fc2565b60408051601f198184030181529181526020820180516001600160e01b031663266c45bb60e11b17905260065490519192505f916001600160a01b03909116908390610a1e90611aac565b610a29929190611fe6565b604051809103905ff080158015610a42573d5f5f3e3d5ffd5b506040805160018082528183019092529192505f91906020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750505f805485519394506001600160a01b031692859250610aa757610aa7612011565b6001600160a01b0392831660209182029290920101525f80548351921691839190610ad457610ad4612011565b6001600160a01b03929092166020928302919091018201526040805160028082526060820183525f93919290918301908036833750506040805160028082526060820183529394505f93909250906020830190803683375050604080516003808252608082019092529293505f929150602082016060803683370190505090508b5f0151835f81518110610b6a57610b6a612011565b60200260200101906001600160a01b031690816001600160a01b0316815250508b6020015183600181518110610ba257610ba2612011565b60200260200101906001600160a01b031690816001600160a01b0316815250508b5f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c259190612025565b610c30906012612059565b610c3b90600a612155565b825f81518110610c4d57610c4d612011565b6020026020010181815250508b602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbd9190612025565b610cc8906012612059565b610cd390600a612155565b82600181518110610ce657610ce6612011565b602002602001018181525050600154815f81518110610d0757610d07612011565b60200260200101818152505060025481600181518110610d2957610d29612011565b60200260200101818152505060035481600281518110610d4b57610d4b612011565b6020908102919091010152604080516002808252606082019092525f918160200160208202803683370190505090505f8d604001516003811115610d9157610d91612163565b1480610db2575060028d604001516003811115610db057610db0612163565b145b15610dfd5760085481516001600160a01b039091169082905f90610dd857610dd8612011565b60200260200101906001600160a01b031690816001600160a01b031681525050610f70565b60018d604001516003811115610e1557610e15612163565b03610ee15760608d01516001600160a01b0316610e4557604051639589a27d60e01b815260040160405180910390fd5b5f8d608001515111610e6a576040516314ca5b9760e31b815260040160405180910390fd5b5f8d606001518e60800151604051610e8190611ab9565b610e8c929190611fe6565b604051809103905ff080158015610ea5573d5f5f3e3d5ffd5b50905080825f81518110610ebb57610ebb612011565b60200260200101906001600160a01b031690816001600160a01b03168152505050610f70565b60038d604001516003811115610ef957610ef9612163565b03610f70575f8d5f0151604051610f0f90611ac6565b6001600160a01b039091168152602001604051809103905ff080158015610f38573d5f5f3e3d5ffd5b50905080825f81518110610f4e57610f4e612011565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8d60a001516003811115610f8757610f87612163565b1480610fa8575060028d60a001516003811115610fa657610fa6612163565b145b15610ff65760085481516001600160a01b039091169082906001908110610fd157610fd1612011565b60200260200101906001600160a01b031690816001600160a01b03168152505061116c565b60018d60a00151600381111561100e5761100e612163565b036110db5760c08d01516001600160a01b031661103e57604051639589a27d60e01b815260040160405180910390fd5b5f8d60e001515111611063576040516314ca5b9760e31b815260040160405180910390fd5b5f8d60c001518e60e0015160405161107a90611ab9565b611085929190611fe6565b604051809103905ff08015801561109e573d5f5f3e3d5ffd5b50905080826001815181106110b5576110b5612011565b60200260200101906001600160a01b031690816001600160a01b0316815250505061116c565b60038d60a0015160038111156110f3576110f3612163565b0361116c575f8d6020015160405161110a90611ac6565b6001600160a01b039091168152602001604051809103905ff080158015611133573d5f5f3e3d5ffd5b509050808260018151811061114a5761114a612011565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8484848a6004548660405160240161118a969594939291906121ea565b60408051601f198184030181529181526020820180516001600160e01b031663bf9dddad60e01b17905260055490519192505f916001600160a01b039091169083906111d590611aac565b6111e0929190611fe6565b604051809103905ff0801580156111f9573d5f5f3e3d5ffd5b505f54604051632585eee960e11b81526001600160a01b0391821660048201526001602482015291925082918b91831690634b0bddd2906044015f604051808303815f87803b15801561124a575f5ffd5b505af115801561125c573d5f5f3e3d5ffd5b50505f5460405163f2fde38b60e01b81526001600160a01b039182166004820152908516925063f2fde38b91506024015f604051808303815f87803b1580156112a3575f5ffd5b505af11580156112b5573d5f5f3e3d5ffd5b505060405163d914cd4b60e01b81526001600160a01b0385811660048301528416925063d914cd4b91506024015f604051808303815f87803b1580156112f9575f5ffd5b505af115801561130b573d5f5f3e3d5ffd5b50505f5460405163f2fde38b60e01b81526001600160a01b039182166004820152908416925063f2fde38b91506024015f604051808303815f87803b158015611352575f5ffd5b505af1158015611364573d5f5f3e3d5ffd5b50506040516001600160a01b03841660248201525f9250604401905060408051601f198184030181529181526020820180516001600160e01b031663189acdbd60e31b17905260075490519192505f916001600160a01b039091169083906113cb90611aac565b6113d6929190611fe6565b604051809103905ff0801580156113ef573d5f5f3e3d5ffd5b5090507f9c5d829b9b23efc461f9aeef91979ec04bb903feb3bee4f26d22114abfc7335b8d8683604051611443939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60405180910390a150505050505050505050505050505050505050565b6114686115d9565b6001600160a01b03811661148f5760405163e6c4247b60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fb607f57f46e59880ba44c1571bc4aef5ef0e09f8a981adddbfb3dd1189d356839060200161070f565b6114e46115d9565b60018190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e8554689060200161070f565b6115216115d9565b5f811161154157604051632a9ffab760e21b815260040160405180910390fd5b60048190556040518181527f408aa8ab61e953b559cf60fcd74348414e42226217aaec52f5eaa420a0949a799060200161070f565b61157e6115d9565b6001600160a01b0381166115ac57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6115b5816117ea565b50565b6115c061185a565b6107a26118a3565b6115d061185a565b6115b5816118d1565b3361160b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107a25760405163118cdaa760e01b81523360048201526024016115a3565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806116ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166116ae5f516020612fde5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156107a25760405163703e46dd60e11b815260040160405180910390fd5b6115b56115d9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561173a575060408051601f3d908101601f191682019092526117379181019061228b565b60015b61176257604051634c9c8ce360e01b81526001600160a01b03831660048201526024016115a3565b5f516020612fde5f395f51905f52811461179257604051632a87526960e21b8152600481018290526024016115a3565b61179c83836118d9565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a25760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107a257604051631afcd79f60e31b815260040160405180910390fd5b6118ab61185a565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61157e61185a565b6118e28261192e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156119265761179c8282611991565b610735611a05565b806001600160a01b03163b5f0361196357604051634c9c8ce360e01b81526001600160a01b03821660048201526024016115a3565b5f516020612fde5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516119ad91906122a2565b5f60405180830381855af49150503d805f81146119e5576040519150601f19603f3d011682016040523d82523d5f602084013e6119ea565b606091505b50915091506119fa858383611a24565b925050505b92915050565b34156107a25760405163b398979f60e01b815260040160405180910390fd5b606082611a3957611a3482611a83565b611a7c565b8151158015611a5057506001600160a01b0384163b155b15611a7957604051639996b31560e01b81526001600160a01b03851660048201526024016115a3565b50805b9392505050565b805115611a935780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610572806122be83390190565b6106478061283083390190565b61016780612e7783390190565b6001600160a01b03811681146115b5575f5ffd5b8035611af281611ad3565b919050565b5f5f5f5f5f5f5f5f5f6101208a8c031215611b10575f5ffd5b8935611b1b81611ad3565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135611b4781611ad3565b935060c08a0135611b5781611ad3565b925060e08a0135611b6781611ad3565b91506101008a0135611b7881611ad3565b809150509295985092959850929598565b5f60208284031215611b99575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715611bd857611bd8611ba0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c0757611c07611ba0565b604052919050565b5f67ffffffffffffffff821115611c2857611c28611ba0565b50601f01601f191660200190565b5f611c48611c4384611c0f565b611bde565b9050828152838383011115611c5b575f5ffd5b828260208301375f602084830101529392505050565b5f5f60408385031215611c82575f5ffd5b8235611c8d81611ad3565b9150602083013567ffffffffffffffff811115611ca8575f5ffd5b8301601f81018513611cb8575f5ffd5b611cc785823560208401611c36565b9150509250929050565b803560048110611af2575f5ffd5b5f82601f830112611cee575f5ffd5b611a7c83833560208501611c36565b5f60208284031215611d0d575f5ffd5b813567ffffffffffffffff811115611d23575f5ffd5b82016101008185031215611d35575f5ffd5b611d3d611bb4565b611d4682611ae7565b8152611d5460208301611ae7565b6020820152611d6560408301611cd1565b6040820152611d7660608301611ae7565b6060820152608082013567ffffffffffffffff811115611d94575f5ffd5b611da086828501611cdf565b608083015250611db260a08301611cd1565b60a0820152611dc360c08301611ae7565b60c082015260e082013567ffffffffffffffff811115611de1575f5ffd5b611ded86828501611cdf565b60e083015250949350505050565b5f5b83811015611e15578181015183820152602001611dfd565b50505f910152565b5f8151808452611e34816020860160208601611dfb565b601f01601f19169290920160200192915050565b602081525f611a7c6020830184611e1d565b5f60208284031215611e6a575f5ffd5b8135611a7c81611ad3565b5f60208284031215611e85575f5ffd5b815167ffffffffffffffff811115611e9b575f5ffd5b8201601f81018413611eab575f5ffd5b8051611eb9611c4382611c0f565b818152856020838501011115611ecd575f5ffd5b611ede826020830160208601611dfb565b95945050505050565b635350412d60e01b81525f8251611f05816004850160208701611dfb565b9190910160040192915050565b5f8251611f23818460208701611dfb565b602d60f81b920191825250600101919050565b5f8351611f47818460208801611dfb565b835190830190611f5b818360208801611dfb565b01949350505050565b72029b2b633102832b3b3b4b7339020b9b9b2ba1606d1b81525f8251611f91816013850160208701611dfb565b9190910160130192915050565b5f8251611faf818460208701611dfb565b600160fd1b920191825250600101919050565b604081525f611fd46040830185611e1d565b8281036020840152611ede8185611e1d565b6001600160a01b03831681526040602082018190525f9061200990830184611e1d565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612035575f5ffd5b815160ff81168114611a7c575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156119ff576119ff612045565b6001815b60018411156120ad5780850481111561209157612091612045565b600184161561209f57908102905b60019390931c928002612076565b935093915050565b5f826120c3575060016119ff565b816120cf57505f6119ff565b81600181146120e557600281146120ef5761210b565b60019150506119ff565b60ff84111561210057612100612045565b50506001821b6119ff565b5060208310610133831016604e8410600b841016171561212e575081810a6119ff565b61213a5f198484612072565b805f190482111561214d5761214d612045565b029392505050565b5f611a7c60ff8416836120b5565b634e487b7160e01b5f52602160045260245ffd5b5f8151808452602084019350602083015f5b828110156121a7578151865260209586019590910190600101612189565b5093949350505050565b5f8151808452602084019350602083015f5b828110156121a75781516001600160a01b03168652602095860195909101906001016121c3565b60c080825287519082018190525f90602089019060e0840190835b8181101561222c5783516001600160a01b0316835260209384019390920191600101612205565b50508381036020850152612240818a612177565b91505082810360408401526122558188612177565b6001600160a01b0387166060850152905084608084015282810360a084015261227e81856121b1565b9998505050505050505050565b5f6020828403121561229b575f5ffd5b5051919050565b5f82516122b3818460208701611dfb565b919091019291505056fe60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a608060405234801561000f575f5ffd5b5060405161064738038061064783398101604081905261002e91610070565b5f80546001600160a01b0319166001600160a01b038416179055600161005482826101d8565b505050610292565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610081575f5ffd5b82516001600160a01b0381168114610097575f5ffd5b60208401519092506001600160401b038111156100b2575f5ffd5b8301601f810185136100c2575f5ffd5b80516001600160401b038111156100db576100db61005c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101095761010961005c565b604052818152828201602001871015610120575f5ffd5b5f5b8281101561013e57602081850181015183830182015201610122565b505f602083830101528093505050509250929050565b600181811c9082168061016857607f821691505b60208210810361018657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101d357805f5260205f20601f840160051c810160208510156101b15750805b601f840160051c820191505b818110156101d0575f81556001016101bd565b50505b505050565b81516001600160401b038111156101f1576101f161005c565b610205816101ff8454610154565b8461018c565b6020601f821160018114610237575f83156102205750848201515b5f19600385901b1c1916600184901b1784556101d0565b5f84815260208120601f198516915b828110156102665787850151825560209485019460019092019101610246565b508482101561028357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6103a88061029f5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80632b5136011461004e5780633ba0b9a9146100645780637dc0d1d01461006c578063bfa814b514610096575b5f5ffd5b60125b6040519081526020015b60405180910390f35b6100516100ab565b5f5461007e906001600160a01b031681565b6040516001600160a01b03909116815260200161005b565b61009e6101ab565b60405161005b9190610259565b5f5f60016040516020016100bf91906102c3565b60408051601f198184030181526004835260248301918290526100e191610369565b60408051918290039091206020830180516001600160e01b03166001600160e01b03199092169190911790525f805491519293509182916001600160a01b03169061012d908590610369565b5f60405180830381855afa9150503d805f8114610165576040519150601f19603f3d011682016040523d82523d5f602084013e61016a565b606091505b50915091508161018d576040516352760cdd60e01b815260040160405180910390fd5b5f818060200190518101906101a29190610384565b95945050505050565b600180546101b89061028b565b80601f01602080910402602001604051908101604052809291908181526020018280546101e49061028b565b801561022f5780601f106102065761010080835404028352916020019161022f565b820191905f5260205f20905b81548152906001019060200180831161021257829003601f168201915b505050505081565b5f5b83811015610251578181015183820152602001610239565b50505f910152565b602081525f8251806020840152610277816040850160208701610237565b601f01601f19169190910160400192915050565b600181811c9082168061029f57607f821691505b6020821081036102bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f5f83545f8160011c905060018216806102de57607f821691505b6020821081036102fc57634e487b7160e01b5f52602260045260245ffd5b808015610310576001811461032557610353565b60ff1984168752821515830287019450610353565b5f888152602090205f5b8481101561034b5781548982015260019091019060200161032f565b505082870194505b505061282960f01b835250506002019392505050565b5f825161037a818460208701610237565b9190910192915050565b5f60208284031215610394575f5ffd5b505191905056fea164736f6c634300081c000a6080604052348015600e575f5ffd5b50604051610167380380610167833981016040819052602b91604e565b5f80546001600160a01b0319166001600160a01b03929092169190911790556079565b5f60208284031215605d575f5ffd5b81516001600160a01b03811681146072575f5ffd5b9392505050565b60e2806100855f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b60375f80546040516303d1689d60e11b8152670de0b6b3a764000060048201526001600160a01b03909116906307a2d13a90602401602060405180830381865afa1580156098573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ba919060bf565b905090565b5f6020828403121560ce575f5ffd5b505191905056fea164736f6c634300081c000a360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c634300081c000a", + "nonce": "0xe2", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionType": "CREATE", + "contractName": "ERC1967Proxy", + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": null, + "arguments": [ + "0x2Bd95ae42d848Ac93F6fA2A4b988Af5a32e6ADA9", + "0x0208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df8138" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x6ab3e", + "value": "0x0", + "input": "0x60806040526040516103cd3803806103cd8339810160408190526100229161025e565b61002c8282610033565b5050610347565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051610128919061032c565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f5f6040838503121561026f575f5ffd5b82516001600160a01b0381168114610285575f5ffd5b60208401519092506001600160401b038111156102a0575f5ffd5b8301601f810185136102b0575f5ffd5b80516001600160401b038111156102c9576102c9610228565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f7576102f7610228565b60405281815282820160200187101561030e575f5ffd5b61031f82602083016020860161023c565b8093505050509250929050565b5f825161033d81846020870161023c565b9190910192915050565b607a806103535f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156069573d5ff35b3d5ffdfea164736f6c634300081c000a0000000000000000000000002bd95ae42d848ac93f6fa2a4b988af5a32e6ada9000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001240208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df813800000000000000000000000000000000000000000000000000000000", + "nonce": "0xe3", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "gas": "0xa614", + "value": "0x0", + "input": "0xf2fde38b00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xe4", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x38cf24", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1c209791c39d1106df7cb5e72df8dfd6536657249d260fc1182252da55b31dee", + "transactionIndex": "0x1e", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x87185", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xca91e3a169", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x69fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4140a9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd3f181ce056cb4831d71256eafd68f18a30f6862d12ec6e73078fbc16e4daa18", + "transactionIndex": "0x1f", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x87185", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xca91e3a169", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x69fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x8f668d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1c82721bc64373b4e2fc7580a638d39835ef5e3eb4fa5c1c91f39889c9af5ebd", + "transactionIndex": "0x20", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x4e25e4", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x10172bcc93a7fbde0ec4318e4aab2211f8858c17", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4ef70dfa439", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x294ff" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa66ab2", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4cd1f0d98ac1019e733e14c957c8707ebd59888857af3742dff240179e078612", + "transactionIndex": "0x21", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x170425", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x5b9b00e3ccb5b4bb77cb398c539afb69ebbead96", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1cc7e1e581c", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0xf0ea" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbc69f7", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf80c957117a3d66fe58df0d7fa8ffd726c8aa7816ad259af5a8cd10bd0fc613f", + "transactionIndex": "0x22", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x15ff45", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x640959ecedb9ca512af716a1f770fffd3df81774", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1c099cf7645", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0xeab1" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc0154b", + "logs": [ + { + "address": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000010172bcc93a7fbde0ec4318e4aab2211f8858c17" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "logIndex": "0x52", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000001000000000000000000000000000001000000020000000000000000000800000000000000000000000000000000400000000000000000000000000100000000000000000000000080000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010004000000000800040000000000000000000000", + "type": "0x2", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab54", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc3c093", + "logs": [ + { + "address": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000005b9b00e3ccb5b4bb77cb398c539afb69ebbead96" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "logIndex": "0x54", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000100000000000400000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000040000001000000020000000000000000000800000000000000000000000000002800400000000000000000000000000000000000000000000000000000000000000000000000000000040000001000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab48", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc76be7", + "logs": [ + { + "address": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "logIndex": "0x55", + "removed": false + }, + { + "address": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000640959ecedb9ca512af716a1f770fffd3df81774" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "logIndex": "0x56", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000002000001000000000000000000000000000001000000020000000000000000000800000000002000000000000000000000400080000000000000000000000000000040000000000000100000000000000000000000000000040000000000000000000000000000400000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab54", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc89038", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x97884dada719ab2a4d04fc19b6b926d67ea7a687ad6cc7ec68249038da596846", + "transactionIndex": "0x26", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x12451", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xeb47d13e805c64d00e9ea0b3eee5a02a69df8138", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xf992dcf81", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x829" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf1ef5d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3436de2f09a2ae216b0d6f77cbeb0897d46496d063869f57bc279619e8cbda7a", + "transactionIndex": "0x27", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x295f25", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x2bd95ae42d848ac93f6fa2a4b988af5a32e6ada9", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x2efb14b4eda", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x18943" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf710a1", + "logs": [ + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002bd95ae42d848ac93f6fa2a4b988af5a32e6ada9" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x57", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x58", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x59", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000100000000000000000000000000040000000000000000000000000000000000000000000000000002000001000000000000000000000000000001000000020000000000000000000800000000000000000002000000000000400000000000000000000800001000000000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000004000000000000000000004000000000000000020000000000040000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x52144", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x68bcb2e086", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x36cb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf788df", + "logs": [ + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionIndex": "0x29", + "logIndex": "0x5a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001000000000000000000000000000000000000000000000002000000000000400000000000000000000000001000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionIndex": "0x29", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x783e", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xbf244e5d7", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1735538998, + "chain": 84532, + "commit": "cfe6617" +} \ No newline at end of file diff --git a/broadcast/Testnet.s.sol/84532/run-latest.json b/broadcast/Testnet.s.sol/84532/run-latest.json new file mode 100644 index 0000000..eb45c4e --- /dev/null +++ b/broadcast/Testnet.s.sol/84532/run-latest.json @@ -0,0 +1,662 @@ +{ + "transactions": [ + { + "hash": "0x1c209791c39d1106df7cb5e72df8dfd6536657249d260fc1182252da55b31dee", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "function": null, + "arguments": [ + "USDC", + "USDC", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xaf9f9", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610a77380380610a7783398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610794806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c806340c10f191161006e57806340c10f191461012557806370a082311461013a57806395d89b41146101625780639dc29fac1461016a578063a9059cbb1461017d578063dd62ed3e14610190575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b26101c8565b6040516100bf9190610617565b60405180910390f35b6100db6100d636600461067d565b610258565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b3660046106a5565b610271565b60055460405160ff90911681526020016100bf565b61013861013336600461067d565b610294565b005b6100ef6101483660046106df565b6001600160a01b03165f9081526020819052604090205490565b6100b26102a2565b61013861017836600461067d565b6102b1565b6100db61018b36600461067d565b6102bb565b6100ef61019e3660046106ff565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101d790610730565b80601f016020809104026020016040519081016040528092919081815260200182805461020390610730565b801561024e5780601f106102255761010080835404028352916020019161024e565b820191905f5260205f20905b81548152906001019060200180831161023157829003601f168201915b5050505050905090565b5f336102658185856102c8565b60019150505b92915050565b5f3361027e8582856102da565b61028985858561035a565b506001949350505050565b61029e82826103b7565b5050565b6060600480546101d790610730565b61029e82826103eb565b5f3361026581858561035a565b6102d5838383600161041f565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610354578181101561034657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61035484848484035f61041f565b50505050565b6001600160a01b03831661038357604051634b637e8f60e11b81525f600482015260240161033d565b6001600160a01b0382166103ac5760405163ec442f0560e01b81525f600482015260240161033d565b6102d58383836104f1565b6001600160a01b0382166103e05760405163ec442f0560e01b81525f600482015260240161033d565b61029e5f83836104f1565b6001600160a01b03821661041457604051634b637e8f60e11b81525f600482015260240161033d565b61029e825f836104f1565b6001600160a01b0384166104485760405163e602df0560e01b81525f600482015260240161033d565b6001600160a01b03831661047157604051634a1406b160e11b81525f600482015260240161033d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561035457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104e391815260200190565b60405180910390a350505050565b6001600160a01b03831661051b578060025f8282546105109190610768565b9091555061058b9050565b6001600160a01b0383165f908152602081905260409020548181101561056d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161033d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166105a7576002805482900390556105c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161060a91815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b818110156106435760208186018101516040868401015201610626565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610678575f5ffd5b919050565b5f5f6040838503121561068e575f5ffd5b61069783610662565b946020939093013593505050565b5f5f5f606084860312156106b7575f5ffd5b6106c084610662565b92506106ce60208501610662565b929592945050506040919091013590565b5f602082840312156106ef575f5ffd5b6106f882610662565b9392505050565b5f5f60408385031215610710575f5ffd5b61071983610662565b915061072760208401610662565b90509250929050565b600181811c9082168061074457607f821691505b60208210810361076257634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561026b57634e487b7160e01b5f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553444300000000000000000000000000000000000000000000000000000000", + "nonce": "0xd9", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd3f181ce056cb4831d71256eafd68f18a30f6862d12ec6e73078fbc16e4daa18", + "transactionType": "CREATE", + "contractName": "MockToken", + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "function": null, + "arguments": [ + "USDT", + "USDT", + "6" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0xaf9f9", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610a77380380610a7783398101604081905261002e9161011b565b8282600361003c838261021c565b506004610049828261021c565b50506005805460ff191660ff9390931692909217909155506102d6915050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261008c575f5ffd5b81516001600160401b038111156100a5576100a5610069565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d3576100d3610069565b6040528181528382016020018510156100ea575f5ffd5b5f5b82811015610108576020818601810151838301820152016100ec565b505f918101602001919091529392505050565b5f5f5f6060848603121561012d575f5ffd5b83516001600160401b03811115610142575f5ffd5b61014e8682870161007d565b602086015190945090506001600160401b0381111561016b575f5ffd5b6101778682870161007d565b925050604084015160ff8116811461018d575f5ffd5b809150509250925092565b600181811c908216806101ac57607f821691505b6020821081036101ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561021757805f5260205f20601f840160051c810160208510156101f55750805b601f840160051c820191505b81811015610214575f8155600101610201565b50505b505050565b81516001600160401b0381111561023557610235610069565b610249816102438454610198565b846101d0565b6020601f82116001811461027b575f83156102645750848201515b5f19600385901b1c1916600184901b178455610214565b5f84815260208120601f198516915b828110156102aa578785015182556020948501946001909201910161028a565b50848210156102c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610794806102e35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c806340c10f191161006e57806340c10f191461012557806370a082311461013a57806395d89b41146101625780639dc29fac1461016a578063a9059cbb1461017d578063dd62ed3e14610190575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b26101c8565b6040516100bf9190610617565b60405180910390f35b6100db6100d636600461067d565b610258565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b3660046106a5565b610271565b60055460405160ff90911681526020016100bf565b61013861013336600461067d565b610294565b005b6100ef6101483660046106df565b6001600160a01b03165f9081526020819052604090205490565b6100b26102a2565b61013861017836600461067d565b6102b1565b6100db61018b36600461067d565b6102bb565b6100ef61019e3660046106ff565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101d790610730565b80601f016020809104026020016040519081016040528092919081815260200182805461020390610730565b801561024e5780601f106102255761010080835404028352916020019161024e565b820191905f5260205f20905b81548152906001019060200180831161023157829003601f168201915b5050505050905090565b5f336102658185856102c8565b60019150505b92915050565b5f3361027e8582856102da565b61028985858561035a565b506001949350505050565b61029e82826103b7565b5050565b6060600480546101d790610730565b61029e82826103eb565b5f3361026581858561035a565b6102d5838383600161041f565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610354578181101561034657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61035484848484035f61041f565b50505050565b6001600160a01b03831661038357604051634b637e8f60e11b81525f600482015260240161033d565b6001600160a01b0382166103ac5760405163ec442f0560e01b81525f600482015260240161033d565b6102d58383836104f1565b6001600160a01b0382166103e05760405163ec442f0560e01b81525f600482015260240161033d565b61029e5f83836104f1565b6001600160a01b03821661041457604051634b637e8f60e11b81525f600482015260240161033d565b61029e825f836104f1565b6001600160a01b0384166104485760405163e602df0560e01b81525f600482015260240161033d565b6001600160a01b03831661047157604051634a1406b160e11b81525f600482015260240161033d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561035457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104e391815260200190565b60405180910390a350505050565b6001600160a01b03831661051b578060025f8282546105109190610768565b9091555061058b9050565b6001600160a01b0383165f908152602081905260409020548181101561056d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161033d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166105a7576002805482900390556105c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161060a91815260200190565b60405180910390a3505050565b602081525f82518060208401525f5b818110156106435760208186018101516040868401015201610626565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610678575f5ffd5b919050565b5f5f6040838503121561068e575f5ffd5b61069783610662565b946020939093013593505050565b5f5f5f606084860312156106b7575f5ffd5b6106c084610662565b92506106ce60208501610662565b929592945050506040919091013590565b5f602082840312156106ef575f5ffd5b6106f882610662565b9392505050565b5f5f60408385031215610710575f5ffd5b61071983610662565b915061072760208401610662565b90509250929050565b600181811c9082168061074457607f821691505b60208210810361076257634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561026b57634e487b7160e01b5f52601160045260245ffdfea164736f6c634300081c000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004555344540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000", + "nonce": "0xda", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1c82721bc64373b4e2fc7580a638d39835ef5e3eb4fa5c1c91f39889c9af5ebd", + "transactionType": "CREATE", + "contractName": "SelfPeggingAsset", + "contractAddress": "0x10172bcc93a7fbde0ec4318e4aab2211f8858c17", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x6597a8", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50615b898061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610276575f3560e01c80635c975abb11610156578063af14052c116100ca578063cbdf382c11610084578063cbdf382c14610557578063d46300fd1461056a578063d6d657c314610572578063e018396114610585578063eddd0d9c1461058e578063f2fde38b146105a1575f5ffd5b8063af14052c146104f6578063afb690a2146104fe578063b54b88c314610511578063bf9dddad1461051a578063bfab5a721461052d578063c7ee15001461054e575f5ffd5b806386fed0241161011b57806386fed0241461047b5780638da5cb5b146104845780638e4d943e146104b45780639389b3e3146104c7578063965fa21e146104da5780639f493aa7146104e3575f5ffd5b80635c975abb146104425780635d841af51461044f5780636c51123914610462578063715018a61461046b5780638456cb5914610473575f5ffd5b806341ad8e7d116101ed5780634b0bddd2116101b25780634b0bddd2146103cc5780634f64b2be146103df57806354cf2aeb1461040a57806355024167146104135780635673b02d146104265780635a86bb2e14610439575f5ffd5b806341ad8e7d14610341578063429b62e51461035457806344dedbc71461038657806345cf2ef6146103a65780634903b0d1146103b9575f5ffd5b806319cf42801161023e57806319cf4280146102ef57806324cbaf25146102f8578063312d6efb1461030057806334e19907146103135780633c09e2d4146103265780633f4ba83a14610339575f5ffd5b806304574dc51461027a5780630bd062461461028f57806313966db5146102b55780631468e98c146102be57806318160ddd146102e6575b5f5ffd5b61028d610288366004615444565b6105b4565b005b6102a261029d36600461549b565b6105f8565b6040519081526020015b60405180910390f35b6102a260035481565b6102d16102cc3660046154e2565b610b0e565b604080519283526020830191909152016102ac565b6102a260075481565b6102a2600f5481565b61028d610d54565b6102a261030e366004615502565b611094565b61028d610321366004615444565b61163a565b6102a2610334366004615444565b61169c565b61028d6116bb565b6102d161034f36600461552b565b611719565b61037661036236600461557d565b60086020525f908152604090205460ff1681565b60405190151581526020016102ac565b61039961039436600461549b565b6119b1565b6040516102ac91906155d2565b6102d16103b4366004615502565b611e82565b6102a26103c7366004615444565b6123bc565b61028d6103da3660046155e4565b6123cb565b6103f26103ed366004615444565b612424565b6040516001600160a01b0390911681526020016102ac565b6102a260045481565b61028d6104213660046154e2565b61244b565b6102a261043436600461561f565b6125ae565b6102a2600a5481565b6009546103769060ff1681565b61028d61045d366004615444565b612da4565b6102a2600d5481565b61028d612e06565b61028d612e19565b6102a260115481565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166103f2565b61028d6104c2366004615444565b612e7b565b61028d6104d5366004615444565b612eb8565b6102a260055481565b6103996104f136600461564e565b612ef5565b6102a2613526565b6102d161050c36600461552b565b613834565b6102a2600c5481565b61028d6105283660046157d9565b613ab5565b61054061053b366004615444565b614025565b6040516102ac9291906158a6565b6102a260105481565b6006546103f2906001600160a01b031681565b6102a26142d3565b6103f2610580366004615444565b614399565b6102a2600b5481565b61028d61059c366004615444565b6143a8565b61028d6105af36600461557d565b61440a565b6105bc614447565b60108190556040518181527f0ee75a27bfe194d086724ff0bdc0f721a795360f3397b23304c71e1561826edf906020015b60405180910390a150565b5f6106016144a2565b60095460ff1615806106215750335f9081526008602052604090205460ff165b61063e576040516313d0ff5960e31b815260040160405180910390fd5b60025483146106605760405163162908e360e11b815260040160405180910390fd5b6106695f6144d9565b505f60028054806020026020016040519081016040528092919081815260200182805480156106b557602002820191905f5260205f20905b8154815260200190600101908083116106a1575b505050505090505f6106c56142d3565b6007549091505f5b83518110156108ed57620186a08888838181106106ec576106ec6158c7565b905060200201351015610719575f821161071957604051631f2a200560e01b815260040160405180910390fd5b87878281811061072b5761072b6158c7565b905060200201355f03156108e5575f88888381811061074c5761074c6158c7565b905060200201359050600e8281548110610768576107686158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156107b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d791906158db565b6107e290600a6159e1565b600e83815481106107f5576107f56158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610840573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086491906158db565b61086e90836159ec565b6108789190615a03565b90506001828154811061088d5761088d6158c7565b905f5260205f200154816108a191906159ec565b8583815181106108b3576108b36158c7565b60200260200101516108c59190615a22565b8583815181106108d7576108d76158c7565b602002602001018181525050505b6001016106cd565b5f6108f88585614b7f565b90505f6109058483615a35565b6003549091505f901561093f576402540be4006003548361092691906159ec565b6109309190615a03565b905061093c8183615a35565b91505b8882101561096f5760405163da97547560e01b815260048101839052602481018a90526044015b60405180910390fd5b5f93505b89841015610a2a578a8a8581811061098d5761098d6158c7565b905060200201355f0315610a1f578684815181106109ad576109ad6158c7565b6020026020010151600285815481106109c8576109c86158c7565b5f91825260209091200155610a1f33308d8d888181106109ea576109ea6158c7565b905060200201355f8881548110610a0357610a036158c7565b5f918252602090912001546001600160a01b0316929190614d64565b600190930192610973565b610a348286615a22565b6007556006546040516329460cc560e11b8152336004820152602481018490526001600160a01b039091169063528c198a906044015f604051808303815f87803b158015610a80575f5ffd5b505af1158015610a92573d5f5f3e3d5ffd5b50505050610aa060016144d9565b9050336001600160a01b03167fc1258b6f224442b6aa30f317612f0920bb2f76d968200d28d9163ec6aee9ad00838d8d85604051610ae19493929190615a48565b60405180910390a25095505050505050610b0760015f516020615b5d5f395f51905f5255565b9392505050565b5f5f60605f610b1b614de4565b909250905085610b3e57604051631f2a200560e01b815260040160405180910390fd5b81518510610b5f5760405163c1ab6dc160e01b815260040160405180910390fd5b5f610b686142d3565b60055490915082905f90899015610ba6576402540be4006005548b610b8d91906159ec565b610b979190615a03565b9150610ba3828b615a35565b90505b5f610bbc878b610bb68588615a35565b88615060565b90505f60018b81548110610bd257610bd26158c7565b905f5260205f2001546001838a8e81518110610bf057610bf06158c7565b6020026020010151610c029190615a35565b610c0c9190615a35565b610c169190615a03565b90505f819050600e8c81548110610c2f57610c2f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9e91906158db565b600e8d81548110610cb157610cb16158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610cfc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2091906158db565b610d2b90600a6159e1565b610d3590836159ec565b610d3f9190615a03565b9a5093985050505050505050505b9250929050565b610d5c614447565b60095460ff16610d7f57604051636cd6020160e01b815260040160405180910390fd5b5f6002805480602002602001604051908101604052809291908181526020018280548015610dca57602002820191905f5260205f20905b815481526020019060010190808311610db6575b505050505090505f610dda6142d3565b6007549091505f5b8351811015610fe4575f5f8281548110610dfe57610dfe6158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7091906158db565b9050600e8281548110610e8557610e856158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015610ed0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef491906158db565b610eff90600a6159e1565b600e8381548110610f1257610f126158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015610f5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8191906158db565b610f8b90836159ec565b610f959190615a03565b905060018281548110610faa57610faa6158c7565b905f5260205f20015481610fbe91906159ec565b858381518110610fd057610fd06158c7565b602090810291909101015250600101610de2565b505f610ff08484614b7f565b90508181106110125760405163497228ef60e11b815260040160405180910390fd5b6006546001600160a01b031663fd71a23761102d8385615a35565b6040518263ffffffff1660e01b815260040161104b91815260200190565b5f604051808303815f87803b158015611062575f5ffd5b505af1158015611074573d5f5f3e3d5ffd5b5050855161108b9250600291506020870190615398565b50600755505050565b5f61109d6144a2565b60095460ff1615806110bd5750335f9081526008602052604090205460ff165b6110da576040516313d0ff5960e31b815260040160405180910390fd5b5f84116110fa57604051631f2a200560e01b815260040160405180910390fd5b600254831061111c5760405163c1ab6dc160e01b815260040160405180910390fd5b6111255f6144d9565b505f600280548060200260200160405190810160405280929190818152602001828054801561117157602002820191905f5260205f20905b81548152602001906001019080831161115d575b505050505090505f6111816142d3565b600754600554919250905f908890156111c1576402540be4006005548a6111a891906159ec565b6111b29190615a03565b91506111be828a615a35565b90505b600e88815481106111d4576111d46158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561121f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124391906158db565b61124e90600a6159e1565b600e8981548110611261576112616158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156112ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d091906158db565b6112da90896159ec565b6112e49190615a03565b96505f6112f6868a610bb68588615a35565b90505f60018a8154811061130c5761130c6158c7565b905f5260205f200154600183898d8151811061132a5761132a6158c7565b602002602001015161133c9190615a35565b6113469190615a35565b6113509190615a03565b90508881101561137d5760405163369b7e4160e01b815260048101829052602481018a9052604401610966565b8160028b81548110611391576113916158c7565b905f5260205f2001819055505f87516001600160401b038111156113b7576113b7615695565b6040519080825280602002602001820160405280156113e0578160200160208202803683370190505b5090505f829050600e8c815481106113fa576113fa6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611445573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146991906158db565b600e8d8154811061147c5761147c6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156114c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114eb91906158db565b6114f690600a6159e1565b61150090836159ec565b61150a9190615a03565b905080828d8151811061151f5761151f6158c7565b60200260200101818152505061155d33825f8f81548110611542576115426158c7565b5f918252602090912001546001600160a01b0316919061520c565b6115678d88615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018f90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b1580156115b3575f5ffd5b505af11580156115c5573d5f5f3e3d5ffd5b505050506115d360016144d9565b9550336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8e848960405161161293929190615a8c565b60405180910390a298505050505050505050610b0760015f516020615b5d5f395f51905f5255565b611642614447565b6402540be400811061166757604051631930e3c960e11b815260040160405180910390fd5b60048190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb8906020016105ed565b600181815481106116ab575f80fd5b5f91825260209091200154905081565b60095460ff166116de57604051636cd6020160e01b815260040160405180910390fd5b335f9081526008602052604090205460ff1661170d57604051637bfa4b9f60e01b815260040160405180910390fd5b6009805460ff19169055565b5f5f60605f611726614de4565b6002549193509150851461174c5760405162a80fb560e51b815260040160405180910390fd5b5f6117556142d3565b9050815f5b845181101561193757888882818110611775576117756158c7565b905060200201355f031561192f575f898983818110611796576117966158c7565b905060200201359050600e82815481106117b2576117b26158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156117fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182191906158db565b61182c90600a6159e1565b600e838154811061183f5761183f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561188a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ae91906158db565b6118b890836159ec565b6118c29190615a03565b9050600182815481106118d7576118d76158c7565b905f5260205f200154816118eb91906159ec565b8683815181106118fd576118fd6158c7565b602002602001015161190f9190615a35565b868381518110611921576119216158c7565b602002602001018181525050505b60010161175a565b505f6119438584614b7f565b90505f6119508284615a35565b6005549091505f90156119a15760055461196f906402540be400615a35565b61197e6402540be400846159ec565b6119889190615a03565b91506119948385615a35565b61199e9083615a35565b90505b909a909950975050505050505050565b60606119bb6144a2565b60025483146119dc5760405162a80fb560e51b815260040160405180910390fd5b60095460ff1615806119fc5750335f9081526008602052604090205460ff165b611a19576040516313d0ff5960e31b815260040160405180910390fd5b611a225f6144d9565b505f6002805480602002602001604051908101604052809291908181526020018280548015611a6e57602002820191905f5260205f20905b815481526020019060010190808311611a5a575b505050505090505f611a7e6142d3565b6007549091505f5b8351811015611c6357878782818110611aa157611aa16158c7565b905060200201355f0315611c5b575f888883818110611ac257611ac26158c7565b905060200201359050600e8281548110611ade57611ade6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611b29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4d91906158db565b611b5890600a6159e1565b600e8381548110611b6b57611b6b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015611bb6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bda91906158db565b611be490836159ec565b611bee9190615a03565b905060018281548110611c0357611c036158c7565b905f5260205f20015481611c1791906159ec565b858381518110611c2957611c296158c7565b6020026020010151611c3b9190615a35565b858381518110611c4d57611c4d6158c7565b602002602001018181525050505b600101611a86565b5f611c6e8585614b7f565b90505f611c7b8285615a35565b6005549091505f9015611ccc57600554611c9a906402540be400615a35565b611ca96402540be400846159ec565b611cb39190615a03565b9150611cbf8386615a35565b611cc99083615a35565b90505b88821115611cf75760405163deefd46d60e01b815260048101839052602481018a9052604401610966565b8651611d0a9060029060208a0190615398565b50611d158286615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018490526001600160a01b03909116906333fce74b906044015f604051808303815f87803b158015611d61575f5ffd5b505af1158015611d73573d5f5f3e3d5ffd5b505050505f8b8b808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525098509293505050505b8751851015611e12578b8b86818110611dca57611dca6158c7565b905060200201355f0315611e0757611e07338d8d88818110611dee57611dee6158c7565b905060200201355f8881548110611542576115426158c7565b600190940193611daf565b611e1c60016144d9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce848385604051611e5b93929190615a8c565b60405180910390a2975050505050505050610b0760015f516020615b5d5f395f51905f5255565b5f5f60605f611e8f614de4565b9092509050858703611eb45760405163100dac0560e11b815260040160405180910390fd5b81518710611ed557604051630a8e0c2760e31b815260040160405180910390fd5b81518610611ef65760405163272b3e9d60e21b815260040160405180910390fd5b5f8511611f165760405163162908e360e11b815260040160405180910390fd5b5f611f1f6142d3565b600e805491925083918891908b908110611f3b57611f3b6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015611f86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611faa91906158db565b611fb590600a6159e1565b600e8b81548110611fc857611fc86158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612013573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203791906158db565b61204190836159ec565b61204b9190615a03565b905060018a81548110612060576120606158c7565b905f5260205f2001548161207491906159ec565b858b81518110612086576120866158c7565b60200260200101516120989190615a22565b858b815181106120aa576120aa6158c7565b6020026020010181815250505f6120c3868b8587615060565b90505f60018b815481106120d9576120d96158c7565b905f5260205f200154600183898e815181106120f7576120f76158c7565b60200260200101516121099190615a35565b6121139190615a35565b61211d9190615a03565b6004549091505f9015612157576402540be4006004548361213e91906159ec565b6121489190615a03565b90506121548183615a35565b91505b600e8054839183918f90811061216f5761216f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156121ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121de91906158db565b600e8f815481106121f1576121f16158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561223c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226091906158db565b61226b90600a6159e1565b61227590846159ec565b61227f9190615a03565b9150600e8e81548110612294576122946158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156122df573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230391906158db565b600e8f81548110612316576123166158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612361573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238591906158db565b61239090600a6159e1565b61239a90836159ec565b6123a49190615a03565b919b509099505050505050505050505b935093915050565b600281815481106116ab575f80fd5b6123d3614447565b6001600160a01b0382166123fa576040516319e0266b60e21b815260040160405180910390fd5b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b5f8181548110612432575f80fd5b5f918252602090912001546001600160a01b0316905081565b612453614447565b5f821180156124645750620f424082105b612481576040516319e580c160e01b815260040160405180910390fd5b4381116124a15760405163346d715b60e11b815260040160405180910390fd5b6124a96142d3565b600a5543600b55600c829055600d8190556124c35f6144d9565b505f61251f600280548060200260200160405190810160405280929190818152602001828054801561251257602002820191905f5260205f20905b8154815260200190600101908083116124fe575b5050505050600c54614b7f565b90505f816007541161253d576007546125389083615a35565b61254b565b8160075461254b9190615a35565b9050601154811061256f57604051633bc1d43160e21b815260040160405180910390fd5b60408051858152602081018590527ffc451bbe450f43d894c85911791028d71f61cde18fbe7d5caa282d982ab29aca910160405180910390a150505050565b5f6125b76144a2565b60095460ff1615806125d75750335f9081526008602052604090205460ff165b6125f4576040516313d0ff5960e31b815260040160405180910390fd5b8385036126145760405163100dac0560e11b815260040160405180910390fd5b600254851061263657604051630a8e0c2760e31b815260040160405180910390fd5b60025484106126585760405163272b3e9d60e21b815260040160405180910390fd5b825f036126785760405163162908e360e11b815260040160405180910390fd5b6126815f6144d9565b505f60028054806020026020016040519081016040528092919081815260200182805480156126cd57602002820191905f5260205f20905b8154815260200190600101908083116126b9575b505050505090505f6126dd6142d3565b90505f859050600e88815481106126f6576126f66158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612741573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276591906158db565b61277090600a6159e1565b600e8981548110612783576127836158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156127ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f291906158db565b6127fc90836159ec565b6128069190615a03565b90506001888154811061281b5761281b6158c7565b905f5260205f2001548161282f91906159ec565b838981518110612841576128416158c7565b60200260200101516128539190615a22565b838981518110612865576128656158c7565b6020026020010181815250505f612880848960075486615060565b90505f60018981548110612896576128966158c7565b905f5260205f200154600183878c815181106128b4576128b46158c7565b60200260200101516128c69190615a35565b6128d09190615a35565b6128da9190615a03565b90508160028a815481106128f0576128f06158c7565b905f5260205f200181905550848a8151811061290e5761290e6158c7565b602002602001015160028b81548110612929576129296158c7565b5f9182526020822001919091556004541561296b576402540be4006004548361295291906159ec565b61295c9190615a03565b90506129688183615a35565b91505b600e8a8154811061297e5761297e6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156129c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ed91906158db565b6129f890600a6159e1565b600e8b81548110612a0b57612a0b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612a56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a7a91906158db565b612a84908a6159ec565b612a8e9190615a03565b975087821015612abb57604051639d2e2cc560e01b81526004810183905260248101899052604401610966565b612ad333308b5f8f81548110610a0357610a036158c7565b5f829050600e8b81548110612aea57612aea6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015612b35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5991906158db565b600e8c81548110612b6c57612b6c6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015612bb7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bdb91906158db565b612be690600a6159e1565b612bf090836159ec565b612bfa9190615a03565b9050612c1333825f8e81548110611542576115426158c7565b5f87516001600160401b03811115612c2d57612c2d615695565b604051908082528060200260200182016040528015612c56578160200160208202803683370190505b5090505f88516001600160401b03811115612c7357612c73615695565b604051908082528060200260200182016040528015612c9c578160200160208202803683370190505b5090508b828f81518110612cb257612cb26158c7565b60200260200101818152505082828e81518110612cd157612cd16158c7565b6020026020010181815250505f818f81518110612cf057612cf06158c7565b6020026020010190151590811515815250506001818e81518110612d1657612d166158c7565b911515602092830291909101909101525f612d3160016144d9565b9050336001600160a01b03167fcd7a62fee01c7edcaea3ced055fa3c650872e7b381ec5f1fa282e9e47db4e39585858585604051612d729493929190615ab4565b60405180910390a2509198505050505050505050612d9c60015f516020615b5d5f395f51905f5255565b949350505050565b612dac614447565b6402540be4008110612dd157604051631930e3c960e11b815260040160405180910390fd5b60058190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc1084906020016105ed565b612e0e614447565b612e175f615242565b565b60095460ff1615612e3d576040516313d0ff5960e31b815260040160405180910390fd5b335f9081526008602052604090205460ff16612e6c57604051637bfa4b9f60e01b815260040160405180910390fd5b6009805460ff19166001179055565b612e83614447565b600f8190556040518181527fc468beba3fc0a36cd690d9b68e45775b36bb8cb29703829e8393a907814907f1906020016105ed565b612ec0614447565b60118190556040518181527f99ea5e64b4c3a2f96657b182aec44c50497ec3102eb58eafdd24367bf16080e3906020016105ed565b6060612eff6144a2565b60095460ff161580612f1f5750335f9081526008602052604090205460ff165b612f3c576040516313d0ff5960e31b815260040160405180910390fd5b835f03612f5c57604051631f2a200560e01b815260040160405180910390fd5b6002548214612f7e57604051630947aa2560e01b815260040160405180910390fd5b612f875f6144d9565b505f6002805480602002602001604051908101604052809291908181526020018280548015612fd357602002820191905f5260205f20905b815481526020019060010190808311612fbf575b505050505090505f60075490505f82516001600160401b03811115612ffa57612ffa615695565b604051908082528060200260200182016040528015613023578160200160208202803683370190505b506005549091505f90889015613060576402540be4006005548a61304791906159ec565b6130519190615a03565b915061305d828a615a35565b90505b5f5b855181101561344b575f8583888481518110613080576130806158c7565b602002602001015161309291906159ec565b61309c9190615a03565b9050600182815481106130b1576130b16158c7565b905f5260205f200154816130c59190615a03565b8583815181106130d7576130d76158c7565b6020026020010181815250505f8a8a848181106130f6576130f66158c7565b905060200201359050600e8381548110613112576131126158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561315d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061318191906158db565b61318c90600a6159e1565b600e848154811061319f5761319f6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156131ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061320e91906158db565b61321890836159ec565b6132229190615a03565b905080868481518110613237576132376158c7565b6020026020010151101561328457858381518110613257576132576158c7565b60200260200101518160405163369b7e4160e01b8152600401610966929190918252602082015260400190565b81888481518110613297576132976158c7565b60200260200101516132a99190615a35565b600284815481106132bc576132bc6158c7565b905f5260205f2001819055505f8684815181106132db576132db6158c7565b60200260200101519050600e84815481106132f8576132f86158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613343573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061336791906158db565b600e858154811061337a5761337a6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa1580156133c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e991906158db565b6133f490600a6159e1565b6133fe90836159ec565b6134089190615a03565b90508087858151811061341d5761341d6158c7565b60200260200101818152505061344033825f8781548110611542576115426158c7565b505050600101613062565b506134568985615a35565b6007556006546040516333fce74b60e01b8152336004820152602481018b90526001600160a01b03909116906333fce74b906044015f604051808303815f87803b1580156134a2575f5ffd5b505af11580156134b4573d5f5f3e3d5ffd5b505050506134c260016144d9565b9150336001600160a01b03167f39a1a3541d21c63181b51e6047a407492fe0c1c0151825f217c445e3b1fd21ce8a858560405161350193929190615a8c565b60405180910390a250909350505050610b0760015f516020615b5d5f395f51905f5255565b5f5f600280548060200260200160405190810160405280929190818152602001828054801561357257602002820191905f5260205f20905b81548152602001906001019080831161355e575b505050505090505f6135826142d3565b6007549091505f5b835181101561378c575f5f82815481106135a6576135a66158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135f4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361891906158db565b9050600e828154811061362d5761362d6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613678573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369c91906158db565b6136a790600a6159e1565b600e83815481106136ba576136ba6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015613705573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061372991906158db565b61373390836159ec565b61373d9190615a03565b905060018281548110613752576137526158c7565b905f5260205f2001548161376691906159ec565b858381518110613778576137786158c7565b60209081029190910101525060010161358a565b505f6137988484614b7f565b9050808211156137ac575f94505050505090565b83516137bf906002906020870190615398565b5060078190555f6137d08383615a35565b600654604051637234344760e11b8152600481018390529192506001600160a01b03169063e468688e906024015f604051808303815f87803b158015613814575f5ffd5b505af1158015613826573d5f5f3e3d5ffd5b509298975050505050505050565b5f5f60605f613841614de4565b8151919350915085146138675760405163162908e360e11b815260040160405180910390fd5b5f6138706142d3565b9050815f5b8451811015613a5257888882818110613890576138906158c7565b905060200201355f0315613a4a575f8989838181106138b1576138b16158c7565b905060200201359050600e82815481106138cd576138cd6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015613918573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393c91906158db565b61394790600a6159e1565b600e838154811061395a5761395a6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156139a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c991906158db565b6139d390836159ec565b6139dd9190615a03565b9050600182815481106139f2576139f26158c7565b905f5260205f20015481613a0691906159ec565b868381518110613a1857613a186158c7565b6020026020010151613a2a9190615a22565b868381518110613a3c57613a3c6158c7565b602002602001018181525050505b600101613875565b5f613a5d8685614b7f565b90505f613a6a8483615a35565b6003549091505f9015613aa4576402540be40060035483613a8b91906159ec565b613a959190615a03565b9050613aa18183615a35565b91505b909b909a5098505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015613af95750825b90505f826001600160401b03166001148015613b145750303b155b905081158015613b22575080155b15613b405760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315613b6a57845460ff60401b1916600160401b1785555b60028b5110158015613b7d575089518b51145b8015613b8a575085518b51145b613ba65760405162a80fb560e51b815260040160405180910390fd5b8851600314613bc8576040516303fbecdf60e51b815260040160405180910390fd5b5f5b6003811015613c19576402540be4008a8281518110613beb57613beb6158c7565b602002602001015110613c1157604051636d4761a360e11b815260040160405180910390fd5b600101613bca565b505f5b8b51811015613deb575f6001600160a01b03168c8281518110613c4157613c416158c7565b60200260200101516001600160a01b031603613c7057604051634b62f01360e01b815260040160405180910390fd5b5f6001600160a01b0316878281518110613c8c57613c8c6158c7565b60200260200101516001600160a01b031603613cbb57604051632a47a99360e01b815260040160405180910390fd5b5f8c8281518110613cce57613cce6158c7565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d359190615b18565b60ff1690508b8281518110613d4c57613d4c6158c7565b60200260200101515f14158015613d905750613d69816012615a35565b613d7490600a6159e1565b8c8381518110613d8657613d866158c7565b6020026020010151145b613dad57604051635a9112a360e11b815260040160405180910390fd5b5060028054600181810183555f9283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091019190915501613c1c565b505f5b8b51811015613e84575f613e03826001615a22565b90505b8c51811015613e7b578c8181518110613e2157613e216158c7565b60200260200101516001600160a01b03168d8381518110613e4457613e446158c7565b60200260200101516001600160a01b031603613e73576040516323271fb560e11b815260040160405180910390fd5b600101613e06565b50600101613dee565b506001600160a01b038816613eac5760405163bfc8732f60e01b815260040160405180910390fd5b5f87118015613ebd5750620f424087105b613eda576040516319e580c160e01b815260040160405180910390fd5b613ee26152b2565b613eeb336152c2565b8a51613efd905f9060208e01906153dd565b508951613f119060019060208d0190615398565b50885f81518110613f2457613f246158c7565b602002602001015160038190555088600181518110613f4557613f456158c7565b602002602001015160048190555088600281518110613f6657613f666158c7565b602090810291909101810151600555600680546001600160a01b0319166001600160a01b038b161790558651613fa291600e91908901906153dd565b50600a879055600c87905543600b819055600d55620186a0600f8190556127106010556011556009805460ff19169055831561401857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60605f60605f614033614de4565b90925090505f85900361405957604051631f2a200560e01b815260040160405180910390fd5b815181905f906001600160401b0381111561407657614076615695565b60405190808252806020026020018201604052801561409f578160200160208202803683370190505b506005549091505f908890156140dc576402540be4006005548a6140c391906159ec565b6140cd9190615a03565b91506140d9828a615a35565b90505b5f5b86518110156142c457600181815481106140fa576140fa6158c7565b905f5260205f2001548583898481518110614117576141176158c7565b602002602001015161412991906159ec565b6141339190615a03565b61413d9190615a03565b84828151811061414f5761414f6158c7565b6020026020010181815250505f84828151811061416e5761416e6158c7565b60200260200101519050600e828154811061418b5761418b6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa1580156141d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141fa91906158db565b600e838154811061420d5761420d6158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614258573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061427c91906158db565b61428790600a6159e1565b61429190836159ec565b61429b9190615a03565b9050808583815181106142b0576142b06158c7565b6020908102919091010152506001016140de565b50919890975095505050505050565b600d545f90439081101561438d575f600b54826142f09190615a35565b90505f600b54600d546143039190615a35565b9050600a54600c541115614354575f600a54600c546143229190615a35565b90505f8261433085846159ec565b61433a9190615a03565b905080600a5461434a9190615a22565b9550505050505090565b5f600c54600a546143659190615a35565b90505f8261437385846159ec565b61437d9190615a03565b905080600a5461434a9190615a35565b5050600c5490565b5090565b600e8181548110612432575f80fd5b6143b0614447565b6402540be40081106143d557604051631930e3c960e11b815260040160405180910390fd5b60038190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e855468906020016105ed565b614412614447565b6001600160a01b03811661443b57604051631e4fbdf760e01b81525f6004820152602401610966565b61444481615242565b50565b336144797f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614612e175760405163118cdaa760e01b8152336004820152602401610966565b5f516020615b5d5f395f51905f528054600119016144d357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f600280548060200260200160405190810160405280929190818152602001828054801561452557602002820191905f5260205f20905b815481526020019060010190808311614511575b505050505090505f600280548060200260200160405190810160405280929190818152602001828054801561457757602002820191905f5260205f20905b815481526020019060010190808311614563575b505050505090505f6145876142d3565b6007549091505f5b8351811015614791575f5f82815481106145ab576145ab6158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156145f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461d91906158db565b9050600e8281548110614632576146326158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa15801561467d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a191906158db565b6146ac90600a6159e1565b600e83815481106146bf576146bf6158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa15801561470a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472e91906158db565b61473890836159ec565b6147429190615a03565b905060018281548110614757576147576158c7565b905f5260205f2001548161476b91906159ec565b85838151811061477d5761477d6158c7565b60209081029190910101525060010161458f565b505f61479d8484614b7f565b84519091506147b3906002906020870190615398565b50600781905586156148195780821180156147d85750600f546147d68284615a35565b105b156147e957505f9695505050505050565b808211156148145760405163320f885160e21b81526004810183905260248101829052604401610966565b61486e565b808211801561483257506010546148308284615a35565b105b1561484357505f9695505050505050565b8082111561486e5760405163320f885160e21b81526004810183905260248101829052604401610966565b5f6148798383615a35565b9050805f0361488f57505f979650505050505050565b600654604051637234344760e11b8152600481018390526001600160a01b039091169063e468688e906024015f604051808303815f87803b1580156148d2575f5ffd5b505af11580156148e4573d5f5f3e3d5ffd5b505050508715614930576007546040805183815260208101929092527faf7c505ee772ec188af7067e1f73db08ab028e3d564273442b907742b9c41fa0910160405180910390a1614b74565b5f85516001600160401b0381111561494a5761494a615695565b604051908082528060200260200182016040528015614973578160200160208202803683370190505b5090505f5b8651811015614b34575f888281518110614994576149946158c7565b60200260200101518883815181106149ae576149ae6158c7565b60200260200101516149c09190615a35565b9050600e82815481106149d5576149d56158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614a20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a4491906158db565b600e8381548110614a5757614a576158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac691906158db565b614ad190600a6159e1565b614adb90836159ec565b614ae59190615a03565b905060018281548110614afa57614afa6158c7565b905f5260205f20015481614b0e9190615a03565b838381518110614b2057614b206158c7565b602090810291909101015250600101614978565b507fd65be40a3578d69ed7f74db1bac74a654f59f9ef9f0552c21466202ad03ff6618183600754604051614b6a93929190615b38565b60405180910390a1505b979650505050505050565b5f80808360015b8651831015614be7575f878481518110614ba257614ba26158c7565b60200260200101519050805f14614bbb575f9150614bbf565b5060015b614bc98186615a22565b9450875183614bd891906159ec565b6001909401939250614b869050565b8015614bf9575f945050505050614d5e565b5f925082845b60ff851015614d1357805f5b8a51811015614c57578a518b82828110614c2757614c276158c7565b6020026020010151614c3991906159ec565b614c4384846159ec565b614c4d9190615a03565b9150600101614c0b565b50819250808a516001614c6a9190615a22565b614c7491906159ec565b82614c80600188615a35565b614c8a91906159ec565b614c949190615a22565b828b5183614ca291906159ec565b614cac8a896159ec565b614cb69190615a22565b614cc091906159ec565b614cca9190615a03565b915082821115614cf0576001614ce08484615a35565b11614ceb5750614d13565b614d07565b6001614cfc8385615a35565b11614d075750614d13565b50600190940193614bff565b8460ff03614d565760405162461bcd60e51b815260206004820152601060248201526f646f65736e277420636f6e766572676560801b6044820152606401610966565b955050505050505b92915050565b6040516001600160a01b038481166024830152838116604483015260648201839052614dcb9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506152d3565b50505050565b60015f516020615b5d5f395f51905f5255565b60605f5f6002805480602002602001604051908101604052809291908181526020018280548015614e3257602002820191905f5260205f20905b815481526020019060010190808311614e1e575b505050505090505f614e426142d3565b90505f5b8251811015615048575f5f8281548110614e6257614e626158c7565b5f918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ed491906158db565b9050600e8281548110614ee957614ee96158c7565b5f918252602091829020015460408051632b51360160e01b815290516001600160a01b0390921692632b513601926004808401938290030181865afa158015614f34573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f5891906158db565b614f6390600a6159e1565b600e8381548110614f7657614f766158c7565b5f918252602091829020015460408051633ba0b9a960e01b815290516001600160a01b0390921692633ba0b9a9926004808401938290030181865afa158015614fc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614fe591906158db565b614fef90836159ec565b614ff99190615a03565b90506001828154811061500e5761500e6158c7565b905f5260205f2001548161502291906159ec565b848381518110615034576150346158c7565b602090810291909101015250600101614e46565b505f6150548383614b7f565b92959294509192505050565b5f828183815b88518110156150f057885161507b90836159ec565b91508088146150e857888181518110615096576150966158c7565b6020026020010151836150a99190615a22565b925088518982815181106150bf576150bf6158c7565b60200260200101516150d191906159ec565b6150db88866159ec565b6150e59190615a03565b93505b600101615066565b88516150fc90836159ec565b61510688866159ec565b6151109190615a03565b93505f61511d8389615a03565b6151279085615a22565b5f9250905081885b60ff8410156151ba5790508089836151488360026159ec565b6151529190615a22565b61515c9190615a35565b8761516783806159ec565b6151719190615a22565b61517b9190615a03565b90508181111561519c5760016151918383615a35565b11156151ba576151af565b60016151a88284615a35565b11156151ba575b60019093019261512f565b8360ff036151fd5760405162461bcd60e51b815260206004820152601060248201526f646f65736e277420636f6e766572676560801b6044820152606401610966565b9b9a5050505050505050505050565b6040516001600160a01b0383811660248301526044820183905261523d91859182169063a9059cbb90606401614d99565b505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6152ba61533f565b612e17615388565b6152ca61533f565b61444481615390565b5f5f60205f8451602086015f885af1806152f2576040513d5f823e3d81fd5b50505f513d91508115615309578060011415615316565b6001600160a01b0384163b155b15614dcb57604051635274afe760e01b81526001600160a01b0385166004820152602401610966565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612e1757604051631afcd79f60e31b815260040160405180910390fd5b614dd161533f565b61441261533f565b828054828255905f5260205f209081019282156153d1579160200282015b828111156153d15782518255916020019190600101906153b6565b50614395929150615430565b828054828255905f5260205f209081019282156153d1579160200282015b828111156153d157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906153fb565b5b80821115614395575f8155600101615431565b5f60208284031215615454575f5ffd5b5035919050565b5f5f83601f84011261546b575f5ffd5b5081356001600160401b03811115615481575f5ffd5b6020830191508360208260051b8501011115610d4d575f5ffd5b5f5f5f604084860312156154ad575f5ffd5b83356001600160401b038111156154c2575f5ffd5b6154ce8682870161545b565b909790965060209590950135949350505050565b5f5f604083850312156154f3575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215615514575f5ffd5b505081359360208301359350604090920135919050565b5f5f6020838503121561553c575f5ffd5b82356001600160401b03811115615551575f5ffd5b61555d8582860161545b565b90969095509350505050565b6001600160a01b0381168114614444575f5ffd5b5f6020828403121561558d575f5ffd5b8135610b0781615569565b5f8151808452602084019350602083015f5b828110156155c85781518652602095860195909101906001016155aa565b5093949350505050565b602081525f610b076020830184615598565b5f5f604083850312156155f5575f5ffd5b823561560081615569565b915060208301358015158114615614575f5ffd5b809150509250929050565b5f5f5f5f60808587031215615632575f5ffd5b5050823594602084013594506040840135936060013592509050565b5f5f5f60408486031215615660575f5ffd5b8335925060208401356001600160401b0381111561567c575f5ffd5b6156888682870161545b565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156156d1576156d1615695565b604052919050565b5f6001600160401b038211156156f1576156f1615695565b5060051b60200190565b5f82601f83011261570a575f5ffd5b813561571d615718826156d9565b6156a9565b8082825260208201915060208360051b86010192508583111561573e575f5ffd5b602085015b8381101561576457803561575681615569565b835260209283019201615743565b5095945050505050565b5f82601f83011261577d575f5ffd5b813561578b615718826156d9565b8082825260208201915060208360051b8601019250858311156157ac575f5ffd5b602085015b838110156157645780358352602092830192016157b1565b80356157d481615569565b919050565b5f5f5f5f5f5f60c087890312156157ee575f5ffd5b86356001600160401b03811115615803575f5ffd5b61580f89828a016156fb565b96505060208701356001600160401b0381111561582a575f5ffd5b61583689828a0161576e565b95505060408701356001600160401b03811115615851575f5ffd5b61585d89828a0161576e565b94505061586c606088016157c9565b92506080870135915060a08701356001600160401b0381111561588d575f5ffd5b61589989828a016156fb565b9150509295509295509295565b604081525f6158b86040830185615598565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156158eb575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156123b457808504811115615925576159256158f2565b600184161561593357908102905b60019390931c92800261590a565b5f8261594f57506001614d5e565b8161595b57505f614d5e565b8160018114615971576002811461597b57615997565b6001915050614d5e565b60ff84111561598c5761598c6158f2565b50506001821b614d5e565b5060208310610133831016604e8410600b84101617156159ba575081810a614d5e565b6159c65f198484615906565b805f19048211156159d9576159d96158f2565b029392505050565b5f610b078383615941565b8082028115828204841417614d5e57614d5e6158f2565b5f82615a1d57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115614d5e57614d5e6158f2565b81810381811115614d5e57614d5e6158f2565b84815260606020820181905281018390525f6001600160fb1b03841115615a6d575f5ffd5b8360051b80866080850137604083019390935250016080019392505050565b838152606060208201525f615aa46060830185615598565b9050826040830152949350505050565b848152608060208201525f615acc6080830186615598565b8281036040840152845180825260208087019201905f5b81811015615b035783511515835260209384019390920191600101615ae3565b50506060939093019390935250949350505050565b5f60208284031215615b28575f5ffd5b815160ff81168114610b07575f5ffd5b606081525f615b4a6060830186615598565b6020830194909452506040015291905056fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081c000a", + "nonce": "0xdb", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4cd1f0d98ac1019e733e14c957c8707ebd59888857af3742dff240179e078612", + "transactionType": "CREATE", + "contractName": "LPToken", + "contractAddress": "0x5b9b00e3ccb5b4bb77cb398c539afb69ebbead96", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x1debc9", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50611a4a8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061021e575f3560e01c80638da5cb5b1161012a578063ce7c2ac2116100b4578063f2fde38b11610079578063f2fde38b146104d7578063f476d145146104ea578063f5eb42dc146104fd578063f9bdea4214610510578063fd71a23714610523575f5ffd5b8063ce7c2ac21461044e578063d914cd4b1461046d578063da76ed9314610480578063dd62ed3e1461048c578063e468688e146104c4575f5ffd5b8063a457c2d7116100fa578063a457c2d7146103f9578063a9059cbb1461040c578063adc7ea371461041f578063b84c824614610432578063c18e2a5c14610445575f5ffd5b80638da5cb5b146103825780638fcb4e5b146103bc57806395d89b41146103cf578063a4063dbc146103d7575f5ffd5b80633b7d0946116101ab5780635c5d44171161017b5780635c5d4417146103385780636d7804591461034157806370a0823114610354578063715018a614610367578063853c637d1461036f575f5ffd5b80633b7d0946146102d55780634cd88b76146102e8578063528c198a146102fb57806355b6ed5c1461030e575f5ffd5b806323b872dd116101f157806323b872dd14610283578063313ce5671461029657806333fce74b146102a557806339509351146102ba5780633a98ef39146102cd575f5ffd5b806306fdde0314610222578063095ea7b3146102405780630e15561a1461026357806318160ddd1461027a575b5f5ffd5b61022a610536565b60405161023791906115dc565b60405180910390f35b61025361024e36600461163d565b6105c6565b6040519015158152602001610237565b61026c60025481565b604051908152602001610237565b61026c60015481565b610253610291366004611665565b6105dc565b60405160128152602001610237565b6102b86102b336600461163d565b6105fd565b005b6102536102c836600461163d565b610617565b61026c5f5481565b6102b86102e336600461169f565b610660565b6102b86102f6366004611757565b61071c565b6102b861030936600461163d565b610845565b61026c61031c3660046117bc565b600460209081525f928352604080842090915290825290205481565b61026c60065481565b61026c61034f366004611665565b61087d565b61026c61036236600461169f565b6108b4565b6102b86108d5565b6102b861037d3660046117ed565b6108e8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610237565b61026c6103ca36600461163d565b6108f6565b61022a610921565b6102536103e536600461169f565b60056020525f908152604090205460ff1681565b61025361040736600461163d565b610930565b61025361041a36600461163d565b6109b7565b6102b861042d3660046117ed565b6109c3565b6102b8610440366004611804565b610a53565b61026c60075481565b61026c61045c36600461169f565b60036020525f908152604090205481565b6102b861047b36600461169f565b610a97565b61026c6402540be40081565b61026c61049a3660046117bc565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b6102b86104d23660046117ed565b610b78565b6102b86104e536600461169f565b610cd9565b61026c6104f83660046117ed565b610d16565b61026c61050b36600461169f565b610d45565b61026c61051e3660046117ed565b610d62565b6102b86105313660046117ed565b610d81565b60606008805461054590611836565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611836565b80156105bc5780601f10610593576101008083540402835291602001916105bc565b820191905f5260205f20905b81548152906001019060200180831161059f57829003601f168201915b5050505050905090565b5f6105d2338484610e95565b5060015b92915050565b5f6105e8843384610fa1565b6105f384848461100e565b5060019392505050565b610608823383610fa1565b6106128282611031565b505050565b335f8181526004602090815260408083206001600160a01b03871684529091528120805491926105d292909186918691908690610655908490611882565b925050819055610e95565b610668611190565b6001600160a01b0381165f9081526005602052604090205460ff166106d45760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20706f6f6c20646f65736e2774206578697374000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f81815260056020526040808220805460ff19169055517f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f9190a250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156107615750825b90505f8267ffffffffffffffff16600114801561077d5750303b155b90508115801561078b575080155b156107a95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107d357845460ff60401b1916600160401b1785555b60086107df88826118e0565b5060096107ec87826118e0565b506107f6336111eb565b831561083c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b335f9081526005602052604090205460ff166108735760405162461bcd60e51b81526004016106cb9061199b565b61061282826111fc565b5f5f61088883610d62565b9050610895853383610fa1565b6108a0858585611328565b6108ac8585838661147b565b949350505050565b6001600160a01b0381165f908152600360205260408120546105d690610d62565b6108dd611190565b6108e65f61151b565b565b6108f23382611031565b5050565b5f610902338484611328565b5f61090c83610d62565b905061091a3385838661147b565b9392505050565b60606009805461054590611836565b335f9081526004602090815260408083206001600160a01b0386168452909152812054828110156109a35760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a414c4c4f57414e43455f42454c4f575f5a45524f0000000060448201526064016106cb565b6105f333856109b286856119c5565b610e95565b5f6105d233848461100e565b6109cb611190565b6402540be4008110610a175760405162461bcd60e51b81526020600482015260156024820152744c50546f6b656e3a206f7574206f662072616e676560581b60448201526064016106cb565b60068190556040518181527f11e3209d0ae07ce8613db0c067c493a7230fca326aaae2383e09cf738d923871906020015b60405180910390a150565b610a5b611190565b6009610a6782826118e0565b507fd7ac43020a860396b99c06d6cea4b050bef19c5c43f9a8bd3932066c60e11c4e81604051610a4891906115dc565b610a9f611190565b6001600160a01b038116610ac55760405162461bcd60e51b81526004016106cb906119d8565b6001600160a01b0381165f9081526005602052604090205460ff1615610b2d5760405162461bcd60e51b815260206004820152601e60248201527f4c50546f6b656e3a20706f6f6c20697320616c7265616479206164646564000060448201526064016106cb565b6001600160a01b0381165f81815260056020526040808220805460ff19166001179055517f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69190a250565b335f9081526005602052604090205460ff16610ba65760405162461bcd60e51b81526004016106cb9061199b565b805f03610bea5760405162461bcd60e51b81526020600482015260126024820152711314151bdad95b8e881b9bc8185b5bdd5b9d60721b60448201526064016106cb565b5f6402540be40082600654610bff9190611a07565b610c099190611a1e565b90505f610c1682846119c5565b90508060015f828254610c299190611882565b925050819055508060025f828254610c419190611882565b925050819055508160075f828254610c599190611882565b90915550506007546040805184815260208101929092527fa5e8bf15c46a47065bbdc3023e67f56cb553e0bdbc3076775f41fb63240b863c910160405180910390a160408051848152602081018390527f9149335f0abe9ee631f35156bcb8e266e1eab4f22242f2e07707e4c1cdbec3ce910160405180910390a1505050565b610ce1611190565b6001600160a01b038116610d0a57604051631e4fbdf760e01b81525f60048201526024016106cb565b610d138161151b565b50565b5f6001545f03610d2757505f919050565b6001545f54610d369084611a07565b6105d69190611a1e565b919050565b6001600160a01b0381165f908152600360205260408120546105d6565b5f5f545f03610d7257505f919050565b5f54600154610d369084611a07565b335f9081526005602052604090205460ff16610daf5760405162461bcd60e51b81526004016106cb9061199b565b805f03610df35760405162461bcd60e51b81526020600482015260126024820152711314151bdad95b8e881b9bc8185b5bdd5b9d60721b60448201526064016106cb565b600754811115610e455760405162461bcd60e51b815260206004820152601b60248201527f4c50546f6b656e3a20696e737566666369656e7420627566666572000000000060448201526064016106cb565b8060075f828254610e5691906119c5565b90915550506007546040805183815260208101929092527f41f7a6194921888a19dff325a631c0f2f64415d7825efdeb68a4e8ab0635b6209101610a48565b6001600160a01b038316610eeb5760405162461bcd60e51b815260206004820152601f60248201527f4c50546f6b656e3a20415050524f56455f46524f4d5f5a45524f5f414444520060448201526064016106cb565b6001600160a01b038216610f415760405162461bcd60e51b815260206004820152601d60248201527f4c50546f6b656e3a20415050524f56455f544f5f5a45524f5f4144445200000060448201526064016106cb565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038084165f908152600460209081526040808320938616835292905220545f1981146110085781811015610ff95760405163054365bb60e31b815260048101829052602481018390526044016106cb565b61100884846109b285856119c5565b50505050565b5f61101882610d16565b9050611025848483611328565b6110088484848461147b565b5f6001600160a01b0383166110885760405162461bcd60e51b815260206004820152601c60248201527f4c50546f6b656e3a204255524e5f46524f4d5f5a45524f5f414444520000000060448201526064016106cb565b6001600160a01b0383165f908152600360205260408120546110a990610d62565b9050808311156110d65760405163cf47918160e01b815260048101829052602481018490526044016106cb565b5f6110e084610d16565b6001600160a01b0386165f9081526003602052604081208054929350839290919061110c9084906119c5565b92505081905550805f5f82825461112391906119c5565b925050819055505f5492508360015f82825461113f91906119c5565b909155505060408051858152602081018390526001600160a01b038716917f9228b7e435f7ca9ea03da268ef3e8d57d72b10fd771f32c7a2eb095fb58f6897910160405180910390a2505092915050565b336111c27f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108e65760405163118cdaa760e01b81523360048201526024016106cb565b6111f361158b565b610d13816115d4565b5f6001600160a01b0383166112535760405162461bcd60e51b815260206004820152601a60248201527f4c50546f6b656e3a204d494e545f544f5f5a45524f5f4144445200000000000060448201526064016106cb565b5f6001545f1415801561126657505f5415155b1561127b5761127483610d16565b905061127e565b50815b6001600160a01b0384165f90815260036020526040812080548392906112a5908490611882565b92505081905550805f5f8282546112bc9190611882565b925050819055505f5491508260015f8282546112d89190611882565b909155505060408051848152602081018390526001600160a01b038616917fd5103f333769455df788908e17b0f6f83838ebeae2cd1ed6f23ec20dad88c9a3910160405180910390a25092915050565b6001600160a01b03831661134e5760405162461bcd60e51b81526004016106cb906119d8565b6001600160a01b0382166113745760405162461bcd60e51b81526004016106cb906119d8565b306001600160a01b038316036113da5760405162461bcd60e51b815260206004820152602560248201527f4c50546f6b656e3a205452414e534645525f544f5f6c70546f6b656e5f434f4e60448201526415149050d560da1b60648201526084016106cb565b6001600160a01b0383165f908152600360205260409020548082111561141d5760405163cf47918160e01b815260048101829052602481018390526044016106cb565b6001600160a01b0384165f90815260036020526040812080548492906114449084906119c5565b90915550506001600160a01b0383165f9081526003602052604081208054849290611470908490611882565b909155505050505050565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114c091815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb8360405161150d91815260200190565b60405180910390a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108e657604051631afcd79f60e31b815260040160405180910390fd5b610ce161158b565b602081525f82518060208401525f5b8181101561160857602081860181015160408684010152016115eb565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610d40575f5ffd5b5f5f6040838503121561164e575f5ffd5b61165783611627565b946020939093013593505050565b5f5f5f60608486031215611677575f5ffd5b61168084611627565b925061168e60208501611627565b929592945050506040919091013590565b5f602082840312156116af575f5ffd5b61091a82611627565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126116db575f5ffd5b813567ffffffffffffffff8111156116f5576116f56116b8565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611724576117246116b8565b60405281815283820160200185101561173b575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611768575f5ffd5b823567ffffffffffffffff81111561177e575f5ffd5b61178a858286016116cc565b925050602083013567ffffffffffffffff8111156117a6575f5ffd5b6117b2858286016116cc565b9150509250929050565b5f5f604083850312156117cd575f5ffd5b6117d683611627565b91506117e460208401611627565b90509250929050565b5f602082840312156117fd575f5ffd5b5035919050565b5f60208284031215611814575f5ffd5b813567ffffffffffffffff81111561182a575f5ffd5b6108ac848285016116cc565b600181811c9082168061184a57607f821691505b60208210810361186857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105d6576105d661186e565b601f82111561061257805f5260205f20601f840160051c810160208510156118ba5750805b601f840160051c820191505b818110156118d9575f81556001016118c6565b5050505050565b815167ffffffffffffffff8111156118fa576118fa6116b8565b61190e816119088454611836565b84611895565b6020601f821160018114611940575f83156119295750848201515b5f19600385901b1c1916600184901b1784556118d9565b5f84815260208120601f198516915b8281101561196f578785015182556020948501946001909201910161194f565b508482101561198c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60208082526010908201526f1314151bdad95b8e881b9bc81c1bdbdb60821b604082015260600190565b818103818111156105d6576105d661186e565b6020808252601590820152744c50546f6b656e3a207a65726f206164647265737360581b604082015260600190565b80820281158282048414176105d6576105d661186e565b5f82611a3857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081c000a", + "nonce": "0xdc", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf80c957117a3d66fe58df0d7fa8ffd726c8aa7816ad259af5a8cd10bd0fc613f", + "transactionType": "CREATE", + "contractName": "WLPToken", + "contractAddress": "0x640959ecedb9ca512af716a1f770fffd3df81774", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x1c98a6", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506119148061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106101a1575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb7714610391578063d905777e146103a4578063dd62ed3e146103b7578063ef8b30f7146103ca575f5ffd5b8063c4d66de814610369578063c63d75b6146102a3578063c6e6f5921461037e575f5ffd5b8063a9059cbb116100ce578063a9059cbb1461031d578063b3d7f6b914610330578063b460af9414610343578063ba08765214610356575f5ffd5b806370a08231146102ef57806394bf804d1461030257806395d89b4114610315575f5ffd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102a35780634cdad506146102b75780635fcbd285146102ca5780636e553f65146102dc575f5ffd5b806323b872dd14610245578063313ce5671461025857806338d52e0f14610272575f5ffd5b806301e1d114146101a557806306fdde03146101c057806307a2d13a146101d5578063095ea7b3146101e85780630a28a4771461020b57806318160ddd1461021e575b5f5ffd5b6101ad6103dd565b6040519081526020015b60405180910390f35b6101c861044c565b6040516101b79190611419565b6101ad6101e336600461144b565b61050c565b6101fb6101f6366004611476565b61057e565b60405190151581526020016101b7565b6101ad61021936600461144b565b610595565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101ad565b6101fb6102533660046114a0565b6105a1565b6102606105c6565b60405160ff90911681526020016101b7565b5f5160206118e85f395f51905f52546001600160a01b03165b6040516001600160a01b0390911681526020016101b7565b6101ad6102b13660046114de565b505f1990565b6101ad6102c536600461144b565b6105f5565b5f5461028b906001600160a01b031681565b6101ad6102ea3660046114f9565b610600565b6101ad6102fd3660046114de565b6106ad565b6101ad6103103660046114f9565b6106d3565b6101c8610704565b6101fb61032b366004611476565b610742565b6101ad61033e36600461144b565b61074f565b6101ad610351366004611527565b61075b565b6101ad610364366004611527565b610890565b61037c6103773660046114de565b61094d565b005b6101ad61038c36600461144b565b610ac7565b6101ad61039f3660046114de565b610af8565b6101ad6103b23660046114de565b610b0b565b6101ad6103c5366004611566565b610b15565b6101ad6103d836600461144b565b610b5e565b5f80546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610423573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104479190611592565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206118c85f395f51905f529161048a906115a9565b80601f01602080910402602001604051908101604052809291908181526020018280546104b6906115a9565b80156105015780601f106104d857610100808354040283529160200191610501565b820191905f5260205f20905b8154815290600101906020018083116104e457829003601f168201915b505050505091505090565b5f8054604051637cdef52160e11b8152600481018490526001600160a01b039091169063f9bdea42906024015b602060405180830381865afa158015610554573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105789190611592565b92915050565b5f3361058b818585610b69565b5060019392505050565b5f610578826001610b7b565b5f336105ae858285610bd2565b6105b9858585610c35565b60019150505b9392505050565b5f805f5160206118e85f395f51905f5290505f81546105ef9190600160a01b900460ff166115f5565b91505090565b5f610578825f610c92565b5f5f831161062157604051631f2a200560e01b815260040160405180910390fd5b61062a83610ac7565b5f546040516323b872dd60e01b8152336004820152306024820152604481018690529192506001600160a01b0316906323b872dd906064016020604051808303815f875af115801561067e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a2919061160e565b506105788282610ce0565b6001600160a01b03165f9081525f5160206118c85f395f51905f52602052604090205490565b5f5f196106e4565b60405180910390fd5b5f6106ee8561074f565b90506106fc33858388610d18565b949350505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206118c85f395f51905f529161048a906115a9565b5f3361058b818585610c35565b5f610578826001610c92565b5f5f841161077c57604051631f2a200560e01b815260040160405180910390fd5b61078584610ac7565b9050336001600160a01b0383161461080a575f6107a28333610b15565b9050818110156107f45760405162461bcd60e51b815260206004820152601f60248201527f455243343632363a20696e73756666696369656e7420616c6c6f77616e63650060448201526064016106db565b6108088333610803858561162d565b610b69565b505b6108148282610da4565b5f5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529091169063a9059cbb906044015b6020604051808303815f875af1158015610864573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610888919061160e565b509392505050565b5f5f84116108b157604051631f2a200560e01b815260040160405180910390fd5b6108ba8461050c565b9050336001600160a01b0383161461090b575f6108d78333610b15565b9050848110156108fa576040516313be252b60e01b815260040160405180910390fd5b6109098333610803888561162d565b505b6109158285610da4565b5f5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb90604401610848565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156109925750825b90505f8267ffffffffffffffff1660011480156109ae5750303b155b9050811580156109bc575080155b156109da5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a0457845460ff60401b1916600160401b1785555b610a566040518060400160405280601081526020016f2bb930b83832b2102628102a37b5b2b760811b815250604051806040016040528060088152602001673bb6382a37b5b2b760c11b815250610dd8565b610a5f86610dea565b5f80546001600160a01b0319166001600160a01b0388161790558315610abf57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f805460405163f476d14560e01b8152600481018490526001600160a01b039091169063f476d14590602401610539565b5f610578610b05836106ad565b5f610c92565b5f610578826106ad565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610578825f610b7b565b610b768383836001610dfe565b505050565b5f6105bf610b8a82600a611723565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bb69190611731565b610bbe6103dd565b610bc9906001611731565b85919085610ed9565b5f610bdd8484610b15565b90505f198114610c2f5781811015610c2157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106db565b610c2f84848484035f610dfe565b50505050565b6001600160a01b038316610c5e57604051634b637e8f60e11b81525f60048201526024016106db565b6001600160a01b038216610c875760405163ec442f0560e01b81525f60048201526024016106db565b610b76838383610f24565b5f6105bf610c9e6103dd565b610ca9906001611731565b610cb45f600a611723565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bc99190611731565b6001600160a01b038216610d095760405163ec442f0560e01b81525f60048201526024016106db565b610d145f8383610f24565b5050565b5f5160206118e85f395f51905f528054610d3d906001600160a01b031686308661105d565b610d478483610ce0565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051610d95929190918252602082015260400190565b60405180910390a35050505050565b6001600160a01b038216610dcd57604051634b637e8f60e11b81525f60048201526024016106db565b610d14825f83610f24565b610de06110b7565b610d148282611102565b610df26110b7565b610dfb81611152565b50565b5f5160206118c85f395f51905f526001600160a01b038516610e355760405163e602df0560e01b81525f60048201526024016106db565b6001600160a01b038416610e5e57604051634a1406b160e11b81525f60048201526024016106db565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115610ed257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d9591815260200190565b5050505050565b5f610f06610ee6836111c2565b8015610f0157505f8480610efc57610efc611744565b868809115b151590565b610f118686866111ee565b610f1b9190611731565b95945050505050565b5f5160206118c85f395f51905f526001600160a01b038416610f5e5781816002015f828254610f539190611731565b90915550610fce9050565b6001600160a01b0384165f9081526020829052604090205482811015610fb05760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016106db565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316610fec57600281018054839003905561100a565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161104f91815260200190565b60405180910390a350505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c2f9085906112a4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661110057604051631afcd79f60e31b815260040160405180910390fd5b565b61110a6110b7565b5f5160206118c85f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361114384826117b0565b5060048101610c2f83826117b0565b61115a6110b7565b5f5160206118e85f395f51905f525f8061117384611310565b9150915081611183576012611185565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f60028260038111156111d7576111d761186b565b6111e1919061187f565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036112225783828161121857611218611744565b04925050506105bf565b8084116112395761123960038515026011186113e6565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f60205f8451602086015f885af1806112c3576040513d5f823e3d81fd5b50505f513d915081156112da5780600114156112e7565b6001600160a01b0384163b155b15610c2f57604051635274afe760e01b81526001600160a01b03851660048201526024016106db565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b03871691611356916118ac565b5f60405180830381855afa9150503d805f811461138e576040519150601f19603f3d011682016040523d82523d5f602084013e611393565b606091505b50915091508180156113a757506020815110155b156113da575f818060200190518101906113c19190611592565b905060ff81116113d8576001969095509350505050565b505b505f9485945092505050565b634e487b715f52806020526024601cfd5b5f5b838110156114115781810151838201526020016113f9565b50505f910152565b602081525f82518060208401526114378160408501602087016113f7565b601f01601f19169190910160400192915050565b5f6020828403121561145b575f5ffd5b5035919050565b6001600160a01b0381168114610dfb575f5ffd5b5f5f60408385031215611487575f5ffd5b823561149281611462565b946020939093013593505050565b5f5f5f606084860312156114b2575f5ffd5b83356114bd81611462565b925060208401356114cd81611462565b929592945050506040919091013590565b5f602082840312156114ee575f5ffd5b81356105bf81611462565b5f5f6040838503121561150a575f5ffd5b82359150602083013561151c81611462565b809150509250929050565b5f5f5f60608486031215611539575f5ffd5b83359250602084013561154b81611462565b9150604084013561155b81611462565b809150509250925092565b5f5f60408385031215611577575f5ffd5b823561158281611462565b9150602083013561151c81611462565b5f602082840312156115a2575f5ffd5b5051919050565b600181811c908216806115bd57607f821691505b6020821081036115db57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610578576105786115e1565b5f6020828403121561161e575f5ffd5b815180151581146105bf575f5ffd5b81810381811115610578576105786115e1565b6001815b600184111561167b5780850481111561165f5761165f6115e1565b600184161561166d57908102905b60019390931c928002611644565b935093915050565b5f8261169157506001610578565b8161169d57505f610578565b81600181146116b357600281146116bd576116d9565b6001915050610578565b60ff8411156116ce576116ce6115e1565b50506001821b610578565b5060208310610133831016604e8410600b84101617156116fc575081810a610578565b6117085f198484611640565b805f190482111561171b5761171b6115e1565b029392505050565b5f6105bf60ff841683611683565b80820180821115610578576105786115e1565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b601f821115610b7657805f5260205f20601f840160051c810160208510156117915750805b601f840160051c820191505b81811015610ed2575f815560010161179d565b815167ffffffffffffffff8111156117ca576117ca611758565b6117de816117d884546115a9565b8461176c565b6020601f821160018114611810575f83156117f95750848201515b5f19600385901b1c1916600184901b178455610ed2565b5f84815260208120601f198516915b8281101561183f578785015182556020948501946001909201910161181f565b508482101561185c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061189d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82516118bd8184602087016113f7565b919091019291505056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a164736f6c634300081c000a", + "nonce": "0xdd", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "function": null, + "arguments": [ + "0x10172bCC93a7fBde0EC4318e4aAb2211F8858c17", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c520", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a00000000000000000000000010172bcc93a7fbde0ec4318e4aab2211f8858c1700000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xde", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "function": null, + "arguments": [ + "0x5B9b00E3CCb5b4BB77cB398c539Afb69EbbeaD96", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c510", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a0000000000000000000000005b9b00e3ccb5b4bb77cb398c539afb69ebbead9600000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xdf", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionType": "CREATE", + "contractName": "UpgradeableBeacon", + "contractAddress": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "function": null, + "arguments": [ + "0x640959eCEdb9Ca512aF716a1f770Fffd3Df81774", + "0x92Bc7D2305EC97E138a5c98F6f5FD69703fe0589" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x4c520", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040516103f83803806103f883398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f5ffd5b919050565b5f5f60408385031215610170575f5ffd5b61017983610144565b915061018760208401610144565b90509250929050565b61025b8061019d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f5ffd5b81356001600160a01b0381168114610247575f5ffd5b939250505056fea164736f6c634300081c000a000000000000000000000000640959ecedb9ca512af716a1f770fffd3df8177400000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xe0", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x97884dada719ab2a4d04fc19b6b926d67ea7a687ad6cc7ec68249038da596846", + "transactionType": "CREATE", + "contractName": "ConstantExchangeRateProvider", + "contractAddress": "0xeb47d13e805c64d00e9ea0b3eee5a02a69df8138", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x17c02", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b50606380601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b670de0b6b3a7640000603756fea164736f6c634300081c000a", + "nonce": "0xe1", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3436de2f09a2ae216b0d6f77cbeb0897d46496d063869f57bc279619e8cbda7a", + "transactionType": "CREATE", + "contractName": "SelfPeggingAssetFactory", + "contractAddress": "0x2bd95ae42d848ac93f6fa2a4b988af5a32e6ada9", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x35c87c", + "value": "0x0", + "input": "0x60a0604052306080523480156012575f5ffd5b5060805161300a6100395f395f818161163f0152818161166801526117ac015261300a5ff3fe608060405260043610610131575f3560e01c80638da5cb5b116100a8578063b86bc2a21161006d578063b86bc2a21461034c578063c42cf5351461036b578063eddd0d9c1461038a578063ee919d50146103a9578063f2fde38b146103c8578063f446c1d0146103e7575f5ffd5b80638da5cb5b14610280578063965fa21e146102bc578063a17fcbc8146102d1578063ab0d433c146102f0578063ad3cb1cc1461030f575f5ffd5b80634f1ef286116100f95780634f1ef286146101f257806352d1902d1461020557806354cf2aeb146102195780635d841af51461022e5780636cd243381461024d578063715018a61461026c575f5ffd5b80630208fedc146101355780630810a132146101565780630c340a241461019257806313966db5146101b057806334e19907146101d3575b5f5ffd5b348015610140575f5ffd5b5061015461014f366004611af7565b6103fc565b005b348015610161575f5ffd5b50600854610175906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019d575f5ffd5b505f54610175906001600160a01b031681565b3480156101bb575f5ffd5b506101c560015481565b604051908152602001610189565b3480156101de575f5ffd5b506101546101ed366004611b89565b6106d6565b610154610200366004611c71565b61071a565b348015610210575f5ffd5b506101c5610739565b348015610224575f5ffd5b506101c560025481565b348015610239575f5ffd5b50610154610248366004611b89565b610754565b348015610258575f5ffd5b50600654610175906001600160a01b031681565b348015610277575f5ffd5b50610154610791565b34801561028b575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610175565b3480156102c7575f5ffd5b506101c560035481565b3480156102dc575f5ffd5b50600554610175906001600160a01b031681565b3480156102fb575f5ffd5b5061015461030a366004611cfd565b6107a4565b34801561031a575f5ffd5b5061033f604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101899190611e48565b348015610357575f5ffd5b50600754610175906001600160a01b031681565b348015610376575f5ffd5b50610154610385366004611e5a565b611460565b348015610395575f5ffd5b506101546103a4366004611b89565b6114dc565b3480156103b4575f5ffd5b506101546103c3366004611b89565b611519565b3480156103d3575f5ffd5b506101546103e2366004611e5a565b611576565b3480156103f2575f5ffd5b506101c560045481565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156104415750825b90505f8267ffffffffffffffff16600114801561045d5750303b155b90508115801561046b575080155b156104895760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104b357845460ff60401b1916600160401b1785555b6001600160a01b038e166104da5760405163e6c4247b60e01b815260040160405180910390fd5b5f8a116104fa57604051632a9ffab760e21b815260040160405180910390fd5b6001600160a01b0389166105215760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0388166105485760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03871661056f5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166105965760405163e6c4247b60e01b815260040160405180910390fd5b61059e6115b8565b6105a7336115c8565b8d5f5f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508860055f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508760065f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508660075f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508560085f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508c6001819055508b6002819055508a6003819055508960048190555083156106c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050505050565b6106de6115d9565b60028190556040518181527ffb519bd09b996bbbb09efc975180c1aaa4c0d4314fbfdcbd6bac01f18040ecb8906020015b60405180910390a150565b610722611634565b61072b826116d8565b61073582826116e0565b5050565b5f6107426117a1565b505f516020612fde5f395f51905f5290565b61075c6115d9565b60038190556040518181527ff7fd71d4649087cd364bf6974e709b8a39192e48731c8821334bd374c3bc10849060200161070f565b6107996115d9565b6107a25f6117ea565b565b80516001600160a01b03166107cc5760405163e6c4247b60e01b815260040160405180910390fd5b60208101516001600160a01b03166107f75760405163e6c4247b60e01b815260040160405180910390fd5b80602001516001600160a01b0316815f01516001600160a01b03160361083057604051632a9ffab760e21b815260040160405180910390fd5b5f815f01516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561086f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108969190810190611e75565b90505f82602001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156108d8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ff9190810190611e75565b90505f826040516020016109139190611ee7565b60408051601f198184030181529082905261093091602001611f12565b60408051601f198184030181529082905261094f918490602001611f36565b60405160208183030381529060405290505f836040516020016109729190611f64565b60408051601f198184030181529082905261098f91602001611f9e565b60408051601f19818403018152908290526109ae918590602001611f36565b60405160208183030381529060405290505f81836040516024016109d3929190611fc2565b60408051601f198184030181529181526020820180516001600160e01b031663266c45bb60e11b17905260065490519192505f916001600160a01b03909116908390610a1e90611aac565b610a29929190611fe6565b604051809103905ff080158015610a42573d5f5f3e3d5ffd5b506040805160018082528183019092529192505f91906020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750505f805485519394506001600160a01b031692859250610aa757610aa7612011565b6001600160a01b0392831660209182029290920101525f80548351921691839190610ad457610ad4612011565b6001600160a01b03929092166020928302919091018201526040805160028082526060820183525f93919290918301908036833750506040805160028082526060820183529394505f93909250906020830190803683375050604080516003808252608082019092529293505f929150602082016060803683370190505090508b5f0151835f81518110610b6a57610b6a612011565b60200260200101906001600160a01b031690816001600160a01b0316815250508b6020015183600181518110610ba257610ba2612011565b60200260200101906001600160a01b031690816001600160a01b0316815250508b5f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c259190612025565b610c30906012612059565b610c3b90600a612155565b825f81518110610c4d57610c4d612011565b6020026020010181815250508b602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbd9190612025565b610cc8906012612059565b610cd390600a612155565b82600181518110610ce657610ce6612011565b602002602001018181525050600154815f81518110610d0757610d07612011565b60200260200101818152505060025481600181518110610d2957610d29612011565b60200260200101818152505060035481600281518110610d4b57610d4b612011565b6020908102919091010152604080516002808252606082019092525f918160200160208202803683370190505090505f8d604001516003811115610d9157610d91612163565b1480610db2575060028d604001516003811115610db057610db0612163565b145b15610dfd5760085481516001600160a01b039091169082905f90610dd857610dd8612011565b60200260200101906001600160a01b031690816001600160a01b031681525050610f70565b60018d604001516003811115610e1557610e15612163565b03610ee15760608d01516001600160a01b0316610e4557604051639589a27d60e01b815260040160405180910390fd5b5f8d608001515111610e6a576040516314ca5b9760e31b815260040160405180910390fd5b5f8d606001518e60800151604051610e8190611ab9565b610e8c929190611fe6565b604051809103905ff080158015610ea5573d5f5f3e3d5ffd5b50905080825f81518110610ebb57610ebb612011565b60200260200101906001600160a01b031690816001600160a01b03168152505050610f70565b60038d604001516003811115610ef957610ef9612163565b03610f70575f8d5f0151604051610f0f90611ac6565b6001600160a01b039091168152602001604051809103905ff080158015610f38573d5f5f3e3d5ffd5b50905080825f81518110610f4e57610f4e612011565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8d60a001516003811115610f8757610f87612163565b1480610fa8575060028d60a001516003811115610fa657610fa6612163565b145b15610ff65760085481516001600160a01b039091169082906001908110610fd157610fd1612011565b60200260200101906001600160a01b031690816001600160a01b03168152505061116c565b60018d60a00151600381111561100e5761100e612163565b036110db5760c08d01516001600160a01b031661103e57604051639589a27d60e01b815260040160405180910390fd5b5f8d60e001515111611063576040516314ca5b9760e31b815260040160405180910390fd5b5f8d60c001518e60e0015160405161107a90611ab9565b611085929190611fe6565b604051809103905ff08015801561109e573d5f5f3e3d5ffd5b50905080826001815181106110b5576110b5612011565b60200260200101906001600160a01b031690816001600160a01b0316815250505061116c565b60038d60a0015160038111156110f3576110f3612163565b0361116c575f8d6020015160405161110a90611ac6565b6001600160a01b039091168152602001604051809103905ff080158015611133573d5f5f3e3d5ffd5b509050808260018151811061114a5761114a612011565b60200260200101906001600160a01b031690816001600160a01b031681525050505b5f8484848a6004548660405160240161118a969594939291906121ea565b60408051601f198184030181529181526020820180516001600160e01b031663bf9dddad60e01b17905260055490519192505f916001600160a01b039091169083906111d590611aac565b6111e0929190611fe6565b604051809103905ff0801580156111f9573d5f5f3e3d5ffd5b505f54604051632585eee960e11b81526001600160a01b0391821660048201526001602482015291925082918b91831690634b0bddd2906044015f604051808303815f87803b15801561124a575f5ffd5b505af115801561125c573d5f5f3e3d5ffd5b50505f5460405163f2fde38b60e01b81526001600160a01b039182166004820152908516925063f2fde38b91506024015f604051808303815f87803b1580156112a3575f5ffd5b505af11580156112b5573d5f5f3e3d5ffd5b505060405163d914cd4b60e01b81526001600160a01b0385811660048301528416925063d914cd4b91506024015f604051808303815f87803b1580156112f9575f5ffd5b505af115801561130b573d5f5f3e3d5ffd5b50505f5460405163f2fde38b60e01b81526001600160a01b039182166004820152908416925063f2fde38b91506024015f604051808303815f87803b158015611352575f5ffd5b505af1158015611364573d5f5f3e3d5ffd5b50506040516001600160a01b03841660248201525f9250604401905060408051601f198184030181529181526020820180516001600160e01b031663189acdbd60e31b17905260075490519192505f916001600160a01b039091169083906113cb90611aac565b6113d6929190611fe6565b604051809103905ff0801580156113ef573d5f5f3e3d5ffd5b5090507f9c5d829b9b23efc461f9aeef91979ec04bb903feb3bee4f26d22114abfc7335b8d8683604051611443939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60405180910390a150505050505050505050505050505050505050565b6114686115d9565b6001600160a01b03811661148f5760405163e6c4247b60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fb607f57f46e59880ba44c1571bc4aef5ef0e09f8a981adddbfb3dd1189d356839060200161070f565b6114e46115d9565b60018190556040518181527faff5a6ec6ae547bf04a2ca7611a0e29ce5adeec76632a9d82051a1431e8554689060200161070f565b6115216115d9565b5f811161154157604051632a9ffab760e21b815260040160405180910390fd5b60048190556040518181527f408aa8ab61e953b559cf60fcd74348414e42226217aaec52f5eaa420a0949a799060200161070f565b61157e6115d9565b6001600160a01b0381166115ac57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6115b5816117ea565b50565b6115c061185a565b6107a26118a3565b6115d061185a565b6115b5816118d1565b3361160b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107a25760405163118cdaa760e01b81523360048201526024016115a3565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806116ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166116ae5f516020612fde5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156107a25760405163703e46dd60e11b815260040160405180910390fd5b6115b56115d9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561173a575060408051601f3d908101601f191682019092526117379181019061228b565b60015b61176257604051634c9c8ce360e01b81526001600160a01b03831660048201526024016115a3565b5f516020612fde5f395f51905f52811461179257604051632a87526960e21b8152600481018290526024016115a3565b61179c83836118d9565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a25760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107a257604051631afcd79f60e31b815260040160405180910390fd5b6118ab61185a565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61157e61185a565b6118e28261192e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156119265761179c8282611991565b610735611a05565b806001600160a01b03163b5f0361196357604051634c9c8ce360e01b81526001600160a01b03821660048201526024016115a3565b5f516020612fde5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516119ad91906122a2565b5f60405180830381855af49150503d805f81146119e5576040519150601f19603f3d011682016040523d82523d5f602084013e6119ea565b606091505b50915091506119fa858383611a24565b925050505b92915050565b34156107a25760405163b398979f60e01b815260040160405180910390fd5b606082611a3957611a3482611a83565b611a7c565b8151158015611a5057506001600160a01b0384163b155b15611a7957604051639996b31560e01b81526001600160a01b03851660048201526024016115a3565b50805b9392505050565b805115611a935780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610572806122be83390190565b6106478061283083390190565b61016780612e7783390190565b6001600160a01b03811681146115b5575f5ffd5b8035611af281611ad3565b919050565b5f5f5f5f5f5f5f5f5f6101208a8c031215611b10575f5ffd5b8935611b1b81611ad3565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135611b4781611ad3565b935060c08a0135611b5781611ad3565b925060e08a0135611b6781611ad3565b91506101008a0135611b7881611ad3565b809150509295985092959850929598565b5f60208284031215611b99575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715611bd857611bd8611ba0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c0757611c07611ba0565b604052919050565b5f67ffffffffffffffff821115611c2857611c28611ba0565b50601f01601f191660200190565b5f611c48611c4384611c0f565b611bde565b9050828152838383011115611c5b575f5ffd5b828260208301375f602084830101529392505050565b5f5f60408385031215611c82575f5ffd5b8235611c8d81611ad3565b9150602083013567ffffffffffffffff811115611ca8575f5ffd5b8301601f81018513611cb8575f5ffd5b611cc785823560208401611c36565b9150509250929050565b803560048110611af2575f5ffd5b5f82601f830112611cee575f5ffd5b611a7c83833560208501611c36565b5f60208284031215611d0d575f5ffd5b813567ffffffffffffffff811115611d23575f5ffd5b82016101008185031215611d35575f5ffd5b611d3d611bb4565b611d4682611ae7565b8152611d5460208301611ae7565b6020820152611d6560408301611cd1565b6040820152611d7660608301611ae7565b6060820152608082013567ffffffffffffffff811115611d94575f5ffd5b611da086828501611cdf565b608083015250611db260a08301611cd1565b60a0820152611dc360c08301611ae7565b60c082015260e082013567ffffffffffffffff811115611de1575f5ffd5b611ded86828501611cdf565b60e083015250949350505050565b5f5b83811015611e15578181015183820152602001611dfd565b50505f910152565b5f8151808452611e34816020860160208601611dfb565b601f01601f19169290920160200192915050565b602081525f611a7c6020830184611e1d565b5f60208284031215611e6a575f5ffd5b8135611a7c81611ad3565b5f60208284031215611e85575f5ffd5b815167ffffffffffffffff811115611e9b575f5ffd5b8201601f81018413611eab575f5ffd5b8051611eb9611c4382611c0f565b818152856020838501011115611ecd575f5ffd5b611ede826020830160208601611dfb565b95945050505050565b635350412d60e01b81525f8251611f05816004850160208701611dfb565b9190910160040192915050565b5f8251611f23818460208701611dfb565b602d60f81b920191825250600101919050565b5f8351611f47818460208801611dfb565b835190830190611f5b818360208801611dfb565b01949350505050565b72029b2b633102832b3b3b4b7339020b9b9b2ba1606d1b81525f8251611f91816013850160208701611dfb565b9190910160130192915050565b5f8251611faf818460208701611dfb565b600160fd1b920191825250600101919050565b604081525f611fd46040830185611e1d565b8281036020840152611ede8185611e1d565b6001600160a01b03831681526040602082018190525f9061200990830184611e1d565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612035575f5ffd5b815160ff81168114611a7c575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156119ff576119ff612045565b6001815b60018411156120ad5780850481111561209157612091612045565b600184161561209f57908102905b60019390931c928002612076565b935093915050565b5f826120c3575060016119ff565b816120cf57505f6119ff565b81600181146120e557600281146120ef5761210b565b60019150506119ff565b60ff84111561210057612100612045565b50506001821b6119ff565b5060208310610133831016604e8410600b841016171561212e575081810a6119ff565b61213a5f198484612072565b805f190482111561214d5761214d612045565b029392505050565b5f611a7c60ff8416836120b5565b634e487b7160e01b5f52602160045260245ffd5b5f8151808452602084019350602083015f5b828110156121a7578151865260209586019590910190600101612189565b5093949350505050565b5f8151808452602084019350602083015f5b828110156121a75781516001600160a01b03168652602095860195909101906001016121c3565b60c080825287519082018190525f90602089019060e0840190835b8181101561222c5783516001600160a01b0316835260209384019390920191600101612205565b50508381036020850152612240818a612177565b91505082810360408401526122558188612177565b6001600160a01b0387166060850152905084608084015282810360a084015261227e81856121b1565b9998505050505050505050565b5f6020828403121561229b575f5ffd5b5051919050565b5f82516122b3818460208701611dfb565b919091019291505056fe60a060405260405161057238038061057283398101604081905261002291610376565b61002c828261003e565b506001600160a01b031660805261046b565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610437565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610437565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f5f846001600160a01b0316846040516102259190610450565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80516001600160a01b038116811461033b575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f5f60408385031215610387575f5ffd5b61039083610325565b60208401519092506001600160401b038111156103ab575f5ffd5b8301601f810185136103bb575f5ffd5b80516001600160401b038111156103d4576103d4610340565b604051601f8201601f19908116603f011681016001600160401b038111828210171561040257610402610340565b604052818152828201602001871015610419575f5ffd5b61042a826020830160208601610354565b8093505050509250929050565b5f60208284031215610447575f5ffd5b6102f582610325565b5f8251610461818460208701610354565b9190910192915050565b60805160f26104805f395f601d015260f25ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f5f375f5f365f845af43d5f5f3e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f5ffd5b81516001600160a01b038116811460de575f5ffd5b939250505056fea164736f6c634300081c000a608060405234801561000f575f5ffd5b5060405161064738038061064783398101604081905261002e91610070565b5f80546001600160a01b0319166001600160a01b038416179055600161005482826101d8565b505050610292565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610081575f5ffd5b82516001600160a01b0381168114610097575f5ffd5b60208401519092506001600160401b038111156100b2575f5ffd5b8301601f810185136100c2575f5ffd5b80516001600160401b038111156100db576100db61005c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101095761010961005c565b604052818152828201602001871015610120575f5ffd5b5f5b8281101561013e57602081850181015183830182015201610122565b505f602083830101528093505050509250929050565b600181811c9082168061016857607f821691505b60208210810361018657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101d357805f5260205f20601f840160051c810160208510156101b15750805b601f840160051c820191505b818110156101d0575f81556001016101bd565b50505b505050565b81516001600160401b038111156101f1576101f161005c565b610205816101ff8454610154565b8461018c565b6020601f821160018114610237575f83156102205750848201515b5f19600385901b1c1916600184901b1784556101d0565b5f84815260208120601f198516915b828110156102665787850151825560209485019460019092019101610246565b508482101561028357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6103a88061029f5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80632b5136011461004e5780633ba0b9a9146100645780637dc0d1d01461006c578063bfa814b514610096575b5f5ffd5b60125b6040519081526020015b60405180910390f35b6100516100ab565b5f5461007e906001600160a01b031681565b6040516001600160a01b03909116815260200161005b565b61009e6101ab565b60405161005b9190610259565b5f5f60016040516020016100bf91906102c3565b60408051601f198184030181526004835260248301918290526100e191610369565b60408051918290039091206020830180516001600160e01b03166001600160e01b03199092169190911790525f805491519293509182916001600160a01b03169061012d908590610369565b5f60405180830381855afa9150503d805f8114610165576040519150601f19603f3d011682016040523d82523d5f602084013e61016a565b606091505b50915091508161018d576040516352760cdd60e01b815260040160405180910390fd5b5f818060200190518101906101a29190610384565b95945050505050565b600180546101b89061028b565b80601f01602080910402602001604051908101604052809291908181526020018280546101e49061028b565b801561022f5780601f106102065761010080835404028352916020019161022f565b820191905f5260205f20905b81548152906001019060200180831161021257829003601f168201915b505050505081565b5f5b83811015610251578181015183820152602001610239565b50505f910152565b602081525f8251806020840152610277816040850160208701610237565b601f01601f19169190910160400192915050565b600181811c9082168061029f57607f821691505b6020821081036102bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f5f83545f8160011c905060018216806102de57607f821691505b6020821081036102fc57634e487b7160e01b5f52602260045260245ffd5b808015610310576001811461032557610353565b60ff1984168752821515830287019450610353565b5f888152602090205f5b8481101561034b5781548982015260019091019060200161032f565b505082870194505b505061282960f01b835250506002019392505050565b5f825161037a818460208701610237565b9190910192915050565b5f60208284031215610394575f5ffd5b505191905056fea164736f6c634300081c000a6080604052348015600e575f5ffd5b50604051610167380380610167833981016040819052602b91604e565b5f80546001600160a01b0319166001600160a01b03929092169190911790556079565b5f60208284031215605d575f5ffd5b81516001600160a01b03811681146072575f5ffd5b9392505050565b60e2806100855f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632b5136011460345780633ba0b9a9146049575b5f5ffd5b60125b60405190815260200160405180910390f35b60375f80546040516303d1689d60e11b8152670de0b6b3a764000060048201526001600160a01b03909116906307a2d13a90602401602060405180830381865afa1580156098573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ba919060bf565b905090565b5f6020828403121560ce575f5ffd5b505191905056fea164736f6c634300081c000a360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c634300081c000a", + "nonce": "0xe2", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionType": "CREATE", + "contractName": "ERC1967Proxy", + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": null, + "arguments": [ + "0x2Bd95ae42d848Ac93F6fA2A4b988Af5a32e6ADA9", + "0x0208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df8138" + ], + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "gas": "0x6ab3e", + "value": "0x0", + "input": "0x60806040526040516103cd3803806103cd8339810160408190526100229161025e565b61002c8282610033565b5050610347565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051610128919061032c565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f5f6040838503121561026f575f5ffd5b82516001600160a01b0381168114610285575f5ffd5b60208401519092506001600160401b038111156102a0575f5ffd5b8301601f810185136102b0575f5ffd5b80516001600160401b038111156102c9576102c9610228565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f7576102f7610228565b60405281815282820160200187101561030e575f5ffd5b61031f82602083016020860161023c565b8093505050509250929050565b5f825161033d81846020870161023c565b9190910192915050565b607a806103535f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156069573d5ff35b3d5ffdfea164736f6c634300081c000a0000000000000000000000002bd95ae42d848ac93f6fa2a4b988af5a32e6ada9000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001240208fedc00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000044d3dded46e4d14e9f0a1c3159e908da4bd99084000000000000000000000000012c02f4cc645c16bcbcac3d65fc599fcd4ac0de000000000000000000000000455ac9bf52507951e7e64abc512bb0f2c6e13cee000000000000000000000000eb47d13e805c64d00e9ea0b3eee5a02a69df813800000000000000000000000000000000000000000000000000000000", + "nonce": "0xe3", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "function": null, + "arguments": null, + "transaction": { + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "gas": "0xa614", + "value": "0x0", + "input": "0xf2fde38b00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "nonce": "0xe4", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x38cf24", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1c209791c39d1106df7cb5e72df8dfd6536657249d260fc1182252da55b31dee", + "transactionIndex": "0x1e", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x87185", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x0b20b851320e526caa804e4007135057275625a4", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xca91e3a169", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x69fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4140a9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd3f181ce056cb4831d71256eafd68f18a30f6862d12ec6e73078fbc16e4daa18", + "transactionIndex": "0x1f", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x87185", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x31c6a16ce96ea8a4940c417144e2e1bc91a45df2", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xca91e3a169", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x69fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x8f668d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1c82721bc64373b4e2fc7580a638d39835ef5e3eb4fa5c1c91f39889c9af5ebd", + "transactionIndex": "0x20", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x4e25e4", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x10172bcc93a7fbde0ec4318e4aab2211f8858c17", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4ef70dfa439", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x294ff" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa66ab2", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4cd1f0d98ac1019e733e14c957c8707ebd59888857af3742dff240179e078612", + "transactionIndex": "0x21", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x170425", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x5b9b00e3ccb5b4bb77cb398c539afb69ebbead96", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1cc7e1e581c", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0xf0ea" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbc69f7", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf80c957117a3d66fe58df0d7fa8ffd726c8aa7816ad259af5a8cd10bd0fc613f", + "transactionIndex": "0x22", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x15ff45", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x640959ecedb9ca512af716a1f770fffd3df81774", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1c099cf7645", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0xeab1" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc0154b", + "logs": [ + { + "address": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000010172bcc93a7fbde0ec4318e4aab2211f8858c17" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "logIndex": "0x52", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000001000000000000000000000000000001000000020000000000000000000800000000000000000000000000000000400000000000000000000000000100000000000000000000000080000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010004000000000800040000000000000000000000", + "type": "0x2", + "transactionHash": "0x49bfef5c7ac8124257d31ff6f89a98dd8786799873b929fa1268ba61511e6d10", + "transactionIndex": "0x23", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab54", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x44d3dded46e4d14e9f0a1c3159e908da4bd99084", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc3c093", + "logs": [ + { + "address": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000005b9b00e3ccb5b4bb77cb398c539afb69ebbead96" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "logIndex": "0x54", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000100000000000400000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000040000001000000020000000000000000000800000000000000000000000000002800400000000000000000000000000000000000000000000000000000000000000000000000000000040000001000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x48012032438af9519e1bb9baca3784d7171c1f9f1b3a0b4f7139d7a0f8a33f01", + "transactionIndex": "0x24", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab48", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x012c02f4cc645c16bcbcac3d65fc599fcd4ac0de", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc76be7", + "logs": [ + { + "address": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "logIndex": "0x55", + "removed": false + }, + { + "address": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000640959ecedb9ca512af716a1f770fffd3df81774" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "logIndex": "0x56", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000002000001000000000000000000000000000001000000020000000000000000000800000000002000000000000000000000400080000000000000000000000000000040000000000000100000000000000000000000000000040000000000000000000000000000400000000000000000000000000020000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1eff69c0efc05fd45a85b8cf839d559cbb4b452337e4c053d290d2e06947fe8a", + "transactionIndex": "0x25", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x3ab54", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x455ac9bf52507951e7e64abc512bb0f2c6e13cee", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x4bf4f61ec3", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x27bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc89038", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x97884dada719ab2a4d04fc19b6b926d67ea7a687ad6cc7ec68249038da596846", + "transactionIndex": "0x26", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x12451", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0xeb47d13e805c64d00e9ea0b3eee5a02a69df8138", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xf992dcf81", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x829" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf1ef5d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3436de2f09a2ae216b0d6f77cbeb0897d46496d063869f57bc279619e8cbda7a", + "transactionIndex": "0x27", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x295f25", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x2bd95ae42d848ac93f6fa2a4b988af5a32e6ada9", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x2efb14b4eda", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x18943" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf710a1", + "logs": [ + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002bd95ae42d848ac93f6fa2a4b988af5a32e6ada9" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x57", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x58", + "removed": false + }, + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "logIndex": "0x59", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000100000000000000000000000000040000000000000000000000000000000000000000000000000002000001000000000000000000000000000001000000020000000000000000000800000000000000000002000000000000400000000000000000000800001000000000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000004000000000000000000004000000000000000020000000000040000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3092706599760f4b982754aea894d2a3484369abdd1ce82058acbbc920004b63", + "transactionIndex": "0x28", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x52144", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": null, + "contractAddress": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x68bcb2e086", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x36cb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf788df", + "logs": [ + { + "address": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "0x00000000000000000000000092bc7d2305ec97e138a5c98f6f5fd69703fe0589" + ], + "data": "0x", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "transactionHash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionIndex": "0x29", + "logIndex": "0x5a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001000000000000000000000000000000000000000000000002000000000000400000000000000000000000001000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xdb0f02fbe8e2380bd31dcc51c460ceb04c33d576b817ce617f7b6f5fa6e54192", + "transactionIndex": "0x29", + "blockHash": "0x5e3d25f7d495019bacec3d17edcb10dbcba5103986e3b0b3f86ba0106b05a90c", + "blockNumber": "0x12f6d2a", + "gasUsed": "0x783e", + "effectiveGasPrice": "0x2d2a", + "from": "0x92bc7d2305ec97e138a5c98f6f5fd69703fe0589", + "to": "0x462498e925b34fdee31b07f38a962e94ce600eab", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xbf244e5d7", + "l1GasPrice": "0x6c8131d2f", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1735538998, + "chain": 84532, + "commit": "cfe6617" +} \ No newline at end of file diff --git a/broadcast/testnet.json b/broadcast/testnet.json new file mode 100644 index 0000000..4801599 --- /dev/null +++ b/broadcast/testnet.json @@ -0,0 +1,8 @@ +{ + "Factory": "0x462498e925B34FDee31b07F38a962E94cE600Eab", + "LPTokenBeacon": "0x012c02F4cC645C16bcBcac3d65Fc599fCD4aC0dE", + "SelfPeggingAssetBeacon": "0x44D3DdED46e4d14E9f0A1C3159e908Da4BD99084", + "USDC": "0x0B20B851320E526Caa804e4007135057275625a4", + "USDT": "0x31C6A16Ce96Ea8a4940C417144e2E1BC91a45Df2", + "WLPTokenBeacon": "0x455AC9bf52507951E7E64AbC512BB0F2C6E13CeE" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 79854ae..854e068 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,10 +6,9 @@ bytecode_hash = "none" evm_version = "shanghai" fuzz = { runs = 1_000 } - via_ir = true gas_reports = ["*"] optimizer = true - optimizer_runs = 10_000 + optimizer_runs = 200 out = "out" script = "script" solc = "0.8.28" @@ -20,23 +19,12 @@ "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", "forge-std/=node_modules/forge-std/src/", ] + fs_permissions = [{ access = "read-write", path = "./"}] [profile.ci] fuzz = { runs = 10_000 } verbosity = 4 -[etherscan] - arbitrum = { key = "${API_KEY_ARBISCAN}" } - avalanche = { key = "${API_KEY_SNOWTRACE}" } - base = { key = "${API_KEY_BASESCAN}" } - bnb_smart_chain = { key = "${API_KEY_BSCSCAN}" } - gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" } - goerli = { key = "${API_KEY_ETHERSCAN}" } - mainnet = { key = "${API_KEY_ETHERSCAN}" } - optimism = { key = "${API_KEY_OPTIMISTIC_ETHERSCAN}" } - polygon = { key = "${API_KEY_POLYGONSCAN}" } - sepolia = { key = "${API_KEY_ETHERSCAN}" } - [fmt] bracket_spacing = true int_types = "long" @@ -59,3 +47,4 @@ optimism = "https://optimism-mainnet.infura.io/v3/${API_KEY_INFURA}" polygon = "https://polygon-mainnet.infura.io/v3/${API_KEY_INFURA}" sepolia = "https://sepolia.infura.io/v3/${API_KEY_INFURA}" + basesepolia = "https://sepolia.base.org" diff --git a/package.json b/package.json index 6d9581d..8bbaea3 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "url": "https://nuts.finance" }, "dependencies": { - "@openzeppelin/contracts": "^4.8.3", - "@openzeppelin/contracts-upgradeable": "^4.8.3" + "@openzeppelin/contracts": "^5.1.0", + "@openzeppelin/contracts-upgradeable": "^5.1.0" }, "devDependencies": { "forge-std": "github:foundry-rs/forge-std#v1.8.1", diff --git a/script/Base.s.sol b/script/Base.s.sol deleted file mode 100644 index 04bc3c3..0000000 --- a/script/Base.s.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity ^0.8.28; - -// // SPDX-License-Identifier: MIT -// pragma solidity >=0.8.25 <0.9.0; - -// import { Script } from "forge-std/src/Script.sol"; - -// abstract contract BaseScript is Script { -// /// @dev Included to enable compilation of the script without a $MNEMONIC environment variable. -// string internal constant TEST_MNEMONIC = "test test test test test test test test test test test junk"; - -// /// @dev Needed for the deterministic deployments. -// bytes32 internal constant ZERO_SALT = bytes32(0); - -// /// @dev The address of the transaction broadcaster. -// address internal broadcaster; - -// /// @dev Used to derive the broadcaster's address if $ETH_FROM is not defined. -// string internal mnemonic; - -// /// @dev Initializes the transaction broadcaster like this: -// /// -// /// - If $ETH_FROM is defined, use it. -// /// - Otherwise, derive the broadcaster address from $MNEMONIC. -// /// - If $MNEMONIC is not defined, default to a test mnemonic. -// /// -// /// The use case for $ETH_FROM is to specify the broadcaster key and its address via the command line. -// constructor() { -// address from = vm.envOr({ name: "ETH_FROM", defaultValue: address(0) }); -// if (from != address(0)) { -// broadcaster = from; -// } else { -// mnemonic = vm.envOr({ name: "MNEMONIC", defaultValue: TEST_MNEMONIC }); -// (broadcaster,) = deriveRememberKey({ mnemonic: mnemonic, index: 0 }); -// } -// } - -// modifier broadcast() { -// vm.startBroadcast(broadcaster); -// _; -// vm.stopBroadcast(); -// } -// } diff --git a/script/Config.sol b/script/Config.sol new file mode 100644 index 0000000..00f1a9c --- /dev/null +++ b/script/Config.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { Script } from "forge-std/Script.sol"; +import { console } from "forge-std/console.sol"; +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; + +contract Config is Script { + bool testnet = vm.envBool("TESTNET"); + + uint256 deployerPrivateKey; + + address GOVERNOR; + address DEPLOYER; + + address usdc; + address usdt; + + SelfPeggingAssetFactory factory; + address selfPeggingAssetBeacon; + address lpTokenBeacon; + address wlpTokenBeacon; + + struct JSONData { + address Factory; + address LPTokenBeacon; + address SelfPeggingAssetBeacon; + address USDC; + address USDT; + address WLPTokenBeacon; + } + + function loadConfig() internal { + if (!testnet) { + usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + usdt = 0xdAC17F958D2ee523a2206206994597C13D831ec7; + } + } +} diff --git a/script/CreatePool.s.sol b/script/CreatePool.s.sol new file mode 100644 index 0000000..fc5bef4 --- /dev/null +++ b/script/CreatePool.s.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { stdJson } from "forge-std/StdJson.sol"; +import { console } from "forge-std/console.sol"; + +import { Deploy } from "script/Deploy.sol"; +import { Setup } from "script/Setup.sol"; +import { Pool } from "script/Pool.sol"; +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; +import { SelfPeggingAsset } from "../src/SelfPeggingAsset.sol"; +import { MockToken } from "../src/mock/MockToken.sol"; + +contract Testnet is Deploy, Setup, Pool { + function init() internal { + if (vm.envUint("HEX_PRIV_KEY") == 0) revert("No private key found"); + deployerPrivateKey = vm.envUint("HEX_PRIV_KEY"); + DEPLOYER = vm.addr(deployerPrivateKey); + } + + function run() public payable { + init(); + loadConfig(); + + vm.startBroadcast(deployerPrivateKey); + + string memory root = vm.projectRoot(); + string memory path; + if (testnet) { + path = string.concat(root, "/broadcast/testnet.json"); + } else { + path = string.concat(root, "/broadcast/mainnet.json"); + } + + string memory json = vm.readFile(path); + bytes memory data = vm.parseJson(json); + + JSONData memory jsonData = abi.decode(data, (JSONData)); + + factory = SelfPeggingAssetFactory(jsonData.Factory); + selfPeggingAssetBeacon = jsonData.SelfPeggingAssetBeacon; + lpTokenBeacon = jsonData.LPTokenBeacon; + wlpTokenBeacon = jsonData.WLPTokenBeacon; + usdc = jsonData.USDC; + usdt = jsonData.USDT; + + (, address selfPeggingAsset,) = createStandardPool(); + + uint256 amount = 10_000e18; + + MockToken(usdc).mint(DEPLOYER, amount); + MockToken(usdt).mint(DEPLOYER, amount); + + initialMint(amount, amount, SelfPeggingAsset(selfPeggingAsset)); + + vm.stopBroadcast(); + } +} diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol deleted file mode 100644 index 7104813..0000000 --- a/script/Deploy.s.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity ^0.8.28; - -// // SPDX-License-Identifier: UNLICENSED -// pragma solidity >=0.8.25 <0.9.0; - -// import { Foo } from "../src/Foo.sol"; - -// import { BaseScript } from "./Base.s.sol"; - -// /// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting -// contract Deploy is BaseScript { -// function run() public broadcast returns (Foo foo) { -// foo = new Foo(); -// } -// } diff --git a/script/Deploy.sol b/script/Deploy.sol new file mode 100644 index 0000000..514a55c --- /dev/null +++ b/script/Deploy.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import { stdJson } from "forge-std/StdJson.sol"; +import { console } from "forge-std/console.sol"; +import { SelfPeggingAsset } from "../src/SelfPeggingAsset.sol"; +import { LPToken } from "../src/LPToken.sol"; +import { WLPToken } from "../src/WLPToken.sol"; +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; +import { Config } from "script/Config.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "../src/misc/ConstantExchangeRateProvider.sol"; + +contract Deploy is Config { + function deployBeacons() internal { + console.log("---------------"); + console.log("deploy-beacon-logs"); + console.log("---------------"); + + address selfPeggingAssetImplentation = address(new SelfPeggingAsset()); + address lpTokenImplentation = address(new LPToken()); + address wlpTokenImplentation = address(new WLPToken()); + + UpgradeableBeacon beacon = new UpgradeableBeacon(selfPeggingAssetImplentation, GOVERNOR); + selfPeggingAssetBeacon = address(beacon); + + beacon = new UpgradeableBeacon(lpTokenImplentation, GOVERNOR); + lpTokenBeacon = address(beacon); + + beacon = new UpgradeableBeacon(wlpTokenImplentation, GOVERNOR); + wlpTokenBeacon = address(beacon); + } + + function deployFactory() internal { + console.log("---------------"); + console.log("deploy-factory-logs"); + console.log("---------------"); + + bytes memory data = abi.encodeCall( + SelfPeggingAssetFactory.initialize, + ( + GOVERNOR, + 0, + 0, + 0, + 100, + selfPeggingAssetBeacon, + lpTokenBeacon, + wlpTokenBeacon, + new ConstantExchangeRateProvider() + ) + ); + ERC1967Proxy proxy = new ERC1967Proxy(address(new SelfPeggingAssetFactory()), data); + + factory = SelfPeggingAssetFactory(address(proxy)); + factory.transferOwnership(GOVERNOR); + } +} diff --git a/script/Pool.sol b/script/Pool.sol new file mode 100644 index 0000000..90d792b --- /dev/null +++ b/script/Pool.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { Vm } from "forge-std/Vm.sol"; +import { stdJson } from "forge-std/StdJson.sol"; +import { console } from "forge-std/console.sol"; +import { Config } from "script/Config.sol"; +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; +import { SelfPeggingAsset } from "../src/SelfPeggingAsset.sol"; +import { MockToken } from "../src/mock/MockToken.sol"; + +contract Pool is Config { + function createStandardPool() internal returns (address, address, address) { + console.log("---------------"); + console.log("create-pool-logs"); + console.log("---------------"); + + SelfPeggingAssetFactory.CreatePoolArgument memory arg = SelfPeggingAssetFactory.CreatePoolArgument({ + tokenA: usdc, + tokenB: usdt, + tokenAType: SelfPeggingAssetFactory.TokenType.Standard, + tokenAOracle: address(0), + tokenAFunctionSig: "", + tokenBType: SelfPeggingAssetFactory.TokenType.Standard, + tokenBOracle: address(0), + tokenBFunctionSig: "" + }); + + vm.recordLogs(); + factory.createPool(arg); + Vm.Log[] memory entries = vm.getRecordedLogs(); + bytes32 eventSig = keccak256("PoolCreated(address,address,address)"); + + address decodedPoolToken; + address decodedSelfPeggingAsset; + address decodedWrappedPoolToken; + + for (uint256 i = 0; i < entries.length; i++) { + Vm.Log memory log = entries[i]; + + if (log.topics[0] == eventSig) { + (decodedPoolToken, decodedSelfPeggingAsset, decodedWrappedPoolToken) = + abi.decode(log.data, (address, address, address)); + } + } + + return (decodedPoolToken, decodedSelfPeggingAsset, decodedWrappedPoolToken); + } + + function initialMint(uint256 usdcAmount, uint256 usdtAmount, SelfPeggingAsset selfPeggingAsset) internal { + console.log("---------------"); + console.log("initial-mint-logs"); + console.log("---------------"); + + MockToken(usdc).approve(address(selfPeggingAsset), usdcAmount); + MockToken(usdt).approve(address(selfPeggingAsset), usdtAmount); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = usdcAmount; + amounts[1] = usdtAmount; + + selfPeggingAsset.mint(amounts, 0); + } +} diff --git a/script/Setup.sol b/script/Setup.sol new file mode 100644 index 0000000..29779d2 --- /dev/null +++ b/script/Setup.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { stdJson } from "forge-std/StdJson.sol"; +import { console } from "forge-std/console.sol"; +import { MockToken } from "../src/mock/MockToken.sol"; +import { Config } from "script/Config.sol"; + +contract Setup is Config { + function deployMocks() internal { + MockToken tokenA = new MockToken("USDC", "USDC", 6); + MockToken tokenB = new MockToken("USDT", "USDT", 6); + + usdc = address(tokenA); + usdt = address(tokenB); + } +} diff --git a/script/Testnet.s.sol b/script/Testnet.s.sol new file mode 100644 index 0000000..e865205 --- /dev/null +++ b/script/Testnet.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { stdJson } from "forge-std/StdJson.sol"; +import { console } from "forge-std/console.sol"; + +import { Deploy } from "script/Deploy.sol"; +import { Setup } from "script/Setup.sol"; + +contract Testnet is Deploy, Setup { + function init() internal { + if (vm.envUint("HEX_PRIV_KEY") == 0) revert("No private key found"); + deployerPrivateKey = vm.envUint("HEX_PRIV_KEY"); + GOVERNOR = vm.addr(deployerPrivateKey); + DEPLOYER = vm.addr(deployerPrivateKey); + } + + function run() public payable { + init(); + loadConfig(); + + vm.startBroadcast(deployerPrivateKey); + + deployMocks(); + deployBeacons(); + deployFactory(); + + vm.writeJson(vm.serializeAddress("contracts", "USDC", usdc), "./broadcast/testnet.json"); + + vm.writeJson(vm.serializeAddress("contracts", "USDT", usdt), "./broadcast/testnet.json"); + + vm.writeJson(vm.serializeAddress("contracts", "Factory", address(factory)), "./broadcast/testnet.json"); + + vm.writeJson( + vm.serializeAddress("contracts", "SelfPeggingAssetBeacon", selfPeggingAssetBeacon), + "./broadcast/testnet.json" + ); + + vm.writeJson(vm.serializeAddress("contracts", "LPTokenBeacon", lpTokenBeacon), "./broadcast/testnet.json"); + + vm.writeJson(vm.serializeAddress("contracts", "WLPTokenBeacon", wlpTokenBeacon), "./broadcast/testnet.json"); + + vm.stopBroadcast(); + } +} diff --git a/src/TapETH.sol b/src/LPToken.sol similarity index 69% rename from src/TapETH.sol rename to src/LPToken.sol index 3582b6f..627972c 100644 --- a/src/TapETH.sol +++ b/src/LPToken.sol @@ -3,7 +3,8 @@ pragma solidity ^0.8.28; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; -import "./interfaces/ITapETH.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "./interfaces/ILPToken.sol"; error InsufficientAllowance(uint256 currentAllowance, uint256 amount); error InsufficientBalance(uint256 currentBalance, uint256 amount); @@ -12,86 +13,156 @@ error InsufficientBalance(uint256 currentBalance, uint256 amount); * @title Interest-bearing ERC20-like token for Tapio protocol * @author Nuts Finance Developer * @notice ERC20 token minted by the StableSwap pools. - * @dev TapETH is ERC20 rebase token minted by StableSwap pools for liquidity providers. - * TapETH balances are dynamic and represent the holder's share in the total amount - * of tapETH controlled by the protocol. Account shares aren't normalized, so the + * @dev LPToken is ERC20 rebase token minted by StableSwap pools for liquidity providers. + * LPToken balances are dynamic and represent the holder's share in the total amount + * of lpToken controlled by the protocol. Account shares aren't normalized, so the * contract also stores the sum of all shares to calculate each account's token balance * which equals to: * * shares[account] * _totalSupply / _totalShares - * where the _totalSupply is the total supply of tapETH controlled by the protocol. + * where the _totalSupply is the total supply of lpToken controlled by the protocol. */ -contract TapETH is Initializable, ITapETH { - using Math for uint256; - +contract LPToken is Initializable, OwnableUpgradeable, ILPToken { + /** + * @dev Constant value representing an infinite allowance. + */ uint256 internal constant INFINITE_ALLOWANCE = ~uint256(0); + + /** + * @dev Constant value representing the denominator for the buffer rate. + */ uint256 public constant BUFFER_DENOMINATOR = 10 ** 10; + /** + * @dev The total amount of shares. + */ uint256 public totalShares; + + /** + * @dev The total supply of lpToken + */ uint256 public totalSupply; + + /** + * @dev The total amount of rewards + */ uint256 public totalRewards; - address public governance; - address public pendingGovernance; + + /** + * @dev The mapping of account shares. + */ mapping(address => uint256) public shares; + + /** + * @dev The mapping of account allowances. + */ mapping(address => mapping(address => uint256)) public allowances; + + /** + * @dev The mapping of pools. + */ mapping(address => bool) public pools; + + /** + * @dev The buffer rate. + */ uint256 public bufferPercent; + + /** + * @dev The buffer amount. + */ uint256 public bufferAmount; + + /** + * @dev The token name. + */ string internal tokenName; + + /** + * @dev The token symbol. + */ string internal tokenSymbol; + /** + * @notice Emitted when shares are transferred. + */ event TransferShares(address indexed from, address indexed to, uint256 sharesValue); + /** + * @notice Emitted when shares are minted. + */ event SharesMinted(address indexed account, uint256 tokenAmount, uint256 sharesAmount); + /** + * @notice Emitted when shares are burnt. + */ event SharesBurnt(address indexed account, uint256 tokenAmount, uint256 sharesAmount); + /** + * @notice Emitted when rewards are minted. + */ event RewardsMinted(uint256 amount, uint256 actualAmount); - event GovernanceModified(address indexed governance); - event GovernanceProposed(address indexed governance); + /** + * @notice Emitted when a pool is added. + */ event PoolAdded(address indexed pool); + + /** + * @notice Emitted when a pool is removed. + */ event PoolRemoved(address indexed pool); + + /** + * @notice Emitted when the buffer rate is set. + */ event SetBufferPercent(uint256); + + /** + * @notice Emitted when the buffer is increased. + */ event BufferIncreased(uint256, uint256); + + /** + * @notice Emitted when the buffer is decreased. + */ event BufferDecreased(uint256, uint256); - function initialize(address _governance, string memory _name, string memory _symbol) public initializer { - require(_governance != address(0), "TapETH: zero address"); - governance = _governance; + /** + * @notice Emitted when the symbol is modified. + */ + event SymbolModified(string); + + function initialize(string memory _name, string memory _symbol) public initializer { tokenName = _name; tokenSymbol = _symbol; - } - function proposeGovernance(address _governance) public { - require(msg.sender == governance, "TapETH: no governance"); - pendingGovernance = _governance; - emit GovernanceProposed(_governance); + __Ownable_init(msg.sender); } - function acceptGovernance() public { - require(msg.sender == pendingGovernance, "TapETH: no pending governance"); - governance = pendingGovernance; - pendingGovernance = address(0); - emit GovernanceModified(governance); - } - - function addPool(address _pool) public { - require(msg.sender == governance, "TapETH: no governance"); - require(_pool != address(0), "TapETH: zero address"); - require(!pools[_pool], "TapETH: pool is already added"); + /** + * @dev Adds a pool to the list of pools. + * @param _pool The address of the pool to add. + */ + function addPool(address _pool) public onlyOwner { + require(_pool != address(0), "LPToken: zero address"); + require(!pools[_pool], "LPToken: pool is already added"); pools[_pool] = true; emit PoolAdded(_pool); } - function removePool(address _pool) public { - require(msg.sender == governance, "TapETH: no governance"); - require(pools[_pool], "TapETH: pool doesn't exist"); + /** + * @dev Removes a pool from the list of pools. + * @param _pool The address of the pool to remove. + */ + function removePool(address _pool) public onlyOwner { + require(pools[_pool], "LPToken: pool doesn't exist"); pools[_pool] = false; emit PoolRemoved(_pool); } /** + * @dev Returns the name of the token. * @return the name of the token. */ function name() external view returns (string memory) { @@ -99,14 +170,15 @@ contract TapETH is Initializable, ITapETH { } /** - * @return the symbol of the token, usually a shorter version of the - * name. + * @dev Returns the symbol of the token. + * @return the symbol of the token. */ function symbol() external view returns (string memory) { return tokenSymbol; } /** + * @dev Returns the decimals of the token. * @return the number of decimals for getting user representation of a token amount. */ function decimals() external pure returns (uint8) { @@ -114,21 +186,20 @@ contract TapETH is Initializable, ITapETH { } /** - * @return the amount of tokens owned by the `_account`. - * * @dev Balances are dynamic and equal the `_account`'s share in the amount of the - * total tapETH controlled by the protocol. See `sharesOf`. + * total lpToken controlled by the protocol. See `sharesOf`. + * @return the amount of tokens owned by the `_account`. */ function balanceOf(address _account) external view returns (uint256) { - return getPooledEthByShares(_sharesOf(_account)); + return getPeggedTokenByShares(_sharesOf(_account)); } /** * @notice Moves `_amount` tokens from the caller's account to the `_recipient`account. + * @dev The `_amount` argument is the amount of tokens, not shares. * @return a boolean value indicating whether the operation succeeded. * Emits a `Transfer` event. * Emits a `TransferShares` event. - * @dev The `_amount` argument is the amount of tokens, not shares. */ function transfer(address _recipient, uint256 _amount) external returns (bool) { _transfer(msg.sender, _recipient, _amount); @@ -136,9 +207,9 @@ contract TapETH is Initializable, ITapETH { } /** + * @dev This value changes when `approve` or `transferFrom` is called. * @return the remaining number of tokens that `_spender` is allowed to spend * on behalf of `_owner` through `transferFrom`. This is zero by default. - * @dev This value changes when `approve` or `transferFrom` is called. */ function allowance(address _owner, address _spender) external view returns (uint256) { return allowances[_owner][_spender]; @@ -146,10 +217,9 @@ contract TapETH is Initializable, ITapETH { /** * @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens. - * + * @dev The `_amount` argument is the amount of tokens, not shares. * @return a boolean value indicating whether the operation succeeded. * Emits an `Approval` event. - * @dev The `_amount` argument is the amount of tokens, not shares. */ function approve(address _spender, uint256 _amount) external returns (bool) { _approve(msg.sender, _spender, _amount); @@ -160,7 +230,7 @@ contract TapETH is Initializable, ITapETH { * @notice Moves `_amount` tokens from `_sender` to `_recipient` using the * allowance mechanism. `_amount` is then deducted from the caller's * allowance. - * + * @dev The `_amount` argument is the amount of tokens, not shares. * @return a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. @@ -169,8 +239,6 @@ contract TapETH is Initializable, ITapETH { * * Requirements: * - the caller must have allowance for `_sender`'s tokens of at least `_amount`. - * - * @dev The `_amount` argument is the amount of tokens, not shares. */ function transferFrom(address _sender, address _recipient, uint256 _amount) external returns (bool) { _spendAllowance(_sender, msg.sender, _amount); @@ -202,29 +270,33 @@ contract TapETH is Initializable, ITapETH { */ function decreaseAllowance(address _spender, uint256 _subtractedValue) external returns (bool) { uint256 currentAllowance = allowances[msg.sender][_spender]; - require(currentAllowance >= _subtractedValue, "TapETH:ALLOWANCE_BELOW_ZERO"); + require(currentAllowance >= _subtractedValue, "LPToken:ALLOWANCE_BELOW_ZERO"); _approve(msg.sender, _spender, currentAllowance - _subtractedValue); return true; } // solhint-enable max-line-length /** - * @notice This function is called by the governance to set the buffer rate. + * @notice This function is called by the owner to set the buffer rate. */ - function setBuffer(uint256 _buffer) external { - require(msg.sender == governance, "TapETH: no governance"); - require(_buffer < BUFFER_DENOMINATOR, "TapETH: out of range"); + function setBuffer(uint256 _buffer) external onlyOwner { + require(_buffer < BUFFER_DENOMINATOR, "LPToken: out of range"); bufferPercent = _buffer; emit SetBufferPercent(_buffer); } + function setSymbol(string memory _symbol) external onlyOwner { + tokenSymbol = _symbol; + emit SymbolModified(_symbol); + } + /** * @notice This function is called only by a stableSwap pool to increase - * the total supply of TapETH by the staking rewards and the swap fee. + * the total supply of LPToken by the staking rewards and the swap fee. */ function addTotalSupply(uint256 _amount) external { - require(pools[msg.sender], "TapETH: no pool"); - require(_amount != 0, "TapETH: no amount"); + require(pools[msg.sender], "LPToken: no pool"); + require(_amount != 0, "LPToken: no amount"); uint256 _deltaBuffer = (bufferPercent * _amount) / BUFFER_DENOMINATOR; uint256 actualAmount = _amount - _deltaBuffer; @@ -238,12 +310,12 @@ contract TapETH is Initializable, ITapETH { /** * @notice This function is called only by a stableSwap pool to decrease - * the total supply of TapETH by lost amount. + * the total supply of LPToken by lost amount. */ function removeTotalSupply(uint256 _amount) external { - require(pools[msg.sender], "TapETH: no pool"); - require(_amount != 0, "TapETH: no amount"); - require(_amount <= bufferAmount, "TapETH: insuffcient buffer"); + require(pools[msg.sender], "LPToken: no pool"); + require(_amount != 0, "LPToken: no amount"); + require(_amount <= bufferAmount, "LPToken: insuffcient buffer"); bufferAmount -= _amount; @@ -258,20 +330,20 @@ contract TapETH is Initializable, ITapETH { } /** - * @return the amount of shares that corresponds to `_tapETHAmount` protocol-controlled tapETH. + * @return the amount of shares that corresponds to `_lpTokenAmount` protocol-controlled lpToken. */ - function getSharesByPooledEth(uint256 _tapETHAmount) public view returns (uint256) { + function getSharesByPeggedToken(uint256 _lpTokenAmount) public view returns (uint256) { if (totalSupply == 0) { return 0; } else { - return (_tapETHAmount * totalShares) / totalSupply; + return (_lpTokenAmount * totalShares) / totalSupply; } } /** - * @return the amount of tapETH that corresponds to `_sharesAmount` token shares. + * @return the amount of lpToken that corresponds to `_sharesAmount` token shares. */ - function getPooledEthByShares(uint256 _sharesAmount) public view returns (uint256) { + function getPeggedTokenByShares(uint256 _sharesAmount) public view returns (uint256) { if (totalShares == 0) { return 0; } else { @@ -281,28 +353,27 @@ contract TapETH is Initializable, ITapETH { /** * @notice Moves `_sharesAmount` token shares from the caller's account to the `_recipient` account. + * @dev The `_sharesAmount` argument is the amount of shares, not tokens. * @return amount of transferred tokens. * Emits a `TransferShares` event. * Emits a `Transfer` event. - * @dev The `_sharesAmount` argument is the amount of shares, not tokens. */ function transferShares(address _recipient, uint256 _sharesAmount) external returns (uint256) { _transferShares(msg.sender, _recipient, _sharesAmount); - uint256 tokensAmount = getPooledEthByShares(_sharesAmount); + uint256 tokensAmount = getPeggedTokenByShares(_sharesAmount); _emitTransferEvents(msg.sender, _recipient, tokensAmount, _sharesAmount); return tokensAmount; } /** * @notice Moves `_sharesAmount` token shares from the `_sender` account to the `_recipient` account. - * + * @dev The `_sharesAmount` argument is the amount of shares, not tokens. * @return amount of transferred tokens. * Emits a `TransferShares` event. * Emits a `Transfer` event. * * Requirements: - * - the caller must have allowance for `_sender`'s tokens of at least `getPooledEthByShares(_sharesAmount)`. - * @dev The `_sharesAmount` argument is the amount of shares, not tokens. + * - the caller must have allowance for `_sender`'s tokens of at least `getPeggedTokenByShares(_sharesAmount)`. */ function transferSharesFrom( address _sender, @@ -312,28 +383,31 @@ contract TapETH is Initializable, ITapETH { external returns (uint256) { - uint256 tokensAmount = getPooledEthByShares(_sharesAmount); + uint256 tokensAmount = getPeggedTokenByShares(_sharesAmount); _spendAllowance(_sender, msg.sender, tokensAmount); _transferShares(_sender, _recipient, _sharesAmount); _emitTransferEvents(_sender, _recipient, tokensAmount, _sharesAmount); return tokensAmount; } + /** + * @dev Mints shares for the `_account` and transfers them to the `_account`. + */ function mintShares(address _account, uint256 _tokenAmount) external { - require(pools[msg.sender], "TapETH: no pool"); + require(pools[msg.sender], "LPToken: no pool"); _mintShares(_account, _tokenAmount); } - function donateShares(uint256 _tokenAmount) external { - bufferAmount += _tokenAmount; - emit BufferIncreased(_tokenAmount, bufferAmount); - _burnShares(msg.sender, _tokenAmount); - } - + /** + * @dev Burns shares from the `_account`. + */ function burnShares(uint256 _tokenAmount) external { _burnShares(msg.sender, _tokenAmount); } + /** + * @dev Burns shares from the `_account`. + */ function burnSharesFrom(address _account, uint256 _tokenAmount) external { _spendAllowance(_account, msg.sender, _tokenAmount); _burnShares(_account, _tokenAmount); @@ -345,7 +419,7 @@ contract TapETH is Initializable, ITapETH { * Emits a `TransferShares` event. */ function _transfer(address _sender, address _recipient, uint256 _amount) internal { - uint256 _sharesToTransfer = getSharesByPooledEth(_amount); + uint256 _sharesToTransfer = getSharesByPeggedToken(_amount); _transferShares(_sender, _recipient, _sharesToTransfer); _emitTransferEvents(_sender, _recipient, _amount, _sharesToTransfer); } @@ -356,8 +430,8 @@ contract TapETH is Initializable, ITapETH { * Emits an `Approval` event. */ function _approve(address _owner, address _spender, uint256 _amount) internal { - require(_owner != address(0), "TapETH: APPROVE_FROM_ZERO_ADDR"); - require(_spender != address(0), "TapETH: APPROVE_TO_ZERO_ADDR"); + require(_owner != address(0), "LPToken: APPROVE_FROM_ZERO_ADDR"); + require(_spender != address(0), "LPToken: APPROVE_TO_ZERO_ADDR"); allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); @@ -393,9 +467,9 @@ contract TapETH is Initializable, ITapETH { * @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`. */ function _transferShares(address _sender, address _recipient, uint256 _sharesAmount) internal { - require(_sender != address(0), "TapETH: zero address"); - require(_recipient != address(0), "TapETH: zero address"); - require(_recipient != address(this), "TapETH: TRANSFER_TO_tapETH_CONTRACT"); + require(_sender != address(0), "LPToken: zero address"); + require(_recipient != address(0), "LPToken: zero address"); + require(_recipient != address(this), "LPToken: TRANSFER_TO_lpToken_CONTRACT"); uint256 currentSenderShares = shares[_sender]; @@ -411,10 +485,10 @@ contract TapETH is Initializable, ITapETH { * @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares. */ function _mintShares(address _recipient, uint256 _tokenAmount) internal returns (uint256 newTotalShares) { - require(_recipient != address(0), "TapETH: MINT_TO_ZERO_ADDR"); + require(_recipient != address(0), "LPToken: MINT_TO_ZERO_ADDR"); uint256 _sharesAmount; if (totalSupply != 0 && totalShares != 0) { - _sharesAmount = getSharesByPooledEth(_tokenAmount); + _sharesAmount = getSharesByPeggedToken(_tokenAmount); } else { _sharesAmount = _tokenAmount; } @@ -430,14 +504,14 @@ contract TapETH is Initializable, ITapETH { * @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares. */ function _burnShares(address _account, uint256 _tokenAmount) internal returns (uint256 newTotalShares) { - require(_account != address(0), "TapETH: BURN_FROM_ZERO_ADDR"); + require(_account != address(0), "LPToken: BURN_FROM_ZERO_ADDR"); - uint256 _balance = getPooledEthByShares(_sharesOf(_account)); + uint256 _balance = getPeggedTokenByShares(_sharesOf(_account)); if (_tokenAmount > _balance) { revert InsufficientBalance(_balance, _tokenAmount); } - uint256 _sharesAmount = getSharesByPooledEth(_tokenAmount); + uint256 _sharesAmount = getSharesByPeggedToken(_tokenAmount); shares[_account] -= _sharesAmount; totalShares -= _sharesAmount; newTotalShares = totalShares; @@ -446,12 +520,18 @@ contract TapETH is Initializable, ITapETH { emit SharesBurnt(_account, _tokenAmount, _sharesAmount); } + /** + * @notice Emits Transfer and TransferShares events. + */ function _emitTransferEvents(address _from, address _to, uint256 _tokenAmount, uint256 _sharesAmount) internal { emit Transfer(_from, _to, _tokenAmount); emit TransferShares(_from, _to, _sharesAmount); } + /** + * @notice Emits Transfer and TransferShares events after minting shares. + */ function _emitTransferAfterMintingShares(address _to, uint256 _sharesAmount) internal { - _emitTransferEvents(address(0), _to, getPooledEthByShares(_sharesAmount), _sharesAmount); + _emitTransferEvents(address(0), _to, getPeggedTokenByShares(_sharesAmount), _sharesAmount); } } diff --git a/src/StableAsset.sol b/src/SelfPeggingAsset.sol similarity index 71% rename from src/StableAsset.sol rename to src/SelfPeggingAsset.sol index 420f091..28140fa 100644 --- a/src/StableAsset.sol +++ b/src/SelfPeggingAsset.sol @@ -2,14 +2,13 @@ pragma solidity ^0.8.28; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import "./misc/IERC20MintableBurnable.sol"; import "./interfaces/IExchangeRateProvider.sol"; -import "./interfaces/ITapETH.sol"; +import "./interfaces/ILPToken.sol"; error InsufficientMintAmount(uint256 mintAmount, uint256 minMintAmount); error InsufficientSwapOutAmount(uint256 outAmount, uint256 minOutAmount); @@ -19,152 +18,99 @@ error SameTokenInTokenOut(uint256 tokenInIndex, uint256 tokenOutIndex); error ImbalancedPool(uint256 oldD, uint256 newD); /** - * @title StableAsset swap + * @title SelfPeggingAsset swap * @author Nuts Finance Developer - * @notice The StableAsset pool provides a way to swap between different tokens - * @dev The StableAsset contract allows users to trade between different tokens, with prices determined algorithmically + * @notice The SelfPeggingAsset pool provides a way to swap between different tokens + * @dev The SelfPeggingAsset contract allows users to trade between different tokens, with prices determined + * algorithmically * based on the current supply and demand of each token */ -contract StableAsset is Initializable, ReentrancyGuardUpgradeable { - using SafeERC20Upgradeable for IERC20Upgradeable; +contract SelfPeggingAsset is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable { + using SafeERC20 for IERC20; /** - * @notice This event is emitted when a token swap occurs. - * @param buyer is the address of the account that made the swap. - * @param amounts is an array containing the amounts of each token received by the buyer. - * @param feeAmount is the amount of transaction fee charged for the swap. - */ - event TokenSwapped( - address indexed buyer, uint256 swapAmount, uint256[] amounts, bool[] amountPositive, uint256 feeAmount - ); - /** - * @notice This event is emitted when liquidity is added to the StableAsset contract. - * @param provider is the address of the liquidity provider. - * @param mintAmount is the amount of liquidity tokens minted to the provider in exchange for their contribution. - * @param amounts is an array containing the amounts of each token contributed by the provider. - * @param feeAmount is the amount of transaction fee charged for the liquidity provision. - */ - event Minted(address indexed provider, uint256 mintAmount, uint256[] amounts, uint256 feeAmount); - /** - * @dev This event is emitted when liquidity is removed from the StableAsset contract. - * @param provider is the address of the liquidity provider. - * @param redeemAmount is the amount of liquidity tokens redeemed by the provider. - * @param amounts is an array containing the amounts of each token received by the provider. - * @param feeAmount is the amount of transaction fee charged for the liquidity provision. - */ - event Redeemed(address indexed provider, uint256 redeemAmount, uint256[] amounts, uint256 feeAmount); - /** - * @dev This event is emitted when transaction fees are collected by the StableAsset contract. - * @param feeAmount is the amount of fee collected. - * @param totalSupply is the total supply of LP token. - */ - event FeeCollected(uint256 feeAmount, uint256 totalSupply); - /** - * @dev This event is emitted when yield is collected by the StableAsset contract. - * @param amounts is an array containing the amounts of each token the yield receives. - * @param feeAmount is the amount of yield collected. - * @param totalSupply is the total supply of LP token. - */ - event YieldCollected(uint256[] amounts, uint256 feeAmount, uint256 totalSupply); - /** - * @dev This event is emitted when the A parameter is modified. - * @param futureA is the new value of the A parameter. - * @param futureABlock is the block number at which the new value of the A parameter will take effect. + * @dev This is the denominator used for calculating transaction fees in the SelfPeggingAsset contract. */ - event AModified(uint256 futureA, uint256 futureABlock); - - /** - * @dev This event is emitted when the mint fee is modified. - * @param mintFee is the new value of the mint fee. - */ - event MintFeeModified(uint256 mintFee); - - /** - * @dev This event is emitted when the swap fee is modified. - * @param swapFee is the new value of the swap fee. - */ - event SwapFeeModified(uint256 swapFee); - - /** - * @dev This event is emitted when the redeem fee is modified. - * @param redeemFee is the new value of the redeem fee. - */ - event RedeemFeeModified(uint256 redeemFee); - + uint256 private constant FEE_DENOMINATOR = 10 ** 10; /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. + * @dev This is the maximum error margin for calculating transaction fees in the SelfPeggingAsset contract. */ - event GovernanceModified(address governance); + uint256 private constant DEFAULT_FEE_ERROR_MARGIN = 100_000; /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. + * @dev This is the maximum error margin for calculating transaction yield in the SelfPeggingAsset contract. */ - event GovernanceProposed(address governance); + uint256 private constant DEFAULT_YIELD_ERROR_MARGIN = 10_000; /** - * @dev This is the denominator used for calculating transaction fees in the StableAsset contract. + * @dev This is the maximum error margin for updating A in the SelfPeggingAsset contract. */ - uint256 private constant FEE_DENOMINATOR = 10 ** 10; + uint256 private constant DEFAULT_MAX_DELTA_D = 100_000; /** * @dev This is the maximum value of the amplification coefficient A. */ uint256 private constant MAX_A = 10 ** 6; + /** * @dev This is minimum initial mint */ uint256 private constant INITIAL_MINT_MIN = 100_000; /** - * @dev This is an array of addresses representing the tokens currently supported by the StableAsset contract. + * @dev This is an array of addresses representing the tokens currently supported by the SelfPeggingAsset contract. */ address[] public tokens; + /** - * @dev This is an array of uint256 values representing the precisions of each token in the StableAsset contract. + * @dev This is an array of uint256 values representing the precisions of each token in the SelfPeggingAsset + * contract. * The precision of each token is calculated as 10 ** (18 - token decimals). */ uint256[] public precisions; + /** - * @dev This is an array of uint256 values representing the current balances of each token in the StableAsset + * @dev This is an array of uint256 values representing the current balances of each token in the SelfPeggingAsset * contract. * The balances are converted to the standard token unit (10 ** 18). */ uint256[] public balances; + /** - * @dev This is the fee charged for adding liquidity to the StableAsset contract. + * @dev This is the fee charged for adding liquidity to the SelfPeggingAsset contract. */ uint256 public mintFee; + /** - * @dev This is the fee charged for trading assets in the StableAsset contract. + * @dev This is the fee charged for trading assets in the SelfPeggingAsset contract. * swapFee = swapFee * FEE_DENOMINATOR */ uint256 public swapFee; + /** - * @dev This is the fee charged for removing liquidity from the StableAsset contract. + * @dev This is the fee charged for removing liquidity from the SelfPeggingAsset contract. * redeemFee = redeemFee * FEE_DENOMINATOR */ uint256 public redeemFee; + /** - * @dev This is the address of the ERC20 token contract that represents the StableAsset pool token. + * @dev This is the address of the ERC20 token contract that represents the SelfPeggingAsset pool token. */ - ITapETH public poolToken; + ILPToken public poolToken; + /** * @dev The total supply of pool token minted by the swap. * It might be different from the pool token supply as the pool token can have multiple minters. */ uint256 public totalSupply; + /** - * @dev This is the account that has governance control over the StableAsset contract. - */ - address public governance; - /** - * @dev This is a mapping of accounts that have administrative privileges over the StableAsset contract. + * @dev This is a mapping of accounts that have administrative privileges over the SelfPeggingAsset contract. */ mapping(address => bool) public admins; + /** - * @dev This is a state variable that represents whether or not the StableAsset contract is currently paused. + * @dev This is a state variable that represents whether or not the SelfPeggingAsset contract is currently paused. */ bool public paused; @@ -172,39 +118,202 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev These is a state variables that represents the initial amplification coefficient A. */ uint256 public initialA; + /** * @dev These is a state variables that represents the initial block number when A is set. */ uint256 public initialABlock; + /** * @dev These is a state variables that represents the future amplification coefficient A. */ uint256 public futureA; + /** * @dev These is a state variables that represents the future block number when A is set. */ uint256 public futureABlock; + + /** + * @dev Exchange rate provider for the tokens + */ + IExchangeRateProvider[] public exchangeRateProviders; + + /** + * @dev Fee error margin. + */ + uint256 public feeErrorMargin; + + /** + * @dev Yield error margin. + */ + uint256 public yieldErrorMargin; + + /** + * @dev Max delta D. + */ + uint256 public maxDeltaD; + + /** + * @notice This event is emitted when a token swap occurs. + * @param buyer is the address of the account that made the swap. + * @param amounts is an array containing the amounts of each token received by the buyer. + * @param feeAmount is the amount of transaction fee charged for the swap. + */ + event TokenSwapped( + address indexed buyer, uint256 swapAmount, uint256[] amounts, bool[] amountPositive, uint256 feeAmount + ); + + /** + * @notice This event is emitted when liquidity is added to the SelfPeggingAsset contract. + * @param provider is the address of the liquidity provider. + * @param mintAmount is the amount of liquidity tokens minted to the provider in exchange for their contribution. + * @param amounts is an array containing the amounts of each token contributed by the provider. + * @param feeAmount is the amount of transaction fee charged for the liquidity provision. + */ + event Minted(address indexed provider, uint256 mintAmount, uint256[] amounts, uint256 feeAmount); + + /** + * @dev This event is emitted when liquidity is removed from the SelfPeggingAsset contract. + * @param provider is the address of the liquidity provider. + * @param redeemAmount is the amount of liquidity tokens redeemed by the provider. + * @param amounts is an array containing the amounts of each token received by the provider. + * @param feeAmount is the amount of transaction fee charged for the liquidity provision. + */ + event Redeemed(address indexed provider, uint256 redeemAmount, uint256[] amounts, uint256 feeAmount); + + /** + * @dev This event is emitted when transaction fees are collected by the SelfPeggingAsset contract. + * @param feeAmount is the amount of fee collected. + * @param totalSupply is the total supply of LP token. + */ + event FeeCollected(uint256 feeAmount, uint256 totalSupply); + + /** + * @dev This event is emitted when yield is collected by the SelfPeggingAsset contract. + * @param amounts is an array containing the amounts of each token the yield receives. + * @param feeAmount is the amount of yield collected. + * @param totalSupply is the total supply of LP token. + */ + event YieldCollected(uint256[] amounts, uint256 feeAmount, uint256 totalSupply); + + /** + * @dev This event is emitted when the A parameter is modified. + * @param futureA is the new value of the A parameter. + * @param futureABlock is the block number at which the new value of the A parameter will take effect. + */ + event AModified(uint256 futureA, uint256 futureABlock); + + /** + * @dev This event is emitted when the mint fee is modified. + * @param mintFee is the new value of the mint fee. + */ + event MintFeeModified(uint256 mintFee); + + /** + * @dev This event is emitted when the swap fee is modified. + * @param swapFee is the new value of the swap fee. + */ + event SwapFeeModified(uint256 swapFee); + /** - * @dev Exchange rate provider for token at exchangeRateTokenIndex. + * @dev This event is emitted when the redeem fee is modified. + * @param redeemFee is the new value of the redeem fee. */ - IExchangeRateProvider public exchangeRateProvider; + event RedeemFeeModified(uint256 redeemFee); + /** - * @dev Index of tokens array for IExchangeRateProvider. + * @dev This event is emitted when the fee margin is modified. + * @param margin is the new value of the margin. */ - uint256 public exchangeRateTokenIndex; + event FeeMarginModified(uint256 margin); /** - * @dev Pending governance address. + * @dev This event is emitted when the fee margin is modified. + * @param margin is the new value of the margin. */ - address public pendingGovernance; + event YieldMarginModified(uint256 margin); /** - * @dev Last redeem or mint timestamp + * @dev This event is emitted when the max delta D is modified. + * @param delta is the new value of the delta. */ - uint256 private lastRedeemOrMint; + event MaxDeltaDModified(uint256 delta); + + /// @notice Error thrown when the input parameters do not match the expected values. + error InputMismatch(); + + /// @notice Error thrown when fees are not set + error NoFees(); + + /// @notice Error thrown when the fee percentage is too large. + error FeePercentageTooLarge(); + + /// @notice Error thrown when the token address is not set. + error TokenNotSet(); + + /// @notice Error thrown when the exchange rate provider is not set. + error ExchangeRateProviderNotSet(); + + /// @notice Error thrown when the precision is not set. + error PrecisionNotSet(); + + /// @notice Error thrown when the tokens are duplicates. + error DuplicateToken(); + + /// @notice Error thrown when the pool token is not set. + error PoolTokenNotSet(); + + /// @notice Error thrown when the A value is not set. + error ANotSet(); + + /// @notice Error thrown when the amount is invalid. + error InvalidAmount(); + + /// @notice Error thrown when the pool is paused. + error Paused(); + + /// @notice Error thrown when the amount is zero. + error ZeroAmount(); + + /// @notice Error thrown when the token is the same. + error SameToken(); + + /// @notice Error thrown when the input token is invalid. + error InvalidIn(); + + /// @notice Error thrown when the output token is invalid. + error InvalidOut(); + + /// @notice Error thrown when the amount is invalid. + error InvalidMins(); + + /// @notice Error thrown when the token is invalid. + error InvalidToken(); + + /// @notice Error thrown when the limit is exceeded. + error LimitExceeded(); + + /// @notice Error thrown when the pool is not paused. + error NotPaused(); + + /// @notice Error thrown when the account address is zero + error AccountIsZero(); + + /// @notice Error thrown when the block number is an past block + error PastBlock(); + + /// @notice Error thrown when the pool is imbalanced + error PoolImbalanced(); + + /// @notice Error thrown when there is no loss + error NoLosses(); + + /// @notice Error thrown when the account is not an admin + error NotAdmin(); /** - * @dev Initializes the StableAsset contract with the given parameters. + * @dev Initializes the SelfPeggingAsset contract with the given parameters. * @param _tokens The tokens in the pool. * @param _precisions The precisions of each token (10 ** (18 - token decimals)). * @param _fees The fees for minting, swapping, and redeeming. @@ -215,55 +324,57 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { address[] memory _tokens, uint256[] memory _precisions, uint256[] memory _fees, - ITapETH _poolToken, + ILPToken _poolToken, uint256 _A, - IExchangeRateProvider _exchangeRateProvider, - uint256 _exchangeRateTokenIndex + IExchangeRateProvider[] memory _exchangeRateProviders ) public initializer { - require(_tokens.length >= 2 && _tokens.length == _precisions.length, "input mismatch"); - require(_fees.length == 3, "no fees"); + require( + _tokens.length >= 2 && _tokens.length == _precisions.length + && _tokens.length == _exchangeRateProviders.length, + InputMismatch() + ); + require(_fees.length == 3, NoFees()); for (uint256 i = 0; i < 3; i++) { - require(_fees[i] < FEE_DENOMINATOR, "fee percentage too large"); + require(_fees[i] < FEE_DENOMINATOR, FeePercentageTooLarge()); } for (uint256 i = 0; i < _tokens.length; i++) { - require(_tokens[i] != address(0x0), "token not set"); + require(_tokens[i] != address(0x0), TokenNotSet()); + require(address(_exchangeRateProviders[i]) != address(0x0), ExchangeRateProviderNotSet()); // query tokens decimals uint256 _decimals = ERC20Upgradeable(_tokens[i]).decimals(); - require(_precisions[i] != 0 && _precisions[i] == 10 ** (18 - _decimals), "precision not set"); + require(_precisions[i] != 0 && _precisions[i] == 10 ** (18 - _decimals), PrecisionNotSet()); balances.push(0); } for (uint256 i = 0; i < _tokens.length; i++) { for (uint256 j = i + 1; j < _tokens.length; j++) { - require(_tokens[i] != _tokens[j], "duplicate token address"); + require(_tokens[i] != _tokens[j], DuplicateToken()); } } - require(address(_poolToken) != address(0x0), "pool token not set"); - require(_A > 0 && _A < MAX_A, "A not set"); - require(address(_exchangeRateProvider) != address(0x0), "exchangeRate not set"); - require(_exchangeRateTokenIndex < _tokens.length, "exchange rate token index out of range"); + require(address(_poolToken) != address(0x0), PoolTokenNotSet()); + require(_A > 0 && _A < MAX_A, ANotSet()); __ReentrancyGuard_init(); + __Ownable_init(msg.sender); - governance = msg.sender; tokens = _tokens; precisions = _precisions; mintFee = _fees[0]; swapFee = _fees[1]; redeemFee = _fees[2]; poolToken = _poolToken; - exchangeRateProvider = _exchangeRateProvider; - exchangeRateTokenIndex = _exchangeRateTokenIndex; + exchangeRateProviders = _exchangeRateProviders; initialA = _A; futureA = _A; initialABlock = block.number; futureABlock = block.number; - lastRedeemOrMint = block.timestamp; + feeErrorMargin = DEFAULT_FEE_ERROR_MARGIN; + yieldErrorMargin = DEFAULT_YIELD_ERROR_MARGIN; + maxDeltaD = DEFAULT_MAX_DELTA_D; - // The swap must start with paused state! - paused = true; + paused = false; } /** @@ -293,7 +404,7 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev Computes D given token balances. * @param _balances Normalized balance of each token. * @param _A Amplification coefficient from getA(). - * @return D The StableAsset invariant. + * @return D The SelfPeggingAsset invariant. */ function _getD(uint256[] memory _balances, uint256 _A) internal pure returns (uint256) { uint256 sum = 0; @@ -388,7 +499,7 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory _balances; uint256 _totalSupply; (_balances, _totalSupply) = getPendingYieldAmount(); - require(_amounts.length == _balances.length, "invalid amount"); + require(_amounts.length == _balances.length, InvalidAmount()); uint256 A = getA(); uint256 oldD = _totalSupply; @@ -396,10 +507,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { for (i = 0; i < _balances.length; i++) { if (_amounts[i] == 0) continue; uint256 balanceAmount = _amounts[i]; - if (i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + balanceAmount = (balanceAmount * exchangeRateProviders[i].exchangeRate()) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); // balance = balance + amount * precision _balances[i] = _balances[i] + (balanceAmount * precisions[i]); } @@ -424,9 +533,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { */ function mint(uint256[] calldata _amounts, uint256 _minMintAmount) external nonReentrant returns (uint256) { // If swap is paused, only admins can mint. - require(!paused || admins[msg.sender], "paused"); - require(balances.length == _amounts.length, "invalid amounts"); - require(block.timestamp > lastRedeemOrMint, "same block redeem"); + require(!paused || admins[msg.sender], Paused()); + require(balances.length == _amounts.length, InvalidAmount()); collectFeeOrYield(false); uint256[] memory _balances = balances; @@ -436,16 +544,14 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { for (i = 0; i < _balances.length; i++) { if (_amounts[i] < INITIAL_MINT_MIN) { // Initial deposit requires all tokens provided! - require(oldD > 0, "zero amount"); + require(oldD > 0, ZeroAmount()); } if (_amounts[i] == 0) { continue; } uint256 balanceAmount = _amounts[i]; - if (i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + balanceAmount = (balanceAmount * exchangeRateProviders[i].exchangeRate()) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); _balances[i] = _balances[i] + (balanceAmount * precisions[i]); } uint256 newD = _getD(_balances, A); @@ -466,13 +572,12 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { if (_amounts[i] == 0) continue; // Update the balance in storage balances[i] = _balances[i]; - IERC20Upgradeable(tokens[i]).safeTransferFrom(msg.sender, address(this), _amounts[i]); + IERC20(tokens[i]).safeTransferFrom(msg.sender, address(this), _amounts[i]); } totalSupply = oldD + mintAmount; poolToken.mintShares(msg.sender, mintAmount); feeAmount = collectFeeOrYield(true); emit Minted(msg.sender, mintAmount, _amounts, feeAmount); - lastRedeemOrMint = block.timestamp; return mintAmount; } @@ -488,18 +593,16 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory _balances; uint256 _totalSupply; (_balances, _totalSupply) = getPendingYieldAmount(); - require(_i != _j, "same token"); - require(_i < _balances.length, "invalid in"); - require(_j < _balances.length, "invalid out"); - require(_dx > 0, "invalid amount"); + require(_i != _j, SameToken()); + require(_i < _balances.length, InvalidIn()); + require(_j < _balances.length, InvalidOut()); + require(_dx > 0, InvalidAmount()); uint256 A = getA(); uint256 D = _totalSupply; uint256 balanceAmount = _dx; - if (_i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + balanceAmount = (balanceAmount * exchangeRateProviders[_i].exchangeRate()) + / (10 ** exchangeRateProviders[_i].exchangeRateDecimals()); // balance[i] = balance[i] + dx * precisions[i] _balances[_i] = _balances[_i] + (balanceAmount * precisions[_i]); uint256 y = _getY(_balances, _j, D, A); @@ -514,12 +617,10 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256 transferAmountJ = dy; uint256 feeAmountReturn = feeAmount; - if (_j == exchangeRateTokenIndex) { - transferAmountJ = (transferAmountJ * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - feeAmountReturn = (feeAmountReturn * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + transferAmountJ = (transferAmountJ * (10 ** exchangeRateProviders[_j].exchangeRateDecimals())) + / exchangeRateProviders[_j].exchangeRate(); + feeAmountReturn = (feeAmountReturn * (10 ** exchangeRateProviders[_j].exchangeRateDecimals())) + / exchangeRateProviders[_j].exchangeRate(); return (transferAmountJ, feeAmountReturn); } @@ -534,26 +635,23 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { */ function swap(uint256 _i, uint256 _j, uint256 _dx, uint256 _minDy) external nonReentrant returns (uint256) { // If swap is paused, only admins can swap. - require(!paused || admins[msg.sender], "paused"); + require(!paused || admins[msg.sender], Paused()); if (_i == _j) { - revert SameTokenInTokenOut(_i, _j); + revert SameToken(); } - require(_i < balances.length, "invalid in"); - require(_j < balances.length, "invalid out"); - require(_dx != 0, "invalid amount"); + require(_i < balances.length, InvalidIn()); + require(_j < balances.length, InvalidOut()); + require(_dx != 0, InvalidAmount()); collectFeeOrYield(false); uint256[] memory _balances = balances; uint256 A = getA(); - uint256 D = totalSupply; uint256 balanceAmount = _dx; - if (_i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + balanceAmount = (balanceAmount * exchangeRateProviders[_i].exchangeRate()) + / (10 ** exchangeRateProviders[_i].exchangeRateDecimals()); // balance[i] = balance[i] + dx * precisions[i] _balances[_i] = _balances[_i] + (balanceAmount * precisions[_i]); - uint256 y = _getY(_balances, _j, D, A); + uint256 y = _getY(_balances, _j, totalSupply, A); // dy = (balance[j] - y - 1) / precisions[j] in case there was rounding errors uint256 dy = (_balances[_j] - y - 1) / precisions[_j]; // Update token balance in storage @@ -565,27 +663,23 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { feeAmount = (dy * swapFee) / FEE_DENOMINATOR; dy = dy - feeAmount; } - if (_j == exchangeRateTokenIndex) { - _minDy = - (_minDy * exchangeRateProvider.exchangeRate()) / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + _minDy = (_minDy * exchangeRateProviders[_j].exchangeRate()) + / (10 ** exchangeRateProviders[_j].exchangeRateDecimals()); if (dy < _minDy) { revert InsufficientSwapOutAmount(dy, _minDy); } - IERC20Upgradeable(tokens[_i]).safeTransferFrom(msg.sender, address(this), _dx); + IERC20(tokens[_i]).safeTransferFrom(msg.sender, address(this), _dx); // Important: When swap fee > 0, the swap fee is charged on the output token. // Therefore, balances[j] < tokens[j].balanceOf(this) // Since balances[j] is used to compute D, D is unchanged. // collectFees() is used to convert the difference between balances[j] and tokens[j].balanceOf(this) // into pool token as fees! uint256 transferAmountJ = dy; - if (_j == exchangeRateTokenIndex) { - transferAmountJ = (transferAmountJ * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } - IERC20Upgradeable(tokens[_j]).safeTransfer(msg.sender, transferAmountJ); + transferAmountJ = (transferAmountJ * (10 ** exchangeRateProviders[_j].exchangeRateDecimals())) + / exchangeRateProviders[_j].exchangeRate(); + IERC20(tokens[_j]).safeTransfer(msg.sender, transferAmountJ); uint256[] memory amounts = new uint256[](_balances.length); bool[] memory amountPositive = new bool[](_balances.length); @@ -609,7 +703,7 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory _balances; uint256 _totalSupply; (_balances, _totalSupply) = getPendingYieldAmount(); - require(_amount != 0, "zero amount"); + require(_amount != 0, ZeroAmount()); uint256 D = _totalSupply; uint256[] memory amounts = new uint256[](_balances.length); @@ -625,10 +719,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { // D in case we have multiple minters on the pool token. amounts[i] = (_balances[i] * redeemAmount) / D / precisions[i]; uint256 transferAmount = amounts[i]; - if (i == exchangeRateTokenIndex) { - transferAmount = (transferAmount * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + transferAmount = (transferAmount * (10 ** exchangeRateProviders[i].exchangeRateDecimals())) + / exchangeRateProviders[i].exchangeRate(); amounts[i] = transferAmount; } @@ -650,10 +742,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { returns (uint256[] memory) { // If swap is paused, only admins can redeem. - require(!paused || admins[msg.sender], "paused"); - require(_amount != 0, "zero amount"); - require(balances.length == _minRedeemAmounts.length, "invalid mins"); - require(block.timestamp > lastRedeemOrMint, "same block redeem"); + require(!paused || admins[msg.sender], Paused()); + require(_amount != 0, ZeroAmount()); + require(balances.length == _minRedeemAmounts.length, InvalidMins()); collectFeeOrYield(false); uint256[] memory _balances = balances; @@ -673,29 +764,24 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { // Important: Underlying tokens must convert back to original decimals! amounts[i] = tokenAmount / precisions[i]; uint256 minRedeemAmount = _minRedeemAmounts[i]; - if (i == exchangeRateTokenIndex) { - minRedeemAmount = (minRedeemAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + minRedeemAmount = (minRedeemAmount * exchangeRateProviders[i].exchangeRate()) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); if (amounts[i] < minRedeemAmount) { revert InsufficientRedeemAmount(amounts[i], minRedeemAmount); } // Updates the balance in storage balances[i] = _balances[i] - tokenAmount; uint256 transferAmount = amounts[i]; - if (i == exchangeRateTokenIndex) { - transferAmount = (transferAmount * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + transferAmount = (transferAmount * (10 ** exchangeRateProviders[i].exchangeRateDecimals())) + / exchangeRateProviders[i].exchangeRate(); amounts[i] = transferAmount; - IERC20Upgradeable(tokens[i]).safeTransfer(msg.sender, transferAmount); + IERC20(tokens[i]).safeTransfer(msg.sender, transferAmount); } totalSupply = D - _amount; // After reducing the redeem fee, the remaining pool tokens are burned! poolToken.burnSharesFrom(msg.sender, _amount); feeAmount = collectFeeOrYield(true); - lastRedeemOrMint = block.timestamp; emit Redeemed(msg.sender, _amount, amounts, feeAmount); return amounts; } @@ -712,8 +798,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256 _totalSupply; (_balances, _totalSupply) = getPendingYieldAmount(); - require(_amount > 0, "zero amount"); - require(_i < _balances.length, "invalid token"); + require(_amount > 0, ZeroAmount()); + require(_i < _balances.length, InvalidToken()); uint256 A = getA(); uint256 D = _totalSupply; @@ -728,10 +814,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { // dy = (balance[i] - y - 1) / precisions[i] in case there was rounding errors uint256 dy = (_balances[_i] - y - 1) / precisions[_i]; uint256 transferAmount = dy; - if (_i == exchangeRateTokenIndex) { - transferAmount = (transferAmount * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + transferAmount = (transferAmount * (10 ** exchangeRateProviders[_i].exchangeRateDecimals())) + / exchangeRateProviders[_i].exchangeRate(); return (transferAmount, feeAmount); } @@ -753,10 +837,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { returns (uint256) { // If swap is paused, only admins can redeem. - require(!paused || admins[msg.sender], "paused"); - require(_amount > 0, "zero amount"); - require(_i < balances.length, "invalid token"); - require(block.timestamp > lastRedeemOrMint, "same block redeem"); + require(!paused || admins[msg.sender], Paused()); + require(_amount > 0, ZeroAmount()); + require(_i < balances.length, InvalidToken()); collectFeeOrYield(false); uint256[] memory _balances = balances; @@ -768,10 +851,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { feeAmount = (_amount * redeemFee) / FEE_DENOMINATOR; redeemAmount = _amount - feeAmount; } - if (_i == exchangeRateTokenIndex) { - _minRedeemAmount = (_minRedeemAmount * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + _minRedeemAmount = (_minRedeemAmount * exchangeRateProviders[_i].exchangeRate()) + / (10 ** exchangeRateProviders[_i].exchangeRateDecimals()); // y is converted(18 decimals) uint256 y = _getY(_balances, _i, D - redeemAmount, A); @@ -785,16 +866,13 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { balances[_i] = y; uint256[] memory amounts = new uint256[](_balances.length); uint256 transferAmount = dy; - if (_i == exchangeRateTokenIndex) { - transferAmount = (transferAmount * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + transferAmount = (transferAmount * (10 ** exchangeRateProviders[_i].exchangeRateDecimals())) + / exchangeRateProviders[_i].exchangeRate(); amounts[_i] = transferAmount; - IERC20Upgradeable(tokens[_i]).safeTransfer(msg.sender, transferAmount); + IERC20(tokens[_i]).safeTransfer(msg.sender, transferAmount); totalSupply = D - _amount; poolToken.burnSharesFrom(msg.sender, _amount); feeAmount = collectFeeOrYield(true); - lastRedeemOrMint = block.timestamp; emit Redeemed(msg.sender, _amount, amounts, feeAmount); return transferAmount; } @@ -809,7 +887,7 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory _balances; uint256 _totalSupply; (_balances, _totalSupply) = getPendingYieldAmount(); - require(_amounts.length == balances.length, "length not match"); + require(_amounts.length == balances.length, InputMismatch()); uint256 A = getA(); uint256 oldD = _totalSupply; @@ -817,10 +895,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { if (_amounts[i] == 0) continue; // balance = balance + amount * precision uint256 balanceAmount = _amounts[i]; - if (i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / 10 ** exchangeRateProvider.exchangeRateDecimals(); - } + balanceAmount = (balanceAmount * exchangeRateProviders[i].exchangeRate()) + / 10 ** exchangeRateProviders[i].exchangeRateDecimals(); _balances[i] = _balances[i] - (balanceAmount * precisions[i]); } uint256 newD = _getD(_balances, A); @@ -850,10 +926,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { nonReentrant returns (uint256[] memory) { - require(_amounts.length == balances.length, "length not match"); + require(_amounts.length == balances.length, InputMismatch()); // If swap is paused, only admins can redeem. - require(!paused || admins[msg.sender], "paused"); - require(block.timestamp > lastRedeemOrMint, "same block redeem"); + require(!paused || admins[msg.sender], Paused()); collectFeeOrYield(false); uint256[] memory _balances = balances; @@ -863,10 +938,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { for (i = 0; i < _balances.length; i++) { if (_amounts[i] == 0) continue; uint256 balanceAmount = _amounts[i]; - if (i == exchangeRateTokenIndex) { - balanceAmount = (balanceAmount * exchangeRateProvider.exchangeRate()) - / 10 ** exchangeRateProvider.exchangeRateDecimals(); - } + balanceAmount = (balanceAmount * exchangeRateProviders[i].exchangeRate()) + / 10 ** exchangeRateProviders[i].exchangeRateDecimals(); // balance = balance + amount * precision _balances[i] = _balances[i] - (balanceAmount * precisions[i]); } @@ -890,10 +963,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory amounts = _amounts; for (i = 0; i < _balances.length; i++) { if (_amounts[i] == 0) continue; - IERC20Upgradeable(tokens[i]).safeTransfer(msg.sender, _amounts[i]); + IERC20(tokens[i]).safeTransfer(msg.sender, _amounts[i]); } feeAmount = collectFeeOrYield(true); - lastRedeemOrMint = block.timestamp; emit Redeemed(msg.sender, redeemAmount, amounts, feeAmount); return amounts; } @@ -908,11 +980,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256 A = getA(); for (uint256 i = 0; i < _balances.length; i++) { - uint256 balanceI = IERC20Upgradeable(tokens[i]).balanceOf(address(this)); - if (i == exchangeRateTokenIndex) { - balanceI = (balanceI * exchangeRateProvider.exchangeRate()) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + uint256 balanceI = IERC20(tokens[i]).balanceOf(address(this)); + balanceI = (balanceI * exchangeRateProviders[i].exchangeRate()) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); _balances[i] = balanceI * precisions[i]; } uint256 newD = _getD(_balances, A); @@ -932,11 +1002,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256 oldD = totalSupply; for (uint256 i = 0; i < _balances.length; i++) { - uint256 balanceI = IERC20Upgradeable(tokens[i]).balanceOf(address(this)); - if (i == exchangeRateTokenIndex) { - balanceI = (balanceI * (exchangeRateProvider.exchangeRate())) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + uint256 balanceI = IERC20(tokens[i]).balanceOf(address(this)); + balanceI = (balanceI * (exchangeRateProviders[i].exchangeRate())) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); _balances[i] = balanceI * precisions[i]; } uint256 newD = _getD(_balances, A); @@ -944,11 +1012,19 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { balances = _balances; totalSupply = newD; - if (oldD > newD) { - poolToken.removeTotalSupply(oldD - newD); - return 0; + if (isFee) { + if (oldD > newD && (oldD - newD) < feeErrorMargin) { + return 0; + } else if (oldD > newD) { + revert ImbalancedPool(oldD, newD); + } + } else { + if (oldD > newD && (oldD - newD) < yieldErrorMargin) { + return 0; + } else if (oldD > newD) { + revert ImbalancedPool(oldD, newD); + } } - uint256 feeAmount = newD - oldD; if (feeAmount == 0) { return 0; @@ -961,10 +1037,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256[] memory amounts = new uint256[](_balances.length); for (uint256 i = 0; i < _balances.length; i++) { uint256 amount = _balances[i] - oldBalances[i]; - if (i == exchangeRateTokenIndex) { - amount = (amount * (10 ** exchangeRateProvider.exchangeRateDecimals())) - / exchangeRateProvider.exchangeRate(); - } + amount = (amount * (10 ** exchangeRateProviders[i].exchangeRateDecimals())) + / exchangeRateProviders[i].exchangeRate(); amounts[i] = amount / precisions[i]; } emit YieldCollected(amounts, feeAmount, totalSupply); @@ -972,33 +1046,12 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { return feeAmount; } - /** - * @dev Propose the govenance address. - * @param _governance Address of the new governance. - */ - function proposeGovernance(address _governance) public { - require(msg.sender == governance, "not governance"); - pendingGovernance = _governance; - emit GovernanceProposed(_governance); - } - - /** - * @dev Accept the govenance address. - */ - function acceptGovernance() public { - require(msg.sender == pendingGovernance, "not pending governance"); - governance = pendingGovernance; - pendingGovernance = address(0); - emit GovernanceModified(governance); - } - /** * @dev Updates the mint fee. * @param _mintFee The new mint fee. */ - function setMintFee(uint256 _mintFee) external { - require(msg.sender == governance, "not governance"); - require(_mintFee < FEE_DENOMINATOR, "exceed limit"); + function setMintFee(uint256 _mintFee) external onlyOwner { + require(_mintFee < FEE_DENOMINATOR, LimitExceeded()); mintFee = _mintFee; emit MintFeeModified(_mintFee); } @@ -1007,9 +1060,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev Updates the swap fee. * @param _swapFee The new swap fee. */ - function setSwapFee(uint256 _swapFee) external { - require(msg.sender == governance, "not governance"); - require(_swapFee < FEE_DENOMINATOR, "exceed limit"); + function setSwapFee(uint256 _swapFee) external onlyOwner { + require(_swapFee < FEE_DENOMINATOR, LimitExceeded()); swapFee = _swapFee; emit SwapFeeModified(_swapFee); } @@ -1018,9 +1070,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev Updates the redeem fee. * @param _redeemFee The new redeem fee. */ - function setRedeemFee(uint256 _redeemFee) external { - require(msg.sender == governance, "not governance"); - require(_redeemFee < FEE_DENOMINATOR, "exceed limit"); + function setRedeemFee(uint256 _redeemFee) external onlyOwner { + require(_redeemFee < FEE_DENOMINATOR, LimitExceeded()); redeemFee = _redeemFee; emit RedeemFeeModified(_redeemFee); } @@ -1029,8 +1080,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev Pause mint/swap/redeem actions. Can unpause later. */ function pause() external { - require(msg.sender == governance, "not governance"); - require(!paused, "paused"); + require(!paused, Paused()); + require(admins[msg.sender], NotAdmin()); paused = true; } @@ -1039,8 +1090,8 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @dev Unpause mint/swap/redeem actions. */ function unpause() external { - require(msg.sender == governance, "not governance"); - require(paused, "not paused"); + require(paused, NotPaused()); + require(admins[msg.sender], NotAdmin()); paused = false; } @@ -1050,84 +1101,77 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { * @param _account Address to update admin role. * @param _allowed Whether the address is granted the admin role. */ - function setAdmin(address _account, bool _allowed) external { - require(msg.sender == governance, "not governance"); - require(_account != address(0x0), "account not set"); + function setAdmin(address _account, bool _allowed) external onlyOwner { + require(_account != address(0x0), AccountIsZero()); admins[_account] = _allowed; } /** - * @dev Increase the A value. + * @dev Update the A value. * @param _futureA The new A value. * @param _futureABlock The block number to update A value. */ - function increaseA(uint256 _futureA, uint256 _futureABlock) external { - require(msg.sender == governance, "not governance"); - require(_futureA > 0 && _futureA < MAX_A, "A not set"); - require(_futureABlock > block.number, "block in the past"); - - collectFeeOrYield(false); + function updateA(uint256 _futureA, uint256 _futureABlock) external onlyOwner { + require(_futureA > 0 && _futureA < MAX_A, ANotSet()); + require(_futureABlock > block.number, PastBlock()); initialA = getA(); - require(_futureA > initialA, "A decreasing"); initialABlock = block.number; futureA = _futureA; futureABlock = _futureABlock; + collectFeeOrYield(false); uint256 newD = _getD(balances, futureA); - if (newD < totalSupply) { - revert("Can't update A"); - } + uint256 absolute = totalSupply > newD ? totalSupply - newD : newD - totalSupply; + require(absolute < maxDeltaD, PoolImbalanced()); + emit AModified(_futureA, _futureABlock); } /** - * @dev Decrease the A value. - * @param _futureA The new A value. + * @dev update fee error margin. */ - function decreaseA(uint256 _futureA) external { - require(msg.sender == governance, "not governance"); - require(_futureA > 0 && _futureA < MAX_A, "A not set"); - - collectFeeOrYield(false); + function updateFeeErrorMargin(uint256 newValue) external onlyOwner { + feeErrorMargin = newValue; + emit FeeMarginModified(newValue); + } - initialA = getA(); - require(initialA > _futureA, "A increasing"); - initialABlock = block.number; - futureA = _futureA; - futureABlock = block.number; + /** + * @dev update yield error margin. + */ + function updateYieldErrorMargin(uint256 newValue) external onlyOwner { + yieldErrorMargin = newValue; + emit YieldMarginModified(newValue); + } - uint256 newD = _getD(balances, futureA); - if (newD < totalSupply) { - poolToken.removeTotalSupply(totalSupply - newD); - } - initialA = _futureA; - emit AModified(_futureA, block.number); + /** + * @dev update yield error margin. + */ + function updateMaxDeltaDMargin(uint256 newValue) external onlyOwner { + maxDeltaD = newValue; + emit MaxDeltaDModified(newValue); } /** * @dev Distribute losses */ - function distributeLoss() external { - require(msg.sender == governance, "not governance"); - require(paused, "not paused"); + function distributeLoss() external onlyOwner { + require(paused, NotPaused()); uint256[] memory _balances = balances; uint256 A = getA(); uint256 oldD = totalSupply; for (uint256 i = 0; i < _balances.length; i++) { - uint256 balanceI = IERC20Upgradeable(tokens[i]).balanceOf(address(this)); - if (i == exchangeRateTokenIndex) { - balanceI = (balanceI * (exchangeRateProvider.exchangeRate())) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + uint256 balanceI = IERC20(tokens[i]).balanceOf(address(this)); + balanceI = (balanceI * (exchangeRateProviders[i].exchangeRate())) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); _balances[i] = balanceI * precisions[i]; } uint256 newD = _getD(_balances, A); - require(newD < oldD, "no losses"); + require(newD < oldD, NoLosses()); poolToken.removeTotalSupply(oldD - newD); balances = _balances; totalSupply = newD; @@ -1141,7 +1185,7 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { } /** - * @notice This function allows to rebase TapETH by increasing his total supply + * @notice This function allows to rebase LPToken by increasing his total supply * from the current stableSwap pool by the staking rewards and the swap fee. */ function rebase() external returns (uint256) { @@ -1150,11 +1194,9 @@ contract StableAsset is Initializable, ReentrancyGuardUpgradeable { uint256 oldD = totalSupply; for (uint256 i = 0; i < _balances.length; i++) { - uint256 balanceI = IERC20Upgradeable(tokens[i]).balanceOf(address(this)); - if (i == exchangeRateTokenIndex) { - balanceI = (balanceI * (exchangeRateProvider.exchangeRate())) - / (10 ** exchangeRateProvider.exchangeRateDecimals()); - } + uint256 balanceI = IERC20(tokens[i]).balanceOf(address(this)); + balanceI = (balanceI * (exchangeRateProviders[i].exchangeRate())) + / (10 ** exchangeRateProviders[i].exchangeRateDecimals()); _balances[i] = balanceI * precisions[i]; } uint256 newD = _getD(_balances, A); diff --git a/src/SelfPeggingAssetFactory.sol b/src/SelfPeggingAssetFactory.sol new file mode 100644 index 0000000..65aa2b3 --- /dev/null +++ b/src/SelfPeggingAssetFactory.sol @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +import "./SelfPeggingAsset.sol"; +import "./LPToken.sol"; +import "./WLPToken.sol"; +import "./misc/ConstantExchangeRateProvider.sol"; +import "./misc/ERC4626ExchangeRate.sol"; +import "./misc/OracleExchangeRate.sol"; +import "./interfaces/IExchangeRateProvider.sol"; + +/** + * @title SelfPeggingAsset Application + * @author Nuts Finance Developer + * @notice The StableSwap Application provides an interface for users to interact with StableSwap pool contracts + * @dev The StableSwap Application contract allows users to mint pool tokens, swap between different tokens, and redeem + * pool tokens to underlying tokens. + * This contract should never store assets. + */ +contract SelfPeggingAssetFactory is UUPSUpgradeable, ReentrancyGuardUpgradeable, OwnableUpgradeable { + /// @notice Token type enum + enum TokenType { + Standard, + Oracle, + Rebasing, + ERC4626 + } + + /// @notice Parameters for creating a new pool + struct CreatePoolArgument { + /// @notice Address of token A + address tokenA; + /// @notice Address of token B + address tokenB; + /// @notice Type of token A + TokenType tokenAType; + /// @notice Address of the oracle for token A + address tokenAOracle; + /// @notice Function signature for token A + string tokenAFunctionSig; + /// @notice Type of token B + TokenType tokenBType; + /// @notice Address of the oracle for token B + address tokenBOracle; + /// @notice Function signature for token B + string tokenBFunctionSig; + } + + /** + * @dev This is the account that has governor control over the protocol. + */ + address public governor; + + /** + * @dev Default mint fee for the pool. + */ + uint256 public mintFee; + + /** + * @dev Default swap fee for the pool. + */ + uint256 public swapFee; + + /** + * @dev Default redeem fee for the pool. + */ + uint256 public redeemFee; + + /** + * @dev Default A parameter for the pool. + */ + uint256 public A; + + /** + * @dev Beacon for the SelfPeggingAsset implementation. + */ + address public selfPeggingAssetBeacon; + + /** + * @dev Beacon for the LPToken implementation. + */ + address public lpTokenBeacon; + + /** + * @dev Beacon for the LPToken implementation. + */ + address public wlpTokenBeacon; + + /** + * @dev Constant exchange rate provider. + */ + ConstantExchangeRateProvider public constantExchangeRateProvider; + + /** + * @dev This event is emitted when the governor is modified. + * @param governor is the new value of the governor. + */ + event GovernorModified(address governor); + + /** + * @dev This event is emitted when a new pool is created. + * @param poolToken is the pool token created. + */ + event PoolCreated(address poolToken, address selfPeggingAsset, address wrappedPoolToken); + + /** + * @dev This event is emitted when the mint fee is updated. + * @param mintFee is the new value of the mint fee. + */ + event MintFeeModified(uint256 mintFee); + + /** + * @dev This event is emitted when the swap fee is updated. + * @param swapFee is the new value of the swap fee. + */ + event SwapFeeModified(uint256 swapFee); + + /** + * @dev This event is emitted when the redeem fee is updated. + * @param redeemFee is the new value of the redeem fee. + */ + event RedeemFeeModified(uint256 redeemFee); + + /** + * @dev This event is emitted when the A parameter is updated. + * @param A is the new value of the A parameter. + */ + event AModified(uint256 A); + + /// @dev Error thrown when the address is invalid + error InvalidAddress(); + + /// @dev Error thrown when the value is invalid + error InvalidValue(); + + /// @dev Error thrown when the oracle is invalid + error InvalidOracle(); + + /// @dev Error thrown when the function signature is invalid + error InvalidFunctionSig(); + + /** + * @dev Initializes the StableSwap Application contract. + */ + function initialize( + address _governor, + uint256 _mintFee, + uint256 _swapFee, + uint256 _redeemFee, + uint256 _A, + address _selfPeggingAssetBeacon, + address _lpTokenBeacon, + address _wlpTokenBeacon, + ConstantExchangeRateProvider _constantExchangeRateProvider + ) + public + initializer + { + require(_governor != address(0), InvalidAddress()); + require(_A > 0, InvalidValue()); + require(_selfPeggingAssetBeacon != address(0), InvalidAddress()); + require(_lpTokenBeacon != address(0), InvalidAddress()); + require(_wlpTokenBeacon != address(0), InvalidAddress()); + require(address(_constantExchangeRateProvider) != address(0), InvalidAddress()); + + __ReentrancyGuard_init(); + __Ownable_init(msg.sender); + + governor = _governor; + + selfPeggingAssetBeacon = _selfPeggingAssetBeacon; + lpTokenBeacon = _lpTokenBeacon; + wlpTokenBeacon = _wlpTokenBeacon; + constantExchangeRateProvider = _constantExchangeRateProvider; + + mintFee = _mintFee; + swapFee = _swapFee; + redeemFee = _redeemFee; + A = _A; + } + + /** + * @dev Set the govenance address. + */ + function setGovernor(address _governor) public onlyOwner { + require(_governor != address(0), InvalidAddress()); + governor = _governor; + emit GovernorModified(governor); + } + + /** + * @dev Set the mint fee. + */ + function setMintFee(uint256 _mintFee) external onlyOwner { + mintFee = _mintFee; + emit MintFeeModified(_mintFee); + } + + /** + * @dev Set the swap fee. + */ + function setSwapFee(uint256 _swapFee) external onlyOwner { + swapFee = _swapFee; + emit SwapFeeModified(_swapFee); + } + + /** + * @dev Set the redeem fee. + */ + function setRedeemFee(uint256 _redeemFee) external onlyOwner { + redeemFee = _redeemFee; + emit RedeemFeeModified(_redeemFee); + } + + /** + * @dev Set the A parameter. + */ + function setA(uint256 _A) external onlyOwner { + require(_A > 0, InvalidValue()); + A = _A; + emit AModified(_A); + } + + /** + * @dev Create a new pool. + */ + function createPool(CreatePoolArgument memory argument) external { + require(argument.tokenA != address(0), InvalidAddress()); + require(argument.tokenB != address(0), InvalidAddress()); + require(argument.tokenA != argument.tokenB, InvalidValue()); + + string memory symbolA = ERC20Upgradeable(argument.tokenA).symbol(); + string memory symbolB = ERC20Upgradeable(argument.tokenB).symbol(); + string memory symbol = string.concat(string.concat(string.concat("SPA-", symbolA), "-"), symbolB); + string memory name = string.concat(string.concat(string.concat("Self Pegging Asset ", symbolA), " "), symbolB); + bytes memory lpTokenInit = abi.encodeCall(LPToken.initialize, (name, symbol)); + BeaconProxy lpTokenProxy = new BeaconProxy(lpTokenBeacon, lpTokenInit); + + address[] memory proposers = new address[](1); + address[] memory executors = new address[](1); + proposers[0] = governor; + executors[0] = governor; + + address[] memory tokens = new address[](2); + uint256[] memory precisions = new uint256[](2); + uint256[] memory fees = new uint256[](3); + tokens[0] = argument.tokenA; + tokens[1] = argument.tokenB; + precisions[0] = 10 ** (18 - ERC20Upgradeable(argument.tokenA).decimals()); + precisions[1] = 10 ** (18 - ERC20Upgradeable(argument.tokenB).decimals()); + fees[0] = mintFee; + fees[1] = swapFee; + fees[2] = redeemFee; + + IExchangeRateProvider[] memory exchangeRateProviders = new IExchangeRateProvider[](2); + + if (argument.tokenAType == TokenType.Standard || argument.tokenAType == TokenType.Rebasing) { + exchangeRateProviders[0] = IExchangeRateProvider(constantExchangeRateProvider); + } else if (argument.tokenAType == TokenType.Oracle) { + require(argument.tokenAOracle != address(0), InvalidOracle()); + require(bytes(argument.tokenAFunctionSig).length > 0, InvalidFunctionSig()); + OracleExchangeRate oracleExchangeRate = + new OracleExchangeRate(argument.tokenAOracle, argument.tokenAFunctionSig); + exchangeRateProviders[0] = IExchangeRateProvider(oracleExchangeRate); + } else if (argument.tokenAType == TokenType.ERC4626) { + ERC4626ExchangeRate erc4626ExchangeRate = new ERC4626ExchangeRate(IERC4626(argument.tokenA)); + exchangeRateProviders[0] = IExchangeRateProvider(erc4626ExchangeRate); + } + + if (argument.tokenBType == TokenType.Standard || argument.tokenBType == TokenType.Rebasing) { + exchangeRateProviders[1] = IExchangeRateProvider(constantExchangeRateProvider); + } else if (argument.tokenBType == TokenType.Oracle) { + require(argument.tokenBOracle != address(0), InvalidOracle()); + require(bytes(argument.tokenBFunctionSig).length > 0, InvalidFunctionSig()); + OracleExchangeRate oracleExchangeRate = + new OracleExchangeRate(argument.tokenBOracle, argument.tokenBFunctionSig); + exchangeRateProviders[1] = IExchangeRateProvider(oracleExchangeRate); + } else if (argument.tokenBType == TokenType.ERC4626) { + ERC4626ExchangeRate erc4626ExchangeRate = new ERC4626ExchangeRate(IERC4626(argument.tokenB)); + exchangeRateProviders[1] = IExchangeRateProvider(erc4626ExchangeRate); + } + + bytes memory selfPeggingAssetInit = abi.encodeCall( + SelfPeggingAsset.initialize, + (tokens, precisions, fees, LPToken(address(lpTokenProxy)), A, exchangeRateProviders) + ); + BeaconProxy selfPeggingAssetProxy = new BeaconProxy(selfPeggingAssetBeacon, selfPeggingAssetInit); + SelfPeggingAsset selfPeggingAsset = SelfPeggingAsset(address(selfPeggingAssetProxy)); + LPToken lpToken = LPToken(address(lpTokenProxy)); + + selfPeggingAsset.setAdmin(governor, true); + selfPeggingAsset.transferOwnership(governor); + lpToken.addPool(address(selfPeggingAsset)); + lpToken.transferOwnership(governor); + + bytes memory wlpTokenInit = abi.encodeCall(WLPToken.initialize, (ILPToken(lpToken))); + BeaconProxy wlpTokenProxy = new BeaconProxy(wlpTokenBeacon, wlpTokenInit); + + emit PoolCreated(address(lpTokenProxy), address(selfPeggingAssetProxy), address(wlpTokenProxy)); + } + + /** + * @dev Authorisation to upgrade the implementation of the contract. + */ + function _authorizeUpgrade(address) internal override onlyOwner { } +} diff --git a/src/StableAssetApplication.sol b/src/StableAssetApplication.sol deleted file mode 100644 index 99ae1ae..0000000 --- a/src/StableAssetApplication.sol +++ /dev/null @@ -1,409 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; -import "./interfaces/IWETH.sol"; -import "./interfaces/Ipool.sol"; -import "./StableAsset.sol"; - -error NotAllowedPool(address pool); -error EthAmount(uint256 requiredAmount, uint256 sentAmount); -error FailedEtherTransfer(); - -/** - * @title StableAsset Application - * @author Nuts Finance Developer - * @notice The StableSwap Application provides an interface for users to interact with StableSwap pool contracts - * @dev The StableSwap Application contract allows users to mint pool tokens, swap between different tokens, and redeem - * pool tokens to underlying tokens. - * This contract should never store assets. - */ -contract StableAssetApplication is Initializable, ReentrancyGuardUpgradeable { - using SafeMathUpgradeable for uint256; - using SafeERC20Upgradeable for IERC20Upgradeable; - - /** - * @dev Wrapped ETH address. - */ - IWETH public wETH; - - /** - * @dev This is the account that has governance control over the StableAssetApplication contract. - */ - address public governance; - - /** - * @dev Allowed pool address. - */ - mapping(address => bool) public allowedPoolAddress; - - address[] public pools; - - /** - * @dev Pending governance address, - */ - address public pendingGovernance; - - /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. - */ - event GovernanceModified(address governance); - - /** - * @dev This event is emitted when the pool is modified. - * @param swap is the new value of the swap. - * @param enabled pool enabled or disabled. - */ - event PoolModified(address swap, bool enabled); - - /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. - */ - event GovernanceProposed(address governance); - - /** - * @dev Initializes the StableSwap Application contract. - * @param _wETH Wrapped ETH address. - */ - function initialize(IWETH _wETH) public initializer { - require(address(_wETH) != address(0x0), "wETH not set"); - __ReentrancyGuard_init(); - wETH = _wETH; - governance = msg.sender; - } - - /** - * @dev Fallback function to receive ETH from WETH contract. - */ - receive() external payable { - assert(msg.sender == address(wETH)); // only accept ETH via fallback from the WETH contract - } - - /** - * @dev Mints new pool token and wrap ETH. - * @param _swap Underlying stable swap address. - * @param _amounts Unconverted token balances used to mint pool token. - * @param _minMintAmount Minimum amount of pool token to mint. - */ - function mint( - StableAsset _swap, - uint256[] calldata _amounts, - uint256 _minMintAmount - ) - external - payable - nonReentrant - { - address[] memory tokens = _swap.getTokens(); - address poolToken = address(_swap.poolToken()); - uint256 wETHIndex = findTokenIndex(tokens, address(wETH)); - if (_amounts[wETHIndex] != msg.value) { - revert EthAmount(_amounts[wETHIndex], msg.value); - } - if (!allowedPoolAddress[address(_swap)]) { - revert NotAllowedPool(address(_swap)); - } - - if (_amounts[wETHIndex] > 0) { - wETH.deposit{ value: _amounts[wETHIndex] }(); - } - for (uint256 i = 0; i < tokens.length; i++) { - if (i != wETHIndex) { - IERC20Upgradeable(tokens[i]).safeTransferFrom(msg.sender, address(this), _amounts[i]); - } - IERC20Upgradeable(tokens[i]).safeApprove(address(_swap), _amounts[i]); - } - uint256 mintAmount = _swap.mint(_amounts, _minMintAmount); - IERC20Upgradeable(poolToken).safeTransfer(msg.sender, mintAmount); - } - - /** - * @dev Exchange between two underlying tokens with wrap/unwrap ETH. - * @param _swap Underlying stable swap address. - * @param _i Token index to swap in. - * @param _j Token index to swap out. - * @param _dx Unconverted amount of token _i to swap in. - * @param _minDy Minimum token _j to swap out in converted balance. - */ - function swap( - StableAsset _swap, - uint256 _i, - uint256 _j, - uint256 _dx, - uint256 _minDy - ) - external - payable - nonReentrant - { - address[] memory tokens = _swap.getTokens(); - uint256 wETHIndex = findTokenIndex(tokens, address(wETH)); - if (!allowedPoolAddress[address(_swap)]) { - revert NotAllowedPool(address(_swap)); - } - - if (_i == wETHIndex) { - if (_dx != msg.value) { - revert EthAmount(_dx, msg.value); - } - - wETH.deposit{ value: _dx }(); - } else { - if (msg.value != 0) { - revert EthAmount(0, msg.value); - } - IERC20Upgradeable(tokens[_i]).safeTransferFrom(msg.sender, address(this), _dx); - } - IERC20Upgradeable(tokens[_i]).safeApprove(address(_swap), _dx); - uint256 swapAmount = _swap.swap(_i, _j, _dx, _minDy); - - if (_j == wETHIndex) { - wETH.withdraw(swapAmount); - (bool success,) = msg.sender.call{ value: swapAmount }(""); - if (!success) { - revert FailedEtherTransfer(); - } - } else { - IERC20Upgradeable(tokens[_j]).safeTransfer(msg.sender, swapAmount); - } - } - - /** - * @dev Redeems pool token to underlying tokens proportionally with unwrap ETH. - * @param _swap Underlying stable swap address. - * @param _amount Amount of pool token to redeem. - * @param _minRedeemAmounts Minimum amount of underlying tokens to get. - */ - function redeemProportion( - StableAsset _swap, - uint256 _amount, - uint256[] calldata _minRedeemAmounts - ) - external - nonReentrant - { - address[] memory tokens = _swap.getTokens(); - address poolToken = address(_swap.poolToken()); - uint256 wETHIndex = findTokenIndex(tokens, address(wETH)); - if (!allowedPoolAddress[address(_swap)]) { - revert NotAllowedPool(address(_swap)); - } - IERC20Upgradeable(poolToken).safeApprove(address(_swap), _amount); - IERC20Upgradeable(poolToken).safeTransferFrom(msg.sender, address(this), _amount); - - uint256[] memory amounts = _swap.redeemProportion(_amount, _minRedeemAmounts); - - for (uint256 i = 0; i < tokens.length; i++) { - if (i == wETHIndex) { - wETH.withdraw(amounts[i]); - (bool success,) = msg.sender.call{ value: amounts[i] }(""); - if (!success) { - revert FailedEtherTransfer(); - } - } else { - IERC20Upgradeable(tokens[i]).safeTransfer(msg.sender, amounts[i]); - } - } - } - - /** - * @dev Redeem pool token to one specific underlying token. - * @param _swap Underlying stable swap address. - * @param _amount Amount of pool token to redeem. - * @param _i Index of the token to redeem to. - * @param _minRedeemAmount Minimum amount of the underlying token to redeem to. - */ - function redeemSingle( - StableAsset _swap, - uint256 _amount, - uint256 _i, - uint256 _minRedeemAmount - ) - external - nonReentrant - { - address[] memory tokens = _swap.getTokens(); - address poolToken = address(_swap.poolToken()); - uint256 wETHIndex = findTokenIndex(tokens, address(wETH)); - if (!allowedPoolAddress[address(_swap)]) { - revert NotAllowedPool(address(_swap)); - } - IERC20Upgradeable(poolToken).safeApprove(address(_swap), _amount); - IERC20Upgradeable(poolToken).safeTransferFrom(msg.sender, address(this), _amount); - - uint256 redeemAmount = _swap.redeemSingle(_amount, _i, _minRedeemAmount); - - if (_i == wETHIndex) { - wETH.withdraw(redeemAmount); - (bool success,) = msg.sender.call{ value: redeemAmount }(""); - if (!success) { - revert FailedEtherTransfer(); - } - } else { - IERC20Upgradeable(tokens[_i]).safeTransfer(msg.sender, redeemAmount); - } - } - - /** - * @dev Get amount of swap across pool. - * @param _sourceSwap pool of the source token. - * @param _destToken pool of the dest token. - * @param _sourceToken source token. - * @param _destToken dest token. - * @param _amount Amount of source token to swap. - * @return The Amount of dest token to get. - * @return The amount of fee to charge. - */ - function getSwapAmountCrossPool( - StableAsset _sourceSwap, - StableAsset _destSwap, - address _sourceToken, - address _destToken, - uint256 _amount - ) - public - view - returns (uint256, uint256) - { - address[] memory sourceTokens = _sourceSwap.getTokens(); - address[] memory destTokens = _destSwap.getTokens(); - if (!allowedPoolAddress[address(_sourceSwap)]) { - revert NotAllowedPool(address(_sourceSwap)); - } - if (!allowedPoolAddress[address(_destSwap)]) { - revert NotAllowedPool(address(_destSwap)); - } - uint256 sourceIndex = findTokenIndex(sourceTokens, _sourceToken); - uint256 destIndex = findTokenIndex(destTokens, _destToken); - uint256[] memory _mintAmounts = new uint256[](sourceTokens.length); - _mintAmounts[sourceIndex] = _amount; - (uint256 mintAmount, uint256 mintFee) = _sourceSwap.getMintAmount(_mintAmounts); - (uint256 redeemAmount, uint256 redeemFee) = _destSwap.getRedeemSingleAmount(mintAmount, destIndex); - return (redeemAmount, mintFee + redeemFee); - } - - /** - * @dev Swap tokens across pool. - * @param _sourceSwap pool of the source token. - * @param _destToken pool of the dest token. - * @param _sourceToken source token. - * @param _destToken dest token. - * @param _amount Amount of source token to swap. - * @param _minSwapAmount Minimum amount of the dest token to receive. - */ - function swapCrossPool( - StableAsset _sourceSwap, - StableAsset _destSwap, - address _sourceToken, - address _destToken, - uint256 _amount, - uint256 _minSwapAmount - ) - external - nonReentrant - { - address[] memory sourceTokens = _sourceSwap.getTokens(); - address[] memory destTokens = _destSwap.getTokens(); - if (!allowedPoolAddress[address(_sourceSwap)]) { - revert NotAllowedPool(address(_sourceSwap)); - } - - if (!allowedPoolAddress[address(_destSwap)]) { - revert NotAllowedPool(address(_destSwap)); - } - - uint256 sourceIndex = findTokenIndex(sourceTokens, _sourceToken); - uint256 destIndex = findTokenIndex(destTokens, _destToken); - - IERC20Upgradeable(_sourceToken).safeTransferFrom(msg.sender, address(this), _amount); - IERC20Upgradeable(_sourceToken).safeApprove(address(_sourceSwap), _amount); - - uint256[] memory _mintAmounts = new uint256[](sourceTokens.length); - _mintAmounts[sourceIndex] = _amount; - uint256 mintAmount = _sourceSwap.mint(_mintAmounts, 0); - IERC20Upgradeable(address(_destSwap.poolToken())).safeApprove(address(_destSwap), mintAmount); - uint256 redeemAmount = _destSwap.redeemSingle(mintAmount, destIndex, _minSwapAmount); - - IERC20Upgradeable(_destToken).safeTransfer(msg.sender, redeemAmount); - } - - /** - * @dev Find token index in the array. - * @param tokens Array of tokens. - * @param token Token to find. - * @return Index of the token. - */ - function findTokenIndex(address[] memory tokens, address token) internal pure returns (uint256) { - for (uint256 i = 0; i < tokens.length; i++) { - if (tokens[i] == token) { - return i; - } - } - revert("token not found"); - } - - /** - * @dev Propose the govenance address. - * @param _governance Address of the new governance. - */ - function proposeGovernance(address _governance) public { - require(msg.sender == governance, "not governance"); - pendingGovernance = _governance; - emit GovernanceProposed(_governance); - } - - /** - * @dev Accept the govenance address. - */ - function acceptGovernance() public { - require(msg.sender == pendingGovernance, "not pending governance"); - governance = pendingGovernance; - pendingGovernance = address(0); - emit GovernanceModified(governance); - } - - /** - * @dev Enable/Disable the pool address. - * @param _swap The swap address. - * @param _enabled Enable or disable swap. - */ - function updatePool(address _swap, bool _enabled) external { - require(msg.sender == governance, "not governance"); - if (_enabled && !allowedPoolAddress[_swap]) { - pools.push(_swap); - } else { - address[] memory updatedPools; - uint256 index = 0; - for (uint256 i = 0; i < pools.length; i++) { - if (pools[i] != _swap) { - updatedPools[index] = pools[i]; - index++; - } - } - pools = updatedPools; - } - allowedPoolAddress[_swap] = _enabled; - - emit PoolModified(_swap, _enabled); - } - - /** - * @notice This function allows to rebase TapETH by increasing his total supply - * from all stableSwap pools by the staking rewards and the swap fee. - */ - function rebase() external returns (uint256 _amount) { - for (uint256 i = 0; i < pools.length; i++) { - address _pool = pools[i]; - if (allowedPoolAddress[_pool]) { - _amount += Ipool(_pool).rebase(); - } - } - } -} diff --git a/src/StableAssetFactory.sol b/src/StableAssetFactory.sol deleted file mode 100644 index ff6ac89..0000000 --- a/src/StableAssetFactory.sol +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/interfaces/IERC4626.sol"; - -import "./StableAsset.sol"; -import "./TapETH.sol"; -import "./misc/ConstantExchangeRateProvider.sol"; -import "./misc/ERC4626ExchangeRate.sol"; -import "./interfaces/IExchangeRateProvider.sol"; - -/** - * @title StableAsset Application - * @author Nuts Finance Developer - * @notice The StableSwap Application provides an interface for users to interact with StableSwap pool contracts - * @dev The StableSwap Application contract allows users to mint pool tokens, swap between different tokens, and redeem - * pool tokens to underlying tokens. - * This contract should never store assets. - */ -contract StableAssetFactory is Initializable, ReentrancyGuardUpgradeable { - using SafeMathUpgradeable for uint256; - using SafeERC20Upgradeable for IERC20Upgradeable; - - struct CreatePoolArgument { - address tokenA; - address tokenB; - uint256 precisionA; - uint256 precisionB; - uint256 mintFee; - uint256 swapFee; - uint256 redeemFee; - uint256 A; - } - - /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. - */ - event GovernanceModified(address governance); - - /** - * @dev This event is emitted when the governance is modified. - * @param governance is the new value of the governance. - */ - event GovernanceProposed(address governance); - - /** - * @dev This event is emitted when a new pool is created. - * @param poolToken is the pool token created. - */ - event PoolCreated(address proxyAdmin, address poolToken, address stableAsset); - - /** - * @dev This is the account that has governance control over the StableAssetApplication contract. - */ - address public governance; - - /** - * @dev Pending governance address, - */ - address public pendingGovernance; - - address public stableAssetImplentation; - address public tapETHImplentation; - ConstantExchangeRateProvider public constantExchangeRateProvider; - - /** - * @dev Initializes the StableSwap Application contract. - */ - function initialize(address _stableAssetImplentation, address _tapETHImplentation) public initializer { - __ReentrancyGuard_init(); - governance = msg.sender; - stableAssetImplentation = _stableAssetImplentation; - tapETHImplentation = _tapETHImplentation; - constantExchangeRateProvider = new ConstantExchangeRateProvider(); - } - - /** - * @dev Propose the govenance address. - * @param _governance Address of the new governance. - */ - function proposeGovernance(address _governance) public { - require(msg.sender == governance, "not governance"); - pendingGovernance = _governance; - emit GovernanceProposed(_governance); - } - - /** - * @dev Accept the govenance address. - */ - function acceptGovernance() public { - require(msg.sender == pendingGovernance, "not pending governance"); - governance = pendingGovernance; - pendingGovernance = address(0); - emit GovernanceModified(governance); - } - - function createPool(CreatePoolArgument memory argument, IExchangeRateProvider exchangeRateProvider) internal { - ProxyAdmin proxyAdmin = new ProxyAdmin(); - proxyAdmin.transferOwnership(msg.sender); - - string memory symbolA = ERC20Upgradeable(argument.tokenA).symbol(); - string memory symbolB = ERC20Upgradeable(argument.tokenB).symbol(); - string memory symbol = string.concat(string.concat(string.concat("SA-", symbolA), "-"), symbolB); - string memory name = string.concat(string.concat(string.concat("Stable Asset ", symbolA), " "), symbolB); - bytes memory tapETHInit = abi.encodeCall(TapETH.initialize, (address(this), name, symbol)); - TransparentUpgradeableProxy tapETHProxy = - new TransparentUpgradeableProxy(address(tapETHImplentation), address(proxyAdmin), tapETHInit); - - address[] memory tokens = new address[](2); - uint256[] memory precisions = new uint256[](2); - uint256[] memory fees = new uint256[](3); - tokens[0] = argument.tokenA; - tokens[1] = argument.tokenB; - precisions[0] = argument.precisionA; - precisions[1] = argument.precisionB; - fees[0] = argument.mintFee; - fees[1] = argument.swapFee; - fees[2] = argument.redeemFee; - uint256 A = argument.A; - uint256 exchangeRateTokenIndex = 1; - - bytes memory stableAssetInit = abi.encodeCall( - StableAsset.initialize, - (tokens, precisions, fees, TapETH(address(tapETHProxy)), A, exchangeRateProvider, exchangeRateTokenIndex) - ); - TransparentUpgradeableProxy stableAssetProxy = - new TransparentUpgradeableProxy(address(stableAssetImplentation), address(proxyAdmin), stableAssetInit); - StableAsset stableAsset = StableAsset(address(stableAssetProxy)); - TapETH tapETH = TapETH(address(tapETHProxy)); - - stableAsset.proposeGovernance(msg.sender); - tapETH.addPool(address(stableAsset)); - tapETH.proposeGovernance(msg.sender); - emit PoolCreated(address(proxyAdmin), address(tapETHProxy), address(stableAssetProxy)); - } - - function createPoolConstantExchangeRate(CreatePoolArgument calldata argument) public { - createPool(argument, constantExchangeRateProvider); - } - - function createPoolERC4626(CreatePoolArgument calldata argument) public { - ERC4626ExchangeRate exchangeRate = new ERC4626ExchangeRate(IERC4626(argument.tokenB)); - createPool(argument, exchangeRate); - } -} diff --git a/src/WLPToken.sol b/src/WLPToken.sol new file mode 100644 index 0000000..de380e6 --- /dev/null +++ b/src/WLPToken.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; +import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "./interfaces/ILPToken.sol"; + +/** + * @title LPToken token wrapper with static balances. + * @dev It's an ERC20 token that represents the account's share of the total + * supply of lpToken tokens. WLPToken token's balance only changes on transfers, + * unlike lpToken that is also changed when staking rewards and swap fee are generated. + * It's a "power user" token for DeFi protocols which don't + * support rebasable tokens. + * The contract is also a trustless wrapper that accepts lpToken tokens and mints + * wlpToken in return. Then the user unwraps, the contract burns user's wlpToken + * and sends user locked lpToken in return. + * The contract provides the staking shortcut: user can send ETH with regular + * transfer and get wlpToken in return. The contract will send ETH to Tapio + * staking it and wrapping the received lpToken. + * + */ +contract WLPToken is ERC4626Upgradeable { + ILPToken public lpToken; + + error ZeroAmount(); + error InsufficientAllowance(); + + function initialize(ILPToken _lpToken) public initializer { + __ERC20_init("Wrapped LP Token", "wlpToken"); + __ERC4626_init(IERC20(address(_lpToken))); + lpToken = _lpToken; + } + + /** + * @dev Converts an amount of lpToken to the equivalent amount of shares. + * @param assets Amount of lpToken. + * @return The equivalent shares. + */ + function convertToShares(uint256 assets) public view override returns (uint256) { + return lpToken.getSharesByPeggedToken(assets); + } + + /** + * @dev Converts an amount of shares to the equivalent amount of lpToken. + * @param shares Amount of shares. + * @return The equivalent lpToken. + */ + function convertToAssets(uint256 shares) public view override returns (uint256) { + return lpToken.getPeggedTokenByShares(shares); + } + + /** + * @dev Deposits lpToken into the vault in exchange for shares. + * @param assets Amount of lpToken to deposit. + * @param receiver Address to receive the minted shares. + * @return shares Amount of shares minted. + */ + function deposit(uint256 assets, address receiver) public override returns (uint256 shares) { + require(assets > 0, ZeroAmount()); + shares = convertToShares(assets); + lpToken.transferFrom(msg.sender, address(this), assets); + _mint(receiver, shares); + } + + /** + * @dev Mints shares for a given amount of assets deposited. + * @param shares Amount of shares to mint. + * @param receiver Address to receive the minted shares. + * @return assets The amount of lpToken deposited. + */ + function mint(uint256 shares, address receiver) public override returns (uint256 assets) { + require(shares > 0, ZeroAmount()); + + // Calculate the amount of assets required to mint the given shares + assets = convertToAssets(shares); + + // Transfer the required assets from the user to the vault + lpToken.transferFrom(msg.sender, address(this), assets); + + // Mint the shares to the receiver + _mint(receiver, shares); + } + + /** + * @dev Withdraws lpToken from the vault in exchange for burning shares. + * @param assets Amount of lpToken to withdraw. + * @param receiver Address to receive the lpToken. + * @param owner Address whose shares will be burned. + * @return shares Burned shares corresponding to the assets withdrawn. + */ + function withdraw(uint256 assets, address receiver, address owner) public override returns (uint256 shares) { + require(assets > 0, ZeroAmount()); + shares = convertToShares(assets); + if (msg.sender != owner) { + uint256 allowed = allowance(owner, msg.sender); + require(allowed >= shares, "ERC4626: insufficient allowance"); + _approve(owner, msg.sender, allowed - shares); + } + _burn(owner, shares); + lpToken.transfer(receiver, assets); + } + + /** + * @dev Redeems shares for lpToken. + * @param shares Amount of shares to redeem. + * @param receiver Address to receive the lpToken. + * @param owner Address whose shares will be burned. + * @return assets Amount of lpToken withdrawn. + */ + function redeem(uint256 shares, address receiver, address owner) public override returns (uint256 assets) { + require(shares > 0, ZeroAmount()); + assets = convertToAssets(shares); + if (msg.sender != owner) { + uint256 allowed = allowance(owner, msg.sender); + require(allowed >= shares, InsufficientAllowance()); + _approve(owner, msg.sender, allowed - shares); + } + _burn(owner, shares); + lpToken.transfer(receiver, assets); + } + + /** + * @dev Returns the maximum amount of assets that can be withdrawn by `owner`. + * @param owner Address of the account. + * @return The maximum amount of lpToken that can be withdrawn. + */ + function maxWithdraw(address owner) public view override returns (uint256) { + // Convert the owner's balance of shares to assets + return convertToAssets(balanceOf(owner)); + } + + /** + * @dev Simulates the amount of shares that would be minted for a given amount of assets. + * @param assets Amount of lpToken to deposit. + * @return The number of shares that would be minted. + */ + function previewDeposit(uint256 assets) public view override returns (uint256) { + // Convert assets to shares + return convertToShares(assets); + } + + /** + * @dev Simulates the amount of assets that would be needed to mint a given amount of shares. + * @param shares Amount of shares to mint. + * @return The number of assets required. + */ + function previewMint(uint256 shares) public view override returns (uint256) { + // Convert shares to assets + return convertToAssets(shares); + } + + /** + * @dev Simulates the amount of assets that would be withdrawn for a given amount of shares. + * @param shares Amount of shares to redeem. + * @return The number of assets that would be withdrawn. + */ + function previewRedeem(uint256 shares) public view override returns (uint256) { + // Convert shares to assets + return convertToAssets(shares); + } +} diff --git a/src/WTapETH.sol b/src/WTapETH.sol deleted file mode 100644 index 3c90397..0000000 --- a/src/WTapETH.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; -import "./interfaces/ITapETH.sol"; - -/** - * @title TapETH token wrapper with static balances. - * @dev It's an ERC20 token that represents the account's share of the total - * supply of tapETH tokens. WtapETH token's balance only changes on transfers, - * unlike tapETH that is also changed when staking rewards and swap fee are generated. - * It's a "power user" token for DeFi protocols which don't - * support rebasable tokens. - * The contract is also a trustless wrapper that accepts tapETH tokens and mints - * wtapETH in return. Then the user unwraps, the contract burns user's wtapETH - * and sends user locked tapETH in return. - * The contract provides the staking shortcut: user can send ETH with regular - * transfer and get wtapETH in return. The contract will send ETH to Tapio - * staking it and wrapping the received tapETH. - * - */ -contract WtapETH is ERC20PermitUpgradeable { - ITapETH public tapETH; - - function initialize(ITapETH _tapETH) public initializer { - __ERC20Permit_init("Wrapped tapETH"); - __ERC20_init("Wrapped tapETH", "wtapETH"); - tapETH = _tapETH; - } - - /** - * @notice Exchanges tapETH to wtapETH - * @param _tapETHAmount amount of tapETH to wrap in exchange for wtapETH - * @dev Requirements: - * - msg.sender must approve at least `_tapETHAmount` tapETH to this - * contract. - * @return Amount of wtapETH user receives after wrap - */ - function wrap(uint256 _tapETHAmount) external returns (uint256) { - require(_tapETHAmount > 0, "wtapETH: can't wrap zero tapETH"); - uint256 _wtapETHAmount = tapETH.getSharesByPooledEth(_tapETHAmount); - _mint(msg.sender, _wtapETHAmount); - tapETH.transferFrom(msg.sender, address(this), _tapETHAmount); - return _wtapETHAmount; - } - - /** - * @notice Exchanges wtapETH to tapETH - * @param _wtapETHAmount amount of wtapETH to uwrap in exchange for tapETH - * @return Amount of tapETH user receives after unwrap - */ - function unwrap(uint256 _wtapETHAmount) external returns (uint256) { - require(_wtapETHAmount > 0, "wtapETH: zero amount unwrap not allowed"); - uint256 _tapETHAmount = tapETH.getPooledEthByShares(_wtapETHAmount); - _burn(msg.sender, _wtapETHAmount); - tapETH.transfer(msg.sender, _tapETHAmount); - return _tapETHAmount; - } - - /** - * @notice Get amount of wtapETH for a given amount of tapETH - * @param _tapETHAmount amount of tapETH - * @return Amount of wtapETH for a given tapETH amount - */ - function getWtapETHByTapETH(uint256 _tapETHAmount) external view returns (uint256) { - return tapETH.getSharesByPooledEth(_tapETHAmount); - } - - /** - * @notice Get amount of tapETH for a given amount of wtapETH - * @param _wtapETHAmount amount of wtapETH - * @return Amount of tapETH for a given wtapETH amount - */ - function getTapETHByWtapETH(uint256 _wtapETHAmount) external view returns (uint256) { - return tapETH.getPooledEthByShares(_wtapETHAmount); - } - - /** - * @notice Get amount of tapETH for a one wtapETH - * @return Amount of tapETH for 1 wstETH - */ - function tapETHPerToken() external view returns (uint256) { - return tapETH.getPooledEthByShares(1 ether); - } - - /** - * @notice Get amount of wtapETH for a one tapETH - * @return Amount of wtapETH for a 1 tapETH - */ - function tokensPerTapETH() external view returns (uint256) { - return tapETH.getSharesByPooledEth(1 ether); - } -} diff --git a/src/interfaces/ITapETH.sol b/src/interfaces/ILPToken.sol similarity index 51% rename from src/interfaces/ITapETH.sol rename to src/interfaces/ILPToken.sol index 78cd2a4..021e259 100644 --- a/src/interfaces/ITapETH.sol +++ b/src/interfaces/ILPToken.sol @@ -3,34 +3,49 @@ pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -interface ITapETH is IERC20 { - function proposeGovernance(address _governance) external; - - function acceptGovernance() external; - +/** + * @title ILPToken interface + * @author Nuts Finance Developer + * @notice Interface for LP Token + */ +interface ILPToken is IERC20 { + /// @dev Add a pool to the list of pools function addPool(address _pool) external; + /// @dev Remove a pool from the list of pools function removePool(address _pool) external; + /// @dev Increase the allowance of the spender function increaseAllowance(address _spender, uint256 _addedValue) external returns (bool); + /// @dev Decrease the allowance of the spender function decreaseAllowance(address _spender, uint256 _subtractedValue) external returns (bool); + /// @dev Get the total amount of shares function totalShares() external view returns (uint256); + /// @dev Get the total amount of rewards function totalRewards() external view returns (uint256); + /// @dev Get the total shares of the account function sharesOf(address _account) external view returns (uint256); - function getSharesByPooledEth(uint256 _ethAmount) external view returns (uint256); + /// @dev Get the shares corresponding to the amount of pooled eth + function getSharesByPeggedToken(uint256 _ethAmount) external view returns (uint256); + /// @dev Add the amount to the total supply function addTotalSupply(uint256 _amount) external; + + /// @dev Remove the amount from the total supply function removeTotalSupply(uint256 _amount) external; - function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256); + /// @dev Add the amount of Eth corresponding to the shares + function getPeggedTokenByShares(uint256 _sharesAmount) external view returns (uint256); + /// @dev Transfer the shares to the recipient function transferShares(address _recipient, uint256 _sharesAmount) external returns (uint256); + /// @dev Transfer the shares from the sender to the recipient function transferSharesFrom( address _sender, address _recipient, @@ -39,9 +54,12 @@ interface ITapETH is IERC20 { external returns (uint256); + /// @dev Mint the shares to the account function mintShares(address _account, uint256 _sharesAmount) external; + /// @dev Burn the shares from the account function burnShares(uint256 _sharesAmount) external; + /// @dev Burn the shares from the account function burnSharesFrom(address _account, uint256 _sharesAmount) external; } diff --git a/src/interfaces/ISmartWalletChecker.sol b/src/interfaces/ISmartWalletChecker.sol deleted file mode 100644 index 96be3c7..0000000 --- a/src/interfaces/ISmartWalletChecker.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -interface ISmartWalletChecker { - function check(address addr) external view returns (bool); -} diff --git a/src/interfaces/IWETH.sol b/src/interfaces/IWETH.sol deleted file mode 100644 index a7f52c2..0000000 --- a/src/interfaces/IWETH.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -/** - * @title IWETH interface - * @author Nuts Finance Developer - * @notice Interface for WETH - */ -interface IWETH { - /** - * @dev Deposit ether to get wrapped ether. - */ - function deposit() external payable; - - /** - * @dev Transfer wrapped ether to get ether. - * @param to The address of the receiver. - * @param value The amount of wrapped ether to transfer. - * @return Whether the transfer succeeds. - */ - function transfer(address to, uint256 value) external returns (bool); - - /** - * @dev Withdraw wrapped ether to get ether. - * @param value The amount of wrapped ether to withdraw. - */ - function withdraw(uint256 value) external; -} diff --git a/src/interfaces/IWTaptETH.sol b/src/interfaces/IWTaptETH.sol deleted file mode 100644 index 7b80b56..0000000 --- a/src/interfaces/IWTaptETH.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -interface IWTaptETH { - function wrap(uint256 _tapETHAmount) external returns (uint256); - - function unwrap(uint256 _wtapETHAmount) external returns (uint256); - - receive() external payable; - - function getWtapETHByTapETH(uint256 _tapETHAmount) external view returns (uint256); - - function getTapETHByWtapETH(uint256 _wtapETHAmount) external view returns (uint256); - - function tapETHPerToken() external view returns (uint256); - - function tokensPerTapETH() external view returns (uint256); -} diff --git a/src/interfaces/Ipool.sol b/src/interfaces/Ipool.sol deleted file mode 100644 index 8b75930..0000000 --- a/src/interfaces/Ipool.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -interface Ipool { - function rebase() external returns (uint256); -} diff --git a/src/misc/ConstantExchangeRateProvider.sol b/src/misc/ConstantExchangeRateProvider.sol index d4a50ab..53aa267 100644 --- a/src/misc/ConstantExchangeRateProvider.sol +++ b/src/misc/ConstantExchangeRateProvider.sol @@ -4,13 +4,15 @@ pragma solidity ^0.8.28; import "../interfaces/IExchangeRateProvider.sol"; /** - * @notice Mock exchange rate. + * @notice Constant exchange rate provider. */ contract ConstantExchangeRateProvider is IExchangeRateProvider { + /// @dev Get the exchange rate function exchangeRate() external pure returns (uint256) { return 10 ** 18; } + /// @dev Get the exchange rate decimals function exchangeRateDecimals() external pure returns (uint256) { return 18; } diff --git a/src/misc/ERC4626ExchangeRate.sol b/src/misc/ERC4626ExchangeRate.sol index 988e69c..9278164 100644 --- a/src/misc/ERC4626ExchangeRate.sol +++ b/src/misc/ERC4626ExchangeRate.sol @@ -5,21 +5,23 @@ import "@openzeppelin/contracts/interfaces/IERC4626.sol"; import "../interfaces/IExchangeRateProvider.sol"; /** - * @notice Mock exchange rate. + * @notice ERC4626 exchange rate. */ contract ERC4626ExchangeRate is IExchangeRateProvider { + /// @dev ERC4626 token IERC4626 token; + /// @dev Initialize the contract constructor(IERC4626 _token) { token = _token; } + /// @dev Get the exchange rate function exchangeRate() external view returns (uint256) { - uint256 totalAsset = token.totalAssets(); - uint256 totalSupply = token.totalSupply(); - return (totalAsset * (10 ** 18)) / totalSupply; + return token.convertToAssets(1e18); } + /// @dev Get the exchange rate decimals function exchangeRateDecimals() external pure returns (uint256) { return 18; } diff --git a/src/misc/IERC20MintableBurnable.sol b/src/misc/IERC20MintableBurnable.sol deleted file mode 100644 index db4baaa..0000000 --- a/src/misc/IERC20MintableBurnable.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -/** - * @notice Interface for ERC20 token which supports mint and burn. - */ -interface IERC20MintableBurnable { - function mint(address _user, uint256 _amount) external; - - function burn(uint256 _amount) external; - - function burnFrom(address _user, uint256 _amount) external; -} diff --git a/src/misc/OracleExchangeRate.sol b/src/misc/OracleExchangeRate.sol new file mode 100644 index 0000000..9e43fa3 --- /dev/null +++ b/src/misc/OracleExchangeRate.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "../interfaces/IExchangeRateProvider.sol"; + +/** + * @notice Oracle exchange rate. + */ +contract OracleExchangeRate is IExchangeRateProvider { + /// @dev Oracle address + address public oracle; + + /// @dev Function signature + string public func; + + /// @dev Error thrown when the internal call failed + error InternalCallFailed(); + + /// @dev Initialize the contract + constructor(address _oracle, string memory _func) { + oracle = _oracle; + func = _func; + } + + /// @dev Get the exchange rate + function exchangeRate() external view returns (uint256) { + bytes memory data = abi.encodeWithSignature(string(abi.encodePacked(func, "()"))); + + (bool success, bytes memory result) = oracle.staticcall(data); + require(success, InternalCallFailed()); + + uint256 decodedResult = abi.decode(result, (uint256)); + + return decodedResult; + } + + /// @dev Get the exchange rate decimals + function exchangeRateDecimals() external pure returns (uint256) { + return 18; + } +} diff --git a/src/reth/RocketTokenExchangeRateProvider.sol b/src/misc/reth/RocketTokenExchangeRateProvider.sol similarity index 58% rename from src/reth/RocketTokenExchangeRateProvider.sol rename to src/misc/reth/RocketTokenExchangeRateProvider.sol index f8602c5..c4057af 100644 --- a/src/reth/RocketTokenExchangeRateProvider.sol +++ b/src/misc/reth/RocketTokenExchangeRateProvider.sol @@ -1,25 +1,32 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -import "../interfaces/IExchangeRateProvider.sol"; +import "../../interfaces/IExchangeRateProvider.sol"; import "./RocketTokenRETHInterface.sol"; -import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; /** * @notice Rocket Token exchange rate. */ contract RocketTokenExchangeRateProvider is IExchangeRateProvider, Initializable, ReentrancyGuardUpgradeable { + /// @dev Rocket Token contract RocketTokenRETHInterface private rocketToken; + /// @dev Error thrown when the Rocket Token is not set + error RocketTokenNotSet(); + + /// @dev Initialize the contract function initialize(RocketTokenRETHInterface _rocketToken) public initializer { - require(address(_rocketToken) != address(0x0), "_rocketToken not set"); + require(address(_rocketToken) != address(0x0), RocketTokenNotSet()); rocketToken = _rocketToken; } + /// @dev Get the exchange rate function exchangeRate() external view returns (uint256) { return rocketToken.getExchangeRate(); } + /// @dev Get the exchange rate decimals function exchangeRateDecimals() external pure returns (uint256) { return 18; } diff --git a/src/misc/reth/RocketTokenRETHInterface.sol b/src/misc/reth/RocketTokenRETHInterface.sol new file mode 100644 index 0000000..cdcbfcc --- /dev/null +++ b/src/misc/reth/RocketTokenRETHInterface.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface RocketTokenRETHInterface is IERC20 { + /// @dev Get the exchange rate + function getExchangeRate() external view returns (uint256); +} diff --git a/src/mock/WETH.sol b/src/mock/WETH.sol index ca36dee..12a9ed3 100644 --- a/src/mock/WETH.sol +++ b/src/mock/WETH.sol @@ -14,6 +14,9 @@ contract WETH9 { mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; + error InsufficientBalance(); + error NoAllowance(); + function deposit() public payable { balanceOf[msg.sender] += msg.value; emit Deposit(msg.sender, msg.value); @@ -41,14 +44,14 @@ contract WETH9 { } function transferFrom(address src, address dst, uint256 wad) public returns (bool) { - require(balanceOf[src] >= wad, "insufficient balance"); + require(balanceOf[src] >= wad, InsufficientBalance()); // solhint-disable max-line-length if ( src != msg.sender && allowance[src][msg.sender] != uint256(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ) { - require(allowance[src][msg.sender] >= wad, "no allowance"); + require(allowance[src][msg.sender] >= wad, NoAllowance()); allowance[src][msg.sender] -= wad; } diff --git a/src/reth/RocketTokenRETHInterface.sol b/src/reth/RocketTokenRETHInterface.sol deleted file mode 100644 index d52efa9..0000000 --- a/src/reth/RocketTokenRETHInterface.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface RocketTokenRETHInterface is IERC20 { - function getEthValue(uint256 _rethAmount) external view returns (uint256); - - function getRethValue(uint256 _ethAmount) external view returns (uint256); - - function getExchangeRate() external view returns (uint256); - - function getTotalCollateral() external view returns (uint256); - - function getCollateralRate() external view returns (uint256); - - function depositExcess() external payable; - - function depositExcessCollateral() external; - - function mint(uint256 _ethAmount, address _to) external; - - function burn(uint256 _rethAmount) external; -} diff --git a/test/Factory.t.sol b/test/Factory.t.sol new file mode 100644 index 0000000..b6d5ad4 --- /dev/null +++ b/test/Factory.t.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { Test } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { console } from "forge-std/console.sol"; + +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; +import { MockToken } from "../src/mock/MockToken.sol"; +import { SelfPeggingAsset } from "../src/SelfPeggingAsset.sol"; +import { LPToken } from "../src/LPToken.sol"; +import { WLPToken } from "../src/WLPToken.sol"; +import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "../src/misc/ConstantExchangeRateProvider.sol"; + +contract FactoryTest is Test { + SelfPeggingAssetFactory internal factory; + address governor = address(0x01); + address initialMinter = address(0x02); + + function setUp() public virtual { + factory = new SelfPeggingAssetFactory(); + + address selfPeggingAssetImplentation = address(new SelfPeggingAsset()); + address lpTokenImplentation = address(new LPToken()); + address wlpTokenImplentation = address(new WLPToken()); + + UpgradeableBeacon beacon = new UpgradeableBeacon(selfPeggingAssetImplentation, governor); + address selfPeggingAssetBeacon = address(beacon); + + beacon = new UpgradeableBeacon(lpTokenImplentation, governor); + address lpTokenBeacon = address(beacon); + + beacon = new UpgradeableBeacon(wlpTokenImplentation, governor); + address wlpTokenBeacon = address(beacon); + + factory.initialize( + governor, + 0, + 0, + 0, + 100, + selfPeggingAssetBeacon, + lpTokenBeacon, + wlpTokenBeacon, + new ConstantExchangeRateProvider() + ); + } + + function test_CreatePoolConstantExchangeRate() external { + MockToken tokenA = new MockToken("test 1", "T1", 18); + MockToken tokenB = new MockToken("test 2", "T2", 18); + + SelfPeggingAssetFactory.CreatePoolArgument memory arg = SelfPeggingAssetFactory.CreatePoolArgument({ + tokenA: address(tokenA), + tokenB: address(tokenB), + tokenAType: SelfPeggingAssetFactory.TokenType.Standard, + tokenAOracle: address(0), + tokenAFunctionSig: "", + tokenBType: SelfPeggingAssetFactory.TokenType.Standard, + tokenBOracle: address(0), + tokenBFunctionSig: "" + }); + + vm.recordLogs(); + factory.createPool(arg); + Vm.Log[] memory entries = vm.getRecordedLogs(); + bytes32 eventSig = keccak256("PoolCreated(address,address,address)"); + + address decodedPoolToken; + address decodedSelfPeggingAsset; + address decodedWrappedPoolToken; + + for (uint256 i = 0; i < entries.length; i++) { + Vm.Log memory log = entries[i]; + + if (log.topics[0] == eventSig) { + (decodedPoolToken, decodedSelfPeggingAsset, decodedWrappedPoolToken) = + abi.decode(log.data, (address, address, address)); + } + } + + SelfPeggingAsset selfPeggingAsset = SelfPeggingAsset(decodedSelfPeggingAsset); + LPToken poolToken = LPToken(decodedPoolToken); + WLPToken wrappedPoolToken = WLPToken(decodedWrappedPoolToken); + + vm.startPrank(initialMinter); + tokenA.mint(initialMinter, 100e18); + tokenB.mint(initialMinter, 100e18); + + tokenA.approve(address(selfPeggingAsset), 100e18); + tokenB.approve(address(selfPeggingAsset), 100e18); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 100e18; + amounts[1] = 100e18; + + vm.warp(block.timestamp + 1000); + + selfPeggingAsset.mint(amounts, 0); + + assertEq(poolToken.balanceOf(initialMinter), 200e18); + assertNotEq(address(wrappedPoolToken), address(0)); + } +} diff --git a/test/Foo.t.sol b/test/Foo.t.sol deleted file mode 100644 index f20c0e1..0000000 --- a/test/Foo.t.sol +++ /dev/null @@ -1,59 +0,0 @@ -pragma solidity ^0.8.28; - -// // SPDX-License-Identifier: UNLICENSED -// pragma solidity >=0.8.25 <0.9.0; - -// import { Test } from "forge-std/src/Test.sol"; -// import { console2 } from "forge-std/src/console2.sol"; - -// import { Foo } from "../src/Foo.sol"; - -// interface IERC20 { -// function balanceOf(address account) external view returns (uint256); -// } - -// /// @dev If this is your first time with Forge, read this tutorial in the Foundry Book: -// /// https://book.getfoundry.sh/forge/writing-tests -// contract FooTest is Test { -// Foo internal foo; - -// /// @dev A function invoked before each test case is run. -// function setUp() public virtual { -// // Instantiate the contract-under-test. -// foo = new Foo(); -// } - -// /// @dev Basic test. Run it with `forge test -vvv` to see the console log. -// function test_Example() external view { -// console2.log("Hello World"); -// uint256 x = 42; -// assertEq(foo.id(x), x, "value mismatch"); -// } - -// /// @dev Fuzz test that provides random values for an unsigned integer, but which rejects zero as an input. -// /// If you need more sophisticated input validation, you should use the `bound` utility instead. -// /// See https://twitter.com/PaulRBerg/status/1622558791685242880 -// function testFuzz_Example(uint256 x) external view { -// vm.assume(x != 0); // or x = bound(x, 1, 100) -// assertEq(foo.id(x), x, "value mismatch"); -// } - -// /// @dev Fork test that runs against an Ethereum Mainnet fork. For this to work, you need to set -// `API_KEY_ALCHEMY` -// /// in your environment You can get an API key for free at https://alchemy.com. -// function testFork_Example() external { -// // Silently pass this test if there is no API key. -// string memory alchemyApiKey = vm.envOr("API_KEY_ALCHEMY", string("")); -// if (bytes(alchemyApiKey).length == 0) { -// return; -// } - -// // Otherwise, run the test against the mainnet fork. -// vm.createSelectFork({ urlOrAlias: "mainnet", blockNumber: 16_428_000 }); -// address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; -// address holder = 0x7713974908Be4BEd47172370115e8b1219F4A5f0; -// uint256 actualBalance = IERC20(usdc).balanceOf(holder); -// uint256 expectedBalance = 196_307_713.810457e6; -// assertEq(actualBalance, expectedBalance); -// } -// } diff --git a/test/LPToken.t.sol b/test/LPToken.t.sol new file mode 100644 index 0000000..d602e7a --- /dev/null +++ b/test/LPToken.t.sol @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "forge-std/Test.sol"; +import "../src/LPToken.sol"; + +contract LPTokenTest is Test { + LPToken public lpToken; + address public governance; + address public pool1; + address public pool2; + address public user1; + address public user2; + address public user3; + + function setUp() public { + governance = makeAddr("governance"); + pool1 = makeAddr("pool1"); + pool2 = makeAddr("pool2"); + user1 = makeAddr("user1"); + user2 = makeAddr("user2"); + user3 = makeAddr("user3"); + + lpToken = new LPToken(); + lpToken.initialize("Tapio ETH", "lpToken"); + lpToken.transferOwnership(governance); + } + + function test_AddPool() public { + vm.prank(governance); + lpToken.addPool(pool1); + + assertEq(lpToken.pools(pool1), true); + } + + function test_RemovePool() public { + vm.prank(governance); + lpToken.addPool(pool1); + + vm.prank(governance); + lpToken.removePool(pool1); + + assertEq(lpToken.pools(pool1), false); + } + + function test_MintSharesSingleUser() public { + vm.prank(governance); + lpToken.addPool(pool1); + + uint256 amount = 1_000_000_000_000_000_000_000; + vm.prank(pool1); + lpToken.mintShares(user1, amount); + + assertEq(lpToken.totalSupply(), amount); + assertEq(lpToken.totalShares(), amount); + assertEq(lpToken.sharesOf(user1), amount); + assertEq(lpToken.balanceOf(user1), amount); + } + + function test_MintSharesMultipleUsers() public { + vm.prank(governance); + lpToken.addPool(pool1); + + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 2_000_000_000_000_000_000_000; + uint256 amount3 = 3_000_000_000_000_000_000_000; + + vm.prank(pool1); + lpToken.mintShares(user1, amount1); + vm.prank(pool1); + lpToken.mintShares(user2, amount2); + vm.prank(pool1); + lpToken.mintShares(user3, amount3); + + uint256 totalAmount = amount1 + amount2 + amount3; + assertEq(lpToken.totalSupply(), totalAmount); + assertEq(lpToken.totalShares(), totalAmount); + assertEq(lpToken.sharesOf(user1), amount1); + assertEq(lpToken.balanceOf(user1), amount1); + assertEq(lpToken.sharesOf(user2), amount2); + assertEq(lpToken.balanceOf(user2), amount2); + assertEq(lpToken.sharesOf(user3), amount3); + assertEq(lpToken.balanceOf(user3), amount3); + } + + function test_BurnSharesSingleUser() public { + vm.prank(governance); + lpToken.addPool(pool1); + + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + + vm.prank(pool1); + lpToken.mintShares(user1, amount1); + + vm.prank(user1); + lpToken.burnShares(amount2); + + uint256 deltaAmount = amount1 - amount2; + assertEq(lpToken.totalSupply(), deltaAmount); + assertEq(lpToken.totalShares(), deltaAmount); + assertEq(lpToken.sharesOf(user1), deltaAmount); + assertEq(lpToken.balanceOf(user1), deltaAmount); + } + + function test_AddTotalSupply() public { + address user = vm.addr(0x5); + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 totalAmount = amount1 + amount2; + + vm.prank(governance); + lpToken.addPool(pool1); + + vm.prank(pool1); + lpToken.mintShares(user, amount1); + + vm.prank(pool1); + lpToken.addTotalSupply(amount2); + + assertEq(lpToken.totalSupply(), totalAmount); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.totalRewards(), amount2); + assertEq(lpToken.sharesOf(user), amount1); + assertEq(lpToken.balanceOf(user), totalAmount); + } + + function testApprove() public { + address user = vm.addr(0x5); + address spender = vm.addr(0x6); + uint256 amount = 1_000_000_000_000_000_000_000; + + // User approves spender + vm.prank(user); + lpToken.approve(spender, amount); + + // Check that the allowance is updated correctly + assertEq(lpToken.allowance(user, spender), amount); + } + + function test_IncreaseAllowance() public { + address user = vm.addr(0x5); + address spender = vm.addr(0x6); + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 2_000_000_000_000_000_000_000; + uint256 totalAmount = amount1 + amount2; + + // User approves spender with an initial amount + vm.prank(user); + lpToken.approve(spender, amount1); + + // User increases the allowance + vm.prank(user); + lpToken.increaseAllowance(spender, amount2); + + // Check that the total allowance is updated correctly + assertEq(lpToken.allowance(user, spender), totalAmount); + } + + function test_Approve() public { + address user = vm.addr(0x5); + address spender = vm.addr(0x6); + uint256 amount = 1_000_000_000_000_000_000_000; + + // User approves spender + vm.prank(user); + lpToken.approve(spender, amount); + + // Check that the allowance is updated correctly + assertEq(lpToken.allowance(user, spender), amount); + } + + function test_DecreaseAllowance() public { + address user = vm.addr(0x5); + address spender = vm.addr(0x6); + + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 totalAmount = amount1 - amount2; + + // User approves spender + vm.prank(user); + lpToken.approve(spender, amount1); + + // User decreases the allowance + vm.prank(user); + lpToken.decreaseAllowance(spender, amount2); + + // Assert the updated allowance + assertEq(lpToken.allowance(user, spender), totalAmount); + } + + function test_TransferShares() public { + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 deltaAmount = amount1 - amount2; + + // Governance adds pool + vm.prank(governance); + lpToken.addPool(pool1); + + // Pool mints shares to user1 + vm.prank(pool1); + lpToken.mintShares(user1, amount1); + + // User1 transfers shares to user2 + vm.prank(user1); + lpToken.transferShares(user2, amount2); + + // Assertions + assertEq(lpToken.totalSupply(), amount1); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.sharesOf(user1), deltaAmount); + assertEq(lpToken.sharesOf(user2), amount2); + assertEq(lpToken.balanceOf(user1), deltaAmount); + assertEq(lpToken.balanceOf(user2), amount2); + } + + function test_TransferSharesFrom() public { + address spender = vm.addr(0x7); + + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 deltaAmount = amount1 - amount2; + + // Governance adds pool + vm.prank(governance); + lpToken.addPool(pool1); + + // Pool mints shares to user1 + vm.prank(pool1); + lpToken.mintShares(user1, amount1); + + // User1 approves spender + vm.prank(user1); + lpToken.approve(spender, amount1); + + // Spender transfers shares from user1 to user2 + vm.prank(spender); + lpToken.transferSharesFrom(user1, user2, amount2); + + // Assertions + assertEq(lpToken.totalSupply(), amount1); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.sharesOf(user1), deltaAmount); + assertEq(lpToken.sharesOf(user2), amount2); + assertEq(lpToken.balanceOf(user1), deltaAmount); + assertEq(lpToken.balanceOf(user2), amount2); + assertEq(lpToken.allowance(user1, spender), deltaAmount); + } +} diff --git a/test/StableAsset.t.sol b/test/StableAsset.t.sol new file mode 100644 index 0000000..1e85328 --- /dev/null +++ b/test/StableAsset.t.sol @@ -0,0 +1,504 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { Test } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { console } from "forge-std/console.sol"; + +import { SelfPeggingAssetFactory } from "../src/SelfPeggingAssetFactory.sol"; +import { MockToken } from "../src/mock/MockToken.sol"; +import { SelfPeggingAsset } from "../src/SelfPeggingAsset.sol"; +import { LPToken } from "../src/LPToken.sol"; +import { WLPToken } from "../src/WLPToken.sol"; +import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "../src/misc/ConstantExchangeRateProvider.sol"; +import "../src/mock/MockExchangeRateProvider.sol"; + +contract SelfPeggingAssetTest is Test { + address owner = address(0x01); + address user = address(0x02); + address user2 = address(0x03); + uint256 A = 100; + LPToken lpToken; + SelfPeggingAsset pool; // WETH and frxETH Pool + uint256 feeDenominator = 10_000_000_000; + uint256 mintFee = 10_000_000; + uint256 swapFee = 20_000_000; + uint256 redeemFee = 50_000_000; + MockToken WETH; + MockToken frxETH; + uint256[] precisions; + + function setUp() public { + WETH = new MockToken("WETH", "WETH", 18); + frxETH = new MockToken("frxETH", "frxETH", 18); + + lpToken = new LPToken(); + lpToken.initialize("LP Token", "LPT"); + lpToken.transferOwnership(owner); + + ConstantExchangeRateProvider exchangeRateProvider = new ConstantExchangeRateProvider(); + + pool = new SelfPeggingAsset(); + + address[] memory tokens = new address[](2); + tokens[0] = address(WETH); + tokens[1] = address(frxETH); + + precisions = new uint256[](2); + precisions[0] = 1; + precisions[1] = 1; + + uint256[] memory fees = new uint256[](3); + fees[0] = mintFee; + fees[1] = swapFee; + fees[2] = redeemFee; + + IExchangeRateProvider[] memory exchangeRateProviders = new IExchangeRateProvider[](2); + exchangeRateProviders[0] = exchangeRateProvider; + exchangeRateProviders[1] = exchangeRateProvider; + + pool.initialize(tokens, precisions, fees, lpToken, A, exchangeRateProviders); + pool.transferOwnership(owner); + + vm.prank(owner); + lpToken.addPool(address(pool)); + } + + function test_CorrectMintAmount_EqualTokenAmounts() external { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 100e18; + amounts[1] = 100e18; + + WETH.mint(user, 100e18); + frxETH.mint(user, 100e18); + + vm.startPrank(user); + WETH.approve(address(pool), 100e18); + frxETH.approve(address(pool), 100e18); + vm.stopPrank(); + + (uint256 lpTokensMinted, uint256 feesCharged) = pool.getMintAmount(amounts); + + uint256 totalAmount = lpTokensMinted + feesCharged; + assertEq(totalAmount, 200e18); + + assertFee(totalAmount, feesCharged, mintFee); + + assertEq(100e18, WETH.balanceOf(user)); + assertEq(100e18, frxETH.balanceOf(user)); + assertEq(0, lpToken.balanceOf(user)); + assertEq(0, pool.balances(0)); + assertEq(0, pool.balances(1)); + assertEq(0, pool.totalSupply()); + + vm.prank(user); + pool.mint(amounts, 0); + + assertEq(0, WETH.balanceOf(user)); + assertEq(0, frxETH.balanceOf(user)); + assertEq(totalAmount, lpToken.balanceOf(user)); + assertEq(lpTokensMinted, lpToken.sharesOf(user)); + assertEq(totalAmount, lpToken.totalSupply()); + } + + function test_CorrectMintAmount_UnequalTokenAmounts() external view { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 110e18; + amounts[1] = 90e18; + + (uint256 lpTokensMinted, uint256 feesCharged) = pool.getMintAmount(amounts); + + assertFee(lpTokensMinted + feesCharged, feesCharged, mintFee); + } + + function test_Pegging_UnderlyingToken() external { + MockExchangeRateProvider rETHExchangeRateProvider = new MockExchangeRateProvider(1.1e18, 18); + MockExchangeRateProvider wstETHExchangeRateProvider = new MockExchangeRateProvider(1.2e18, 18); + + MockToken rETH = new MockToken("rETH", "rETH", 18); + MockToken wstETH = new MockToken("wstETH", "wstETH", 18); + + address[] memory _tokens = new address[](2); + _tokens[0] = address(rETH); + _tokens[1] = address(wstETH); + + IExchangeRateProvider[] memory exchangeRateProviders = new IExchangeRateProvider[](2); + exchangeRateProviders[0] = IExchangeRateProvider(rETHExchangeRateProvider); + exchangeRateProviders[1] = IExchangeRateProvider(wstETHExchangeRateProvider); + + SelfPeggingAsset _pool = new SelfPeggingAsset(); + + LPToken _lpToken = new LPToken(); + _lpToken.initialize("LP Token", "LPT"); + _lpToken.transferOwnership(owner); + + uint256[] memory _fees = new uint256[](3); + _fees[0] = 0; + _fees[1] = 0; + _fees[2] = 0; + + uint256[] memory _precisions = new uint256[](2); + _precisions[0] = 1; + _precisions[1] = 1; + + _pool.initialize(_tokens, _precisions, _fees, _lpToken, A, exchangeRateProviders); + + vm.prank(owner); + _lpToken.addPool(address(_pool)); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 110e18; + amounts[1] = 90e18; + + (uint256 lpTokensMinted,) = _pool.getMintAmount(amounts); + + assertIsCloseTo(lpTokensMinted, 229e18, 0.01e18); + } + + function test_exchangeCorrectAmount() external { + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 105e18; + amounts[1] = 85e18; + + pool.mint(amounts, 0); + vm.stopPrank(); + + frxETH.mint(user2, 8e18); + vm.startPrank(user2); + frxETH.approve(address(pool), 8e18); + vm.stopPrank(); + + (uint256 exchangeAmount,) = pool.getSwapAmount(1, 0, 8e18); + + assertEq(WETH.balanceOf(user2), 0); + assertEq(frxETH.balanceOf(user2), 8e18); + + assertEq(WETH.balanceOf(address(pool)), 105e18); + assertEq(frxETH.balanceOf(address(pool)), 85e18); + + assertEq(pool.balances(0), 105e18); + assertEq(pool.balances(1), 85e18); + + assertEq(pool.totalSupply(), 189.994704791049550806e18); + + assertEq(pool.totalSupply(), lpToken.totalSupply()); + + vm.prank(user2); + pool.swap(1, 0, 8e18, 0); + + assertEq(WETH.balanceOf(user2), exchangeAmount); + assertEq(frxETH.balanceOf(user2), 0); + + assertEq(WETH.balanceOf(address(pool)), 105e18 - exchangeAmount); + assertEq(frxETH.balanceOf(address(pool)), 85e18 + 8e18); + assertEq(pool.totalSupply(), lpToken.totalSupply()); + } + + function test_redeemCorrectAmountWithProportionalRedemption() external { + uint256[] memory mintAmounts = new uint256[](2); + mintAmounts[0] = 105e18; + mintAmounts[1] = 85e18; + + uint256 totalAmount = mintAmounts[0] + mintAmounts[1]; + + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + pool.mint(mintAmounts, 0); + vm.stopPrank(); + + (uint256[] memory tokenAmounts,) = pool.getRedeemProportionAmount(25e18); + uint256 token1Amount = tokenAmounts[0]; + uint256 token2Amount = tokenAmounts[1]; + + uint256 totalShares = lpToken.totalShares(); + uint256 totalBalance = lpToken.totalSupply(); + + vm.prank(user); + lpToken.transfer(user2, 25e18); + + uint256 shares2 = lpToken.sharesOf(user2); + uint256 balance2 = lpToken.balanceOf(user2); + + assertEq(WETH.balanceOf(user2), 0); + assertEq(frxETH.balanceOf(user2), 0); + + assertEq(WETH.balanceOf(address(pool)), 105e18); + assertEq(frxETH.balanceOf(address(pool)), 85e18); + + assertEq(pool.balances(0), 105e18); + assertEq(pool.balances(1), 85e18); + + assertEq(pool.totalSupply(), 189.994704791049550806e18); + assertEq(lpToken.totalSupply(), 189.994704791049550806e18); + + uint256 amountToRedeem = lpToken.balanceOf(user2); + vm.startPrank(user2); + lpToken.approve(address(pool), amountToRedeem); + uint256[] memory _minRedeemAmounts = new uint256[](2); + pool.redeemProportion(amountToRedeem, _minRedeemAmounts); + vm.stopPrank(); + + assertEq(WETH.balanceOf(user2), token1Amount); + assertEq(frxETH.balanceOf(user2), token2Amount); + + assertEq(lpToken.sharesOf(user2), 1); + assertEq(lpToken.balanceOf(user2), 1); + + assertEq(WETH.balanceOf(address(pool)), 105e18 - token1Amount); + assertEq(frxETH.balanceOf(address(pool)), 85e18 - token2Amount); + + assertIsCloseTo(pool.balances(0), 105e18 - token1Amount * precisions[0], 0); + assertIsCloseTo(pool.balances(1), 85e18 - token2Amount * precisions[1], 0); + + assertEq(pool.totalSupply(), lpToken.totalSupply()); + } + + function test_redeemCorrectAmountToSingleToken() external { + uint256[] memory mintAmounts = new uint256[](2); + mintAmounts[0] = 105e18; + mintAmounts[1] = 85e18; + + uint256 totalAmount = mintAmounts[0] + mintAmounts[1]; + + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + pool.mint(mintAmounts, 0); + vm.stopPrank(); + + (uint256 token1Amount, uint256 token2Amount) = pool.getRedeemSingleAmount(25e18, 0); + + vm.prank(user); + lpToken.transfer(user2, 25e18); + + assertEq(WETH.balanceOf(user2), 0); + assertEq(frxETH.balanceOf(user2), 0); + + assertEq(WETH.balanceOf(address(pool)), 105e18); + assertEq(frxETH.balanceOf(address(pool)), 85e18); + + assertEq(pool.balances(0), 105e18); + assertEq(pool.balances(1), 85e18); + + assertEq(pool.totalSupply(), lpToken.totalSupply()); + + uint256 redeemAmount = lpToken.balanceOf(user2); + vm.startPrank(user2); + lpToken.approve(address(pool), redeemAmount); + pool.redeemSingle(redeemAmount, 0, 0); + vm.stopPrank(); + + assertEq(WETH.balanceOf(user2), token1Amount); + assertEq(frxETH.balanceOf(user2), 0); + assertEq(lpToken.sharesOf(user2), 1); + + assertEq(WETH.balanceOf(address(pool)), 105e18 - token1Amount); + assertEq(frxETH.balanceOf(address(pool)), 85e18); + assertIsCloseTo(pool.balances(0), 105e18 - token1Amount * precisions[0], 0); + assertEq(pool.balances(1), 85e18); + assertEq(pool.totalSupply(), lpToken.totalSupply()); + } + + function test_redeemCorrectAmountToMultipleTokens() external { + uint256[] memory mintAmounts = new uint256[](2); + mintAmounts[0] = 105e18; + mintAmounts[1] = 85e18; + + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + pool.mint(mintAmounts, 0); + vm.stopPrank(); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 10e18; + amounts[1] = 5e18; + (uint256 redeemAmount,) = pool.getRedeemMultiAmount(amounts); + + vm.prank(user); + lpToken.transfer(user2, 25e18); + + uint256 balance = lpToken.balanceOf(user2); + + assertEq(WETH.balanceOf(user2), 0); + assertEq(frxETH.balanceOf(user2), 0); + assertEq(lpToken.balanceOf(user2), balance); + + assertEq(WETH.balanceOf(address(pool)), 105e18); + assertEq(frxETH.balanceOf(address(pool)), 85e18); + + assertEq(pool.balances(0), 105e18); + assertEq(pool.balances(1), 85e18); + + assertEq(pool.totalSupply(), lpToken.totalSupply()); + + vm.startPrank(user2); + lpToken.approve(address(pool), redeemAmount); + uint256[] memory redeemAmounts = new uint256[](2); + redeemAmounts[0] = 10e18; + redeemAmounts[1] = 5e18; + pool.redeemMulti(redeemAmounts, redeemAmount); + vm.stopPrank(); + + assertEq(WETH.balanceOf(user2), 10e18); + assertEq(frxETH.balanceOf(user2), 5e18); + + assertEq(WETH.balanceOf(address(pool)), 105e18 - 10e18); + assertEq(frxETH.balanceOf(address(pool)), 85e18 - 5e18); + + assertEq(pool.balances(0), 105e18 - 10e18); + assertEq(pool.balances(1), 85e18 - 5e18); + assertEq(pool.totalSupply(), lpToken.totalSupply()); + } + + function test_redeemCorrectAmountToSingleTokenRebasing() external { + uint256[] memory mintAmounts = new uint256[](2); + mintAmounts[0] = 105e18; + mintAmounts[1] = 85e18; + + uint256 totalAmount = mintAmounts[0] + mintAmounts[1]; + + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + pool.mint(mintAmounts, 0); + vm.stopPrank(); + + WETH.mint(address(pool), 10e18); + uint256 redeemAmount = 25e18; + (uint256 token1Amount, uint256 feeAmount) = pool.getRedeemSingleAmount(redeemAmount, 0); + + assertInvariant(105e18 - (token1Amount * precisions[0]), 85e18, 100, totalAmount - redeemAmount - feeAmount); + } + + function test_redeemCorrectAmountWithProportionalRedemptionRebasing() external { + uint256[] memory mintAmounts = new uint256[](2); + mintAmounts[0] = 105e18; + mintAmounts[1] = 85e18; + + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + pool.mint(mintAmounts, 0); + vm.stopPrank(); + + WETH.mint(address(pool), 10e18); + uint256 redeemAmount = 25e18; + (uint256[] memory tokenAmounts, uint256 feeAmount) = pool.getRedeemProportionAmount(redeemAmount); + + uint256 token1Amount = tokenAmounts[0]; + uint256 token2Amount = tokenAmounts[1]; + + assertEq(token1Amount, 14_303_943_881_560_144_839); + assertEq(token2Amount, 10_572_480_260_283_585_316); + assertEq(feeAmount, 125_000_000_000_000_000); + } + + function test_correctExchangeAmountRebasing() external { + WETH.mint(user, 105e18); + frxETH.mint(user, 85e18); + + vm.startPrank(user); + WETH.approve(address(pool), 105e18); + frxETH.approve(address(pool), 85e18); + + uint256[] memory amounts = new uint256[](2); + amounts[0] = 105e18; + amounts[1] = 85e18; + + pool.mint(amounts, 0); + vm.stopPrank(); + + WETH.mint(address(pool), 10e18); + frxETH.mint(user2, 8e18); + vm.startPrank(user2); + frxETH.approve(address(pool), 8e18); + vm.stopPrank(); + + (uint256 exchangeAmount, uint256 feeAmount) = pool.getSwapAmount(1, 0, 8e18); + + assertEq(exchangeAmount, 7.992985053666343961e18); + assertEq(feeAmount, 0.016018006119571831e18); + } + + function test_updateA() external { + assertEq(pool.initialA(), 100); + assertEq(pool.futureA(), 100); + + vm.prank(owner); + pool.updateA(1000, 20); + + assertEq(pool.initialA(), 100); + assertEq(pool.futureA(), 1000); + + vm.prank(owner); + pool.updateA(1000, 20); + } + + function assertFee(uint256 totalAmount, uint256 feeAmount, uint256 fee) internal view { + uint256 expectedFee = totalAmount * fee / feeDenominator; + assertEq(feeAmount, expectedFee); + } + + function assertAlmostTheSame(uint256 num1, uint256 num2) internal view { + // Calculate the absolute difference + uint256 diff = num1 > num2 ? num1 - num2 : num2 - num1; + + // Use the smaller number as the denominator + uint256 denominator = num1 < num2 ? num1 : num2; + require(denominator > 0, "Denominator must be greater than 0"); + + // Calculate the relative difference scaled by 10000 (0.01% precision) + uint256 scaledDiff = (diff * 10_000) / denominator; + + // Assert that the relative difference is smaller than 0.15% (scaled value <= 15) + require(scaledDiff <= 15, "Values are not almost the same"); + } + + function assertInvariant(uint256 balance0, uint256 balance1, uint256 A, uint256 D) internal { + // We only check n = 2 here + uint256 left = (A * 4) * (balance0 + balance1) + D; + uint256 denominator = balance0 * balance1 * 4; + require(denominator > 0, "Denominator must be greater than 0"); + uint256 right = (A * 4) * D + (D ** 3) / denominator; + + assertAlmostTheSame(left, right); + } + + function assertIsCloseTo(uint256 a, uint256 b, uint256 tolerance) public pure returns (bool) { + if (a > b) { + require(a - b <= tolerance == true, "Not close enough"); + } else { + require(b - a <= tolerance == true == true, "Not close enough"); + } + } +} diff --git a/test/WLPToken.t.sol b/test/WLPToken.t.sol new file mode 100644 index 0000000..6342ed7 --- /dev/null +++ b/test/WLPToken.t.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "forge-std/Test.sol"; +import "../src/LPToken.sol"; +import "../src/WLPToken.sol"; + +contract WLPTokenTest is Test { + LPToken public lpToken; + WLPToken public wlpToken; + + address public owner; + address public governance; + address public pool1; + address public pool2; + address public user; + + function setUp() public { + owner = vm.addr(1); + governance = vm.addr(2); + pool1 = vm.addr(3); + pool2 = vm.addr(4); + user = vm.addr(5); + + vm.startPrank(owner); + + lpToken = new LPToken(); + lpToken.initialize("Tapio ETH", "TapETH"); + lpToken.transferOwnership(governance); + + wlpToken = new WLPToken(); + wlpToken.initialize(lpToken); + + vm.stopPrank(); + } + + function test_Deposit() public { + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 amountToWrap = 300_000_000_000_000_000_000; + + uint256 targetTotalSupply = amount1 + amount2; + uint256 wlpTokenTargetAmount = (amountToWrap * amount1) / targetTotalSupply; + + // Add pool + vm.prank(governance); + lpToken.addPool(pool1); + + // Mint shares to user + vm.prank(pool1); + lpToken.mintShares(user, amount1); + + // Increase total supply + vm.prank(pool1); + lpToken.addTotalSupply(amount2); + + // Approve wlpToken contract + vm.prank(user); + lpToken.approve(address(wlpToken), amountToWrap); + + // Wrap tokens + vm.prank(user); + wlpToken.deposit(amountToWrap, user); + + // Assertions + assertEq(lpToken.totalSupply(), targetTotalSupply); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.sharesOf(user), amount1 - wlpTokenTargetAmount); + assertEq(lpToken.sharesOf(address(wlpToken)), wlpTokenTargetAmount); + assertEq(lpToken.balanceOf(address(wlpToken)), amountToWrap); + assertEq(wlpToken.balanceOf(user), wlpTokenTargetAmount); + } + + function test_Redeem() public { + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 amountToWrap = 300_000_000_000_000_000_000; + + uint256 targetTotalSupply = amount1 + amount2; + uint256 wlpTokenTargetAmount = (amountToWrap * amount1) / targetTotalSupply; + + // Add pool + vm.prank(governance); + lpToken.addPool(pool1); + + // Mint shares to user + vm.prank(pool1); + lpToken.mintShares(user, amount1); + + // Increase total supply + vm.prank(pool1); + lpToken.addTotalSupply(amount2); + + // Approve wlpToken contract + vm.prank(user); + lpToken.approve(address(wlpToken), amountToWrap); + + // Wrap tokens + vm.prank(user); + wlpToken.deposit(amountToWrap, user); + + // Unwrap tokens + vm.prank(user); + wlpToken.redeem(wlpTokenTargetAmount, user, user); + + // Assertions + assertEq(lpToken.totalSupply(), targetTotalSupply); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.sharesOf(user), amount1); + assertEq(lpToken.sharesOf(address(wlpToken)), 0); + assertEq(lpToken.balanceOf(address(wlpToken)), 0); + assertEq(wlpToken.balanceOf(user), 0); + assertEq(wlpToken.totalAssets(), 0); + } + + function test_Withdraw() public { + uint256 amount1 = 1_000_000_000_000_000_000_000; + uint256 amount2 = 500_000_000_000_000_000_000; + uint256 amountToWrap = 300_000_000_000_000_000_000; + + uint256 targetTotalSupply = amount1 + amount2; + uint256 wlpTokenTargetAmount = (amountToWrap * amount1) / targetTotalSupply; + + // Add pool + vm.prank(governance); + lpToken.addPool(pool1); + + // Mint shares to user + vm.prank(pool1); + lpToken.mintShares(user, amount1); + + // Increase total supply + vm.prank(pool1); + lpToken.addTotalSupply(amount2); + + // Approve wlpToken contract + vm.prank(user); + lpToken.approve(address(wlpToken), amountToWrap); + + // Wrap tokens + vm.prank(user); + wlpToken.deposit(amountToWrap, user); + + // Unwrap tokens + uint256 assets = wlpToken.convertToAssets(wlpTokenTargetAmount); + vm.prank(user); + wlpToken.withdraw(assets, user, user); + + // Assertions + assertEq(lpToken.totalSupply(), targetTotalSupply); + assertEq(lpToken.totalShares(), amount1); + assertEq(lpToken.sharesOf(user), amount1); + assertEq(lpToken.sharesOf(address(wlpToken)), 0); + assertEq(lpToken.balanceOf(address(wlpToken)), 0); + assertEq(wlpToken.balanceOf(user), 0); + assertEq(wlpToken.totalAssets(), 0); + } +} diff --git a/yarn.lock b/yarn.lock index 40659a5..f3be936 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,15 +16,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@openzeppelin/contracts-upgradeable@^4.8.3": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" - integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== - -"@openzeppelin/contracts@^4.8.3": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" - integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== +"@openzeppelin/contracts-upgradeable@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.1.0.tgz#4d37648b7402929c53e2ff6e45749ecff91eb2b6" + integrity sha512-AIElwP5Ck+cslNE+Hkemf5SxjJoF4wBvvjxc27Rp+9jaPs/CLIaUBMYe1FNzhdiN0cYuwGRmYaRHmmntuiju4Q== + +"@openzeppelin/contracts@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.1.0.tgz#4e61162f2a2bf414c4e10c45eca98ce5f1aadbd4" + integrity sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA== "@solidity-parser/parser@^0.16.0": version "0.16.2"