diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e059f0b..bcdf0b27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Contract sizes run: | @@ -48,7 +48,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Format run: | @@ -69,7 +69,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Test run: | @@ -90,7 +90,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Fork Test run: | @@ -116,7 +116,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Run Slither uses: crytic/slither-action@v0.4.0 @@ -159,7 +159,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Install Crytic-compile run: | @@ -220,7 +220,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Install Halmos run: | @@ -245,7 +245,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Install dependencies run: npm install @@ -281,7 +281,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Install dependencies run: npm install @@ -308,7 +308,7 @@ jobs: - name: Setup Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: stable + version: v1.3.5 - name: Upload Selectors run: | diff --git a/README.md b/README.md index 5fe2e4fc..b5cb5c96 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ Since Size v1.8, collections of markets, curators and rate providers are core en - Curators can transfer ownership of their collections. - Since users can subscribe to multiple collections, each with potentially many rate providers, the "borrow offer should be lower than loan offer" check now has O(C × R) complexity, where C is the number of collections and R is the number of rate providers. Users should avoid subscribing to too many collections or collections with excessive rate providers, as this may cause market orders to revert due to high gas usage. - A rate provider in any market belonging to any collection can prevent all subscribed users from market orders if they set the borrow offer APR greater than or equal to the lend offer APR. +- After v1.8.1, users can configure a per-collection `CopyLimitOrderConfig`, which is applied as a fallback to per-market configs, and curator-defined configs are deprecated. ##### Breaking changes @@ -181,8 +182,7 @@ Since Size v1.8, collections of markets, curators and rate providers are core en - During reinitialization: - All users who previously used the `copyLimitOrder` feature are now subscribed to a new collection that mirrors the rate provider they had copied. - Their existing limit orders are cleared, since these may now be used by the taker side of a market order. - - By default, market orders now select the user-defined yield curve. Since migrated users will have no personal curve set, market orders will revert unless integrators pass an explicit collection parameter. -- To indicate "no copy," users should pass a `CopyLimitOrderConfig` with all fields set to null except `offsetAPR`. Passing zero min/max bounds will cause reverts—even if the curator has configured valid bounds. +- To indicate "no copy," users should pass a `CopyLimitOrderConfig` with all fields set to null except `offsetAPR`. - For the sake of clarity, `getLoanOfferAPR` and `getBorrowOfferAPR` on the `SizeView` contract were renamed to `getUserDefinedLoanOfferAPR` and `getUserDefinedBorrowOfferAPR` to be explicit about whether the yield curve is from a rate provider or from the user themselves. - Some infrequently utilized `SizeView` functions were removed to make room for the additional `WithCollection` functions and not break the max contract size limit. diff --git a/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-1761315146906.json b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-1761315146906.json new file mode 100644 index 00000000..9564672a --- /dev/null +++ b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-1761315146906.json @@ -0,0 +1,182 @@ +{ + "transactions": [ + { + "hash": "0x12ec4b362249a03acad003fda1c8579eea529358ce426c01f3de819f7e153f83", + "transactionType": "CREATE2", + "contractName": "MarketFactoryLibrary", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0e14", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006107a3610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063d41bcfc514610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610132565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8087878787878760405160240161008f959493929190610271565b60408051601f198184030181529181526020820180516001600160e01b031663f1bf35c360e01b179052516100c3906100f4565b6100ce929190610321565b604051809103905ff0801580156100e7573d5f803e3d5ffd5b5098975050505050505050565b6103f08061037e83390190565b80356001600160a01b0381168114610117575f80fd5b919050565b5f60c0828403121561012c575f80fd5b50919050565b5f805f805f808688036102a0811215610149575f80fd5b61015288610101565b965061016060208901610101565b955061016f8960408a0161011c565b945060a060ff1982011215610182575f80fd5b61010088019350604061019f198201121561019b575f80fd5b506101a0870191506101b1886101e0890161011c565b90509295509295509295565b6001600160a01b036101ce82610101565b168252602081013567ffffffffffffffff81168082146101ec575f80fd5b80602085015250505050565b6001600160a01b038061020a83610101565b1683528061021a60208401610101565b1660208401528061022d60408401610101565b1660408401528061024060608401610101565b1660608401528061025360808401610101565b1660808401528061026660a08401610101565b1660a0840152505050565b5f6102808201905060018060a01b03808816835286356020840152602087013560408401526040870135606084015260608701356080840152608087013560a0840152806102c160a08901610101565b1660c084015250843560e083015260208501356101008301526040850135610120830152606085013561014083015260808501356101608301526103096101808301856101bd565b6103176101c08301846101f8565b9695505050505050565b60018060a01b03831681525f60206040602084015283518060408501525f5b8181101561035c57858101830151858201606001528201610340565b505f606082860101526060601f19601f83011685010192505050939250505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a2646970667358221220670540a779fc707ba2d74908460b71b5f911940396a8e4eec820b0783b7eb1cf64736f6c63430008170033", + "nonce": "0xe4", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x27ab659ce7d830b3e511ea0478a792350e700439ee979fad87dbd7fe97549b47", + "transactionType": "CREATE2", + "contractName": "NonTransferrableRebasingTokenVaultLibrary", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xbc5c9", + "input": "0x000000000000000000000000000000000000000000000000000000000000000061091b610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80630550810a14610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610277565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8430848487866001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100b4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100db9190810190610306565b6040516020016100eb91906103ae565b604051602081830303815290604052876001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610135573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261015c9190810190610306565b60405160200161016c91906103ea565b604051602081830303815290604052886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101db9190610413565b6040516024016101f19796959493929190610465565b60408051601f198184030181529181526020820180516001600160e01b0316631f0cbe6160e01b1790525161022590610253565b6102309291906104ca565b604051809103905ff080158015610249573d5f803e3d5ffd5b5095945050505050565b6103f0806104f683390190565b6001600160a01b0381168114610274575f80fd5b50565b5f805f806080858703121561028a575f80fd5b843561029581610260565b935060208501356102a581610260565b925060408501356102b581610260565b915060608501356102c581610260565b939692955090935050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102fe5781810151838201526020016102e6565b50505f910152565b5f60208284031215610316575f80fd5b815167ffffffffffffffff8082111561032d575f80fd5b818401915084601f830112610340575f80fd5b815181811115610352576103526102d0565b604051601f8201601f19908116603f0116810190838211818310171561037a5761037a6102d0565b81604052828152876020848701011115610392575f80fd5b6103a38360208301602088016102e4565b979650505050505050565b64029b4bd32960dd1b81525f82516103cd8160058501602087016102e4565b650815985d5b1d60d21b6005939091019283015250600b01919050565b6139bb60f11b81525f82516104068160028501602087016102e4565b9190910160020192915050565b5f60208284031215610423575f80fd5b815160ff81168114610433575f80fd5b9392505050565b5f81518084526104518160208601602086016102e4565b601f01601f19169290920160200192915050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260e0608082018190525f906104a09083018661043a565b82810360a08401526104b2818661043a565b91505060ff831660c083015298975050505050505050565b6001600160a01b03831681526040602082018190525f906104ed9083018461043a565b94935050505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a26469706673582212209d2380a7304f006d1c66be055eaf76eddad4d8b6b38978aec43f72b90761da5e64736f6c63430008170033", + "nonce": "0xe5", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionType": "CREATE", + "contractName": "CollectionsManager", + "contractAddress": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x4c3517", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516143f6620001005f395f8181611f3a01528181611f63015261213301526143f65ff3fe608060405260043610610249575f3560e01c806370a0823111610134578063ac9650d8116100b3578063c4d66de811610078578063c4d66de8146106f2578063c87b56dd14610711578063dd2bc30214610730578063de1eb8801461075c578063e985e9c51461077b578063eb379a581461079a575f80fd5b8063ac9650d81461062c578063ad3cb1cc14610658578063b88d4fde14610688578063b9d33d1e146106a7578063c260d206146106d3575f80fd5b80639feffdb0116100f95780639feffdb014610591578063a0529e5f146105b0578063a22cb465146105cf578063abff1222146105ee578063ac888c071461060d575f80fd5b806370a08231146105015780638134a9e01461052057806393c0d3f31461053f57806395d89b411461055e5780639e4082db14610572575f80fd5b80633184b046116101cb57806352d1902d1161019057806352d1902d1461045b578063565380571461046f5780635fb7f10c146104905780636352211e146104af578063647f1a9c146104ce578063678b9bad146104e2575f80fd5b80633184b046146103bf57806342842e0e146103eb578063495e6d891461040a5780634f1ef286146104295780634f6ccce71461043c575f80fd5b806318160ddd1161021157806318160ddd1461031957806318d5932d1461034357806320d634561461036257806323b872dd146103815780632f745c59146103a0575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630b379508146102fa575b5f80fd5b348015610258575f80fd5b5061026c61026736600461362c565b6107b9565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107e3565b6040516102789190613694565b3480156102ad575f80fd5b506102c16102bc3660046136a6565b610884565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f33660046136d1565b610898565b005b348015610305575f80fd5b506102f8610314366004613789565b6108a7565b348015610324575f80fd5b505f805160206143a1833981519152545b604051908152602001610278565b34801561034e575f80fd5b506102f861035d36600461388b565b6109dd565b34801561036d575f80fd5b5061026c61037c3660046136d1565b610a1b565b34801561038c575f80fd5b506102f861039b3660046138da565b610a43565b3480156103ab575f80fd5b506103356103ba3660046136d1565b610ac6565b3480156103ca575f80fd5b506103de6103d93660046136d1565b610b37565b6040516102789190613918565b3480156103f6575f80fd5b506102f86104053660046138da565b610b4a565b348015610415575f80fd5b50610335610424366004613951565b610b69565b6102f8610437366004613a13565b610b84565b348015610447575f80fd5b506103356104563660046136a6565b610b9f565b348015610466575f80fd5b50610335610c11565b34801561047a575f80fd5b5061026c6104893660046136a6565b6001541190565b34801561049b575f80fd5b506103356104aa366004613951565b610c2d565b3480156104ba575f80fd5b506102c16104c93660046136a6565b610c3d565b3480156104d9575f80fd5b50610335610c47565b3480156104ed575f80fd5b5061026c6104fc366004613a5f565b610c67565b34801561050c575f80fd5b5061033561051b366004613aa4565b610c80565b34801561052b575f80fd5b5061026c61053a366004613abf565b610cd8565b34801561054a575f80fd5b506102f8610559366004613aed565b610d1a565b348015610569575f80fd5b50610295610eb0565b34801561057d575f80fd5b506103de61058c3660046136d1565b610eee565b34801561059c575f80fd5b5061026c6105ab366004613a5f565b610f02565b3480156105bb575f80fd5b506102f86105ca366004613b8d565b610f11565b3480156105da575f80fd5b506102f86105e9366004613c2b565b611187565b3480156105f9575f80fd5b506102f8610608366004613b8d565b611192565b348015610618575f80fd5b5061026c610627366004613c57565b61132e565b348015610637575f80fd5b5061064b610646366004613ca7565b6113cf565b6040516102789190613d15565b348015610663575f80fd5b50610295604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610693575f80fd5b506102f86106a2366004613d77565b6114b4565b3480156106b2575f80fd5b506106c66106c1366004613aa4565b6114cc565b6040516102789190613dde565b3480156106de575f80fd5b506103356106ed366004613e21565b6114ef565b3480156106fd575f80fd5b506102f861070c366004613aa4565b61160f565b34801561071c575f80fd5b5061029561072b3660046136a6565b611789565b34801561073b575f80fd5b5061074f61074a366004613abf565b6117ed565b6040516102789190613e8d565b348015610767575f80fd5b506102f8610776366004613aed565b61189b565b348015610786575f80fd5b5061026c610795366004613ecd565b6119cb565b3480156107a5575f80fd5b506102f86107b4366004613789565b611a17565b5f6001600160e01b0319821663780e9d6360e01b14806107dd57506107dd82611b3a565b92915050565b5f80516020614361833981519152805460609190819061080290613ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613ef9565b80156108795780601f1061085057610100808354040283529160200191610879565b820191905f5260205f20905b81548152906001019060200180831161085c57829003601f168201915b505050505091505090565b5f61088e82611b89565b506107dd82611bc0565b6108a3828233611bf9565b5050565b826108bb6108b482610c3d565b3383611c06565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff1661091457604051631713bf1160e21b8152600481018590526001600160a01b03841660248201526044015b60405180910390fd5b5f5b82518110156109d6575f61096a84838151811061093557610935613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b0190611c6a565b905080156109cd5783828151811061098457610984613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f41a3856b408397a3953ee2e3fc5961815599fafae92aa64253fea4124c15835260405160405180910390a45b50600101610916565b5050505050565b5f546001600160a01b03163314610a0957604051630b56d23b60e41b815233600482015260240161090b565b610a1584848484611c7e565b50505050565b6001600160a01b0382165f908152600360205260408120610a3c9083611d87565b9392505050565b6001600160a01b038216610a6c57604051633250574960e11b81525f600482015260240161090b565b5f610a78838333611d9e565b9050836001600160a01b0316816001600160a01b031614610a15576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161090b565b5f5f80516020614341833981519152610ade84610c80565b8310610b0f5760405163295f44f760e21b81526001600160a01b03851660048201526024810184905260440161090b565b6001600160a01b0384165f908152602091825260408082208583529092522054905092915050565b610b3f6135c3565b610a3c83835f611e94565b610b6483838360405180602001604052805f8152506114b4565b505050565b5f610b7886868686865f6114ef565b90505b95945050505050565b610b8c611f2f565b610b9582611fd5565b6108a3828261206c565b5f5f80516020614341833981519152610bc35f805160206143a18339815191525490565b8310610beb5760405163295f44f760e21b81525f60048201526024810184905260440161090b565b806002018381548110610c0057610c00613f31565b905f5260205f200154915050919050565b5f610c1a612128565b505f805160206143818339815191525b90565b5f610b78868686868660016114ef565b5f6107dd82611b89565b600180545f9182610c5783613f59565b919050559050610c2a3382612171565b5f610c75858585855f61218a565b90505b949350505050565b5f5f805160206143618339815191526001600160a01b038316610cb8576040516322718ad960e21b81525f600482015260240161090b565b6001600160a01b039092165f908152600390920160205250604090205490565b5f610ce4836001541190565b610cef57505f6107dd565b505f9182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f546001600160a01b03163314610d4657604051630b56d23b60e41b815233600482015260240161090b565b5f6040518060a001604052805f81526020015f1981526020015f81526020015f1981526020015f81525090505f5b8251811015610a1557610da1838281518110610d9257610d92613f31565b60200260200101516001541190565b610ddb57828181518110610db757610db7613f31565b602002602001015160405163500f73d960e01b815260040161090b91815260200190565b5f610e2a848381518110610df157610df1613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f2061243990919063ffffffff16565b90508015610ea757838281518110610e4457610e44613f31565b6020026020010151856001600160a01b03167fe9919c1157673d017b4e5eef8d4c012fadcf6ee40cf5f99a0912a0109b5d584260405160405180910390a3610ea785858481518110610e9857610e98613f31565b60200260200101518586611c7e565b50600101610d74565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f805160206143618339815191529161080290613ef9565b610ef66135c3565b610a3c83836001611e94565b5f610c7585858585600161218a565b81610f1e6108b482610c3d565b5f5b8251811015610a15575f5483516001600160a01b0390911690636ec934da90859084908110610f5157610f51613f31565b60200260200101516040518263ffffffff1660e01b8152600401610f8491906001600160a01b0391909116815260200190565b602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190613f71565b61100a57828181518110610fd957610fd9613f31565b602002602001015160405163e2a7bea360e01b815260040161090b91906001600160a01b0391909116815260200190565b82818151811061101c5761101c613f31565b60200260200101516001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110839190613f71565b156110cb5782818151811061109a5761109a613f31565b602002602001015160405163b4e1115760e01b815260040161090b91906001600160a01b0391909116815260200190565b5f8481526002602052604081208451600192908690859081106110f0576110f0613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f6101000a81548160ff02191690831515021790555082818151811061114157611141613f31565b60200260200101516001600160a01b0316847f42e38738c8d2e007a797548d288aea65537b98d212336f6fa33ca20c7a99088560405160405180910390a3600101610f20565b6108a3338383612444565b8161119f6108b482610c3d565b5f5b8251811015610a15575f61120160025f8781526020019081526020015f205f8685815181106111d2576111d2613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600b016124ea565b90506112278585848151811061121957611219613f31565b6020026020010151836108a7565b60025f8681526020019081526020015f205f85848151811061124b5761124b613f31565b6020908102919091018101516001600160a01b031682528101919091526040015f908120805460ff19168155600181018290556002810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560098101829055600a810182905590600b82018181816112cf82826135ed565b5050505050508382815181106112e7576112e7613f31565b60200260200101516001600160a01b0316857fa328ee555a02ae133b939087dcc439417783329f687112f415290a4637f64ab760405160405180910390a3506001016111a1565b5f61133a846001541190565b61134557505f610c78565b6001600160a01b0385165f9081526003602052604090206113669085611d87565b61137157505f610c78565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff166113a157505f610c78565b5f8481526002602090815260408083206001600160a01b03871684529091529020610c7590600b01836124f6565b604080515f815260208101909152606090826001600160401b038111156113f8576113f86136fb565b60405190808252806020026020018201604052801561142b57816020015b60608152602001906001900390816114165790505b5091505f5b838110156114ac576114873086868481811061144e5761144e613f31565b90506020028101906114609190613f9f565b8560405160200161147393929190613fe8565b604051602081830303815290604052612517565b83828151811061149957611499613f31565b6020908102919091010152600101611430565b505092915050565b6114bf848484610a43565b610a153385858585612580565b6001600160a01b0381165f9081526003602052604090206060906107dd906124ea565b5f5f19860361150b576115048786858561269f565b9050611605565b6115178787878761132e565b61154e5760405163c6c8526f60e01b8152600481018790526001600160a01b0380871660248301528516604482015260640161090b565b5f61155b88888886612751565b80519091508410806115705750806020015184115b156115a55780516020820151604051633e5d735760e21b8152600481018790526024810192909252604482015260640161090b565b5f6115b28688878761269f565b90506115d482608001516115c58361277f565b6115cf919061400d565b6127af565b925081604001518310156115ee5781604001519250611602565b816060015183111561160257816060015192505b50505b9695505050505050565b5f6116186127d4565b805490915060ff600160401b82041615906001600160401b03165f8115801561163e5750825b90505f826001600160401b031660011480156116595750303b155b905081158015611667575080155b156116855760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116af57845460ff60401b1916600160401b1785555b6117096040518060400160405280601081526020016f53697a6520436f6c6c656374696f6e7360801b8152506040518060400160405280601081526020016f53495a455f434f4c4c454354494f4e5360801b8152506127fc565b61171161280e565b61171961280e565b61172161280e565b5f80546001600160a01b0319166001600160a01b038816179055831561178157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b606061179482611b89565b505f61179e612816565b90505f8151116117bc5760405180602001604052805f815250610a3c565b806117c684612845565b6040516020016117d792919061402c565b6040516020818303038152906040529392505050565b60606117fa836001541190565b61181a5760405163500f73d960e01b81526004810184905260240161090b565b5f8381526002602090815260408083206001600160a01b038616845290915290205460ff1661186e57604051631713bf1160e21b8152600481018490526001600160a01b038316602482015260440161090b565b5f8381526002602090815260408083206001600160a01b03861684529091529020610a3c90600b016124ea565b5f546001600160a01b031633146118c757604051630b56d23b60e41b815233600482015260240161090b565b6118cf6135c3565b5f5b8251811015610a15576118ef838281518110610d9257610d92613f31565b61190557828181518110610db757610db7613f31565b5f61195484838151811061191b5761191b613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f206128d490919063ffffffff16565b905080156119c25783828151811061196e5761196e613f31565b6020026020010151856001600160a01b03167fd0b1806956ca744bd88a4e4057a137959cb88d8d4e7e8d793301cfdf7df7cb2b60405160405180910390a36119c285858481518110610e9857610e98613f31565b506001016118d1565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b82611a246108b482610c3d565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff16611a7857604051631713bf1160e21b8152600481018590526001600160a01b038416602482015260440161090b565b5f5b82518110156109d6575f611ace848381518110611a9957611a99613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b01906128df565b90508015611b3157838281518110611ae857611ae8613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f8e2f88c467ecc78e2adbbe6d65b6176668f4cc362a196a5c46d203a9db8d8fbe60405160405180910390a45b50600101611a7a565b5f6001600160e01b031982166380ac58cd60e01b1480611b6a57506001600160e01b03198216635b5e139f60e01b145b806107dd57506301ffc9a760e01b6001600160e01b03198316146107dd565b5f80611b94836128f3565b90506001600160a01b0381166107dd57604051637e27328960e01b81526004810184905260240161090b565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b64838383600161292c565b611c11838383612a3f565b610b64576001600160a01b038316611c3f57604051637e27328960e01b81526004810182905260240161090b565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161090b565b5f610a3c836001600160a01b038416612aa3565b611c89836001541190565b611ca95760405163500f73d960e01b81526004810184905260240161090b565b611cb38282612b86565b60408051808201825283815260208082018481526001600160a01b0388165f81815260048085528682208a8352855290869020945180518655808501516001870155808701516002870155606080820151600388015560809182015192870192909255925180516005870155938401516006860155838601516007860155830151600885015591015160099092019190915590518491907fb20b9722fd4401237d66274470a4daf19d973d3f3150edba3bcadf8467ed9b4290611d79908690869061405a565b60405180910390a350505050565b5f8181526001830160205260408120541515610a3c565b5f80611dab858585612d18565b90506001600160a01b038116611e3257611e2d845f805160206143a183398151915280545f8381527f645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0360205260408120829055600182018355919091527fa42f15e5d656f8155fd7419d740a6073999f19cd6e061449ce4a257150545bf20155565b611e55565b846001600160a01b0316816001600160a01b031614611e5557611e558185612e1a565b6001600160a01b038516611e7157611e6c84612eb1565b610c78565b846001600160a01b0316816001600160a01b031614610c7857610c788585612f7e565b611e9c6135c3565b81611ecb576001600160a01b0384165f9081526004602090815260408083208684529091529020600501611eee565b6001600160a01b0384165f90815260046020908152604080832086845290915290205b6040805160a0810182528254815260018301546020820152600283015491810191909152600382015460608201526004909101546080820152949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fa95f80516020614381833981519152546001600160a01b031690565b6001600160a01b031614155b15611fd35760405163703e46dd60e11b815260040160405180910390fd5b565b5f8054604051632474521560e21b8152600481018390523360248201526001600160a01b03909116906391d1485490604401602060405180830381865afa158015612022573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120469190613f71565b6108a35760405163e2517d3f60e01b81523360048201526024810182905260440161090b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120c6575060408051601f3d908101601f191682019092526120c3918101906140ca565b60015b6120ee57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161090b565b5f80516020614381833981519152811461211e57604051632a87526960e21b81526004810182905260240161090b565b610b648383612fd6565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fd35760405163703e46dd60e11b815260040160405180910390fd5b6108a3828260405180602001604052805f81525061302b565b6001600160a01b0385165f908152600360205260408120815b6121ac82613042565b811015612340575f6121be838361304b565b5f8181526002602090815260408083206001600160a01b038c16845290915290205490915060ff166121f05750612338565b5f8181526002602090815260408083206001600160a01b038b1684529091528120600b01905b61221f82613042565b811015612334575f612231838361304b565b905061223f818b8a15613056565b1561224a575061232c565b306001600160a01b031663c260d2068d868d858e8e156040518763ffffffff1660e01b8152600401612281969594939291906140e1565b602060405180830381865afa9250505080156122ba575060408051601f3d908101601f191682019092526122b7918101906140ca565b60015b6122f3573d8080156122e7576040519150601f19603f3d011682016040523d82523d5f602084013e6122ec565b606091505b505061232a565b88801561230057508b8110155b806123145750881580156123145750808c10155b15612328575f975050505050505050610b7b565b505b505b600101612216565b5050505b6001016121a3565b5061234d87868515613056565b1561235c576001915050610b7b565b604051636130690360e11b8152309063c260d2069061238b908a905f19908a905f908b908b15906004016140e1565b602060405180830381865afa9250505080156123c4575060408051601f3d908101601f191682019092526123c1918101906140ca565b60015b6123fd573d8080156123f1576040519150601f19603f3d011682016040523d82523d5f602084013e6123f6565b606091505b505061242f565b83801561240a5750868110155b8061241e57508315801561241e5750808710155b1561242d575f92505050610b7b565b505b6001915050610b7b565b5f610a3c838361312c565b5f805160206143618339815191526001600160a01b03831661248457604051630b61174360e31b81526001600160a01b038416600482015260240161090b565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611d79565b60605f610a3c83613178565b6001600160a01b0381165f9081526001830160205260408120541515610a3c565b60605f80846001600160a01b031684604051612533919061411b565b5f60405180830381855af49150503d805f811461256b576040519150601f19603f3d011682016040523d82523d5f602084013e612570565b606091505b5091509150610b7b8583836131d1565b6001600160a01b0383163b156109d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906125c2908890889087908790600401614136565b6020604051808303815f875af19250505080156125fc575060408051601f3d908101601f191682019092526125f991810190614168565b60015b612663573d808015612629576040519150601f19603f3d011682016040523d82523d5f602084013e61262e565b606091505b5080515f0361265b57604051633250574960e11b81526001600160a01b038516600482015260240161090b565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461178157604051633250574960e11b81526001600160a01b038516600482015260240161090b565b5f811561271c57604051620d37ab60e81b81526001600160a01b03868116600483015260248201859052851690630d37ab00906044015b602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271591906140ca565b9050610c78565b604051632b59bd9960e01b81526001600160a01b03868116600483015260248201859052851690632b59bd99906044016126d6565b6127596135c3565b61276485848461322d565b905061276f8161330a565b15610c7857610c75858584611e94565b5f6001600160ff1b038211156127ab5760405163123baf0360e11b81526004810183905260240161090b565b5090565b5f808212156127ab57604051635467221960e11b81526004810183905260240161090b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006107dd565b612804613349565b6108a3828261336e565b611fd3613349565b606061282146612845565b6040516020016128319190614183565b604051602081830303815290604052905090565b60605f6128518361339e565b60010190505f816001600160401b0381111561286f5761286f6136fb565b6040519080825280601f01601f191660200182016040528015612899576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128a357509392505050565b5f610a3c8383612aa3565b5f610a3c836001600160a01b03841661312c565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f80516020614361833981519152818061294e57506001600160a01b03831615155b15612a0f575f61295d85611b89565b90506001600160a01b038416158015906129895750836001600160a01b0316816001600160a01b031614155b801561299c575061299a81856119cb565b155b156129c55760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161090b565b8215612a0d5784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160a01b03831615801590610c785750826001600160a01b0316846001600160a01b03161480612a785750612a7884846119cb565b80610c785750826001600160a01b0316612a9183611bc0565b6001600160a01b031614949350505050565b5f8181526001830160205260408120548015612b7d575f612ac5600183613f8c565b85549091505f90612ad890600190613f8c565b9050808214612b37575f865f018281548110612af657612af6613f31565b905f5260205f200154905080875f018481548110612b1657612b16613f31565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612b4857612b486141df565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107dd565b5f9150506107dd565b602082015182511115612bbc57815160208301516040516307198f4960e11b81526004810192909252602482015260440161090b565b816060015182604001511115612bfa5781604001518260600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b602081015181511115612c3057805160208201516040516307198f4960e11b81526004810192909252602482015260440161090b565b806060015181604001511115612c6e5780604001518160600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b81606001518160400151118015612c8a57508151602082015110155b8015612c9b57508051602083015110155b156108a357805f0151816020015182604001518360600151855f015186602001518760400151886060015160405163a19d2d6760e01b815260040161090b989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b5f5f8051602061436183398151915281612d31856128f3565b90506001600160a01b03841615612d4d57612d4d818587611c06565b6001600160a01b03811615612d8957612d685f865f8061292c565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615612db9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f805160206143418339815191525f612e3284610c80565b5f8481526001840160209081526040808320546001600160a01b03891684529186905290912091925090818314612e8a575f838152602082815260408083205485845281842081905583526001870190915290208290555b5f948552600190930160209081526040808620869055928552929092528220919091555050565b5f805160206143a1833981519152545f80516020614341833981519152905f90612edd90600190613f8c565b5f848152600384016020526040812054600285018054939450909284908110612f0857612f08613f31565b905f5260205f200154905080846002018381548110612f2957612f29613f31565b5f91825260208083209091019290925582815260038601909152604080822084905586825281205560028401805480612f6457612f646141df565b600190038181905f5260205f20015f905590555050505050565b5f805160206143418339815191525f6001612f9885610c80565b612fa29190613f8c565b6001600160a01b039094165f9081526020838152604080832087845282528083208690559482526001909301909252502055565b612fdf82613475565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561302357610b648282612517565b6108a36134d8565b61303583836134f7565b610b64335f858585612580565b5f6107dd825490565b5f610a3c8383613558565b5f816130c457604051630cfa9a4960e01b81526001600160a01b038581166004830152841690630cfa9a4990602401602060405180830381865afa1580156130a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c9190613f71565b60405163044ce7c360e41b81526001600160a01b0385811660048301528416906344ce7c3090602401602060405180830381865afa158015613108573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c789190613f71565b5f81815260018301602052604081205461317157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107dd565b505f6107dd565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131c557602002820191905f5260205f20905b8154815260200190600101908083116131b1575b50505050509050919050565b6060826131e6576131e18261357e565b610a3c565b81511580156131fd57506001600160a01b0384163b155b1561322657604051639996b31560e01b81526001600160a01b038516600482015260240161090b565b5080610a3c565b6132356135c3565b816132a25760405163c421a75960e01b81526001600160a01b03858116600483015284169063c421a7599060240160a060405180830381865afa15801561327e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906141f3565b604051630264211160e11b81526001600160a01b0385811660048301528416906304c842229060240160a060405180830381865afa1580156132e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7891906141f3565b80515f9015801561331d57506020820151155b801561332b57506040820151155b801561333957506060820151155b80156107dd575050608001511590565b6133516135aa565b611fd357604051631afcd79f60e31b815260040160405180910390fd5b613376613349565b5f805160206143618339815191528061338f8482614285565b5060018101610a158382614285565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106133dc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613408576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061342657662386f26fc10000830492506010015b6305f5e100831061343e576305f5e100830492506008015b612710831061345257612710830492506004015b60648310613464576064830492506002015b600a83106107dd5760010192915050565b806001600160a01b03163b5f036134aa57604051634c9c8ce360e01b81526001600160a01b038216600482015260240161090b565b5f8051602061438183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611fd35760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661352057604051633250574960e11b81525f600482015260240161090b565b5f61352c83835f611d9e565b90506001600160a01b03811615610b64576040516339e3563760e11b81525f600482015260240161090b565b5f825f01828154811061356d5761356d613f31565b905f5260205f200154905092915050565b80511561358e5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f6135b36127d4565b54600160401b900460ff16919050565b6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b5080545f8255905f5260205f20908101906135a791905b808211156127ab575f8155600101613604565b6001600160e01b0319811681146135a7575f80fd5b5f6020828403121561363c575f80fd5b8135610a3c81613617565b5f5b83811015613661578181015183820152602001613649565b50505f910152565b5f8151808452613680816020860160208601613647565b601f01601f19169290920160200192915050565b602081525f610a3c6020830184613669565b5f602082840312156136b6575f80fd5b5035919050565b6001600160a01b03811681146135a7575f80fd5b5f80604083850312156136e2575f80fd5b82356136ed816136bd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715613731576137316136fb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561375f5761375f6136fb565b604052919050565b5f6001600160401b0382111561377f5761377f6136fb565b5060051b60200190565b5f805f6060848603121561379b575f80fd5b833592506020808501356137ae816136bd565b925060408501356001600160401b038111156137c8575f80fd5b8501601f810187136137d8575f80fd5b80356137eb6137e682613767565b613737565b81815260059190911b82018301908381019089831115613809575f80fd5b928401925b82841015613830578335613821816136bd565b8252928401929084019061380e565b80955050505050509250925092565b5f60a0828403121561384f575f80fd5b61385761370f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f80610180858703121561389f575f80fd5b84356138aa816136bd565b9350602085013592506138c0866040870161383f565b91506138cf8660e0870161383f565b905092959194509250565b5f805f606084860312156138ec575f80fd5b83356138f7816136bd565b92506020840135613907816136bd565b929592945050506040919091013590565b60a081016107dd828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b5f805f805f60a08688031215613965575f80fd5b8535613970816136bd565b9450602086013593506040860135613987816136bd565b92506060860135613997816136bd565b949793965091946080013592915050565b5f82601f8301126139b7575f80fd5b81356001600160401b038111156139d0576139d06136fb565b6139e3601f8201601f1916602001613737565b8181528460208386010111156139f7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613a24575f80fd5b8235613a2f816136bd565b915060208301356001600160401b03811115613a49575f80fd5b613a55858286016139a8565b9150509250929050565b5f805f8060808587031215613a72575f80fd5b8435613a7d816136bd565b9350602085013592506040850135613a94816136bd565b9396929550929360600135925050565b5f60208284031215613ab4575f80fd5b8135610a3c816136bd565b5f8060408385031215613ad0575f80fd5b823591506020830135613ae2816136bd565b809150509250929050565b5f8060408385031215613afe575f80fd5b8235613b09816136bd565b91506020838101356001600160401b03811115613b24575f80fd5b8401601f81018613613b34575f80fd5b8035613b426137e682613767565b81815260059190911b82018301908381019088831115613b60575f80fd5b928401925b82841015613b7e57833582529284019290840190613b65565b80955050505050509250929050565b5f8060408385031215613b9e575f80fd5b823591506020808401356001600160401b03811115613bbb575f80fd5b8401601f81018613613bcb575f80fd5b8035613bd96137e682613767565b81815260059190911b82018301908381019088831115613bf7575f80fd5b928401925b82841015613b7e578335613c0f816136bd565b82529284019290840190613bfc565b80151581146135a7575f80fd5b5f8060408385031215613c3c575f80fd5b8235613c47816136bd565b91506020830135613ae281613c1e565b5f805f8060808587031215613c6a575f80fd5b8435613c75816136bd565b9350602085013592506040850135613c8c816136bd565b91506060850135613c9c816136bd565b939692955090935050565b5f8060208385031215613cb8575f80fd5b82356001600160401b0380821115613cce575f80fd5b818501915085601f830112613ce1575f80fd5b813581811115613cef575f80fd5b8660208260051b8501011115613d03575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613d6a57603f19888603018452613d58858351613669565b94509285019290850190600101613d3c565b5092979650505050505050565b5f805f8060808587031215613d8a575f80fd5b8435613d95816136bd565b93506020850135613da5816136bd565b92506040850135915060608501356001600160401b03811115613dc6575f80fd5b613dd2878288016139a8565b91505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613e1557835183529284019291840191600101613df9565b50909695505050505050565b5f805f805f8060c08789031215613e36575f80fd5b8635613e41816136bd565b9550602087013594506040870135613e58816136bd565b93506060870135613e68816136bd565b92506080870135915060a0870135613e7f81613c1e565b809150509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613e155783516001600160a01b031683529284019291840191600101613ea8565b5f8060408385031215613ede575f80fd5b8235613ee9816136bd565b91506020830135613ae2816136bd565b600181811c90821680613f0d57607f821691505b602082108103613f2b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613f6a57613f6a613f45565b5060010190565b5f60208284031215613f81575f80fd5b8151610a3c81613c1e565b818103818111156107dd576107dd613f45565b5f808335601e19843603018112613fb4575f80fd5b8301803591506001600160401b03821115613fcd575f80fd5b602001915036819003821315613fe1575f80fd5b9250929050565b828482375f8382015f81528351614003818360208801613647565b0195945050505050565b8082018281125f8312801582168215821617156114ac576114ac613f45565b5f835161403d818460208801613647565b835190830190614051818360208801613647565b01949350505050565b6101408101614094828580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160a0830152602083015160c0830152604083015160e083015260608301516101008301526080830151610120830152610a3c565b5f602082840312156140da575f80fd5b5051919050565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925290151560a082015260c00190565b5f825161412c818460208701613647565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90610b7890830184613669565b5f60208284031215614178575f80fd5b8151610a3c81613617565b7f68747470733a2f2f6170692e73697a652e6372656469742f636f6c6c656374698152636f6e732f60e01b60208201525f82516141c7816024850160208701613647565b602f60f81b6024939091019283015250602501919050565b634e487b7160e01b5f52603160045260245ffd5b5f60a08284031215614203575f80fd5b61420b61370f565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b601f821115610b6457805f5260205f20601f840160051c810160208510156142665750805b601f840160051c820191505b818110156109d6575f8155600101614272565b81516001600160401b0381111561429e5761429e6136fb565b6142b2816142ac8454613ef9565b84614241565b602080601f8311600181146142e5575f84156142ce5750858301515b5f19600386901b1c1916600185901b178555611781565b5f85815260208120601f198616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561433057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed02a264697066735822122003abfeed6c386c88a16ffbbf7a5897b7c6d1d273227a7bd7ff4dab3f8c8fc58964736f6c63430008170033", + "nonce": "0xe6", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionType": "CREATE", + "contractName": "SizeFactory", + "contractAddress": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x388367", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613208620001005f395f81816119ea01528181611a130152611b5601526132085ff3fe60806040526004361061025f575f3560e01c806386eeeb5a1161013f578063ad3cb1cc116100b3578063d152e23611610078578063d152e23614610762578063d547741f14610781578063e8d353c7146107a0578063eb44fdd3146107bf578063ec2c9016146107de578063f0fb716f146107ff575f80fd5b8063ad3cb1cc146106b6578063b1ef804d146106e6578063b4cd6bd114610705578063c4d66de814610724578063c8fb624714610743575f80fd5b80639e42bfa3116101045780639e42bfa3146106065780639feffdb014610625578063a217fddf14610644578063a78ec6ae14610657578063a7b2b31014610676578063ac9650d81461068a575f80fd5b806386eeeb5a1461056b57806388d765201461058a57806391c769ce146105a957806391d14854146105c8578063973cf867146105e7575f80fd5b806352d1902d116101d65780636ec934da1161019b5780636ec934da146104865780636ed41835146104a5578063732218f9146104c45780637643d7ec146104e35780637b8dedad1461050457806381de274c14610540575f80fd5b806352d1902d146103de57806354fd4d50146103f25780635ec49544146104295780635fb7f10c14610448578063678b9bad14610467575f80fd5b806327fa35c31161022757806327fa35c31461033b5780632f2ff15d1461034f57806336568abe1461036e57806337c11b2a1461038d578063495e6d89146103ac5780634f1ef286146103cb575f80fd5b806301a6c8721461026357806301ffc9a7146102845780631286a2dc146102b85780631e4fcddb146102ef578063248a9ca31461030e575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461222c565b61081e565b005b34801561028f575f80fd5b506102a361029e366004612247565b610884565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506007546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b3480156102fa575f80fd5b5061028261030936600461222c565b6108ba565b348015610319575f80fd5b5061032d61032836600461227e565b610947565b6040519081526020016102af565b348015610346575f80fd5b5061032d610967565b34801561035a575f80fd5b50610282610369366004612295565b610976565b348015610379575f80fd5b50610282610388366004612295565b610998565b348015610398575f80fd5b50600a546102d7906001600160a01b031681565b3480156103b7575f80fd5b5061032d6103c63660046122c3565b6109d0565b6102826103d93660046123cf565b610a67565b3480156103e9575f80fd5b5061032d610a86565b3480156103fd575f80fd5b5060408051808201909152600681526576312e382e3160d01b60208201525b6040516102af91906124a8565b348015610434575f80fd5b5061041c6104433660046124ba565b610aa1565b348015610453575f80fd5b5061032d6104623660046122c3565b610b20565b348015610472575f80fd5b506102a3610481366004612537565b610b70565b348015610491575f80fd5b506102a36104a036600461222c565b610bf3565b3480156104b0575f80fd5b506102826104bf3660046125c8565b610bfe565b3480156104cf575f80fd5b506102826104de366004612680565b610c0a565b3480156104ee575f80fd5b506104f7610cb8565b6040516102af91906126c3565b34801561050f575f80fd5b5061032d61051e366004612725565b600860209081525f938452604080852082529284528284209052825290205481565b34801561054b575f80fd5b5061032d61055a36600461222c565b60096020525f908152604090205481565b348015610576575f80fd5b506102a3610585366004612764565b610fe6565b348015610595575f80fd5b506102826105a43660046127a4565b611056565b3480156105b4575f80fd5b506102826105c33660046127f4565b6110d8565b3480156105d3575f80fd5b506102a36105e2366004612295565b6110e3565b3480156105f2575f80fd5b506006546102d7906001600160a01b031681565b348015610611575f80fd5b5061028261062036600461281e565b611119565b348015610630575f80fd5b506102a361063f366004612537565b611126565b34801561064f575f80fd5b5061032d5f81565b348015610662575f80fd5b506102a361067136600461284f565b61116e565b348015610681575f80fd5b506102826111d3565b348015610695575f80fd5b506106a96106a436600461288d565b61121e565b6040516102af91906128fb565b3480156106c1575f80fd5b5061041c604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106f1575f80fd5b50610282610700366004612680565b611303565b348015610710575f80fd5b5061028261071f36600461222c565b61134e565b34801561072f575f80fd5b5061028261073e36600461222c565b6113db565b34801561074e575f80fd5b5061028261075d36600461281e565b61156c565b34801561076d575f80fd5b506102d761077c366004612963565b611576565b34801561078c575f80fd5b5061028261079b366004612295565b611633565b3480156107ab575f80fd5b506102d76107ba366004612a1c565b61164f565b3480156107ca575f80fd5b506102d76107d936600461227e565b61172e565b3480156107e9575f80fd5b506107f2611739565b6040516102af9190612a48565b34801561080a575f80fd5b506102d7610819366004612aaa565b6117ce565b5f610828816118b2565b600a546040516001600160a01b038085169216907f24b8a2b6435960c7b1b405f08e684a0ed2e4d467b56f325250b56e2a10dbabae905f90a350600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160e01b03198216637965db0b60e01b14806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6108c4816118b2565b6001600160a01b0382166108eb5760405163de0ce17d60e01b815260040160405180910390fd5b6007546040516001600160a01b038085169216907faefd875bf3940c57f185da0affbb82ce03656890d6e1d29310e8b4bf9d20b7c1905f90a350600780546001600160a01b0319166001600160a01b0392909216919091179055565b5f9081525f805160206131b3833981519152602052604090206001015490565b5f6109715f6118bc565b905090565b61097f82610947565b610988816118b2565b61099283836118c5565b50505050565b6001600160a01b03811633146109c15760405163334bd91960e11b815260040160405180910390fd5b6109cb8282611966565b505050565b600a5460405163495e6d8960e01b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f92169063495e6d899060a4015b602060405180830381865afa158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612b15565b90505b95945050505050565b610a6f6119df565b610a7882611a85565b610a828282611a8f565b5050565b5f610a8f611b4b565b505f8051602061319383398151915290565b6060610aac84610bf3565b610ad95760405163e2a7bea360e01b81526001600160a01b03851660048201526024015b60405180910390fd5b610b188484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611b9492505050565b949350505050565b600a546040516317edfc4360e21b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f921690635fb7f10c9060a401610a1c565b600a5460405163678b9bad60e01b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f92169063678b9bad906084015b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612b2c565b5f6108b48183611ba1565b6109cb83838333611056565b610c163382600b610fe6565b610c55573381600b5b60405163062709f360e41b81526001600160a01b03938416600482015292909116602483015260ff166044820152606401610ad0565b600a546040516301bc3d7160e71b81526001600160a01b039091169063de1eb88090610c879084908690600401612b5f565b5f604051808303815f87803b158015610c9e575f80fd5b505af1158015610cb0573d5f803e3d5ffd5b505050505050565b6060610cc35f6118bc565b6001600160401b03811115610cda57610cda61231a565b604051908082528060200260200182016040528015610d0d57816020015b6060815260200190600190039081610cf85790505b5090505f5b8151811015610fe2575f610d268183611bc2565b90505f610da06064836001600160a01b0316637c90a6ca6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612bb4565b60200151670de0b6b3a7640000611bcd565b9050816001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ddf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e039190612c0d565b604001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610e41573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e689190810190612cc6565b826001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190612c0d565b606001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f07573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f2e9190810190612cc6565b610f3783611bd9565b846001600160a01b03166354fd4d506040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f72573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f999190810190612cc6565b604051602001610fac9493929190612d2e565b604051602081830303815290604052848481518110610fcd57610fcd612dba565b60209081029190910101525050600101610d12565b5090565b5f826001600160a01b0316846001600160a01b0316036110085750600161104f565b6001600160a01b038084165f8181526009602090815260408083205480845260088352818420958a168452948252808320938352929052205461104b9084611c68565b9150505b9392505050565b6110623382600b610fe6565b61106f573381600b610c1f565b600a546040516318d5932d60e01b81526001600160a01b03909116906318d5932d906110a5908490889088908890600401612dce565b5f604051808303815f87803b1580156110bc575f80fd5b505af11580156110ce573d5f803e3d5ffd5b5050505050505050565b610a82823383611c8a565b5f9182525f805160206131b3833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6111238133610c0a565b50565b600a546040516309feffdb60e41b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f921690639feffdb090608401610bb4565b5f826001600160a01b0316846001600160a01b0316036111905750600161104f565b506001600160a01b038281165f8181526009602090815260408083205483526008825280832094881683529381528382209282529190915220548116811461104f565b60405133907fecbee29490a7e5456f4e3aab0700477764e3f16dda5a21ea92f43f1cfcb15799905f90a2335f90815260096020526040812080549161121783612e6a565b9190505550565b604080515f815260208101909152606090826001600160401b038111156112475761124761231a565b60405190808252806020026020018201604052801561127a57816020015b60608152602001906001900390816112655790505b5091505f5b838110156112fb576112d63086868481811061129d5761129d612dba565b90506020028101906112af9190612e95565b856040516020016112c293929190612ede565b604051602081830303815290604052611d72565b8382815181106112e8576112e8612dba565b602090810291909101015260010161127f565b505092915050565b61130f3382600b610fe6565b61131c573381600b610c1f565b600a546040516393c0d3f360e01b81526001600160a01b03909116906393c0d3f390610c879084908690600401612b5f565b5f611358816118b2565b6001600160a01b03821661137f5760405163de0ce17d60e01b815260040160405180910390fd5b6006546040516001600160a01b038085169216907ffb3d0b43c5121de915eeb8fa2fb4bb792b6b05d5d6f3df7630aac9d9e8697312905f90a350600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f6113e4611ddb565b805490915060ff600160401b82041615906001600160401b03165f8115801561140a5750825b90505f826001600160401b031660011480156114255750303b155b905081158015611433575080155b156114515760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561147b57845460ff60401b1916600160401b1785555b611483611e03565b61148b611e03565b611493611e03565b61149d5f876118c5565b506114c87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a876118c5565b506114f37ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab876118c5565b5061151e7f1eae1854c74a696c6de86fd3c6383d5c1e2c33fbc86e1aa6b6c872d95bd24038876118c5565b508315610cb057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6111238133611303565b5f80611581816118b2565b60405163145b6cb960e11b815273e8dc58c7f234e49f024ce03e926be80fc2db0f7d906328b6d972906115b8908690600401612f03565b602060405180830381865af41580156115d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f79190612fe0565b6040519092506001600160a01b038316907f970cbcaabfe7c54976df22e530fb6ef3a9202796c410ae94972a9b109d5b2ca8905f90a250919050565b61163c82610947565b611645816118b2565b6109928383611966565b5f8061165a816118b2565b6007546040516302a8408560e11b81526001600160a01b03918216600482015233602482018190528683166044830152918516606482015273b4a15fb08dbe6a161ff1d411be2d9f67f060611890630550810a90608401602060405180830381865af41580156116cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f09190612fe0565b6040519093506001600160a01b038416907f798adeb18dd44bd81e89d3ab4aa52d11e6d22b3ab80b11da6844ec0eda2a0810905f90a2505092915050565b5f6108b48183611bc2565b60606117445f6118bc565b6001600160401b0381111561175b5761175b61231a565b604051908082528060200260200182016040528015611784578160200160208202803683370190505b5090505f5b8151811015610fe25761179c5f82611bc2565b8282815181106117ae576117ae612dba565b6001600160a01b0390921660209283029190910190910152600101611789565b5f806117d9816118b2565b60065460405163d41bcfc560e01b815233917322c26a06ef6c51bbca1cf5276e1606e89402979a9163d41bcfc591611829916001600160a01b039091169085908c908c908c908c906004016130c8565b602060405180830381865af4158015611844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118689190612fe0565b92506118745f84611e0b565b506040516001600160a01b038416907ffa970ff5f178441bbe297db8d35a584c9bd6628b17b82d80dc8f5b80063102ca905f90a25050949350505050565b6111238133611e1f565b5f6108b4825490565b5f5f805160206131b38339815191526118de84846110e3565b61195d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556119133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108b4565b5f9150506108b4565b5f5f805160206131b383398151915261197f84846110e3565b1561195d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108b4565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a6557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a595f80516020613193833981519152546001600160a01b031690565b6001600160a01b031614155b15611a835760405163703e46dd60e11b815260040160405180910390fd5b565b5f610a82816118b2565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae9575060408051601f3d908101601f19168201909252611ae691810190612b15565b60015b611b1157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ad0565b5f805160206131938339815191528114611b4157604051632a87526960e21b815260048101829052602401610ad0565b6109cb8383611e58565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a835760405163703e46dd60e11b815260040160405180910390fd5b606061104f83835f611ead565b6001600160a01b0381165f908152600183016020526040812054151561104f565b5f61104f8383611f4d565b5f610b18848484611f73565b60605f611be583611f97565b60010190505f816001600160401b03811115611c0357611c0361231a565b6040519080825280601f01601f191660200182016040528015611c2d576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c3757509392505050565b5f81600c811115611c7b57611c7b612b4b565b6001901b831615159392505050565b6001600160a01b038316611cb15760405163de0ce17d60e01b815260040160405180910390fd5b611cba8161206e565b611cda57604051632e40743360e01b815260048101829052602401610ad0565b6001600160a01b0382165f9081526009602052604090205481846001600160a01b0316846001600160a01b03167f89733de2d64cea40de091169750607b26e8d46142312fba65fb6476c790bad4984604051611d3891815260200190565b60405180910390a45f9081526008602090815260408083206001600160a01b03968716845282528083209490951682529290925291902055565b60605f80846001600160a01b031684604051611d8e9190613177565b5f60405180830381855af49150503d805f8114611dc6576040519150601f19603f3d011682016040523d82523d5f602084013e611dcb565b606091505b5091509150610a5e858383612087565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108b4565b611a836120e3565b5f61104f836001600160a01b038416612108565b611e2982826110e3565b610a825760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610ad0565b611e6182612154565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611ea5576109cb8282611d72565b610a826121b7565b606081471015611ed95760405163cf47918160e01b815247600482015260248101839052604401610ad0565b5f80856001600160a01b03168486604051611ef49190613177565b5f6040518083038185875af1925050503d805f8114611f2e576040519150601f19603f3d011682016040523d82523d5f602084013e611f33565b606091505b5091509150611f43868383612087565b9695505050505050565b5f825f018281548110611f6257611f62612dba565b905f5260205f200154905092915050565b5f825f190484118302158202611f905763ad251c275f526004601cfd5b5091020490565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fd55772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061201f57662386f26fc10000830492506010015b6305f5e1008310612037576305f5e100830492506008015b612710831061204b57612710830492506004015b6064831061205d576064830492506002015b600a83106108b45760010192915050565b5f8061207d6001611000612e82565b9092111592915050565b60608261209c57612097826121d6565b61104f565b81511580156120b357506001600160a01b0384163b155b156120dc57604051639996b31560e01b81526001600160a01b0385166004820152602401610ad0565b508061104f565b6120eb6121ff565b611a8357604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461214d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b4565b505f6108b4565b806001600160a01b03163b5f0361218957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ad0565b5f8051602061319383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611a835760405163b398979f60e01b815260040160405180910390fd5b8051156121e65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f612208611ddb565b54600160401b900460ff16919050565b6001600160a01b0381168114611123575f80fd5b5f6020828403121561223c575f80fd5b813561104f81612218565b5f60208284031215612257575f80fd5b81356001600160e01b03198116811461104f575f80fd5b803561227981612218565b919050565b5f6020828403121561228e575f80fd5b5035919050565b5f80604083850312156122a6575f80fd5b8235915060208301356122b881612218565b809150509250929050565b5f805f805f60a086880312156122d7575f80fd5b85356122e281612218565b94506020860135935060408601356122f981612218565b9250606086013561230981612218565b949793965091946080013592915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156123505761235061231a565b60405290565b60405161014081016001600160401b03811182821017156123505761235061231a565b604051601f8201601f191681016001600160401b03811182821017156123a1576123a161231a565b604052919050565b5f6001600160401b038211156123c1576123c161231a565b50601f01601f191660200190565b5f80604083850312156123e0575f80fd5b82356123eb81612218565b915060208301356001600160401b03811115612405575f80fd5b8301601f81018513612415575f80fd5b8035612428612423826123a9565b612379565b81815286602083850101111561243c575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f5b8381101561247557818101518382015260200161245d565b50505f910152565b5f815180845261249481602086016020860161245b565b601f01601f19169290920160200192915050565b602081525f61104f602083018461247d565b5f805f604084860312156124cc575f80fd5b83356124d781612218565b925060208401356001600160401b03808211156124f2575f80fd5b818601915086601f830112612505575f80fd5b813581811115612513575f80fd5b876020828501011115612524575f80fd5b6020830194508093505050509250925092565b5f805f806080858703121561254a575f80fd5b843561255581612218565b935060208501359250604085013561256c81612218565b9396929550929360600135925050565b5f60a0828403121561258c575f80fd5b61259461232e565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f61016084860312156125db575f80fd5b833592506125ec856020860161257c565b91506125fb8560c0860161257c565b90509250925092565b5f82601f830112612613575f80fd5b813560206001600160401b0382111561262e5761262e61231a565b8160051b61263d828201612379565b9283528481018201928281019087851115612656575f80fd5b83870192505b848310156126755782358252918301919083019061265c565b979650505050505050565b5f8060408385031215612691575f80fd5b82356001600160401b038111156126a6575f80fd5b6126b285828601612604565b92505060208301356122b881612218565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261270685835161247d565b945092850192908501906001016126ea565b5092979650505050505050565b5f805f60608486031215612737575f80fd5b83359250602084013561274981612218565b9150604084013561275981612218565b809150509250925092565b5f805f60608486031215612776575f80fd5b833561278181612218565b9250602084013561279181612218565b91506040840135600d8110612759575f80fd5b5f805f8061018085870312156127b8575f80fd5b843593506127c9866020870161257c565b92506127d88660c0870161257c565b91506101608501356127e981612218565b939692955090935050565b5f8060408385031215612805575f80fd5b823561281081612218565b946020939093013593505050565b5f6020828403121561282e575f80fd5b81356001600160401b03811115612843575f80fd5b610b1884828501612604565b5f805f60608486031215612861575f80fd5b833561286c81612218565b9250602084013561287c81612218565b929592945050506040919091013590565b5f806020838503121561289e575f80fd5b82356001600160401b03808211156128b4575f80fd5b818501915085601f8301126128c7575f80fd5b8135818111156128d5575f80fd5b8660208260051b85010111156128e9575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261293e85835161247d565b94509285019290850190600101612922565b803563ffffffff81168114612279575f80fd5b5f6101408284031215612974575f80fd5b61297c612356565b6129858361226e565b815261299360208401612950565b60208201526129a460408401612950565b60408201526129b56060840161226e565b60608201526129c66080840161226e565b60808201526129d760a0840161226e565b60a08201526129e860c0840161226e565b60c082015260e083013560e0820152610100808401358183015250610120612a1181850161226e565b908201529392505050565b5f8060408385031215612a2d575f80fd5b8235612a3881612218565b915060208301356122b881612218565b602080825282518282018190525f9190848201906040850190845b81811015612a885783516001600160a01b031683529284019291840191600101612a63565b50909695505050505050565b5f60c08284031215612aa4575f80fd5b50919050565b5f805f80848603610260811215612abf575f80fd5b612ac98787612a94565b945060a060bf1982011215612adc575f80fd5b60c086019350604061015f1982011215612af4575f80fd5b5061016085019150612b0a866101a08701612a94565b905092959194509250565b5f60208284031215612b25575f80fd5b5051919050565b5f60208284031215612b3c575f80fd5b8151801515811461104f575f80fd5b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b03831681526040602080830182905283519183018290525f9184820191906060850190845b81811015612ba757845183529383019391830191600101612b8b565b5090979650505050505050565b5f60a08284031215612bc4575f80fd5b612bcc61232e565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b805161227981612218565b5f610100808385031215612c1f575f80fd5b604051908101906001600160401b0382118183101715612c4157612c4161231a565b81604052835181526020840151602082015260408401519150612c6382612218565b816040820152612c7560608501612c02565b6060820152612c8660808501612c02565b6080820152612c9760a08501612c02565b60a0820152612ca860c08501612c02565b60c0820152612cb960e08501612c02565b60e0820152949350505050565b5f60208284031215612cd6575f80fd5b81516001600160401b03811115612ceb575f80fd5b8201601f81018413612cfb575f80fd5b8051612d09612423826123a9565b818152856020838501011115612d1d575f80fd5b610a5e82602083016020860161245b565b66029b4bd32903e160cd1b81525f8551612d4f816007850160208a0161245b565b8083019050620103e160ed1b8060078301528651612d7481600a850160208b0161245b565b600a92019182018190528551612d9181600d850160208a0161245b565b600d9201918201528351612dac81601084016020880161245b565b016010019695505050505050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0385168152602081018490526101808101612e1e604083018580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160e08301526020830151610100830152604083015161012083015260608301516101408301526080830151610160830152610a5e565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612e7b57612e7b612e56565b5060010190565b818103818111156108b4576108b4612e56565b5f808335601e19843603018112612eaa575f80fd5b8301803591506001600160401b03821115612ec3575f80fd5b602001915036819003821315612ed7575f80fd5b9250929050565b828482375f8382015f81528351612ef981836020880161245b565b0195945050505050565b81516001600160a01b0316815261014081016020830151612f2c602084018263ffffffff169052565b506040830151612f44604084018263ffffffff169052565b506060830151612f5f60608401826001600160a01b03169052565b506080830151612f7a60808401826001600160a01b03169052565b5060a0830151612f9560a08401826001600160a01b03169052565b5060c0830151612fb060c08401826001600160a01b03169052565b5060e083810151908301526101008084015190830152610120808401516001600160a01b038116828501526112fb565b5f60208284031215612ff0575f80fd5b815161104f81612218565b803561300681612218565b6001600160a01b0316825260208101356001600160401b03811680821461302b575f80fd5b80602085015250505050565b803561304281612218565b6001600160a01b03908116835260208201359061305e82612218565b908116602084015260408201359061307582612218565b908116604084015260608201359061308c82612218565b90811660608401526080820135906130a382612218565b908116608084015260a0820135906130ba82612218565b80821660a085015250505050565b5f6102a08201905060018060a01b0380891683528088166020840152863560408401526020870135606084015260408701356080840152606087013560a0840152608087013560c084015260a087013561312181612218565b1660e0830152843561010083015260208501356101208301526040850135610140830152606085013561016083015260808501356101808301526131696101a0830185612ffb565b6126756101e0830184613037565b5f825161318881846020870161245b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c0dc8864e841f2aab5145e7160a959acaf73c71a60a5e9aa5756212f1828845964736f6c63430008170033", + "nonce": "0xe7", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1397be8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x12ec4b362249a03acad003fda1c8579eea529358ce426c01f3de819f7e153f83", + "transactionIndex": "0xd2", + "blockHash": "0x5c9d9a0a93fc4833ba7bf5f0c96768947afb16d2acf654e0465ace4c7e0d6e7f", + "blockNumber": "0x168d656", + "gasUsed": "0x74797", + "effectiveGasPrice": "0x396914e2", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1050573", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x27ab659ce7d830b3e511ea0478a792350e700439ee979fad87dbd7fe97549b47", + "transactionIndex": "0xbf", + "blockHash": "0xd91159655b9f561b69b94ce71b0b3fdb8e38ad2d3ec7575bd831e5d0124bfaa8", + "blockNumber": "0x168d657", + "gasUsed": "0x885ee", + "effectiveGasPrice": "0x3c4d2009", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaf938", + "logs": [ + { + "address": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xa4c62a7b87e347cb70f8d01c5ad423a04da1bcb5f7c0939c9536c1f507625183", + "blockNumber": "0x168d658", + "blockTimestamp": "0x68fb88cf", + "transactionHash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionIndex": "0x4d", + "logIndex": "0x13f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000004000000000000000000000000000000000000000000000000000000000000400000000000000000000000", + "type": "0x2", + "transactionHash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionIndex": "0x4d", + "blockHash": "0xa4c62a7b87e347cb70f8d01c5ad423a04da1bcb5f7c0939c9536c1f507625183", + "blockNumber": "0x168d658", + "gasUsed": "0x3a9efe", + "effectiveGasPrice": "0x3bc33dcd", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1081998", + "logs": [ + { + "address": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x0e0634b1216b6686ccc98173f88b825a69ca45181af32fc9ee6aae340398ddfb", + "blockNumber": "0x168d659", + "blockTimestamp": "0x68fb88db", + "transactionHash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionIndex": "0x8d", + "logIndex": "0x1be", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000010000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000010000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionIndex": "0x8d", + "blockHash": "0x0e0634b1216b6686ccc98173f88b825a69ca45181af32fc9ee6aae340398ddfb", + "blockNumber": "0x168d659", + "gasUsed": "0x2b78c6", + "effectiveGasPrice": "0x3e49da46", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a" + } + ], + "libraries": [ + "src/factory/libraries/MarketFactoryLibrary.sol:MarketFactoryLibrary:0x22C26A06ef6C51BbCa1cF5276E1606e89402979a", + "src/factory/libraries/NonTransferrableRebasingTokenVaultLibrary.sol:NonTransferrableRebasingTokenVaultLibrary:0xB4A15fB08Dbe6a161FF1D411be2d9F67F0606118", + "src/factory/libraries/PriceFeedFactoryLibrary.sol:PriceFeedFactoryLibrary:0xe8Dc58C7f234e49F024cE03e926BE80FC2dB0f7d" + ], + "pending": [], + "returns": {}, + "timestamp": 1761315146906, + "chain": 1, + "commit": "2aea4c3d" +} \ No newline at end of file diff --git a/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-latest.json b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-latest.json new file mode 100644 index 00000000..9564672a --- /dev/null +++ b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/1/run-latest.json @@ -0,0 +1,182 @@ +{ + "transactions": [ + { + "hash": "0x12ec4b362249a03acad003fda1c8579eea529358ce426c01f3de819f7e153f83", + "transactionType": "CREATE2", + "contractName": "MarketFactoryLibrary", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0e14", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006107a3610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063d41bcfc514610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610132565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8087878787878760405160240161008f959493929190610271565b60408051601f198184030181529181526020820180516001600160e01b031663f1bf35c360e01b179052516100c3906100f4565b6100ce929190610321565b604051809103905ff0801580156100e7573d5f803e3d5ffd5b5098975050505050505050565b6103f08061037e83390190565b80356001600160a01b0381168114610117575f80fd5b919050565b5f60c0828403121561012c575f80fd5b50919050565b5f805f805f808688036102a0811215610149575f80fd5b61015288610101565b965061016060208901610101565b955061016f8960408a0161011c565b945060a060ff1982011215610182575f80fd5b61010088019350604061019f198201121561019b575f80fd5b506101a0870191506101b1886101e0890161011c565b90509295509295509295565b6001600160a01b036101ce82610101565b168252602081013567ffffffffffffffff81168082146101ec575f80fd5b80602085015250505050565b6001600160a01b038061020a83610101565b1683528061021a60208401610101565b1660208401528061022d60408401610101565b1660408401528061024060608401610101565b1660608401528061025360808401610101565b1660808401528061026660a08401610101565b1660a0840152505050565b5f6102808201905060018060a01b03808816835286356020840152602087013560408401526040870135606084015260608701356080840152608087013560a0840152806102c160a08901610101565b1660c084015250843560e083015260208501356101008301526040850135610120830152606085013561014083015260808501356101608301526103096101808301856101bd565b6103176101c08301846101f8565b9695505050505050565b60018060a01b03831681525f60206040602084015283518060408501525f5b8181101561035c57858101830151858201606001528201610340565b505f606082860101526060601f19601f83011685010192505050939250505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a2646970667358221220670540a779fc707ba2d74908460b71b5f911940396a8e4eec820b0783b7eb1cf64736f6c63430008170033", + "nonce": "0xe4", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x27ab659ce7d830b3e511ea0478a792350e700439ee979fad87dbd7fe97549b47", + "transactionType": "CREATE2", + "contractName": "NonTransferrableRebasingTokenVaultLibrary", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xbc5c9", + "input": "0x000000000000000000000000000000000000000000000000000000000000000061091b610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80630550810a14610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610277565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8430848487866001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100b4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100db9190810190610306565b6040516020016100eb91906103ae565b604051602081830303815290604052876001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610135573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261015c9190810190610306565b60405160200161016c91906103ea565b604051602081830303815290604052886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101db9190610413565b6040516024016101f19796959493929190610465565b60408051601f198184030181529181526020820180516001600160e01b0316631f0cbe6160e01b1790525161022590610253565b6102309291906104ca565b604051809103905ff080158015610249573d5f803e3d5ffd5b5095945050505050565b6103f0806104f683390190565b6001600160a01b0381168114610274575f80fd5b50565b5f805f806080858703121561028a575f80fd5b843561029581610260565b935060208501356102a581610260565b925060408501356102b581610260565b915060608501356102c581610260565b939692955090935050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102fe5781810151838201526020016102e6565b50505f910152565b5f60208284031215610316575f80fd5b815167ffffffffffffffff8082111561032d575f80fd5b818401915084601f830112610340575f80fd5b815181811115610352576103526102d0565b604051601f8201601f19908116603f0116810190838211818310171561037a5761037a6102d0565b81604052828152876020848701011115610392575f80fd5b6103a38360208301602088016102e4565b979650505050505050565b64029b4bd32960dd1b81525f82516103cd8160058501602087016102e4565b650815985d5b1d60d21b6005939091019283015250600b01919050565b6139bb60f11b81525f82516104068160028501602087016102e4565b9190910160020192915050565b5f60208284031215610423575f80fd5b815160ff81168114610433575f80fd5b9392505050565b5f81518084526104518160208601602086016102e4565b601f01601f19169290920160200192915050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260e0608082018190525f906104a09083018661043a565b82810360a08401526104b2818661043a565b91505060ff831660c083015298975050505050505050565b6001600160a01b03831681526040602082018190525f906104ed9083018461043a565b94935050505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a26469706673582212209d2380a7304f006d1c66be055eaf76eddad4d8b6b38978aec43f72b90761da5e64736f6c63430008170033", + "nonce": "0xe5", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionType": "CREATE", + "contractName": "CollectionsManager", + "contractAddress": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x4c3517", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516143f6620001005f395f8181611f3a01528181611f63015261213301526143f65ff3fe608060405260043610610249575f3560e01c806370a0823111610134578063ac9650d8116100b3578063c4d66de811610078578063c4d66de8146106f2578063c87b56dd14610711578063dd2bc30214610730578063de1eb8801461075c578063e985e9c51461077b578063eb379a581461079a575f80fd5b8063ac9650d81461062c578063ad3cb1cc14610658578063b88d4fde14610688578063b9d33d1e146106a7578063c260d206146106d3575f80fd5b80639feffdb0116100f95780639feffdb014610591578063a0529e5f146105b0578063a22cb465146105cf578063abff1222146105ee578063ac888c071461060d575f80fd5b806370a08231146105015780638134a9e01461052057806393c0d3f31461053f57806395d89b411461055e5780639e4082db14610572575f80fd5b80633184b046116101cb57806352d1902d1161019057806352d1902d1461045b578063565380571461046f5780635fb7f10c146104905780636352211e146104af578063647f1a9c146104ce578063678b9bad146104e2575f80fd5b80633184b046146103bf57806342842e0e146103eb578063495e6d891461040a5780634f1ef286146104295780634f6ccce71461043c575f80fd5b806318160ddd1161021157806318160ddd1461031957806318d5932d1461034357806320d634561461036257806323b872dd146103815780632f745c59146103a0575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630b379508146102fa575b5f80fd5b348015610258575f80fd5b5061026c61026736600461362c565b6107b9565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107e3565b6040516102789190613694565b3480156102ad575f80fd5b506102c16102bc3660046136a6565b610884565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f33660046136d1565b610898565b005b348015610305575f80fd5b506102f8610314366004613789565b6108a7565b348015610324575f80fd5b505f805160206143a1833981519152545b604051908152602001610278565b34801561034e575f80fd5b506102f861035d36600461388b565b6109dd565b34801561036d575f80fd5b5061026c61037c3660046136d1565b610a1b565b34801561038c575f80fd5b506102f861039b3660046138da565b610a43565b3480156103ab575f80fd5b506103356103ba3660046136d1565b610ac6565b3480156103ca575f80fd5b506103de6103d93660046136d1565b610b37565b6040516102789190613918565b3480156103f6575f80fd5b506102f86104053660046138da565b610b4a565b348015610415575f80fd5b50610335610424366004613951565b610b69565b6102f8610437366004613a13565b610b84565b348015610447575f80fd5b506103356104563660046136a6565b610b9f565b348015610466575f80fd5b50610335610c11565b34801561047a575f80fd5b5061026c6104893660046136a6565b6001541190565b34801561049b575f80fd5b506103356104aa366004613951565b610c2d565b3480156104ba575f80fd5b506102c16104c93660046136a6565b610c3d565b3480156104d9575f80fd5b50610335610c47565b3480156104ed575f80fd5b5061026c6104fc366004613a5f565b610c67565b34801561050c575f80fd5b5061033561051b366004613aa4565b610c80565b34801561052b575f80fd5b5061026c61053a366004613abf565b610cd8565b34801561054a575f80fd5b506102f8610559366004613aed565b610d1a565b348015610569575f80fd5b50610295610eb0565b34801561057d575f80fd5b506103de61058c3660046136d1565b610eee565b34801561059c575f80fd5b5061026c6105ab366004613a5f565b610f02565b3480156105bb575f80fd5b506102f86105ca366004613b8d565b610f11565b3480156105da575f80fd5b506102f86105e9366004613c2b565b611187565b3480156105f9575f80fd5b506102f8610608366004613b8d565b611192565b348015610618575f80fd5b5061026c610627366004613c57565b61132e565b348015610637575f80fd5b5061064b610646366004613ca7565b6113cf565b6040516102789190613d15565b348015610663575f80fd5b50610295604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610693575f80fd5b506102f86106a2366004613d77565b6114b4565b3480156106b2575f80fd5b506106c66106c1366004613aa4565b6114cc565b6040516102789190613dde565b3480156106de575f80fd5b506103356106ed366004613e21565b6114ef565b3480156106fd575f80fd5b506102f861070c366004613aa4565b61160f565b34801561071c575f80fd5b5061029561072b3660046136a6565b611789565b34801561073b575f80fd5b5061074f61074a366004613abf565b6117ed565b6040516102789190613e8d565b348015610767575f80fd5b506102f8610776366004613aed565b61189b565b348015610786575f80fd5b5061026c610795366004613ecd565b6119cb565b3480156107a5575f80fd5b506102f86107b4366004613789565b611a17565b5f6001600160e01b0319821663780e9d6360e01b14806107dd57506107dd82611b3a565b92915050565b5f80516020614361833981519152805460609190819061080290613ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613ef9565b80156108795780601f1061085057610100808354040283529160200191610879565b820191905f5260205f20905b81548152906001019060200180831161085c57829003601f168201915b505050505091505090565b5f61088e82611b89565b506107dd82611bc0565b6108a3828233611bf9565b5050565b826108bb6108b482610c3d565b3383611c06565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff1661091457604051631713bf1160e21b8152600481018590526001600160a01b03841660248201526044015b60405180910390fd5b5f5b82518110156109d6575f61096a84838151811061093557610935613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b0190611c6a565b905080156109cd5783828151811061098457610984613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f41a3856b408397a3953ee2e3fc5961815599fafae92aa64253fea4124c15835260405160405180910390a45b50600101610916565b5050505050565b5f546001600160a01b03163314610a0957604051630b56d23b60e41b815233600482015260240161090b565b610a1584848484611c7e565b50505050565b6001600160a01b0382165f908152600360205260408120610a3c9083611d87565b9392505050565b6001600160a01b038216610a6c57604051633250574960e11b81525f600482015260240161090b565b5f610a78838333611d9e565b9050836001600160a01b0316816001600160a01b031614610a15576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161090b565b5f5f80516020614341833981519152610ade84610c80565b8310610b0f5760405163295f44f760e21b81526001600160a01b03851660048201526024810184905260440161090b565b6001600160a01b0384165f908152602091825260408082208583529092522054905092915050565b610b3f6135c3565b610a3c83835f611e94565b610b6483838360405180602001604052805f8152506114b4565b505050565b5f610b7886868686865f6114ef565b90505b95945050505050565b610b8c611f2f565b610b9582611fd5565b6108a3828261206c565b5f5f80516020614341833981519152610bc35f805160206143a18339815191525490565b8310610beb5760405163295f44f760e21b81525f60048201526024810184905260440161090b565b806002018381548110610c0057610c00613f31565b905f5260205f200154915050919050565b5f610c1a612128565b505f805160206143818339815191525b90565b5f610b78868686868660016114ef565b5f6107dd82611b89565b600180545f9182610c5783613f59565b919050559050610c2a3382612171565b5f610c75858585855f61218a565b90505b949350505050565b5f5f805160206143618339815191526001600160a01b038316610cb8576040516322718ad960e21b81525f600482015260240161090b565b6001600160a01b039092165f908152600390920160205250604090205490565b5f610ce4836001541190565b610cef57505f6107dd565b505f9182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f546001600160a01b03163314610d4657604051630b56d23b60e41b815233600482015260240161090b565b5f6040518060a001604052805f81526020015f1981526020015f81526020015f1981526020015f81525090505f5b8251811015610a1557610da1838281518110610d9257610d92613f31565b60200260200101516001541190565b610ddb57828181518110610db757610db7613f31565b602002602001015160405163500f73d960e01b815260040161090b91815260200190565b5f610e2a848381518110610df157610df1613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f2061243990919063ffffffff16565b90508015610ea757838281518110610e4457610e44613f31565b6020026020010151856001600160a01b03167fe9919c1157673d017b4e5eef8d4c012fadcf6ee40cf5f99a0912a0109b5d584260405160405180910390a3610ea785858481518110610e9857610e98613f31565b60200260200101518586611c7e565b50600101610d74565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f805160206143618339815191529161080290613ef9565b610ef66135c3565b610a3c83836001611e94565b5f610c7585858585600161218a565b81610f1e6108b482610c3d565b5f5b8251811015610a15575f5483516001600160a01b0390911690636ec934da90859084908110610f5157610f51613f31565b60200260200101516040518263ffffffff1660e01b8152600401610f8491906001600160a01b0391909116815260200190565b602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190613f71565b61100a57828181518110610fd957610fd9613f31565b602002602001015160405163e2a7bea360e01b815260040161090b91906001600160a01b0391909116815260200190565b82818151811061101c5761101c613f31565b60200260200101516001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110839190613f71565b156110cb5782818151811061109a5761109a613f31565b602002602001015160405163b4e1115760e01b815260040161090b91906001600160a01b0391909116815260200190565b5f8481526002602052604081208451600192908690859081106110f0576110f0613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f6101000a81548160ff02191690831515021790555082818151811061114157611141613f31565b60200260200101516001600160a01b0316847f42e38738c8d2e007a797548d288aea65537b98d212336f6fa33ca20c7a99088560405160405180910390a3600101610f20565b6108a3338383612444565b8161119f6108b482610c3d565b5f5b8251811015610a15575f61120160025f8781526020019081526020015f205f8685815181106111d2576111d2613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600b016124ea565b90506112278585848151811061121957611219613f31565b6020026020010151836108a7565b60025f8681526020019081526020015f205f85848151811061124b5761124b613f31565b6020908102919091018101516001600160a01b031682528101919091526040015f908120805460ff19168155600181018290556002810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560098101829055600a810182905590600b82018181816112cf82826135ed565b5050505050508382815181106112e7576112e7613f31565b60200260200101516001600160a01b0316857fa328ee555a02ae133b939087dcc439417783329f687112f415290a4637f64ab760405160405180910390a3506001016111a1565b5f61133a846001541190565b61134557505f610c78565b6001600160a01b0385165f9081526003602052604090206113669085611d87565b61137157505f610c78565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff166113a157505f610c78565b5f8481526002602090815260408083206001600160a01b03871684529091529020610c7590600b01836124f6565b604080515f815260208101909152606090826001600160401b038111156113f8576113f86136fb565b60405190808252806020026020018201604052801561142b57816020015b60608152602001906001900390816114165790505b5091505f5b838110156114ac576114873086868481811061144e5761144e613f31565b90506020028101906114609190613f9f565b8560405160200161147393929190613fe8565b604051602081830303815290604052612517565b83828151811061149957611499613f31565b6020908102919091010152600101611430565b505092915050565b6114bf848484610a43565b610a153385858585612580565b6001600160a01b0381165f9081526003602052604090206060906107dd906124ea565b5f5f19860361150b576115048786858561269f565b9050611605565b6115178787878761132e565b61154e5760405163c6c8526f60e01b8152600481018790526001600160a01b0380871660248301528516604482015260640161090b565b5f61155b88888886612751565b80519091508410806115705750806020015184115b156115a55780516020820151604051633e5d735760e21b8152600481018790526024810192909252604482015260640161090b565b5f6115b28688878761269f565b90506115d482608001516115c58361277f565b6115cf919061400d565b6127af565b925081604001518310156115ee5781604001519250611602565b816060015183111561160257816060015192505b50505b9695505050505050565b5f6116186127d4565b805490915060ff600160401b82041615906001600160401b03165f8115801561163e5750825b90505f826001600160401b031660011480156116595750303b155b905081158015611667575080155b156116855760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116af57845460ff60401b1916600160401b1785555b6117096040518060400160405280601081526020016f53697a6520436f6c6c656374696f6e7360801b8152506040518060400160405280601081526020016f53495a455f434f4c4c454354494f4e5360801b8152506127fc565b61171161280e565b61171961280e565b61172161280e565b5f80546001600160a01b0319166001600160a01b038816179055831561178157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b606061179482611b89565b505f61179e612816565b90505f8151116117bc5760405180602001604052805f815250610a3c565b806117c684612845565b6040516020016117d792919061402c565b6040516020818303038152906040529392505050565b60606117fa836001541190565b61181a5760405163500f73d960e01b81526004810184905260240161090b565b5f8381526002602090815260408083206001600160a01b038616845290915290205460ff1661186e57604051631713bf1160e21b8152600481018490526001600160a01b038316602482015260440161090b565b5f8381526002602090815260408083206001600160a01b03861684529091529020610a3c90600b016124ea565b5f546001600160a01b031633146118c757604051630b56d23b60e41b815233600482015260240161090b565b6118cf6135c3565b5f5b8251811015610a15576118ef838281518110610d9257610d92613f31565b61190557828181518110610db757610db7613f31565b5f61195484838151811061191b5761191b613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f206128d490919063ffffffff16565b905080156119c25783828151811061196e5761196e613f31565b6020026020010151856001600160a01b03167fd0b1806956ca744bd88a4e4057a137959cb88d8d4e7e8d793301cfdf7df7cb2b60405160405180910390a36119c285858481518110610e9857610e98613f31565b506001016118d1565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b82611a246108b482610c3d565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff16611a7857604051631713bf1160e21b8152600481018590526001600160a01b038416602482015260440161090b565b5f5b82518110156109d6575f611ace848381518110611a9957611a99613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b01906128df565b90508015611b3157838281518110611ae857611ae8613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f8e2f88c467ecc78e2adbbe6d65b6176668f4cc362a196a5c46d203a9db8d8fbe60405160405180910390a45b50600101611a7a565b5f6001600160e01b031982166380ac58cd60e01b1480611b6a57506001600160e01b03198216635b5e139f60e01b145b806107dd57506301ffc9a760e01b6001600160e01b03198316146107dd565b5f80611b94836128f3565b90506001600160a01b0381166107dd57604051637e27328960e01b81526004810184905260240161090b565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b64838383600161292c565b611c11838383612a3f565b610b64576001600160a01b038316611c3f57604051637e27328960e01b81526004810182905260240161090b565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161090b565b5f610a3c836001600160a01b038416612aa3565b611c89836001541190565b611ca95760405163500f73d960e01b81526004810184905260240161090b565b611cb38282612b86565b60408051808201825283815260208082018481526001600160a01b0388165f81815260048085528682208a8352855290869020945180518655808501516001870155808701516002870155606080820151600388015560809182015192870192909255925180516005870155938401516006860155838601516007860155830151600885015591015160099092019190915590518491907fb20b9722fd4401237d66274470a4daf19d973d3f3150edba3bcadf8467ed9b4290611d79908690869061405a565b60405180910390a350505050565b5f8181526001830160205260408120541515610a3c565b5f80611dab858585612d18565b90506001600160a01b038116611e3257611e2d845f805160206143a183398151915280545f8381527f645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0360205260408120829055600182018355919091527fa42f15e5d656f8155fd7419d740a6073999f19cd6e061449ce4a257150545bf20155565b611e55565b846001600160a01b0316816001600160a01b031614611e5557611e558185612e1a565b6001600160a01b038516611e7157611e6c84612eb1565b610c78565b846001600160a01b0316816001600160a01b031614610c7857610c788585612f7e565b611e9c6135c3565b81611ecb576001600160a01b0384165f9081526004602090815260408083208684529091529020600501611eee565b6001600160a01b0384165f90815260046020908152604080832086845290915290205b6040805160a0810182528254815260018301546020820152600283015491810191909152600382015460608201526004909101546080820152949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fa95f80516020614381833981519152546001600160a01b031690565b6001600160a01b031614155b15611fd35760405163703e46dd60e11b815260040160405180910390fd5b565b5f8054604051632474521560e21b8152600481018390523360248201526001600160a01b03909116906391d1485490604401602060405180830381865afa158015612022573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120469190613f71565b6108a35760405163e2517d3f60e01b81523360048201526024810182905260440161090b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120c6575060408051601f3d908101601f191682019092526120c3918101906140ca565b60015b6120ee57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161090b565b5f80516020614381833981519152811461211e57604051632a87526960e21b81526004810182905260240161090b565b610b648383612fd6565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fd35760405163703e46dd60e11b815260040160405180910390fd5b6108a3828260405180602001604052805f81525061302b565b6001600160a01b0385165f908152600360205260408120815b6121ac82613042565b811015612340575f6121be838361304b565b5f8181526002602090815260408083206001600160a01b038c16845290915290205490915060ff166121f05750612338565b5f8181526002602090815260408083206001600160a01b038b1684529091528120600b01905b61221f82613042565b811015612334575f612231838361304b565b905061223f818b8a15613056565b1561224a575061232c565b306001600160a01b031663c260d2068d868d858e8e156040518763ffffffff1660e01b8152600401612281969594939291906140e1565b602060405180830381865afa9250505080156122ba575060408051601f3d908101601f191682019092526122b7918101906140ca565b60015b6122f3573d8080156122e7576040519150601f19603f3d011682016040523d82523d5f602084013e6122ec565b606091505b505061232a565b88801561230057508b8110155b806123145750881580156123145750808c10155b15612328575f975050505050505050610b7b565b505b505b600101612216565b5050505b6001016121a3565b5061234d87868515613056565b1561235c576001915050610b7b565b604051636130690360e11b8152309063c260d2069061238b908a905f19908a905f908b908b15906004016140e1565b602060405180830381865afa9250505080156123c4575060408051601f3d908101601f191682019092526123c1918101906140ca565b60015b6123fd573d8080156123f1576040519150601f19603f3d011682016040523d82523d5f602084013e6123f6565b606091505b505061242f565b83801561240a5750868110155b8061241e57508315801561241e5750808710155b1561242d575f92505050610b7b565b505b6001915050610b7b565b5f610a3c838361312c565b5f805160206143618339815191526001600160a01b03831661248457604051630b61174360e31b81526001600160a01b038416600482015260240161090b565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611d79565b60605f610a3c83613178565b6001600160a01b0381165f9081526001830160205260408120541515610a3c565b60605f80846001600160a01b031684604051612533919061411b565b5f60405180830381855af49150503d805f811461256b576040519150601f19603f3d011682016040523d82523d5f602084013e612570565b606091505b5091509150610b7b8583836131d1565b6001600160a01b0383163b156109d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906125c2908890889087908790600401614136565b6020604051808303815f875af19250505080156125fc575060408051601f3d908101601f191682019092526125f991810190614168565b60015b612663573d808015612629576040519150601f19603f3d011682016040523d82523d5f602084013e61262e565b606091505b5080515f0361265b57604051633250574960e11b81526001600160a01b038516600482015260240161090b565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461178157604051633250574960e11b81526001600160a01b038516600482015260240161090b565b5f811561271c57604051620d37ab60e81b81526001600160a01b03868116600483015260248201859052851690630d37ab00906044015b602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271591906140ca565b9050610c78565b604051632b59bd9960e01b81526001600160a01b03868116600483015260248201859052851690632b59bd99906044016126d6565b6127596135c3565b61276485848461322d565b905061276f8161330a565b15610c7857610c75858584611e94565b5f6001600160ff1b038211156127ab5760405163123baf0360e11b81526004810183905260240161090b565b5090565b5f808212156127ab57604051635467221960e11b81526004810183905260240161090b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006107dd565b612804613349565b6108a3828261336e565b611fd3613349565b606061282146612845565b6040516020016128319190614183565b604051602081830303815290604052905090565b60605f6128518361339e565b60010190505f816001600160401b0381111561286f5761286f6136fb565b6040519080825280601f01601f191660200182016040528015612899576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128a357509392505050565b5f610a3c8383612aa3565b5f610a3c836001600160a01b03841661312c565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f80516020614361833981519152818061294e57506001600160a01b03831615155b15612a0f575f61295d85611b89565b90506001600160a01b038416158015906129895750836001600160a01b0316816001600160a01b031614155b801561299c575061299a81856119cb565b155b156129c55760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161090b565b8215612a0d5784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160a01b03831615801590610c785750826001600160a01b0316846001600160a01b03161480612a785750612a7884846119cb565b80610c785750826001600160a01b0316612a9183611bc0565b6001600160a01b031614949350505050565b5f8181526001830160205260408120548015612b7d575f612ac5600183613f8c565b85549091505f90612ad890600190613f8c565b9050808214612b37575f865f018281548110612af657612af6613f31565b905f5260205f200154905080875f018481548110612b1657612b16613f31565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612b4857612b486141df565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107dd565b5f9150506107dd565b602082015182511115612bbc57815160208301516040516307198f4960e11b81526004810192909252602482015260440161090b565b816060015182604001511115612bfa5781604001518260600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b602081015181511115612c3057805160208201516040516307198f4960e11b81526004810192909252602482015260440161090b565b806060015181604001511115612c6e5780604001518160600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b81606001518160400151118015612c8a57508151602082015110155b8015612c9b57508051602083015110155b156108a357805f0151816020015182604001518360600151855f015186602001518760400151886060015160405163a19d2d6760e01b815260040161090b989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b5f5f8051602061436183398151915281612d31856128f3565b90506001600160a01b03841615612d4d57612d4d818587611c06565b6001600160a01b03811615612d8957612d685f865f8061292c565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615612db9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f805160206143418339815191525f612e3284610c80565b5f8481526001840160209081526040808320546001600160a01b03891684529186905290912091925090818314612e8a575f838152602082815260408083205485845281842081905583526001870190915290208290555b5f948552600190930160209081526040808620869055928552929092528220919091555050565b5f805160206143a1833981519152545f80516020614341833981519152905f90612edd90600190613f8c565b5f848152600384016020526040812054600285018054939450909284908110612f0857612f08613f31565b905f5260205f200154905080846002018381548110612f2957612f29613f31565b5f91825260208083209091019290925582815260038601909152604080822084905586825281205560028401805480612f6457612f646141df565b600190038181905f5260205f20015f905590555050505050565b5f805160206143418339815191525f6001612f9885610c80565b612fa29190613f8c565b6001600160a01b039094165f9081526020838152604080832087845282528083208690559482526001909301909252502055565b612fdf82613475565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561302357610b648282612517565b6108a36134d8565b61303583836134f7565b610b64335f858585612580565b5f6107dd825490565b5f610a3c8383613558565b5f816130c457604051630cfa9a4960e01b81526001600160a01b038581166004830152841690630cfa9a4990602401602060405180830381865afa1580156130a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c9190613f71565b60405163044ce7c360e41b81526001600160a01b0385811660048301528416906344ce7c3090602401602060405180830381865afa158015613108573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c789190613f71565b5f81815260018301602052604081205461317157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107dd565b505f6107dd565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131c557602002820191905f5260205f20905b8154815260200190600101908083116131b1575b50505050509050919050565b6060826131e6576131e18261357e565b610a3c565b81511580156131fd57506001600160a01b0384163b155b1561322657604051639996b31560e01b81526001600160a01b038516600482015260240161090b565b5080610a3c565b6132356135c3565b816132a25760405163c421a75960e01b81526001600160a01b03858116600483015284169063c421a7599060240160a060405180830381865afa15801561327e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906141f3565b604051630264211160e11b81526001600160a01b0385811660048301528416906304c842229060240160a060405180830381865afa1580156132e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7891906141f3565b80515f9015801561331d57506020820151155b801561332b57506040820151155b801561333957506060820151155b80156107dd575050608001511590565b6133516135aa565b611fd357604051631afcd79f60e31b815260040160405180910390fd5b613376613349565b5f805160206143618339815191528061338f8482614285565b5060018101610a158382614285565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106133dc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613408576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061342657662386f26fc10000830492506010015b6305f5e100831061343e576305f5e100830492506008015b612710831061345257612710830492506004015b60648310613464576064830492506002015b600a83106107dd5760010192915050565b806001600160a01b03163b5f036134aa57604051634c9c8ce360e01b81526001600160a01b038216600482015260240161090b565b5f8051602061438183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611fd35760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661352057604051633250574960e11b81525f600482015260240161090b565b5f61352c83835f611d9e565b90506001600160a01b03811615610b64576040516339e3563760e11b81525f600482015260240161090b565b5f825f01828154811061356d5761356d613f31565b905f5260205f200154905092915050565b80511561358e5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f6135b36127d4565b54600160401b900460ff16919050565b6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b5080545f8255905f5260205f20908101906135a791905b808211156127ab575f8155600101613604565b6001600160e01b0319811681146135a7575f80fd5b5f6020828403121561363c575f80fd5b8135610a3c81613617565b5f5b83811015613661578181015183820152602001613649565b50505f910152565b5f8151808452613680816020860160208601613647565b601f01601f19169290920160200192915050565b602081525f610a3c6020830184613669565b5f602082840312156136b6575f80fd5b5035919050565b6001600160a01b03811681146135a7575f80fd5b5f80604083850312156136e2575f80fd5b82356136ed816136bd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715613731576137316136fb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561375f5761375f6136fb565b604052919050565b5f6001600160401b0382111561377f5761377f6136fb565b5060051b60200190565b5f805f6060848603121561379b575f80fd5b833592506020808501356137ae816136bd565b925060408501356001600160401b038111156137c8575f80fd5b8501601f810187136137d8575f80fd5b80356137eb6137e682613767565b613737565b81815260059190911b82018301908381019089831115613809575f80fd5b928401925b82841015613830578335613821816136bd565b8252928401929084019061380e565b80955050505050509250925092565b5f60a0828403121561384f575f80fd5b61385761370f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f80610180858703121561389f575f80fd5b84356138aa816136bd565b9350602085013592506138c0866040870161383f565b91506138cf8660e0870161383f565b905092959194509250565b5f805f606084860312156138ec575f80fd5b83356138f7816136bd565b92506020840135613907816136bd565b929592945050506040919091013590565b60a081016107dd828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b5f805f805f60a08688031215613965575f80fd5b8535613970816136bd565b9450602086013593506040860135613987816136bd565b92506060860135613997816136bd565b949793965091946080013592915050565b5f82601f8301126139b7575f80fd5b81356001600160401b038111156139d0576139d06136fb565b6139e3601f8201601f1916602001613737565b8181528460208386010111156139f7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613a24575f80fd5b8235613a2f816136bd565b915060208301356001600160401b03811115613a49575f80fd5b613a55858286016139a8565b9150509250929050565b5f805f8060808587031215613a72575f80fd5b8435613a7d816136bd565b9350602085013592506040850135613a94816136bd565b9396929550929360600135925050565b5f60208284031215613ab4575f80fd5b8135610a3c816136bd565b5f8060408385031215613ad0575f80fd5b823591506020830135613ae2816136bd565b809150509250929050565b5f8060408385031215613afe575f80fd5b8235613b09816136bd565b91506020838101356001600160401b03811115613b24575f80fd5b8401601f81018613613b34575f80fd5b8035613b426137e682613767565b81815260059190911b82018301908381019088831115613b60575f80fd5b928401925b82841015613b7e57833582529284019290840190613b65565b80955050505050509250929050565b5f8060408385031215613b9e575f80fd5b823591506020808401356001600160401b03811115613bbb575f80fd5b8401601f81018613613bcb575f80fd5b8035613bd96137e682613767565b81815260059190911b82018301908381019088831115613bf7575f80fd5b928401925b82841015613b7e578335613c0f816136bd565b82529284019290840190613bfc565b80151581146135a7575f80fd5b5f8060408385031215613c3c575f80fd5b8235613c47816136bd565b91506020830135613ae281613c1e565b5f805f8060808587031215613c6a575f80fd5b8435613c75816136bd565b9350602085013592506040850135613c8c816136bd565b91506060850135613c9c816136bd565b939692955090935050565b5f8060208385031215613cb8575f80fd5b82356001600160401b0380821115613cce575f80fd5b818501915085601f830112613ce1575f80fd5b813581811115613cef575f80fd5b8660208260051b8501011115613d03575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613d6a57603f19888603018452613d58858351613669565b94509285019290850190600101613d3c565b5092979650505050505050565b5f805f8060808587031215613d8a575f80fd5b8435613d95816136bd565b93506020850135613da5816136bd565b92506040850135915060608501356001600160401b03811115613dc6575f80fd5b613dd2878288016139a8565b91505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613e1557835183529284019291840191600101613df9565b50909695505050505050565b5f805f805f8060c08789031215613e36575f80fd5b8635613e41816136bd565b9550602087013594506040870135613e58816136bd565b93506060870135613e68816136bd565b92506080870135915060a0870135613e7f81613c1e565b809150509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613e155783516001600160a01b031683529284019291840191600101613ea8565b5f8060408385031215613ede575f80fd5b8235613ee9816136bd565b91506020830135613ae2816136bd565b600181811c90821680613f0d57607f821691505b602082108103613f2b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613f6a57613f6a613f45565b5060010190565b5f60208284031215613f81575f80fd5b8151610a3c81613c1e565b818103818111156107dd576107dd613f45565b5f808335601e19843603018112613fb4575f80fd5b8301803591506001600160401b03821115613fcd575f80fd5b602001915036819003821315613fe1575f80fd5b9250929050565b828482375f8382015f81528351614003818360208801613647565b0195945050505050565b8082018281125f8312801582168215821617156114ac576114ac613f45565b5f835161403d818460208801613647565b835190830190614051818360208801613647565b01949350505050565b6101408101614094828580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160a0830152602083015160c0830152604083015160e083015260608301516101008301526080830151610120830152610a3c565b5f602082840312156140da575f80fd5b5051919050565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925290151560a082015260c00190565b5f825161412c818460208701613647565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90610b7890830184613669565b5f60208284031215614178575f80fd5b8151610a3c81613617565b7f68747470733a2f2f6170692e73697a652e6372656469742f636f6c6c656374698152636f6e732f60e01b60208201525f82516141c7816024850160208701613647565b602f60f81b6024939091019283015250602501919050565b634e487b7160e01b5f52603160045260245ffd5b5f60a08284031215614203575f80fd5b61420b61370f565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b601f821115610b6457805f5260205f20601f840160051c810160208510156142665750805b601f840160051c820191505b818110156109d6575f8155600101614272565b81516001600160401b0381111561429e5761429e6136fb565b6142b2816142ac8454613ef9565b84614241565b602080601f8311600181146142e5575f84156142ce5750858301515b5f19600386901b1c1916600185901b178555611781565b5f85815260208120601f198616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561433057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed02a264697066735822122003abfeed6c386c88a16ffbbf7a5897b7c6d1d273227a7bd7ff4dab3f8c8fc58964736f6c63430008170033", + "nonce": "0xe6", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionType": "CREATE", + "contractName": "SizeFactory", + "contractAddress": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x388367", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613208620001005f395f81816119ea01528181611a130152611b5601526132085ff3fe60806040526004361061025f575f3560e01c806386eeeb5a1161013f578063ad3cb1cc116100b3578063d152e23611610078578063d152e23614610762578063d547741f14610781578063e8d353c7146107a0578063eb44fdd3146107bf578063ec2c9016146107de578063f0fb716f146107ff575f80fd5b8063ad3cb1cc146106b6578063b1ef804d146106e6578063b4cd6bd114610705578063c4d66de814610724578063c8fb624714610743575f80fd5b80639e42bfa3116101045780639e42bfa3146106065780639feffdb014610625578063a217fddf14610644578063a78ec6ae14610657578063a7b2b31014610676578063ac9650d81461068a575f80fd5b806386eeeb5a1461056b57806388d765201461058a57806391c769ce146105a957806391d14854146105c8578063973cf867146105e7575f80fd5b806352d1902d116101d65780636ec934da1161019b5780636ec934da146104865780636ed41835146104a5578063732218f9146104c45780637643d7ec146104e35780637b8dedad1461050457806381de274c14610540575f80fd5b806352d1902d146103de57806354fd4d50146103f25780635ec49544146104295780635fb7f10c14610448578063678b9bad14610467575f80fd5b806327fa35c31161022757806327fa35c31461033b5780632f2ff15d1461034f57806336568abe1461036e57806337c11b2a1461038d578063495e6d89146103ac5780634f1ef286146103cb575f80fd5b806301a6c8721461026357806301ffc9a7146102845780631286a2dc146102b85780631e4fcddb146102ef578063248a9ca31461030e575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461222c565b61081e565b005b34801561028f575f80fd5b506102a361029e366004612247565b610884565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506007546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b3480156102fa575f80fd5b5061028261030936600461222c565b6108ba565b348015610319575f80fd5b5061032d61032836600461227e565b610947565b6040519081526020016102af565b348015610346575f80fd5b5061032d610967565b34801561035a575f80fd5b50610282610369366004612295565b610976565b348015610379575f80fd5b50610282610388366004612295565b610998565b348015610398575f80fd5b50600a546102d7906001600160a01b031681565b3480156103b7575f80fd5b5061032d6103c63660046122c3565b6109d0565b6102826103d93660046123cf565b610a67565b3480156103e9575f80fd5b5061032d610a86565b3480156103fd575f80fd5b5060408051808201909152600681526576312e382e3160d01b60208201525b6040516102af91906124a8565b348015610434575f80fd5b5061041c6104433660046124ba565b610aa1565b348015610453575f80fd5b5061032d6104623660046122c3565b610b20565b348015610472575f80fd5b506102a3610481366004612537565b610b70565b348015610491575f80fd5b506102a36104a036600461222c565b610bf3565b3480156104b0575f80fd5b506102826104bf3660046125c8565b610bfe565b3480156104cf575f80fd5b506102826104de366004612680565b610c0a565b3480156104ee575f80fd5b506104f7610cb8565b6040516102af91906126c3565b34801561050f575f80fd5b5061032d61051e366004612725565b600860209081525f938452604080852082529284528284209052825290205481565b34801561054b575f80fd5b5061032d61055a36600461222c565b60096020525f908152604090205481565b348015610576575f80fd5b506102a3610585366004612764565b610fe6565b348015610595575f80fd5b506102826105a43660046127a4565b611056565b3480156105b4575f80fd5b506102826105c33660046127f4565b6110d8565b3480156105d3575f80fd5b506102a36105e2366004612295565b6110e3565b3480156105f2575f80fd5b506006546102d7906001600160a01b031681565b348015610611575f80fd5b5061028261062036600461281e565b611119565b348015610630575f80fd5b506102a361063f366004612537565b611126565b34801561064f575f80fd5b5061032d5f81565b348015610662575f80fd5b506102a361067136600461284f565b61116e565b348015610681575f80fd5b506102826111d3565b348015610695575f80fd5b506106a96106a436600461288d565b61121e565b6040516102af91906128fb565b3480156106c1575f80fd5b5061041c604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106f1575f80fd5b50610282610700366004612680565b611303565b348015610710575f80fd5b5061028261071f36600461222c565b61134e565b34801561072f575f80fd5b5061028261073e36600461222c565b6113db565b34801561074e575f80fd5b5061028261075d36600461281e565b61156c565b34801561076d575f80fd5b506102d761077c366004612963565b611576565b34801561078c575f80fd5b5061028261079b366004612295565b611633565b3480156107ab575f80fd5b506102d76107ba366004612a1c565b61164f565b3480156107ca575f80fd5b506102d76107d936600461227e565b61172e565b3480156107e9575f80fd5b506107f2611739565b6040516102af9190612a48565b34801561080a575f80fd5b506102d7610819366004612aaa565b6117ce565b5f610828816118b2565b600a546040516001600160a01b038085169216907f24b8a2b6435960c7b1b405f08e684a0ed2e4d467b56f325250b56e2a10dbabae905f90a350600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160e01b03198216637965db0b60e01b14806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6108c4816118b2565b6001600160a01b0382166108eb5760405163de0ce17d60e01b815260040160405180910390fd5b6007546040516001600160a01b038085169216907faefd875bf3940c57f185da0affbb82ce03656890d6e1d29310e8b4bf9d20b7c1905f90a350600780546001600160a01b0319166001600160a01b0392909216919091179055565b5f9081525f805160206131b3833981519152602052604090206001015490565b5f6109715f6118bc565b905090565b61097f82610947565b610988816118b2565b61099283836118c5565b50505050565b6001600160a01b03811633146109c15760405163334bd91960e11b815260040160405180910390fd5b6109cb8282611966565b505050565b600a5460405163495e6d8960e01b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f92169063495e6d899060a4015b602060405180830381865afa158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612b15565b90505b95945050505050565b610a6f6119df565b610a7882611a85565b610a828282611a8f565b5050565b5f610a8f611b4b565b505f8051602061319383398151915290565b6060610aac84610bf3565b610ad95760405163e2a7bea360e01b81526001600160a01b03851660048201526024015b60405180910390fd5b610b188484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611b9492505050565b949350505050565b600a546040516317edfc4360e21b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f921690635fb7f10c9060a401610a1c565b600a5460405163678b9bad60e01b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f92169063678b9bad906084015b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612b2c565b5f6108b48183611ba1565b6109cb83838333611056565b610c163382600b610fe6565b610c55573381600b5b60405163062709f360e41b81526001600160a01b03938416600482015292909116602483015260ff166044820152606401610ad0565b600a546040516301bc3d7160e71b81526001600160a01b039091169063de1eb88090610c879084908690600401612b5f565b5f604051808303815f87803b158015610c9e575f80fd5b505af1158015610cb0573d5f803e3d5ffd5b505050505050565b6060610cc35f6118bc565b6001600160401b03811115610cda57610cda61231a565b604051908082528060200260200182016040528015610d0d57816020015b6060815260200190600190039081610cf85790505b5090505f5b8151811015610fe2575f610d268183611bc2565b90505f610da06064836001600160a01b0316637c90a6ca6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612bb4565b60200151670de0b6b3a7640000611bcd565b9050816001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ddf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e039190612c0d565b604001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610e41573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e689190810190612cc6565b826001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190612c0d565b606001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f07573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f2e9190810190612cc6565b610f3783611bd9565b846001600160a01b03166354fd4d506040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f72573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f999190810190612cc6565b604051602001610fac9493929190612d2e565b604051602081830303815290604052848481518110610fcd57610fcd612dba565b60209081029190910101525050600101610d12565b5090565b5f826001600160a01b0316846001600160a01b0316036110085750600161104f565b6001600160a01b038084165f8181526009602090815260408083205480845260088352818420958a168452948252808320938352929052205461104b9084611c68565b9150505b9392505050565b6110623382600b610fe6565b61106f573381600b610c1f565b600a546040516318d5932d60e01b81526001600160a01b03909116906318d5932d906110a5908490889088908890600401612dce565b5f604051808303815f87803b1580156110bc575f80fd5b505af11580156110ce573d5f803e3d5ffd5b5050505050505050565b610a82823383611c8a565b5f9182525f805160206131b3833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6111238133610c0a565b50565b600a546040516309feffdb60e41b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f921690639feffdb090608401610bb4565b5f826001600160a01b0316846001600160a01b0316036111905750600161104f565b506001600160a01b038281165f8181526009602090815260408083205483526008825280832094881683529381528382209282529190915220548116811461104f565b60405133907fecbee29490a7e5456f4e3aab0700477764e3f16dda5a21ea92f43f1cfcb15799905f90a2335f90815260096020526040812080549161121783612e6a565b9190505550565b604080515f815260208101909152606090826001600160401b038111156112475761124761231a565b60405190808252806020026020018201604052801561127a57816020015b60608152602001906001900390816112655790505b5091505f5b838110156112fb576112d63086868481811061129d5761129d612dba565b90506020028101906112af9190612e95565b856040516020016112c293929190612ede565b604051602081830303815290604052611d72565b8382815181106112e8576112e8612dba565b602090810291909101015260010161127f565b505092915050565b61130f3382600b610fe6565b61131c573381600b610c1f565b600a546040516393c0d3f360e01b81526001600160a01b03909116906393c0d3f390610c879084908690600401612b5f565b5f611358816118b2565b6001600160a01b03821661137f5760405163de0ce17d60e01b815260040160405180910390fd5b6006546040516001600160a01b038085169216907ffb3d0b43c5121de915eeb8fa2fb4bb792b6b05d5d6f3df7630aac9d9e8697312905f90a350600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f6113e4611ddb565b805490915060ff600160401b82041615906001600160401b03165f8115801561140a5750825b90505f826001600160401b031660011480156114255750303b155b905081158015611433575080155b156114515760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561147b57845460ff60401b1916600160401b1785555b611483611e03565b61148b611e03565b611493611e03565b61149d5f876118c5565b506114c87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a876118c5565b506114f37ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab876118c5565b5061151e7f1eae1854c74a696c6de86fd3c6383d5c1e2c33fbc86e1aa6b6c872d95bd24038876118c5565b508315610cb057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6111238133611303565b5f80611581816118b2565b60405163145b6cb960e11b815273e8dc58c7f234e49f024ce03e926be80fc2db0f7d906328b6d972906115b8908690600401612f03565b602060405180830381865af41580156115d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f79190612fe0565b6040519092506001600160a01b038316907f970cbcaabfe7c54976df22e530fb6ef3a9202796c410ae94972a9b109d5b2ca8905f90a250919050565b61163c82610947565b611645816118b2565b6109928383611966565b5f8061165a816118b2565b6007546040516302a8408560e11b81526001600160a01b03918216600482015233602482018190528683166044830152918516606482015273b4a15fb08dbe6a161ff1d411be2d9f67f060611890630550810a90608401602060405180830381865af41580156116cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f09190612fe0565b6040519093506001600160a01b038416907f798adeb18dd44bd81e89d3ab4aa52d11e6d22b3ab80b11da6844ec0eda2a0810905f90a2505092915050565b5f6108b48183611bc2565b60606117445f6118bc565b6001600160401b0381111561175b5761175b61231a565b604051908082528060200260200182016040528015611784578160200160208202803683370190505b5090505f5b8151811015610fe25761179c5f82611bc2565b8282815181106117ae576117ae612dba565b6001600160a01b0390921660209283029190910190910152600101611789565b5f806117d9816118b2565b60065460405163d41bcfc560e01b815233917322c26a06ef6c51bbca1cf5276e1606e89402979a9163d41bcfc591611829916001600160a01b039091169085908c908c908c908c906004016130c8565b602060405180830381865af4158015611844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118689190612fe0565b92506118745f84611e0b565b506040516001600160a01b038416907ffa970ff5f178441bbe297db8d35a584c9bd6628b17b82d80dc8f5b80063102ca905f90a25050949350505050565b6111238133611e1f565b5f6108b4825490565b5f5f805160206131b38339815191526118de84846110e3565b61195d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556119133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108b4565b5f9150506108b4565b5f5f805160206131b383398151915261197f84846110e3565b1561195d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108b4565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a6557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a595f80516020613193833981519152546001600160a01b031690565b6001600160a01b031614155b15611a835760405163703e46dd60e11b815260040160405180910390fd5b565b5f610a82816118b2565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae9575060408051601f3d908101601f19168201909252611ae691810190612b15565b60015b611b1157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ad0565b5f805160206131938339815191528114611b4157604051632a87526960e21b815260048101829052602401610ad0565b6109cb8383611e58565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a835760405163703e46dd60e11b815260040160405180910390fd5b606061104f83835f611ead565b6001600160a01b0381165f908152600183016020526040812054151561104f565b5f61104f8383611f4d565b5f610b18848484611f73565b60605f611be583611f97565b60010190505f816001600160401b03811115611c0357611c0361231a565b6040519080825280601f01601f191660200182016040528015611c2d576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c3757509392505050565b5f81600c811115611c7b57611c7b612b4b565b6001901b831615159392505050565b6001600160a01b038316611cb15760405163de0ce17d60e01b815260040160405180910390fd5b611cba8161206e565b611cda57604051632e40743360e01b815260048101829052602401610ad0565b6001600160a01b0382165f9081526009602052604090205481846001600160a01b0316846001600160a01b03167f89733de2d64cea40de091169750607b26e8d46142312fba65fb6476c790bad4984604051611d3891815260200190565b60405180910390a45f9081526008602090815260408083206001600160a01b03968716845282528083209490951682529290925291902055565b60605f80846001600160a01b031684604051611d8e9190613177565b5f60405180830381855af49150503d805f8114611dc6576040519150601f19603f3d011682016040523d82523d5f602084013e611dcb565b606091505b5091509150610a5e858383612087565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108b4565b611a836120e3565b5f61104f836001600160a01b038416612108565b611e2982826110e3565b610a825760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610ad0565b611e6182612154565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611ea5576109cb8282611d72565b610a826121b7565b606081471015611ed95760405163cf47918160e01b815247600482015260248101839052604401610ad0565b5f80856001600160a01b03168486604051611ef49190613177565b5f6040518083038185875af1925050503d805f8114611f2e576040519150601f19603f3d011682016040523d82523d5f602084013e611f33565b606091505b5091509150611f43868383612087565b9695505050505050565b5f825f018281548110611f6257611f62612dba565b905f5260205f200154905092915050565b5f825f190484118302158202611f905763ad251c275f526004601cfd5b5091020490565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fd55772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061201f57662386f26fc10000830492506010015b6305f5e1008310612037576305f5e100830492506008015b612710831061204b57612710830492506004015b6064831061205d576064830492506002015b600a83106108b45760010192915050565b5f8061207d6001611000612e82565b9092111592915050565b60608261209c57612097826121d6565b61104f565b81511580156120b357506001600160a01b0384163b155b156120dc57604051639996b31560e01b81526001600160a01b0385166004820152602401610ad0565b508061104f565b6120eb6121ff565b611a8357604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461214d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b4565b505f6108b4565b806001600160a01b03163b5f0361218957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ad0565b5f8051602061319383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611a835760405163b398979f60e01b815260040160405180910390fd5b8051156121e65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f612208611ddb565b54600160401b900460ff16919050565b6001600160a01b0381168114611123575f80fd5b5f6020828403121561223c575f80fd5b813561104f81612218565b5f60208284031215612257575f80fd5b81356001600160e01b03198116811461104f575f80fd5b803561227981612218565b919050565b5f6020828403121561228e575f80fd5b5035919050565b5f80604083850312156122a6575f80fd5b8235915060208301356122b881612218565b809150509250929050565b5f805f805f60a086880312156122d7575f80fd5b85356122e281612218565b94506020860135935060408601356122f981612218565b9250606086013561230981612218565b949793965091946080013592915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156123505761235061231a565b60405290565b60405161014081016001600160401b03811182821017156123505761235061231a565b604051601f8201601f191681016001600160401b03811182821017156123a1576123a161231a565b604052919050565b5f6001600160401b038211156123c1576123c161231a565b50601f01601f191660200190565b5f80604083850312156123e0575f80fd5b82356123eb81612218565b915060208301356001600160401b03811115612405575f80fd5b8301601f81018513612415575f80fd5b8035612428612423826123a9565b612379565b81815286602083850101111561243c575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f5b8381101561247557818101518382015260200161245d565b50505f910152565b5f815180845261249481602086016020860161245b565b601f01601f19169290920160200192915050565b602081525f61104f602083018461247d565b5f805f604084860312156124cc575f80fd5b83356124d781612218565b925060208401356001600160401b03808211156124f2575f80fd5b818601915086601f830112612505575f80fd5b813581811115612513575f80fd5b876020828501011115612524575f80fd5b6020830194508093505050509250925092565b5f805f806080858703121561254a575f80fd5b843561255581612218565b935060208501359250604085013561256c81612218565b9396929550929360600135925050565b5f60a0828403121561258c575f80fd5b61259461232e565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f61016084860312156125db575f80fd5b833592506125ec856020860161257c565b91506125fb8560c0860161257c565b90509250925092565b5f82601f830112612613575f80fd5b813560206001600160401b0382111561262e5761262e61231a565b8160051b61263d828201612379565b9283528481018201928281019087851115612656575f80fd5b83870192505b848310156126755782358252918301919083019061265c565b979650505050505050565b5f8060408385031215612691575f80fd5b82356001600160401b038111156126a6575f80fd5b6126b285828601612604565b92505060208301356122b881612218565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261270685835161247d565b945092850192908501906001016126ea565b5092979650505050505050565b5f805f60608486031215612737575f80fd5b83359250602084013561274981612218565b9150604084013561275981612218565b809150509250925092565b5f805f60608486031215612776575f80fd5b833561278181612218565b9250602084013561279181612218565b91506040840135600d8110612759575f80fd5b5f805f8061018085870312156127b8575f80fd5b843593506127c9866020870161257c565b92506127d88660c0870161257c565b91506101608501356127e981612218565b939692955090935050565b5f8060408385031215612805575f80fd5b823561281081612218565b946020939093013593505050565b5f6020828403121561282e575f80fd5b81356001600160401b03811115612843575f80fd5b610b1884828501612604565b5f805f60608486031215612861575f80fd5b833561286c81612218565b9250602084013561287c81612218565b929592945050506040919091013590565b5f806020838503121561289e575f80fd5b82356001600160401b03808211156128b4575f80fd5b818501915085601f8301126128c7575f80fd5b8135818111156128d5575f80fd5b8660208260051b85010111156128e9575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261293e85835161247d565b94509285019290850190600101612922565b803563ffffffff81168114612279575f80fd5b5f6101408284031215612974575f80fd5b61297c612356565b6129858361226e565b815261299360208401612950565b60208201526129a460408401612950565b60408201526129b56060840161226e565b60608201526129c66080840161226e565b60808201526129d760a0840161226e565b60a08201526129e860c0840161226e565b60c082015260e083013560e0820152610100808401358183015250610120612a1181850161226e565b908201529392505050565b5f8060408385031215612a2d575f80fd5b8235612a3881612218565b915060208301356122b881612218565b602080825282518282018190525f9190848201906040850190845b81811015612a885783516001600160a01b031683529284019291840191600101612a63565b50909695505050505050565b5f60c08284031215612aa4575f80fd5b50919050565b5f805f80848603610260811215612abf575f80fd5b612ac98787612a94565b945060a060bf1982011215612adc575f80fd5b60c086019350604061015f1982011215612af4575f80fd5b5061016085019150612b0a866101a08701612a94565b905092959194509250565b5f60208284031215612b25575f80fd5b5051919050565b5f60208284031215612b3c575f80fd5b8151801515811461104f575f80fd5b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b03831681526040602080830182905283519183018290525f9184820191906060850190845b81811015612ba757845183529383019391830191600101612b8b565b5090979650505050505050565b5f60a08284031215612bc4575f80fd5b612bcc61232e565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b805161227981612218565b5f610100808385031215612c1f575f80fd5b604051908101906001600160401b0382118183101715612c4157612c4161231a565b81604052835181526020840151602082015260408401519150612c6382612218565b816040820152612c7560608501612c02565b6060820152612c8660808501612c02565b6080820152612c9760a08501612c02565b60a0820152612ca860c08501612c02565b60c0820152612cb960e08501612c02565b60e0820152949350505050565b5f60208284031215612cd6575f80fd5b81516001600160401b03811115612ceb575f80fd5b8201601f81018413612cfb575f80fd5b8051612d09612423826123a9565b818152856020838501011115612d1d575f80fd5b610a5e82602083016020860161245b565b66029b4bd32903e160cd1b81525f8551612d4f816007850160208a0161245b565b8083019050620103e160ed1b8060078301528651612d7481600a850160208b0161245b565b600a92019182018190528551612d9181600d850160208a0161245b565b600d9201918201528351612dac81601084016020880161245b565b016010019695505050505050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0385168152602081018490526101808101612e1e604083018580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160e08301526020830151610100830152604083015161012083015260608301516101408301526080830151610160830152610a5e565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612e7b57612e7b612e56565b5060010190565b818103818111156108b4576108b4612e56565b5f808335601e19843603018112612eaa575f80fd5b8301803591506001600160401b03821115612ec3575f80fd5b602001915036819003821315612ed7575f80fd5b9250929050565b828482375f8382015f81528351612ef981836020880161245b565b0195945050505050565b81516001600160a01b0316815261014081016020830151612f2c602084018263ffffffff169052565b506040830151612f44604084018263ffffffff169052565b506060830151612f5f60608401826001600160a01b03169052565b506080830151612f7a60808401826001600160a01b03169052565b5060a0830151612f9560a08401826001600160a01b03169052565b5060c0830151612fb060c08401826001600160a01b03169052565b5060e083810151908301526101008084015190830152610120808401516001600160a01b038116828501526112fb565b5f60208284031215612ff0575f80fd5b815161104f81612218565b803561300681612218565b6001600160a01b0316825260208101356001600160401b03811680821461302b575f80fd5b80602085015250505050565b803561304281612218565b6001600160a01b03908116835260208201359061305e82612218565b908116602084015260408201359061307582612218565b908116604084015260608201359061308c82612218565b90811660608401526080820135906130a382612218565b908116608084015260a0820135906130ba82612218565b80821660a085015250505050565b5f6102a08201905060018060a01b0380891683528088166020840152863560408401526020870135606084015260408701356080840152606087013560a0840152608087013560c084015260a087013561312181612218565b1660e0830152843561010083015260208501356101208301526040850135610140830152606085013561016083015260808501356101808301526131696101a0830185612ffb565b6126756101e0830184613037565b5f825161318881846020870161245b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c0dc8864e841f2aab5145e7160a959acaf73c71a60a5e9aa5756212f1828845964736f6c63430008170033", + "nonce": "0xe7", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1397be8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x12ec4b362249a03acad003fda1c8579eea529358ce426c01f3de819f7e153f83", + "transactionIndex": "0xd2", + "blockHash": "0x5c9d9a0a93fc4833ba7bf5f0c96768947afb16d2acf654e0465ace4c7e0d6e7f", + "blockNumber": "0x168d656", + "gasUsed": "0x74797", + "effectiveGasPrice": "0x396914e2", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1050573", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x27ab659ce7d830b3e511ea0478a792350e700439ee979fad87dbd7fe97549b47", + "transactionIndex": "0xbf", + "blockHash": "0xd91159655b9f561b69b94ce71b0b3fdb8e38ad2d3ec7575bd831e5d0124bfaa8", + "blockNumber": "0x168d657", + "gasUsed": "0x885ee", + "effectiveGasPrice": "0x3c4d2009", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaf938", + "logs": [ + { + "address": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xa4c62a7b87e347cb70f8d01c5ad423a04da1bcb5f7c0939c9536c1f507625183", + "blockNumber": "0x168d658", + "blockTimestamp": "0x68fb88cf", + "transactionHash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionIndex": "0x4d", + "logIndex": "0x13f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000004000000000000000000000000000000000000000000000000000000000000400000000000000000000000", + "type": "0x2", + "transactionHash": "0x750cb78a92395ba1cc781d1590c5af48dbae9cec80b29838789b7216de912012", + "transactionIndex": "0x4d", + "blockHash": "0xa4c62a7b87e347cb70f8d01c5ad423a04da1bcb5f7c0939c9536c1f507625183", + "blockNumber": "0x168d658", + "gasUsed": "0x3a9efe", + "effectiveGasPrice": "0x3bc33dcd", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x5f1dcb1c2eef3a4efacb6fd4a55c9a73ad8b07cb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1081998", + "logs": [ + { + "address": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x0e0634b1216b6686ccc98173f88b825a69ca45181af32fc9ee6aae340398ddfb", + "blockNumber": "0x168d659", + "blockTimestamp": "0x68fb88db", + "transactionHash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionIndex": "0x8d", + "logIndex": "0x1be", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000010000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000010000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4a6e62f0442458328195b30766862504e5172bccc1e933eee11ffa5a30e47499", + "transactionIndex": "0x8d", + "blockHash": "0x0e0634b1216b6686ccc98173f88b825a69ca45181af32fc9ee6aae340398ddfb", + "blockNumber": "0x168d659", + "gasUsed": "0x2b78c6", + "effectiveGasPrice": "0x3e49da46", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x3e275cdce92d1b1a302e5c2e6c37fd5e3420131a" + } + ], + "libraries": [ + "src/factory/libraries/MarketFactoryLibrary.sol:MarketFactoryLibrary:0x22C26A06ef6C51BbCa1cF5276E1606e89402979a", + "src/factory/libraries/NonTransferrableRebasingTokenVaultLibrary.sol:NonTransferrableRebasingTokenVaultLibrary:0xB4A15fB08Dbe6a161FF1D411be2d9F67F0606118", + "src/factory/libraries/PriceFeedFactoryLibrary.sol:PriceFeedFactoryLibrary:0xe8Dc58C7f234e49F024cE03e926BE80FC2dB0f7d" + ], + "pending": [], + "returns": {}, + "timestamp": 1761315146906, + "chain": 1, + "commit": "2aea4c3d" +} \ No newline at end of file diff --git a/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-1761314932405.json b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-1761314932405.json new file mode 100644 index 00000000..c7f95c26 --- /dev/null +++ b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-1761314932405.json @@ -0,0 +1,206 @@ +{ + "transactions": [ + { + "hash": "0x48a9e4d02fc1f1825538fd3849d7c13fe5bafe6c8be59eba14943e5688f7f17c", + "transactionType": "CREATE2", + "contractName": "MarketFactoryLibrary", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0e14", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006107a3610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063d41bcfc514610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610132565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8087878787878760405160240161008f959493929190610271565b60408051601f198184030181529181526020820180516001600160e01b031663f1bf35c360e01b179052516100c3906100f4565b6100ce929190610321565b604051809103905ff0801580156100e7573d5f803e3d5ffd5b5098975050505050505050565b6103f08061037e83390190565b80356001600160a01b0381168114610117575f80fd5b919050565b5f60c0828403121561012c575f80fd5b50919050565b5f805f805f808688036102a0811215610149575f80fd5b61015288610101565b965061016060208901610101565b955061016f8960408a0161011c565b945060a060ff1982011215610182575f80fd5b61010088019350604061019f198201121561019b575f80fd5b506101a0870191506101b1886101e0890161011c565b90509295509295509295565b6001600160a01b036101ce82610101565b168252602081013567ffffffffffffffff81168082146101ec575f80fd5b80602085015250505050565b6001600160a01b038061020a83610101565b1683528061021a60208401610101565b1660208401528061022d60408401610101565b1660408401528061024060608401610101565b1660608401528061025360808401610101565b1660808401528061026660a08401610101565b1660a0840152505050565b5f6102808201905060018060a01b03808816835286356020840152602087013560408401526040870135606084015260608701356080840152608087013560a0840152806102c160a08901610101565b1660c084015250843560e083015260208501356101008301526040850135610120830152606085013561014083015260808501356101608301526103096101808301856101bd565b6103176101c08301846101f8565b9695505050505050565b60018060a01b03831681525f60206040602084015283518060408501525f5b8181101561035c57858101830151858201606001528201610340565b505f606082860101526060601f19601f83011685010192505050939250505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a2646970667358221220670540a779fc707ba2d74908460b71b5f911940396a8e4eec820b0783b7eb1cf64736f6c63430008170033", + "nonce": "0x143", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x25181b56a374b33bcf3027c960ec044e6ec7d17ce07e9ea3b95bd17befe270c3", + "transactionType": "CREATE2", + "contractName": "NonTransferrableRebasingTokenVaultLibrary", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xbc5c9", + "input": "0x000000000000000000000000000000000000000000000000000000000000000061091b610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80630550810a14610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610277565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8430848487866001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100b4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100db9190810190610306565b6040516020016100eb91906103ae565b604051602081830303815290604052876001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610135573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261015c9190810190610306565b60405160200161016c91906103ea565b604051602081830303815290604052886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101db9190610413565b6040516024016101f19796959493929190610465565b60408051601f198184030181529181526020820180516001600160e01b0316631f0cbe6160e01b1790525161022590610253565b6102309291906104ca565b604051809103905ff080158015610249573d5f803e3d5ffd5b5095945050505050565b6103f0806104f683390190565b6001600160a01b0381168114610274575f80fd5b50565b5f805f806080858703121561028a575f80fd5b843561029581610260565b935060208501356102a581610260565b925060408501356102b581610260565b915060608501356102c581610260565b939692955090935050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102fe5781810151838201526020016102e6565b50505f910152565b5f60208284031215610316575f80fd5b815167ffffffffffffffff8082111561032d575f80fd5b818401915084601f830112610340575f80fd5b815181811115610352576103526102d0565b604051601f8201601f19908116603f0116810190838211818310171561037a5761037a6102d0565b81604052828152876020848701011115610392575f80fd5b6103a38360208301602088016102e4565b979650505050505050565b64029b4bd32960dd1b81525f82516103cd8160058501602087016102e4565b650815985d5b1d60d21b6005939091019283015250600b01919050565b6139bb60f11b81525f82516104068160028501602087016102e4565b9190910160020192915050565b5f60208284031215610423575f80fd5b815160ff81168114610433575f80fd5b9392505050565b5f81518084526104518160208601602086016102e4565b601f01601f19169290920160200192915050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260e0608082018190525f906104a09083018661043a565b82810360a08401526104b2818661043a565b91505060ff831660c083015298975050505050505050565b6001600160a01b03831681526040602082018190525f906104ed9083018461043a565b94935050505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a26469706673582212209d2380a7304f006d1c66be055eaf76eddad4d8b6b38978aec43f72b90761da5e64736f6c63430008170033", + "nonce": "0x144", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionType": "CREATE", + "contractName": "CollectionsManager", + "contractAddress": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x4c3517", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516143f6620001005f395f8181611f3a01528181611f63015261213301526143f65ff3fe608060405260043610610249575f3560e01c806370a0823111610134578063ac9650d8116100b3578063c4d66de811610078578063c4d66de8146106f2578063c87b56dd14610711578063dd2bc30214610730578063de1eb8801461075c578063e985e9c51461077b578063eb379a581461079a575f80fd5b8063ac9650d81461062c578063ad3cb1cc14610658578063b88d4fde14610688578063b9d33d1e146106a7578063c260d206146106d3575f80fd5b80639feffdb0116100f95780639feffdb014610591578063a0529e5f146105b0578063a22cb465146105cf578063abff1222146105ee578063ac888c071461060d575f80fd5b806370a08231146105015780638134a9e01461052057806393c0d3f31461053f57806395d89b411461055e5780639e4082db14610572575f80fd5b80633184b046116101cb57806352d1902d1161019057806352d1902d1461045b578063565380571461046f5780635fb7f10c146104905780636352211e146104af578063647f1a9c146104ce578063678b9bad146104e2575f80fd5b80633184b046146103bf57806342842e0e146103eb578063495e6d891461040a5780634f1ef286146104295780634f6ccce71461043c575f80fd5b806318160ddd1161021157806318160ddd1461031957806318d5932d1461034357806320d634561461036257806323b872dd146103815780632f745c59146103a0575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630b379508146102fa575b5f80fd5b348015610258575f80fd5b5061026c61026736600461362c565b6107b9565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107e3565b6040516102789190613694565b3480156102ad575f80fd5b506102c16102bc3660046136a6565b610884565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f33660046136d1565b610898565b005b348015610305575f80fd5b506102f8610314366004613789565b6108a7565b348015610324575f80fd5b505f805160206143a1833981519152545b604051908152602001610278565b34801561034e575f80fd5b506102f861035d36600461388b565b6109dd565b34801561036d575f80fd5b5061026c61037c3660046136d1565b610a1b565b34801561038c575f80fd5b506102f861039b3660046138da565b610a43565b3480156103ab575f80fd5b506103356103ba3660046136d1565b610ac6565b3480156103ca575f80fd5b506103de6103d93660046136d1565b610b37565b6040516102789190613918565b3480156103f6575f80fd5b506102f86104053660046138da565b610b4a565b348015610415575f80fd5b50610335610424366004613951565b610b69565b6102f8610437366004613a13565b610b84565b348015610447575f80fd5b506103356104563660046136a6565b610b9f565b348015610466575f80fd5b50610335610c11565b34801561047a575f80fd5b5061026c6104893660046136a6565b6001541190565b34801561049b575f80fd5b506103356104aa366004613951565b610c2d565b3480156104ba575f80fd5b506102c16104c93660046136a6565b610c3d565b3480156104d9575f80fd5b50610335610c47565b3480156104ed575f80fd5b5061026c6104fc366004613a5f565b610c67565b34801561050c575f80fd5b5061033561051b366004613aa4565b610c80565b34801561052b575f80fd5b5061026c61053a366004613abf565b610cd8565b34801561054a575f80fd5b506102f8610559366004613aed565b610d1a565b348015610569575f80fd5b50610295610eb0565b34801561057d575f80fd5b506103de61058c3660046136d1565b610eee565b34801561059c575f80fd5b5061026c6105ab366004613a5f565b610f02565b3480156105bb575f80fd5b506102f86105ca366004613b8d565b610f11565b3480156105da575f80fd5b506102f86105e9366004613c2b565b611187565b3480156105f9575f80fd5b506102f8610608366004613b8d565b611192565b348015610618575f80fd5b5061026c610627366004613c57565b61132e565b348015610637575f80fd5b5061064b610646366004613ca7565b6113cf565b6040516102789190613d15565b348015610663575f80fd5b50610295604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610693575f80fd5b506102f86106a2366004613d77565b6114b4565b3480156106b2575f80fd5b506106c66106c1366004613aa4565b6114cc565b6040516102789190613dde565b3480156106de575f80fd5b506103356106ed366004613e21565b6114ef565b3480156106fd575f80fd5b506102f861070c366004613aa4565b61160f565b34801561071c575f80fd5b5061029561072b3660046136a6565b611789565b34801561073b575f80fd5b5061074f61074a366004613abf565b6117ed565b6040516102789190613e8d565b348015610767575f80fd5b506102f8610776366004613aed565b61189b565b348015610786575f80fd5b5061026c610795366004613ecd565b6119cb565b3480156107a5575f80fd5b506102f86107b4366004613789565b611a17565b5f6001600160e01b0319821663780e9d6360e01b14806107dd57506107dd82611b3a565b92915050565b5f80516020614361833981519152805460609190819061080290613ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613ef9565b80156108795780601f1061085057610100808354040283529160200191610879565b820191905f5260205f20905b81548152906001019060200180831161085c57829003601f168201915b505050505091505090565b5f61088e82611b89565b506107dd82611bc0565b6108a3828233611bf9565b5050565b826108bb6108b482610c3d565b3383611c06565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff1661091457604051631713bf1160e21b8152600481018590526001600160a01b03841660248201526044015b60405180910390fd5b5f5b82518110156109d6575f61096a84838151811061093557610935613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b0190611c6a565b905080156109cd5783828151811061098457610984613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f41a3856b408397a3953ee2e3fc5961815599fafae92aa64253fea4124c15835260405160405180910390a45b50600101610916565b5050505050565b5f546001600160a01b03163314610a0957604051630b56d23b60e41b815233600482015260240161090b565b610a1584848484611c7e565b50505050565b6001600160a01b0382165f908152600360205260408120610a3c9083611d87565b9392505050565b6001600160a01b038216610a6c57604051633250574960e11b81525f600482015260240161090b565b5f610a78838333611d9e565b9050836001600160a01b0316816001600160a01b031614610a15576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161090b565b5f5f80516020614341833981519152610ade84610c80565b8310610b0f5760405163295f44f760e21b81526001600160a01b03851660048201526024810184905260440161090b565b6001600160a01b0384165f908152602091825260408082208583529092522054905092915050565b610b3f6135c3565b610a3c83835f611e94565b610b6483838360405180602001604052805f8152506114b4565b505050565b5f610b7886868686865f6114ef565b90505b95945050505050565b610b8c611f2f565b610b9582611fd5565b6108a3828261206c565b5f5f80516020614341833981519152610bc35f805160206143a18339815191525490565b8310610beb5760405163295f44f760e21b81525f60048201526024810184905260440161090b565b806002018381548110610c0057610c00613f31565b905f5260205f200154915050919050565b5f610c1a612128565b505f805160206143818339815191525b90565b5f610b78868686868660016114ef565b5f6107dd82611b89565b600180545f9182610c5783613f59565b919050559050610c2a3382612171565b5f610c75858585855f61218a565b90505b949350505050565b5f5f805160206143618339815191526001600160a01b038316610cb8576040516322718ad960e21b81525f600482015260240161090b565b6001600160a01b039092165f908152600390920160205250604090205490565b5f610ce4836001541190565b610cef57505f6107dd565b505f9182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f546001600160a01b03163314610d4657604051630b56d23b60e41b815233600482015260240161090b565b5f6040518060a001604052805f81526020015f1981526020015f81526020015f1981526020015f81525090505f5b8251811015610a1557610da1838281518110610d9257610d92613f31565b60200260200101516001541190565b610ddb57828181518110610db757610db7613f31565b602002602001015160405163500f73d960e01b815260040161090b91815260200190565b5f610e2a848381518110610df157610df1613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f2061243990919063ffffffff16565b90508015610ea757838281518110610e4457610e44613f31565b6020026020010151856001600160a01b03167fe9919c1157673d017b4e5eef8d4c012fadcf6ee40cf5f99a0912a0109b5d584260405160405180910390a3610ea785858481518110610e9857610e98613f31565b60200260200101518586611c7e565b50600101610d74565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f805160206143618339815191529161080290613ef9565b610ef66135c3565b610a3c83836001611e94565b5f610c7585858585600161218a565b81610f1e6108b482610c3d565b5f5b8251811015610a15575f5483516001600160a01b0390911690636ec934da90859084908110610f5157610f51613f31565b60200260200101516040518263ffffffff1660e01b8152600401610f8491906001600160a01b0391909116815260200190565b602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190613f71565b61100a57828181518110610fd957610fd9613f31565b602002602001015160405163e2a7bea360e01b815260040161090b91906001600160a01b0391909116815260200190565b82818151811061101c5761101c613f31565b60200260200101516001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110839190613f71565b156110cb5782818151811061109a5761109a613f31565b602002602001015160405163b4e1115760e01b815260040161090b91906001600160a01b0391909116815260200190565b5f8481526002602052604081208451600192908690859081106110f0576110f0613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f6101000a81548160ff02191690831515021790555082818151811061114157611141613f31565b60200260200101516001600160a01b0316847f42e38738c8d2e007a797548d288aea65537b98d212336f6fa33ca20c7a99088560405160405180910390a3600101610f20565b6108a3338383612444565b8161119f6108b482610c3d565b5f5b8251811015610a15575f61120160025f8781526020019081526020015f205f8685815181106111d2576111d2613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600b016124ea565b90506112278585848151811061121957611219613f31565b6020026020010151836108a7565b60025f8681526020019081526020015f205f85848151811061124b5761124b613f31565b6020908102919091018101516001600160a01b031682528101919091526040015f908120805460ff19168155600181018290556002810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560098101829055600a810182905590600b82018181816112cf82826135ed565b5050505050508382815181106112e7576112e7613f31565b60200260200101516001600160a01b0316857fa328ee555a02ae133b939087dcc439417783329f687112f415290a4637f64ab760405160405180910390a3506001016111a1565b5f61133a846001541190565b61134557505f610c78565b6001600160a01b0385165f9081526003602052604090206113669085611d87565b61137157505f610c78565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff166113a157505f610c78565b5f8481526002602090815260408083206001600160a01b03871684529091529020610c7590600b01836124f6565b604080515f815260208101909152606090826001600160401b038111156113f8576113f86136fb565b60405190808252806020026020018201604052801561142b57816020015b60608152602001906001900390816114165790505b5091505f5b838110156114ac576114873086868481811061144e5761144e613f31565b90506020028101906114609190613f9f565b8560405160200161147393929190613fe8565b604051602081830303815290604052612517565b83828151811061149957611499613f31565b6020908102919091010152600101611430565b505092915050565b6114bf848484610a43565b610a153385858585612580565b6001600160a01b0381165f9081526003602052604090206060906107dd906124ea565b5f5f19860361150b576115048786858561269f565b9050611605565b6115178787878761132e565b61154e5760405163c6c8526f60e01b8152600481018790526001600160a01b0380871660248301528516604482015260640161090b565b5f61155b88888886612751565b80519091508410806115705750806020015184115b156115a55780516020820151604051633e5d735760e21b8152600481018790526024810192909252604482015260640161090b565b5f6115b28688878761269f565b90506115d482608001516115c58361277f565b6115cf919061400d565b6127af565b925081604001518310156115ee5781604001519250611602565b816060015183111561160257816060015192505b50505b9695505050505050565b5f6116186127d4565b805490915060ff600160401b82041615906001600160401b03165f8115801561163e5750825b90505f826001600160401b031660011480156116595750303b155b905081158015611667575080155b156116855760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116af57845460ff60401b1916600160401b1785555b6117096040518060400160405280601081526020016f53697a6520436f6c6c656374696f6e7360801b8152506040518060400160405280601081526020016f53495a455f434f4c4c454354494f4e5360801b8152506127fc565b61171161280e565b61171961280e565b61172161280e565b5f80546001600160a01b0319166001600160a01b038816179055831561178157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b606061179482611b89565b505f61179e612816565b90505f8151116117bc5760405180602001604052805f815250610a3c565b806117c684612845565b6040516020016117d792919061402c565b6040516020818303038152906040529392505050565b60606117fa836001541190565b61181a5760405163500f73d960e01b81526004810184905260240161090b565b5f8381526002602090815260408083206001600160a01b038616845290915290205460ff1661186e57604051631713bf1160e21b8152600481018490526001600160a01b038316602482015260440161090b565b5f8381526002602090815260408083206001600160a01b03861684529091529020610a3c90600b016124ea565b5f546001600160a01b031633146118c757604051630b56d23b60e41b815233600482015260240161090b565b6118cf6135c3565b5f5b8251811015610a15576118ef838281518110610d9257610d92613f31565b61190557828181518110610db757610db7613f31565b5f61195484838151811061191b5761191b613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f206128d490919063ffffffff16565b905080156119c25783828151811061196e5761196e613f31565b6020026020010151856001600160a01b03167fd0b1806956ca744bd88a4e4057a137959cb88d8d4e7e8d793301cfdf7df7cb2b60405160405180910390a36119c285858481518110610e9857610e98613f31565b506001016118d1565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b82611a246108b482610c3d565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff16611a7857604051631713bf1160e21b8152600481018590526001600160a01b038416602482015260440161090b565b5f5b82518110156109d6575f611ace848381518110611a9957611a99613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b01906128df565b90508015611b3157838281518110611ae857611ae8613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f8e2f88c467ecc78e2adbbe6d65b6176668f4cc362a196a5c46d203a9db8d8fbe60405160405180910390a45b50600101611a7a565b5f6001600160e01b031982166380ac58cd60e01b1480611b6a57506001600160e01b03198216635b5e139f60e01b145b806107dd57506301ffc9a760e01b6001600160e01b03198316146107dd565b5f80611b94836128f3565b90506001600160a01b0381166107dd57604051637e27328960e01b81526004810184905260240161090b565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b64838383600161292c565b611c11838383612a3f565b610b64576001600160a01b038316611c3f57604051637e27328960e01b81526004810182905260240161090b565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161090b565b5f610a3c836001600160a01b038416612aa3565b611c89836001541190565b611ca95760405163500f73d960e01b81526004810184905260240161090b565b611cb38282612b86565b60408051808201825283815260208082018481526001600160a01b0388165f81815260048085528682208a8352855290869020945180518655808501516001870155808701516002870155606080820151600388015560809182015192870192909255925180516005870155938401516006860155838601516007860155830151600885015591015160099092019190915590518491907fb20b9722fd4401237d66274470a4daf19d973d3f3150edba3bcadf8467ed9b4290611d79908690869061405a565b60405180910390a350505050565b5f8181526001830160205260408120541515610a3c565b5f80611dab858585612d18565b90506001600160a01b038116611e3257611e2d845f805160206143a183398151915280545f8381527f645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0360205260408120829055600182018355919091527fa42f15e5d656f8155fd7419d740a6073999f19cd6e061449ce4a257150545bf20155565b611e55565b846001600160a01b0316816001600160a01b031614611e5557611e558185612e1a565b6001600160a01b038516611e7157611e6c84612eb1565b610c78565b846001600160a01b0316816001600160a01b031614610c7857610c788585612f7e565b611e9c6135c3565b81611ecb576001600160a01b0384165f9081526004602090815260408083208684529091529020600501611eee565b6001600160a01b0384165f90815260046020908152604080832086845290915290205b6040805160a0810182528254815260018301546020820152600283015491810191909152600382015460608201526004909101546080820152949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fa95f80516020614381833981519152546001600160a01b031690565b6001600160a01b031614155b15611fd35760405163703e46dd60e11b815260040160405180910390fd5b565b5f8054604051632474521560e21b8152600481018390523360248201526001600160a01b03909116906391d1485490604401602060405180830381865afa158015612022573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120469190613f71565b6108a35760405163e2517d3f60e01b81523360048201526024810182905260440161090b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120c6575060408051601f3d908101601f191682019092526120c3918101906140ca565b60015b6120ee57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161090b565b5f80516020614381833981519152811461211e57604051632a87526960e21b81526004810182905260240161090b565b610b648383612fd6565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fd35760405163703e46dd60e11b815260040160405180910390fd5b6108a3828260405180602001604052805f81525061302b565b6001600160a01b0385165f908152600360205260408120815b6121ac82613042565b811015612340575f6121be838361304b565b5f8181526002602090815260408083206001600160a01b038c16845290915290205490915060ff166121f05750612338565b5f8181526002602090815260408083206001600160a01b038b1684529091528120600b01905b61221f82613042565b811015612334575f612231838361304b565b905061223f818b8a15613056565b1561224a575061232c565b306001600160a01b031663c260d2068d868d858e8e156040518763ffffffff1660e01b8152600401612281969594939291906140e1565b602060405180830381865afa9250505080156122ba575060408051601f3d908101601f191682019092526122b7918101906140ca565b60015b6122f3573d8080156122e7576040519150601f19603f3d011682016040523d82523d5f602084013e6122ec565b606091505b505061232a565b88801561230057508b8110155b806123145750881580156123145750808c10155b15612328575f975050505050505050610b7b565b505b505b600101612216565b5050505b6001016121a3565b5061234d87868515613056565b1561235c576001915050610b7b565b604051636130690360e11b8152309063c260d2069061238b908a905f19908a905f908b908b15906004016140e1565b602060405180830381865afa9250505080156123c4575060408051601f3d908101601f191682019092526123c1918101906140ca565b60015b6123fd573d8080156123f1576040519150601f19603f3d011682016040523d82523d5f602084013e6123f6565b606091505b505061242f565b83801561240a5750868110155b8061241e57508315801561241e5750808710155b1561242d575f92505050610b7b565b505b6001915050610b7b565b5f610a3c838361312c565b5f805160206143618339815191526001600160a01b03831661248457604051630b61174360e31b81526001600160a01b038416600482015260240161090b565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611d79565b60605f610a3c83613178565b6001600160a01b0381165f9081526001830160205260408120541515610a3c565b60605f80846001600160a01b031684604051612533919061411b565b5f60405180830381855af49150503d805f811461256b576040519150601f19603f3d011682016040523d82523d5f602084013e612570565b606091505b5091509150610b7b8583836131d1565b6001600160a01b0383163b156109d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906125c2908890889087908790600401614136565b6020604051808303815f875af19250505080156125fc575060408051601f3d908101601f191682019092526125f991810190614168565b60015b612663573d808015612629576040519150601f19603f3d011682016040523d82523d5f602084013e61262e565b606091505b5080515f0361265b57604051633250574960e11b81526001600160a01b038516600482015260240161090b565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461178157604051633250574960e11b81526001600160a01b038516600482015260240161090b565b5f811561271c57604051620d37ab60e81b81526001600160a01b03868116600483015260248201859052851690630d37ab00906044015b602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271591906140ca565b9050610c78565b604051632b59bd9960e01b81526001600160a01b03868116600483015260248201859052851690632b59bd99906044016126d6565b6127596135c3565b61276485848461322d565b905061276f8161330a565b15610c7857610c75858584611e94565b5f6001600160ff1b038211156127ab5760405163123baf0360e11b81526004810183905260240161090b565b5090565b5f808212156127ab57604051635467221960e11b81526004810183905260240161090b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006107dd565b612804613349565b6108a3828261336e565b611fd3613349565b606061282146612845565b6040516020016128319190614183565b604051602081830303815290604052905090565b60605f6128518361339e565b60010190505f816001600160401b0381111561286f5761286f6136fb565b6040519080825280601f01601f191660200182016040528015612899576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128a357509392505050565b5f610a3c8383612aa3565b5f610a3c836001600160a01b03841661312c565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f80516020614361833981519152818061294e57506001600160a01b03831615155b15612a0f575f61295d85611b89565b90506001600160a01b038416158015906129895750836001600160a01b0316816001600160a01b031614155b801561299c575061299a81856119cb565b155b156129c55760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161090b565b8215612a0d5784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160a01b03831615801590610c785750826001600160a01b0316846001600160a01b03161480612a785750612a7884846119cb565b80610c785750826001600160a01b0316612a9183611bc0565b6001600160a01b031614949350505050565b5f8181526001830160205260408120548015612b7d575f612ac5600183613f8c565b85549091505f90612ad890600190613f8c565b9050808214612b37575f865f018281548110612af657612af6613f31565b905f5260205f200154905080875f018481548110612b1657612b16613f31565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612b4857612b486141df565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107dd565b5f9150506107dd565b602082015182511115612bbc57815160208301516040516307198f4960e11b81526004810192909252602482015260440161090b565b816060015182604001511115612bfa5781604001518260600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b602081015181511115612c3057805160208201516040516307198f4960e11b81526004810192909252602482015260440161090b565b806060015181604001511115612c6e5780604001518160600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b81606001518160400151118015612c8a57508151602082015110155b8015612c9b57508051602083015110155b156108a357805f0151816020015182604001518360600151855f015186602001518760400151886060015160405163a19d2d6760e01b815260040161090b989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b5f5f8051602061436183398151915281612d31856128f3565b90506001600160a01b03841615612d4d57612d4d818587611c06565b6001600160a01b03811615612d8957612d685f865f8061292c565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615612db9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f805160206143418339815191525f612e3284610c80565b5f8481526001840160209081526040808320546001600160a01b03891684529186905290912091925090818314612e8a575f838152602082815260408083205485845281842081905583526001870190915290208290555b5f948552600190930160209081526040808620869055928552929092528220919091555050565b5f805160206143a1833981519152545f80516020614341833981519152905f90612edd90600190613f8c565b5f848152600384016020526040812054600285018054939450909284908110612f0857612f08613f31565b905f5260205f200154905080846002018381548110612f2957612f29613f31565b5f91825260208083209091019290925582815260038601909152604080822084905586825281205560028401805480612f6457612f646141df565b600190038181905f5260205f20015f905590555050505050565b5f805160206143418339815191525f6001612f9885610c80565b612fa29190613f8c565b6001600160a01b039094165f9081526020838152604080832087845282528083208690559482526001909301909252502055565b612fdf82613475565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561302357610b648282612517565b6108a36134d8565b61303583836134f7565b610b64335f858585612580565b5f6107dd825490565b5f610a3c8383613558565b5f816130c457604051630cfa9a4960e01b81526001600160a01b038581166004830152841690630cfa9a4990602401602060405180830381865afa1580156130a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c9190613f71565b60405163044ce7c360e41b81526001600160a01b0385811660048301528416906344ce7c3090602401602060405180830381865afa158015613108573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c789190613f71565b5f81815260018301602052604081205461317157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107dd565b505f6107dd565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131c557602002820191905f5260205f20905b8154815260200190600101908083116131b1575b50505050509050919050565b6060826131e6576131e18261357e565b610a3c565b81511580156131fd57506001600160a01b0384163b155b1561322657604051639996b31560e01b81526001600160a01b038516600482015260240161090b565b5080610a3c565b6132356135c3565b816132a25760405163c421a75960e01b81526001600160a01b03858116600483015284169063c421a7599060240160a060405180830381865afa15801561327e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906141f3565b604051630264211160e11b81526001600160a01b0385811660048301528416906304c842229060240160a060405180830381865afa1580156132e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7891906141f3565b80515f9015801561331d57506020820151155b801561332b57506040820151155b801561333957506060820151155b80156107dd575050608001511590565b6133516135aa565b611fd357604051631afcd79f60e31b815260040160405180910390fd5b613376613349565b5f805160206143618339815191528061338f8482614285565b5060018101610a158382614285565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106133dc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613408576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061342657662386f26fc10000830492506010015b6305f5e100831061343e576305f5e100830492506008015b612710831061345257612710830492506004015b60648310613464576064830492506002015b600a83106107dd5760010192915050565b806001600160a01b03163b5f036134aa57604051634c9c8ce360e01b81526001600160a01b038216600482015260240161090b565b5f8051602061438183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611fd35760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661352057604051633250574960e11b81525f600482015260240161090b565b5f61352c83835f611d9e565b90506001600160a01b03811615610b64576040516339e3563760e11b81525f600482015260240161090b565b5f825f01828154811061356d5761356d613f31565b905f5260205f200154905092915050565b80511561358e5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f6135b36127d4565b54600160401b900460ff16919050565b6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b5080545f8255905f5260205f20908101906135a791905b808211156127ab575f8155600101613604565b6001600160e01b0319811681146135a7575f80fd5b5f6020828403121561363c575f80fd5b8135610a3c81613617565b5f5b83811015613661578181015183820152602001613649565b50505f910152565b5f8151808452613680816020860160208601613647565b601f01601f19169290920160200192915050565b602081525f610a3c6020830184613669565b5f602082840312156136b6575f80fd5b5035919050565b6001600160a01b03811681146135a7575f80fd5b5f80604083850312156136e2575f80fd5b82356136ed816136bd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715613731576137316136fb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561375f5761375f6136fb565b604052919050565b5f6001600160401b0382111561377f5761377f6136fb565b5060051b60200190565b5f805f6060848603121561379b575f80fd5b833592506020808501356137ae816136bd565b925060408501356001600160401b038111156137c8575f80fd5b8501601f810187136137d8575f80fd5b80356137eb6137e682613767565b613737565b81815260059190911b82018301908381019089831115613809575f80fd5b928401925b82841015613830578335613821816136bd565b8252928401929084019061380e565b80955050505050509250925092565b5f60a0828403121561384f575f80fd5b61385761370f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f80610180858703121561389f575f80fd5b84356138aa816136bd565b9350602085013592506138c0866040870161383f565b91506138cf8660e0870161383f565b905092959194509250565b5f805f606084860312156138ec575f80fd5b83356138f7816136bd565b92506020840135613907816136bd565b929592945050506040919091013590565b60a081016107dd828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b5f805f805f60a08688031215613965575f80fd5b8535613970816136bd565b9450602086013593506040860135613987816136bd565b92506060860135613997816136bd565b949793965091946080013592915050565b5f82601f8301126139b7575f80fd5b81356001600160401b038111156139d0576139d06136fb565b6139e3601f8201601f1916602001613737565b8181528460208386010111156139f7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613a24575f80fd5b8235613a2f816136bd565b915060208301356001600160401b03811115613a49575f80fd5b613a55858286016139a8565b9150509250929050565b5f805f8060808587031215613a72575f80fd5b8435613a7d816136bd565b9350602085013592506040850135613a94816136bd565b9396929550929360600135925050565b5f60208284031215613ab4575f80fd5b8135610a3c816136bd565b5f8060408385031215613ad0575f80fd5b823591506020830135613ae2816136bd565b809150509250929050565b5f8060408385031215613afe575f80fd5b8235613b09816136bd565b91506020838101356001600160401b03811115613b24575f80fd5b8401601f81018613613b34575f80fd5b8035613b426137e682613767565b81815260059190911b82018301908381019088831115613b60575f80fd5b928401925b82841015613b7e57833582529284019290840190613b65565b80955050505050509250929050565b5f8060408385031215613b9e575f80fd5b823591506020808401356001600160401b03811115613bbb575f80fd5b8401601f81018613613bcb575f80fd5b8035613bd96137e682613767565b81815260059190911b82018301908381019088831115613bf7575f80fd5b928401925b82841015613b7e578335613c0f816136bd565b82529284019290840190613bfc565b80151581146135a7575f80fd5b5f8060408385031215613c3c575f80fd5b8235613c47816136bd565b91506020830135613ae281613c1e565b5f805f8060808587031215613c6a575f80fd5b8435613c75816136bd565b9350602085013592506040850135613c8c816136bd565b91506060850135613c9c816136bd565b939692955090935050565b5f8060208385031215613cb8575f80fd5b82356001600160401b0380821115613cce575f80fd5b818501915085601f830112613ce1575f80fd5b813581811115613cef575f80fd5b8660208260051b8501011115613d03575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613d6a57603f19888603018452613d58858351613669565b94509285019290850190600101613d3c565b5092979650505050505050565b5f805f8060808587031215613d8a575f80fd5b8435613d95816136bd565b93506020850135613da5816136bd565b92506040850135915060608501356001600160401b03811115613dc6575f80fd5b613dd2878288016139a8565b91505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613e1557835183529284019291840191600101613df9565b50909695505050505050565b5f805f805f8060c08789031215613e36575f80fd5b8635613e41816136bd565b9550602087013594506040870135613e58816136bd565b93506060870135613e68816136bd565b92506080870135915060a0870135613e7f81613c1e565b809150509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613e155783516001600160a01b031683529284019291840191600101613ea8565b5f8060408385031215613ede575f80fd5b8235613ee9816136bd565b91506020830135613ae2816136bd565b600181811c90821680613f0d57607f821691505b602082108103613f2b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613f6a57613f6a613f45565b5060010190565b5f60208284031215613f81575f80fd5b8151610a3c81613c1e565b818103818111156107dd576107dd613f45565b5f808335601e19843603018112613fb4575f80fd5b8301803591506001600160401b03821115613fcd575f80fd5b602001915036819003821315613fe1575f80fd5b9250929050565b828482375f8382015f81528351614003818360208801613647565b0195945050505050565b8082018281125f8312801582168215821617156114ac576114ac613f45565b5f835161403d818460208801613647565b835190830190614051818360208801613647565b01949350505050565b6101408101614094828580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160a0830152602083015160c0830152604083015160e083015260608301516101008301526080830151610120830152610a3c565b5f602082840312156140da575f80fd5b5051919050565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925290151560a082015260c00190565b5f825161412c818460208701613647565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90610b7890830184613669565b5f60208284031215614178575f80fd5b8151610a3c81613617565b7f68747470733a2f2f6170692e73697a652e6372656469742f636f6c6c656374698152636f6e732f60e01b60208201525f82516141c7816024850160208701613647565b602f60f81b6024939091019283015250602501919050565b634e487b7160e01b5f52603160045260245ffd5b5f60a08284031215614203575f80fd5b61420b61370f565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b601f821115610b6457805f5260205f20601f840160051c810160208510156142665750805b601f840160051c820191505b818110156109d6575f8155600101614272565b81516001600160401b0381111561429e5761429e6136fb565b6142b2816142ac8454613ef9565b84614241565b602080601f8311600181146142e5575f84156142ce5750858301515b5f19600386901b1c1916600185901b178555611781565b5f85815260208120601f198616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561433057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed02a264697066735822122003abfeed6c386c88a16ffbbf7a5897b7c6d1d273227a7bd7ff4dab3f8c8fc58964736f6c63430008170033", + "nonce": "0x145", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionType": "CREATE", + "contractName": "SizeFactory", + "contractAddress": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x388367", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613208620001005f395f81816119ea01528181611a130152611b5601526132085ff3fe60806040526004361061025f575f3560e01c806386eeeb5a1161013f578063ad3cb1cc116100b3578063d152e23611610078578063d152e23614610762578063d547741f14610781578063e8d353c7146107a0578063eb44fdd3146107bf578063ec2c9016146107de578063f0fb716f146107ff575f80fd5b8063ad3cb1cc146106b6578063b1ef804d146106e6578063b4cd6bd114610705578063c4d66de814610724578063c8fb624714610743575f80fd5b80639e42bfa3116101045780639e42bfa3146106065780639feffdb014610625578063a217fddf14610644578063a78ec6ae14610657578063a7b2b31014610676578063ac9650d81461068a575f80fd5b806386eeeb5a1461056b57806388d765201461058a57806391c769ce146105a957806391d14854146105c8578063973cf867146105e7575f80fd5b806352d1902d116101d65780636ec934da1161019b5780636ec934da146104865780636ed41835146104a5578063732218f9146104c45780637643d7ec146104e35780637b8dedad1461050457806381de274c14610540575f80fd5b806352d1902d146103de57806354fd4d50146103f25780635ec49544146104295780635fb7f10c14610448578063678b9bad14610467575f80fd5b806327fa35c31161022757806327fa35c31461033b5780632f2ff15d1461034f57806336568abe1461036e57806337c11b2a1461038d578063495e6d89146103ac5780634f1ef286146103cb575f80fd5b806301a6c8721461026357806301ffc9a7146102845780631286a2dc146102b85780631e4fcddb146102ef578063248a9ca31461030e575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461222c565b61081e565b005b34801561028f575f80fd5b506102a361029e366004612247565b610884565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506007546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b3480156102fa575f80fd5b5061028261030936600461222c565b6108ba565b348015610319575f80fd5b5061032d61032836600461227e565b610947565b6040519081526020016102af565b348015610346575f80fd5b5061032d610967565b34801561035a575f80fd5b50610282610369366004612295565b610976565b348015610379575f80fd5b50610282610388366004612295565b610998565b348015610398575f80fd5b50600a546102d7906001600160a01b031681565b3480156103b7575f80fd5b5061032d6103c63660046122c3565b6109d0565b6102826103d93660046123cf565b610a67565b3480156103e9575f80fd5b5061032d610a86565b3480156103fd575f80fd5b5060408051808201909152600681526576312e382e3160d01b60208201525b6040516102af91906124a8565b348015610434575f80fd5b5061041c6104433660046124ba565b610aa1565b348015610453575f80fd5b5061032d6104623660046122c3565b610b20565b348015610472575f80fd5b506102a3610481366004612537565b610b70565b348015610491575f80fd5b506102a36104a036600461222c565b610bf3565b3480156104b0575f80fd5b506102826104bf3660046125c8565b610bfe565b3480156104cf575f80fd5b506102826104de366004612680565b610c0a565b3480156104ee575f80fd5b506104f7610cb8565b6040516102af91906126c3565b34801561050f575f80fd5b5061032d61051e366004612725565b600860209081525f938452604080852082529284528284209052825290205481565b34801561054b575f80fd5b5061032d61055a36600461222c565b60096020525f908152604090205481565b348015610576575f80fd5b506102a3610585366004612764565b610fe6565b348015610595575f80fd5b506102826105a43660046127a4565b611056565b3480156105b4575f80fd5b506102826105c33660046127f4565b6110d8565b3480156105d3575f80fd5b506102a36105e2366004612295565b6110e3565b3480156105f2575f80fd5b506006546102d7906001600160a01b031681565b348015610611575f80fd5b5061028261062036600461281e565b611119565b348015610630575f80fd5b506102a361063f366004612537565b611126565b34801561064f575f80fd5b5061032d5f81565b348015610662575f80fd5b506102a361067136600461284f565b61116e565b348015610681575f80fd5b506102826111d3565b348015610695575f80fd5b506106a96106a436600461288d565b61121e565b6040516102af91906128fb565b3480156106c1575f80fd5b5061041c604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106f1575f80fd5b50610282610700366004612680565b611303565b348015610710575f80fd5b5061028261071f36600461222c565b61134e565b34801561072f575f80fd5b5061028261073e36600461222c565b6113db565b34801561074e575f80fd5b5061028261075d36600461281e565b61156c565b34801561076d575f80fd5b506102d761077c366004612963565b611576565b34801561078c575f80fd5b5061028261079b366004612295565b611633565b3480156107ab575f80fd5b506102d76107ba366004612a1c565b61164f565b3480156107ca575f80fd5b506102d76107d936600461227e565b61172e565b3480156107e9575f80fd5b506107f2611739565b6040516102af9190612a48565b34801561080a575f80fd5b506102d7610819366004612aaa565b6117ce565b5f610828816118b2565b600a546040516001600160a01b038085169216907f24b8a2b6435960c7b1b405f08e684a0ed2e4d467b56f325250b56e2a10dbabae905f90a350600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160e01b03198216637965db0b60e01b14806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6108c4816118b2565b6001600160a01b0382166108eb5760405163de0ce17d60e01b815260040160405180910390fd5b6007546040516001600160a01b038085169216907faefd875bf3940c57f185da0affbb82ce03656890d6e1d29310e8b4bf9d20b7c1905f90a350600780546001600160a01b0319166001600160a01b0392909216919091179055565b5f9081525f805160206131b3833981519152602052604090206001015490565b5f6109715f6118bc565b905090565b61097f82610947565b610988816118b2565b61099283836118c5565b50505050565b6001600160a01b03811633146109c15760405163334bd91960e11b815260040160405180910390fd5b6109cb8282611966565b505050565b600a5460405163495e6d8960e01b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f92169063495e6d899060a4015b602060405180830381865afa158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612b15565b90505b95945050505050565b610a6f6119df565b610a7882611a85565b610a828282611a8f565b5050565b5f610a8f611b4b565b505f8051602061319383398151915290565b6060610aac84610bf3565b610ad95760405163e2a7bea360e01b81526001600160a01b03851660048201526024015b60405180910390fd5b610b188484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611b9492505050565b949350505050565b600a546040516317edfc4360e21b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f921690635fb7f10c9060a401610a1c565b600a5460405163678b9bad60e01b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f92169063678b9bad906084015b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612b2c565b5f6108b48183611ba1565b6109cb83838333611056565b610c163382600b610fe6565b610c55573381600b5b60405163062709f360e41b81526001600160a01b03938416600482015292909116602483015260ff166044820152606401610ad0565b600a546040516301bc3d7160e71b81526001600160a01b039091169063de1eb88090610c879084908690600401612b5f565b5f604051808303815f87803b158015610c9e575f80fd5b505af1158015610cb0573d5f803e3d5ffd5b505050505050565b6060610cc35f6118bc565b6001600160401b03811115610cda57610cda61231a565b604051908082528060200260200182016040528015610d0d57816020015b6060815260200190600190039081610cf85790505b5090505f5b8151811015610fe2575f610d268183611bc2565b90505f610da06064836001600160a01b0316637c90a6ca6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612bb4565b60200151670de0b6b3a7640000611bcd565b9050816001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ddf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e039190612c0d565b604001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610e41573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e689190810190612cc6565b826001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190612c0d565b606001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f07573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f2e9190810190612cc6565b610f3783611bd9565b846001600160a01b03166354fd4d506040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f72573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f999190810190612cc6565b604051602001610fac9493929190612d2e565b604051602081830303815290604052848481518110610fcd57610fcd612dba565b60209081029190910101525050600101610d12565b5090565b5f826001600160a01b0316846001600160a01b0316036110085750600161104f565b6001600160a01b038084165f8181526009602090815260408083205480845260088352818420958a168452948252808320938352929052205461104b9084611c68565b9150505b9392505050565b6110623382600b610fe6565b61106f573381600b610c1f565b600a546040516318d5932d60e01b81526001600160a01b03909116906318d5932d906110a5908490889088908890600401612dce565b5f604051808303815f87803b1580156110bc575f80fd5b505af11580156110ce573d5f803e3d5ffd5b5050505050505050565b610a82823383611c8a565b5f9182525f805160206131b3833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6111238133610c0a565b50565b600a546040516309feffdb60e41b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f921690639feffdb090608401610bb4565b5f826001600160a01b0316846001600160a01b0316036111905750600161104f565b506001600160a01b038281165f8181526009602090815260408083205483526008825280832094881683529381528382209282529190915220548116811461104f565b60405133907fecbee29490a7e5456f4e3aab0700477764e3f16dda5a21ea92f43f1cfcb15799905f90a2335f90815260096020526040812080549161121783612e6a565b9190505550565b604080515f815260208101909152606090826001600160401b038111156112475761124761231a565b60405190808252806020026020018201604052801561127a57816020015b60608152602001906001900390816112655790505b5091505f5b838110156112fb576112d63086868481811061129d5761129d612dba565b90506020028101906112af9190612e95565b856040516020016112c293929190612ede565b604051602081830303815290604052611d72565b8382815181106112e8576112e8612dba565b602090810291909101015260010161127f565b505092915050565b61130f3382600b610fe6565b61131c573381600b610c1f565b600a546040516393c0d3f360e01b81526001600160a01b03909116906393c0d3f390610c879084908690600401612b5f565b5f611358816118b2565b6001600160a01b03821661137f5760405163de0ce17d60e01b815260040160405180910390fd5b6006546040516001600160a01b038085169216907ffb3d0b43c5121de915eeb8fa2fb4bb792b6b05d5d6f3df7630aac9d9e8697312905f90a350600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f6113e4611ddb565b805490915060ff600160401b82041615906001600160401b03165f8115801561140a5750825b90505f826001600160401b031660011480156114255750303b155b905081158015611433575080155b156114515760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561147b57845460ff60401b1916600160401b1785555b611483611e03565b61148b611e03565b611493611e03565b61149d5f876118c5565b506114c87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a876118c5565b506114f37ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab876118c5565b5061151e7f1eae1854c74a696c6de86fd3c6383d5c1e2c33fbc86e1aa6b6c872d95bd24038876118c5565b508315610cb057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6111238133611303565b5f80611581816118b2565b60405163145b6cb960e11b815273e8dc58c7f234e49f024ce03e926be80fc2db0f7d906328b6d972906115b8908690600401612f03565b602060405180830381865af41580156115d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f79190612fe0565b6040519092506001600160a01b038316907f970cbcaabfe7c54976df22e530fb6ef3a9202796c410ae94972a9b109d5b2ca8905f90a250919050565b61163c82610947565b611645816118b2565b6109928383611966565b5f8061165a816118b2565b6007546040516302a8408560e11b81526001600160a01b03918216600482015233602482018190528683166044830152918516606482015273b4a15fb08dbe6a161ff1d411be2d9f67f060611890630550810a90608401602060405180830381865af41580156116cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f09190612fe0565b6040519093506001600160a01b038416907f798adeb18dd44bd81e89d3ab4aa52d11e6d22b3ab80b11da6844ec0eda2a0810905f90a2505092915050565b5f6108b48183611bc2565b60606117445f6118bc565b6001600160401b0381111561175b5761175b61231a565b604051908082528060200260200182016040528015611784578160200160208202803683370190505b5090505f5b8151811015610fe25761179c5f82611bc2565b8282815181106117ae576117ae612dba565b6001600160a01b0390921660209283029190910190910152600101611789565b5f806117d9816118b2565b60065460405163d41bcfc560e01b815233917322c26a06ef6c51bbca1cf5276e1606e89402979a9163d41bcfc591611829916001600160a01b039091169085908c908c908c908c906004016130c8565b602060405180830381865af4158015611844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118689190612fe0565b92506118745f84611e0b565b506040516001600160a01b038416907ffa970ff5f178441bbe297db8d35a584c9bd6628b17b82d80dc8f5b80063102ca905f90a25050949350505050565b6111238133611e1f565b5f6108b4825490565b5f5f805160206131b38339815191526118de84846110e3565b61195d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556119133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108b4565b5f9150506108b4565b5f5f805160206131b383398151915261197f84846110e3565b1561195d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108b4565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a6557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a595f80516020613193833981519152546001600160a01b031690565b6001600160a01b031614155b15611a835760405163703e46dd60e11b815260040160405180910390fd5b565b5f610a82816118b2565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae9575060408051601f3d908101601f19168201909252611ae691810190612b15565b60015b611b1157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ad0565b5f805160206131938339815191528114611b4157604051632a87526960e21b815260048101829052602401610ad0565b6109cb8383611e58565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a835760405163703e46dd60e11b815260040160405180910390fd5b606061104f83835f611ead565b6001600160a01b0381165f908152600183016020526040812054151561104f565b5f61104f8383611f4d565b5f610b18848484611f73565b60605f611be583611f97565b60010190505f816001600160401b03811115611c0357611c0361231a565b6040519080825280601f01601f191660200182016040528015611c2d576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c3757509392505050565b5f81600c811115611c7b57611c7b612b4b565b6001901b831615159392505050565b6001600160a01b038316611cb15760405163de0ce17d60e01b815260040160405180910390fd5b611cba8161206e565b611cda57604051632e40743360e01b815260048101829052602401610ad0565b6001600160a01b0382165f9081526009602052604090205481846001600160a01b0316846001600160a01b03167f89733de2d64cea40de091169750607b26e8d46142312fba65fb6476c790bad4984604051611d3891815260200190565b60405180910390a45f9081526008602090815260408083206001600160a01b03968716845282528083209490951682529290925291902055565b60605f80846001600160a01b031684604051611d8e9190613177565b5f60405180830381855af49150503d805f8114611dc6576040519150601f19603f3d011682016040523d82523d5f602084013e611dcb565b606091505b5091509150610a5e858383612087565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108b4565b611a836120e3565b5f61104f836001600160a01b038416612108565b611e2982826110e3565b610a825760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610ad0565b611e6182612154565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611ea5576109cb8282611d72565b610a826121b7565b606081471015611ed95760405163cf47918160e01b815247600482015260248101839052604401610ad0565b5f80856001600160a01b03168486604051611ef49190613177565b5f6040518083038185875af1925050503d805f8114611f2e576040519150601f19603f3d011682016040523d82523d5f602084013e611f33565b606091505b5091509150611f43868383612087565b9695505050505050565b5f825f018281548110611f6257611f62612dba565b905f5260205f200154905092915050565b5f825f190484118302158202611f905763ad251c275f526004601cfd5b5091020490565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fd55772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061201f57662386f26fc10000830492506010015b6305f5e1008310612037576305f5e100830492506008015b612710831061204b57612710830492506004015b6064831061205d576064830492506002015b600a83106108b45760010192915050565b5f8061207d6001611000612e82565b9092111592915050565b60608261209c57612097826121d6565b61104f565b81511580156120b357506001600160a01b0384163b155b156120dc57604051639996b31560e01b81526001600160a01b0385166004820152602401610ad0565b508061104f565b6120eb6121ff565b611a8357604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461214d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b4565b505f6108b4565b806001600160a01b03163b5f0361218957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ad0565b5f8051602061319383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611a835760405163b398979f60e01b815260040160405180910390fd5b8051156121e65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f612208611ddb565b54600160401b900460ff16919050565b6001600160a01b0381168114611123575f80fd5b5f6020828403121561223c575f80fd5b813561104f81612218565b5f60208284031215612257575f80fd5b81356001600160e01b03198116811461104f575f80fd5b803561227981612218565b919050565b5f6020828403121561228e575f80fd5b5035919050565b5f80604083850312156122a6575f80fd5b8235915060208301356122b881612218565b809150509250929050565b5f805f805f60a086880312156122d7575f80fd5b85356122e281612218565b94506020860135935060408601356122f981612218565b9250606086013561230981612218565b949793965091946080013592915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156123505761235061231a565b60405290565b60405161014081016001600160401b03811182821017156123505761235061231a565b604051601f8201601f191681016001600160401b03811182821017156123a1576123a161231a565b604052919050565b5f6001600160401b038211156123c1576123c161231a565b50601f01601f191660200190565b5f80604083850312156123e0575f80fd5b82356123eb81612218565b915060208301356001600160401b03811115612405575f80fd5b8301601f81018513612415575f80fd5b8035612428612423826123a9565b612379565b81815286602083850101111561243c575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f5b8381101561247557818101518382015260200161245d565b50505f910152565b5f815180845261249481602086016020860161245b565b601f01601f19169290920160200192915050565b602081525f61104f602083018461247d565b5f805f604084860312156124cc575f80fd5b83356124d781612218565b925060208401356001600160401b03808211156124f2575f80fd5b818601915086601f830112612505575f80fd5b813581811115612513575f80fd5b876020828501011115612524575f80fd5b6020830194508093505050509250925092565b5f805f806080858703121561254a575f80fd5b843561255581612218565b935060208501359250604085013561256c81612218565b9396929550929360600135925050565b5f60a0828403121561258c575f80fd5b61259461232e565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f61016084860312156125db575f80fd5b833592506125ec856020860161257c565b91506125fb8560c0860161257c565b90509250925092565b5f82601f830112612613575f80fd5b813560206001600160401b0382111561262e5761262e61231a565b8160051b61263d828201612379565b9283528481018201928281019087851115612656575f80fd5b83870192505b848310156126755782358252918301919083019061265c565b979650505050505050565b5f8060408385031215612691575f80fd5b82356001600160401b038111156126a6575f80fd5b6126b285828601612604565b92505060208301356122b881612218565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261270685835161247d565b945092850192908501906001016126ea565b5092979650505050505050565b5f805f60608486031215612737575f80fd5b83359250602084013561274981612218565b9150604084013561275981612218565b809150509250925092565b5f805f60608486031215612776575f80fd5b833561278181612218565b9250602084013561279181612218565b91506040840135600d8110612759575f80fd5b5f805f8061018085870312156127b8575f80fd5b843593506127c9866020870161257c565b92506127d88660c0870161257c565b91506101608501356127e981612218565b939692955090935050565b5f8060408385031215612805575f80fd5b823561281081612218565b946020939093013593505050565b5f6020828403121561282e575f80fd5b81356001600160401b03811115612843575f80fd5b610b1884828501612604565b5f805f60608486031215612861575f80fd5b833561286c81612218565b9250602084013561287c81612218565b929592945050506040919091013590565b5f806020838503121561289e575f80fd5b82356001600160401b03808211156128b4575f80fd5b818501915085601f8301126128c7575f80fd5b8135818111156128d5575f80fd5b8660208260051b85010111156128e9575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261293e85835161247d565b94509285019290850190600101612922565b803563ffffffff81168114612279575f80fd5b5f6101408284031215612974575f80fd5b61297c612356565b6129858361226e565b815261299360208401612950565b60208201526129a460408401612950565b60408201526129b56060840161226e565b60608201526129c66080840161226e565b60808201526129d760a0840161226e565b60a08201526129e860c0840161226e565b60c082015260e083013560e0820152610100808401358183015250610120612a1181850161226e565b908201529392505050565b5f8060408385031215612a2d575f80fd5b8235612a3881612218565b915060208301356122b881612218565b602080825282518282018190525f9190848201906040850190845b81811015612a885783516001600160a01b031683529284019291840191600101612a63565b50909695505050505050565b5f60c08284031215612aa4575f80fd5b50919050565b5f805f80848603610260811215612abf575f80fd5b612ac98787612a94565b945060a060bf1982011215612adc575f80fd5b60c086019350604061015f1982011215612af4575f80fd5b5061016085019150612b0a866101a08701612a94565b905092959194509250565b5f60208284031215612b25575f80fd5b5051919050565b5f60208284031215612b3c575f80fd5b8151801515811461104f575f80fd5b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b03831681526040602080830182905283519183018290525f9184820191906060850190845b81811015612ba757845183529383019391830191600101612b8b565b5090979650505050505050565b5f60a08284031215612bc4575f80fd5b612bcc61232e565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b805161227981612218565b5f610100808385031215612c1f575f80fd5b604051908101906001600160401b0382118183101715612c4157612c4161231a565b81604052835181526020840151602082015260408401519150612c6382612218565b816040820152612c7560608501612c02565b6060820152612c8660808501612c02565b6080820152612c9760a08501612c02565b60a0820152612ca860c08501612c02565b60c0820152612cb960e08501612c02565b60e0820152949350505050565b5f60208284031215612cd6575f80fd5b81516001600160401b03811115612ceb575f80fd5b8201601f81018413612cfb575f80fd5b8051612d09612423826123a9565b818152856020838501011115612d1d575f80fd5b610a5e82602083016020860161245b565b66029b4bd32903e160cd1b81525f8551612d4f816007850160208a0161245b565b8083019050620103e160ed1b8060078301528651612d7481600a850160208b0161245b565b600a92019182018190528551612d9181600d850160208a0161245b565b600d9201918201528351612dac81601084016020880161245b565b016010019695505050505050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0385168152602081018490526101808101612e1e604083018580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160e08301526020830151610100830152604083015161012083015260608301516101408301526080830151610160830152610a5e565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612e7b57612e7b612e56565b5060010190565b818103818111156108b4576108b4612e56565b5f808335601e19843603018112612eaa575f80fd5b8301803591506001600160401b03821115612ec3575f80fd5b602001915036819003821315612ed7575f80fd5b9250929050565b828482375f8382015f81528351612ef981836020880161245b565b0195945050505050565b81516001600160a01b0316815261014081016020830151612f2c602084018263ffffffff169052565b506040830151612f44604084018263ffffffff169052565b506060830151612f5f60608401826001600160a01b03169052565b506080830151612f7a60808401826001600160a01b03169052565b5060a0830151612f9560a08401826001600160a01b03169052565b5060c0830151612fb060c08401826001600160a01b03169052565b5060e083810151908301526101008084015190830152610120808401516001600160a01b038116828501526112fb565b5f60208284031215612ff0575f80fd5b815161104f81612218565b803561300681612218565b6001600160a01b0316825260208101356001600160401b03811680821461302b575f80fd5b80602085015250505050565b803561304281612218565b6001600160a01b03908116835260208201359061305e82612218565b908116602084015260408201359061307582612218565b908116604084015260608201359061308c82612218565b90811660608401526080820135906130a382612218565b908116608084015260a0820135906130ba82612218565b80821660a085015250505050565b5f6102a08201905060018060a01b0380891683528088166020840152863560408401526020870135606084015260408701356080840152606087013560a0840152608087013560c084015260a087013561312181612218565b1660e0830152843561010083015260208501356101208301526040850135610140830152606085013561016083015260808501356101808301526131696101a0830185612ffb565b6126756101e0830184613037565b5f825161318881846020870161245b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c0dc8864e841f2aab5145e7160a959acaf73c71a60a5e9aa5756212f1828845964736f6c63430008170033", + "nonce": "0x146", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x831fc5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x48a9e4d02fc1f1825538fd3849d7c13fe5bafe6c8be59eba14943e5688f7f17c", + "transactionIndex": "0x3b", + "blockHash": "0x1080a192ea014b26cb3180df32f54c5f926b7883f297648f6da39d2d236f7d37", + "blockNumber": "0x238958e", + "gasUsed": "0x74797", + "effectiveGasPrice": "0x468345e", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0x9bd92f847", + "l1GasPrice": "0x37244abc", + "l1GasUsed": "0x58e2" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2c3b449", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x25181b56a374b33bcf3027c960ec044e6ec7d17ce07e9ea3b95bd17befe270c3", + "transactionIndex": "0xa9", + "blockHash": "0xfc86bb27917a6867ef2d164e94142674f17d73e0d2e26ea404be5bfa3583ca97", + "blockNumber": "0x238958f", + "gasUsed": "0x885ee", + "effectiveGasPrice": "0x45da5be", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xc82fca19", + "l1GasPrice": "0x37244abc", + "l1GasUsed": "0x60c6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x15c4f10", + "logs": [ + { + "address": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x82d62a352b00ec3570d122f3abf98c1f13dda1cbb5e534ea6d5529b87829245f", + "blockNumber": "0x2389592", + "blockTimestamp": "0x68fb8807", + "transactionHash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionIndex": "0x89", + "logIndex": "0x144", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionIndex": "0x89", + "blockHash": "0x82d62a352b00ec3570d122f3abf98c1f13dda1cbb5e534ea6d5529b87829245f", + "blockNumber": "0x2389592", + "gasUsed": "0x3a9efe", + "effectiveGasPrice": "0x4486791", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xed1392f2", + "l1GasPrice": "0x382071bb", + "l1GasUsed": "0x25642" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1273b4d", + "logs": [ + { + "address": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x5511227f1e9a082d20763db2209687ec16f02e4353ad3b33d42375baa4297d0a", + "blockNumber": "0x2389593", + "blockTimestamp": "0x68fb8809", + "transactionHash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionIndex": "0x58", + "logIndex": "0x16b", + "removed": false + } + ], + "logsBloom": "0x00000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000090000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionIndex": "0x58", + "blockHash": "0x5511227f1e9a082d20763db2209687ec16f02e4353ad3b33d42375baa4297d0a", + "blockNumber": "0x2389593", + "gasUsed": "0x2b78c6", + "effectiveGasPrice": "0x44214c0", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xcbc33408", + "l1GasPrice": "0x382071bb", + "l1GasUsed": "0x1c0f1" + } + ], + "libraries": [ + "src/factory/libraries/MarketFactoryLibrary.sol:MarketFactoryLibrary:0x22C26A06ef6C51BbCa1cF5276E1606e89402979a", + "src/factory/libraries/NonTransferrableRebasingTokenVaultLibrary.sol:NonTransferrableRebasingTokenVaultLibrary:0xB4A15fB08Dbe6a161FF1D411be2d9F67F0606118", + "src/factory/libraries/PriceFeedFactoryLibrary.sol:PriceFeedFactoryLibrary:0xe8Dc58C7f234e49F024cE03e926BE80FC2dB0f7d" + ], + "pending": [], + "returns": {}, + "timestamp": 1761314932405, + "chain": 8453, + "commit": "2aea4c3d" +} \ No newline at end of file diff --git a/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-latest.json b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-latest.json new file mode 100644 index 00000000..c7f95c26 --- /dev/null +++ b/broadcast/ProposeSafeTxUpgradeToV1_8_1.s.sol/8453/run-latest.json @@ -0,0 +1,206 @@ +{ + "transactions": [ + { + "hash": "0x48a9e4d02fc1f1825538fd3849d7c13fe5bafe6c8be59eba14943e5688f7f17c", + "transactionType": "CREATE2", + "contractName": "MarketFactoryLibrary", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0e14", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006107a3610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063d41bcfc514610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610132565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8087878787878760405160240161008f959493929190610271565b60408051601f198184030181529181526020820180516001600160e01b031663f1bf35c360e01b179052516100c3906100f4565b6100ce929190610321565b604051809103905ff0801580156100e7573d5f803e3d5ffd5b5098975050505050505050565b6103f08061037e83390190565b80356001600160a01b0381168114610117575f80fd5b919050565b5f60c0828403121561012c575f80fd5b50919050565b5f805f805f808688036102a0811215610149575f80fd5b61015288610101565b965061016060208901610101565b955061016f8960408a0161011c565b945060a060ff1982011215610182575f80fd5b61010088019350604061019f198201121561019b575f80fd5b506101a0870191506101b1886101e0890161011c565b90509295509295509295565b6001600160a01b036101ce82610101565b168252602081013567ffffffffffffffff81168082146101ec575f80fd5b80602085015250505050565b6001600160a01b038061020a83610101565b1683528061021a60208401610101565b1660208401528061022d60408401610101565b1660408401528061024060608401610101565b1660608401528061025360808401610101565b1660808401528061026660a08401610101565b1660a0840152505050565b5f6102808201905060018060a01b03808816835286356020840152602087013560408401526040870135606084015260608701356080840152608087013560a0840152806102c160a08901610101565b1660c084015250843560e083015260208501356101008301526040850135610120830152606085013561014083015260808501356101608301526103096101808301856101bd565b6103176101c08301846101f8565b9695505050505050565b60018060a01b03831681525f60206040602084015283518060408501525f5b8181101561035c57858101830151858201606001528201610340565b505f606082860101526060601f19601f83011685010192505050939250505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a2646970667358221220670540a779fc707ba2d74908460b71b5f911940396a8e4eec820b0783b7eb1cf64736f6c63430008170033", + "nonce": "0x143", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x25181b56a374b33bcf3027c960ec044e6ec7d17ce07e9ea3b95bd17befe270c3", + "transactionType": "CREATE2", + "contractName": "NonTransferrableRebasingTokenVaultLibrary", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xbc5c9", + "input": "0x000000000000000000000000000000000000000000000000000000000000000061091b610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80630550810a14610038575b5f80fd5b818015610043575f80fd5b50610057610052366004610277565b610073565b6040516001600160a01b03909116815260200160405180910390f35b5f8430848487866001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100b4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100db9190810190610306565b6040516020016100eb91906103ae565b604051602081830303815290604052876001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610135573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261015c9190810190610306565b60405160200161016c91906103ea565b604051602081830303815290604052886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101db9190610413565b6040516024016101f19796959493929190610465565b60408051601f198184030181529181526020820180516001600160e01b0316631f0cbe6160e01b1790525161022590610253565b6102309291906104ca565b604051809103905ff080158015610249573d5f803e3d5ffd5b5095945050505050565b6103f0806104f683390190565b6001600160a01b0381168114610274575f80fd5b50565b5f805f806080858703121561028a575f80fd5b843561029581610260565b935060208501356102a581610260565b925060408501356102b581610260565b915060608501356102c581610260565b939692955090935050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102fe5781810151838201526020016102e6565b50505f910152565b5f60208284031215610316575f80fd5b815167ffffffffffffffff8082111561032d575f80fd5b818401915084601f830112610340575f80fd5b815181811115610352576103526102d0565b604051601f8201601f19908116603f0116810190838211818310171561037a5761037a6102d0565b81604052828152876020848701011115610392575f80fd5b6103a38360208301602088016102e4565b979650505050505050565b64029b4bd32960dd1b81525f82516103cd8160058501602087016102e4565b650815985d5b1d60d21b6005939091019283015250600b01919050565b6139bb60f11b81525f82516104068160028501602087016102e4565b9190910160020192915050565b5f60208284031215610423575f80fd5b815160ff81168114610433575f80fd5b9392505050565b5f81518084526104518160208601602086016102e4565b601f01601f19169290920160200192915050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260e0608082018190525f906104a09083018661043a565b82810360a08401526104b2818661043a565b91505060ff831660c083015298975050505050505050565b6001600160a01b03831681526040602082018190525f906104ed9083018461043a565b94935050505056fe60806040526040516103f03803806103f08339810160408190526100229161025e565b61002c8282610033565b5050610341565b61003c82610091565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561008557610080828261010c565b505050565b61008d61017f565b5050565b806001600160a01b03163b5f036100cb57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101289190610326565b5f60405180830381855af49150503d805f8114610160576040519150601f19603f3d011682016040523d82523d5f602084013e610165565b606091505b5090925090506101768583836101a0565b95945050505050565b341561019e5760405163b398979f60e01b815260040160405180910390fd5b565b6060826101b5576101b0826101ff565b6101f8565b81511580156101cc57506001600160a01b0384163b155b156101f557604051639996b31560e01b81526001600160a01b03851660048201526024016100c2565b50805b9392505050565b80511561020f5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561025657818101518382015260200161023e565b50505f910152565b5f806040838503121561026f575f80fd5b82516001600160a01b0381168114610285575f80fd5b60208401519092506001600160401b03808211156102a1575f80fd5b818501915085601f8301126102b4575f80fd5b8151818111156102c6576102c6610228565b604051601f8201601f19908116603f011681019083821181831017156102ee576102ee610228565b81604052828152886020848701011115610306575f80fd5b61031783602083016020880161023c565b80955050505050509250929050565b5f825161033781846020870161023c565b9190910192915050565b60a38061034d5f395ff3fe6080604052600a600c565b005b60186014601a565b6050565b565b5f604b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156069573d5ff35b3d5ffdfea264697066735822122082b0e6725746e2397ac59daf9d54b343cc3601125a1089ed1687aed1f8f1d6fb64736f6c63430008170033a26469706673582212209d2380a7304f006d1c66be055eaf76eddad4d8b6b38978aec43f72b90761da5e64736f6c63430008170033", + "nonce": "0x144", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionType": "CREATE", + "contractName": "CollectionsManager", + "contractAddress": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x4c3517", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516143f6620001005f395f8181611f3a01528181611f63015261213301526143f65ff3fe608060405260043610610249575f3560e01c806370a0823111610134578063ac9650d8116100b3578063c4d66de811610078578063c4d66de8146106f2578063c87b56dd14610711578063dd2bc30214610730578063de1eb8801461075c578063e985e9c51461077b578063eb379a581461079a575f80fd5b8063ac9650d81461062c578063ad3cb1cc14610658578063b88d4fde14610688578063b9d33d1e146106a7578063c260d206146106d3575f80fd5b80639feffdb0116100f95780639feffdb014610591578063a0529e5f146105b0578063a22cb465146105cf578063abff1222146105ee578063ac888c071461060d575f80fd5b806370a08231146105015780638134a9e01461052057806393c0d3f31461053f57806395d89b411461055e5780639e4082db14610572575f80fd5b80633184b046116101cb57806352d1902d1161019057806352d1902d1461045b578063565380571461046f5780635fb7f10c146104905780636352211e146104af578063647f1a9c146104ce578063678b9bad146104e2575f80fd5b80633184b046146103bf57806342842e0e146103eb578063495e6d891461040a5780634f1ef286146104295780634f6ccce71461043c575f80fd5b806318160ddd1161021157806318160ddd1461031957806318d5932d1461034357806320d634561461036257806323b872dd146103815780632f745c59146103a0575f80fd5b806301ffc9a71461024d57806306fdde0314610281578063081812fc146102a2578063095ea7b3146102d95780630b379508146102fa575b5f80fd5b348015610258575f80fd5b5061026c61026736600461362c565b6107b9565b60405190151581526020015b60405180910390f35b34801561028c575f80fd5b506102956107e3565b6040516102789190613694565b3480156102ad575f80fd5b506102c16102bc3660046136a6565b610884565b6040516001600160a01b039091168152602001610278565b3480156102e4575f80fd5b506102f86102f33660046136d1565b610898565b005b348015610305575f80fd5b506102f8610314366004613789565b6108a7565b348015610324575f80fd5b505f805160206143a1833981519152545b604051908152602001610278565b34801561034e575f80fd5b506102f861035d36600461388b565b6109dd565b34801561036d575f80fd5b5061026c61037c3660046136d1565b610a1b565b34801561038c575f80fd5b506102f861039b3660046138da565b610a43565b3480156103ab575f80fd5b506103356103ba3660046136d1565b610ac6565b3480156103ca575f80fd5b506103de6103d93660046136d1565b610b37565b6040516102789190613918565b3480156103f6575f80fd5b506102f86104053660046138da565b610b4a565b348015610415575f80fd5b50610335610424366004613951565b610b69565b6102f8610437366004613a13565b610b84565b348015610447575f80fd5b506103356104563660046136a6565b610b9f565b348015610466575f80fd5b50610335610c11565b34801561047a575f80fd5b5061026c6104893660046136a6565b6001541190565b34801561049b575f80fd5b506103356104aa366004613951565b610c2d565b3480156104ba575f80fd5b506102c16104c93660046136a6565b610c3d565b3480156104d9575f80fd5b50610335610c47565b3480156104ed575f80fd5b5061026c6104fc366004613a5f565b610c67565b34801561050c575f80fd5b5061033561051b366004613aa4565b610c80565b34801561052b575f80fd5b5061026c61053a366004613abf565b610cd8565b34801561054a575f80fd5b506102f8610559366004613aed565b610d1a565b348015610569575f80fd5b50610295610eb0565b34801561057d575f80fd5b506103de61058c3660046136d1565b610eee565b34801561059c575f80fd5b5061026c6105ab366004613a5f565b610f02565b3480156105bb575f80fd5b506102f86105ca366004613b8d565b610f11565b3480156105da575f80fd5b506102f86105e9366004613c2b565b611187565b3480156105f9575f80fd5b506102f8610608366004613b8d565b611192565b348015610618575f80fd5b5061026c610627366004613c57565b61132e565b348015610637575f80fd5b5061064b610646366004613ca7565b6113cf565b6040516102789190613d15565b348015610663575f80fd5b50610295604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610693575f80fd5b506102f86106a2366004613d77565b6114b4565b3480156106b2575f80fd5b506106c66106c1366004613aa4565b6114cc565b6040516102789190613dde565b3480156106de575f80fd5b506103356106ed366004613e21565b6114ef565b3480156106fd575f80fd5b506102f861070c366004613aa4565b61160f565b34801561071c575f80fd5b5061029561072b3660046136a6565b611789565b34801561073b575f80fd5b5061074f61074a366004613abf565b6117ed565b6040516102789190613e8d565b348015610767575f80fd5b506102f8610776366004613aed565b61189b565b348015610786575f80fd5b5061026c610795366004613ecd565b6119cb565b3480156107a5575f80fd5b506102f86107b4366004613789565b611a17565b5f6001600160e01b0319821663780e9d6360e01b14806107dd57506107dd82611b3a565b92915050565b5f80516020614361833981519152805460609190819061080290613ef9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613ef9565b80156108795780601f1061085057610100808354040283529160200191610879565b820191905f5260205f20905b81548152906001019060200180831161085c57829003601f168201915b505050505091505090565b5f61088e82611b89565b506107dd82611bc0565b6108a3828233611bf9565b5050565b826108bb6108b482610c3d565b3383611c06565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff1661091457604051631713bf1160e21b8152600481018590526001600160a01b03841660248201526044015b60405180910390fd5b5f5b82518110156109d6575f61096a84838151811061093557610935613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b0190611c6a565b905080156109cd5783828151811061098457610984613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f41a3856b408397a3953ee2e3fc5961815599fafae92aa64253fea4124c15835260405160405180910390a45b50600101610916565b5050505050565b5f546001600160a01b03163314610a0957604051630b56d23b60e41b815233600482015260240161090b565b610a1584848484611c7e565b50505050565b6001600160a01b0382165f908152600360205260408120610a3c9083611d87565b9392505050565b6001600160a01b038216610a6c57604051633250574960e11b81525f600482015260240161090b565b5f610a78838333611d9e565b9050836001600160a01b0316816001600160a01b031614610a15576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161090b565b5f5f80516020614341833981519152610ade84610c80565b8310610b0f5760405163295f44f760e21b81526001600160a01b03851660048201526024810184905260440161090b565b6001600160a01b0384165f908152602091825260408082208583529092522054905092915050565b610b3f6135c3565b610a3c83835f611e94565b610b6483838360405180602001604052805f8152506114b4565b505050565b5f610b7886868686865f6114ef565b90505b95945050505050565b610b8c611f2f565b610b9582611fd5565b6108a3828261206c565b5f5f80516020614341833981519152610bc35f805160206143a18339815191525490565b8310610beb5760405163295f44f760e21b81525f60048201526024810184905260440161090b565b806002018381548110610c0057610c00613f31565b905f5260205f200154915050919050565b5f610c1a612128565b505f805160206143818339815191525b90565b5f610b78868686868660016114ef565b5f6107dd82611b89565b600180545f9182610c5783613f59565b919050559050610c2a3382612171565b5f610c75858585855f61218a565b90505b949350505050565b5f5f805160206143618339815191526001600160a01b038316610cb8576040516322718ad960e21b81525f600482015260240161090b565b6001600160a01b039092165f908152600390920160205250604090205490565b5f610ce4836001541190565b610cef57505f6107dd565b505f9182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f546001600160a01b03163314610d4657604051630b56d23b60e41b815233600482015260240161090b565b5f6040518060a001604052805f81526020015f1981526020015f81526020015f1981526020015f81525090505f5b8251811015610a1557610da1838281518110610d9257610d92613f31565b60200260200101516001541190565b610ddb57828181518110610db757610db7613f31565b602002602001015160405163500f73d960e01b815260040161090b91815260200190565b5f610e2a848381518110610df157610df1613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f2061243990919063ffffffff16565b90508015610ea757838281518110610e4457610e44613f31565b6020026020010151856001600160a01b03167fe9919c1157673d017b4e5eef8d4c012fadcf6ee40cf5f99a0912a0109b5d584260405160405180910390a3610ea785858481518110610e9857610e98613f31565b60200260200101518586611c7e565b50600101610d74565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f805160206143618339815191529161080290613ef9565b610ef66135c3565b610a3c83836001611e94565b5f610c7585858585600161218a565b81610f1e6108b482610c3d565b5f5b8251811015610a15575f5483516001600160a01b0390911690636ec934da90859084908110610f5157610f51613f31565b60200260200101516040518263ffffffff1660e01b8152600401610f8491906001600160a01b0391909116815260200190565b602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190613f71565b61100a57828181518110610fd957610fd9613f31565b602002602001015160405163e2a7bea360e01b815260040161090b91906001600160a01b0391909116815260200190565b82818151811061101c5761101c613f31565b60200260200101516001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110839190613f71565b156110cb5782818151811061109a5761109a613f31565b602002602001015160405163b4e1115760e01b815260040161090b91906001600160a01b0391909116815260200190565b5f8481526002602052604081208451600192908690859081106110f0576110f0613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f6101000a81548160ff02191690831515021790555082818151811061114157611141613f31565b60200260200101516001600160a01b0316847f42e38738c8d2e007a797548d288aea65537b98d212336f6fa33ca20c7a99088560405160405180910390a3600101610f20565b6108a3338383612444565b8161119f6108b482610c3d565b5f5b8251811015610a15575f61120160025f8781526020019081526020015f205f8685815181106111d2576111d2613f31565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600b016124ea565b90506112278585848151811061121957611219613f31565b6020026020010151836108a7565b60025f8681526020019081526020015f205f85848151811061124b5761124b613f31565b6020908102919091018101516001600160a01b031682528101919091526040015f908120805460ff19168155600181018290556002810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560098101829055600a810182905590600b82018181816112cf82826135ed565b5050505050508382815181106112e7576112e7613f31565b60200260200101516001600160a01b0316857fa328ee555a02ae133b939087dcc439417783329f687112f415290a4637f64ab760405160405180910390a3506001016111a1565b5f61133a846001541190565b61134557505f610c78565b6001600160a01b0385165f9081526003602052604090206113669085611d87565b61137157505f610c78565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff166113a157505f610c78565b5f8481526002602090815260408083206001600160a01b03871684529091529020610c7590600b01836124f6565b604080515f815260208101909152606090826001600160401b038111156113f8576113f86136fb565b60405190808252806020026020018201604052801561142b57816020015b60608152602001906001900390816114165790505b5091505f5b838110156114ac576114873086868481811061144e5761144e613f31565b90506020028101906114609190613f9f565b8560405160200161147393929190613fe8565b604051602081830303815290604052612517565b83828151811061149957611499613f31565b6020908102919091010152600101611430565b505092915050565b6114bf848484610a43565b610a153385858585612580565b6001600160a01b0381165f9081526003602052604090206060906107dd906124ea565b5f5f19860361150b576115048786858561269f565b9050611605565b6115178787878761132e565b61154e5760405163c6c8526f60e01b8152600481018790526001600160a01b0380871660248301528516604482015260640161090b565b5f61155b88888886612751565b80519091508410806115705750806020015184115b156115a55780516020820151604051633e5d735760e21b8152600481018790526024810192909252604482015260640161090b565b5f6115b28688878761269f565b90506115d482608001516115c58361277f565b6115cf919061400d565b6127af565b925081604001518310156115ee5781604001519250611602565b816060015183111561160257816060015192505b50505b9695505050505050565b5f6116186127d4565b805490915060ff600160401b82041615906001600160401b03165f8115801561163e5750825b90505f826001600160401b031660011480156116595750303b155b905081158015611667575080155b156116855760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116af57845460ff60401b1916600160401b1785555b6117096040518060400160405280601081526020016f53697a6520436f6c6c656374696f6e7360801b8152506040518060400160405280601081526020016f53495a455f434f4c4c454354494f4e5360801b8152506127fc565b61171161280e565b61171961280e565b61172161280e565b5f80546001600160a01b0319166001600160a01b038816179055831561178157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b606061179482611b89565b505f61179e612816565b90505f8151116117bc5760405180602001604052805f815250610a3c565b806117c684612845565b6040516020016117d792919061402c565b6040516020818303038152906040529392505050565b60606117fa836001541190565b61181a5760405163500f73d960e01b81526004810184905260240161090b565b5f8381526002602090815260408083206001600160a01b038616845290915290205460ff1661186e57604051631713bf1160e21b8152600481018490526001600160a01b038316602482015260440161090b565b5f8381526002602090815260408083206001600160a01b03861684529091529020610a3c90600b016124ea565b5f546001600160a01b031633146118c757604051630b56d23b60e41b815233600482015260240161090b565b6118cf6135c3565b5f5b8251811015610a15576118ef838281518110610d9257610d92613f31565b61190557828181518110610db757610db7613f31565b5f61195484838151811061191b5761191b613f31565b602002602001015160035f886001600160a01b03166001600160a01b031681526020019081526020015f206128d490919063ffffffff16565b905080156119c25783828151811061196e5761196e613f31565b6020026020010151856001600160a01b03167fd0b1806956ca744bd88a4e4057a137959cb88d8d4e7e8d793301cfdf7df7cb2b60405160405180910390a36119c285858481518110610e9857610e98613f31565b506001016118d1565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b82611a246108b482610c3d565b5f8481526002602090815260408083206001600160a01b038716845290915290205460ff16611a7857604051631713bf1160e21b8152600481018590526001600160a01b038416602482015260440161090b565b5f5b82518110156109d6575f611ace848381518110611a9957611a99613f31565b6020908102919091018101515f8981526002835260408082206001600160a01b038b16835290935291909120600b01906128df565b90508015611b3157838281518110611ae857611ae8613f31565b60200260200101516001600160a01b0316856001600160a01b0316877f8e2f88c467ecc78e2adbbe6d65b6176668f4cc362a196a5c46d203a9db8d8fbe60405160405180910390a45b50600101611a7a565b5f6001600160e01b031982166380ac58cd60e01b1480611b6a57506001600160e01b03198216635b5e139f60e01b145b806107dd57506301ffc9a760e01b6001600160e01b03198316146107dd565b5f80611b94836128f3565b90506001600160a01b0381166107dd57604051637e27328960e01b81526004810184905260240161090b565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b64838383600161292c565b611c11838383612a3f565b610b64576001600160a01b038316611c3f57604051637e27328960e01b81526004810182905260240161090b565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161090b565b5f610a3c836001600160a01b038416612aa3565b611c89836001541190565b611ca95760405163500f73d960e01b81526004810184905260240161090b565b611cb38282612b86565b60408051808201825283815260208082018481526001600160a01b0388165f81815260048085528682208a8352855290869020945180518655808501516001870155808701516002870155606080820151600388015560809182015192870192909255925180516005870155938401516006860155838601516007860155830151600885015591015160099092019190915590518491907fb20b9722fd4401237d66274470a4daf19d973d3f3150edba3bcadf8467ed9b4290611d79908690869061405a565b60405180910390a350505050565b5f8181526001830160205260408120541515610a3c565b5f80611dab858585612d18565b90506001600160a01b038116611e3257611e2d845f805160206143a183398151915280545f8381527f645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0360205260408120829055600182018355919091527fa42f15e5d656f8155fd7419d740a6073999f19cd6e061449ce4a257150545bf20155565b611e55565b846001600160a01b0316816001600160a01b031614611e5557611e558185612e1a565b6001600160a01b038516611e7157611e6c84612eb1565b610c78565b846001600160a01b0316816001600160a01b031614610c7857610c788585612f7e565b611e9c6135c3565b81611ecb576001600160a01b0384165f9081526004602090815260408083208684529091529020600501611eee565b6001600160a01b0384165f90815260046020908152604080832086845290915290205b6040805160a0810182528254815260018301546020820152600283015491810191909152600382015460608201526004909101546080820152949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fa95f80516020614381833981519152546001600160a01b031690565b6001600160a01b031614155b15611fd35760405163703e46dd60e11b815260040160405180910390fd5b565b5f8054604051632474521560e21b8152600481018390523360248201526001600160a01b03909116906391d1485490604401602060405180830381865afa158015612022573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120469190613f71565b6108a35760405163e2517d3f60e01b81523360048201526024810182905260440161090b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120c6575060408051601f3d908101601f191682019092526120c3918101906140ca565b60015b6120ee57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161090b565b5f80516020614381833981519152811461211e57604051632a87526960e21b81526004810182905260240161090b565b610b648383612fd6565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fd35760405163703e46dd60e11b815260040160405180910390fd5b6108a3828260405180602001604052805f81525061302b565b6001600160a01b0385165f908152600360205260408120815b6121ac82613042565b811015612340575f6121be838361304b565b5f8181526002602090815260408083206001600160a01b038c16845290915290205490915060ff166121f05750612338565b5f8181526002602090815260408083206001600160a01b038b1684529091528120600b01905b61221f82613042565b811015612334575f612231838361304b565b905061223f818b8a15613056565b1561224a575061232c565b306001600160a01b031663c260d2068d868d858e8e156040518763ffffffff1660e01b8152600401612281969594939291906140e1565b602060405180830381865afa9250505080156122ba575060408051601f3d908101601f191682019092526122b7918101906140ca565b60015b6122f3573d8080156122e7576040519150601f19603f3d011682016040523d82523d5f602084013e6122ec565b606091505b505061232a565b88801561230057508b8110155b806123145750881580156123145750808c10155b15612328575f975050505050505050610b7b565b505b505b600101612216565b5050505b6001016121a3565b5061234d87868515613056565b1561235c576001915050610b7b565b604051636130690360e11b8152309063c260d2069061238b908a905f19908a905f908b908b15906004016140e1565b602060405180830381865afa9250505080156123c4575060408051601f3d908101601f191682019092526123c1918101906140ca565b60015b6123fd573d8080156123f1576040519150601f19603f3d011682016040523d82523d5f602084013e6123f6565b606091505b505061242f565b83801561240a5750868110155b8061241e57508315801561241e5750808710155b1561242d575f92505050610b7b565b505b6001915050610b7b565b5f610a3c838361312c565b5f805160206143618339815191526001600160a01b03831661248457604051630b61174360e31b81526001600160a01b038416600482015260240161090b565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611d79565b60605f610a3c83613178565b6001600160a01b0381165f9081526001830160205260408120541515610a3c565b60605f80846001600160a01b031684604051612533919061411b565b5f60405180830381855af49150503d805f811461256b576040519150601f19603f3d011682016040523d82523d5f602084013e612570565b606091505b5091509150610b7b8583836131d1565b6001600160a01b0383163b156109d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906125c2908890889087908790600401614136565b6020604051808303815f875af19250505080156125fc575060408051601f3d908101601f191682019092526125f991810190614168565b60015b612663573d808015612629576040519150601f19603f3d011682016040523d82523d5f602084013e61262e565b606091505b5080515f0361265b57604051633250574960e11b81526001600160a01b038516600482015260240161090b565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461178157604051633250574960e11b81526001600160a01b038516600482015260240161090b565b5f811561271c57604051620d37ab60e81b81526001600160a01b03868116600483015260248201859052851690630d37ab00906044015b602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271591906140ca565b9050610c78565b604051632b59bd9960e01b81526001600160a01b03868116600483015260248201859052851690632b59bd99906044016126d6565b6127596135c3565b61276485848461322d565b905061276f8161330a565b15610c7857610c75858584611e94565b5f6001600160ff1b038211156127ab5760405163123baf0360e11b81526004810183905260240161090b565b5090565b5f808212156127ab57604051635467221960e11b81526004810183905260240161090b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006107dd565b612804613349565b6108a3828261336e565b611fd3613349565b606061282146612845565b6040516020016128319190614183565b604051602081830303815290604052905090565b60605f6128518361339e565b60010190505f816001600160401b0381111561286f5761286f6136fb565b6040519080825280601f01601f191660200182016040528015612899576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128a357509392505050565b5f610a3c8383612aa3565b5f610a3c836001600160a01b03841661312c565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f80516020614361833981519152818061294e57506001600160a01b03831615155b15612a0f575f61295d85611b89565b90506001600160a01b038416158015906129895750836001600160a01b0316816001600160a01b031614155b801561299c575061299a81856119cb565b155b156129c55760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161090b565b8215612a0d5784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160a01b03831615801590610c785750826001600160a01b0316846001600160a01b03161480612a785750612a7884846119cb565b80610c785750826001600160a01b0316612a9183611bc0565b6001600160a01b031614949350505050565b5f8181526001830160205260408120548015612b7d575f612ac5600183613f8c565b85549091505f90612ad890600190613f8c565b9050808214612b37575f865f018281548110612af657612af6613f31565b905f5260205f200154905080875f018481548110612b1657612b16613f31565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612b4857612b486141df565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107dd565b5f9150506107dd565b602082015182511115612bbc57815160208301516040516307198f4960e11b81526004810192909252602482015260440161090b565b816060015182604001511115612bfa5781604001518260600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b602081015181511115612c3057805160208201516040516307198f4960e11b81526004810192909252602482015260440161090b565b806060015181604001511115612c6e5780604001518160600151604051633ed3c20960e01b815260040161090b929190918252602082015260400190565b81606001518160400151118015612c8a57508151602082015110155b8015612c9b57508051602083015110155b156108a357805f0151816020015182604001518360600151855f015186602001518760400151886060015160405163a19d2d6760e01b815260040161090b989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b5f5f8051602061436183398151915281612d31856128f3565b90506001600160a01b03841615612d4d57612d4d818587611c06565b6001600160a01b03811615612d8957612d685f865f8061292c565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b03861615612db9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b5f805160206143418339815191525f612e3284610c80565b5f8481526001840160209081526040808320546001600160a01b03891684529186905290912091925090818314612e8a575f838152602082815260408083205485845281842081905583526001870190915290208290555b5f948552600190930160209081526040808620869055928552929092528220919091555050565b5f805160206143a1833981519152545f80516020614341833981519152905f90612edd90600190613f8c565b5f848152600384016020526040812054600285018054939450909284908110612f0857612f08613f31565b905f5260205f200154905080846002018381548110612f2957612f29613f31565b5f91825260208083209091019290925582815260038601909152604080822084905586825281205560028401805480612f6457612f646141df565b600190038181905f5260205f20015f905590555050505050565b5f805160206143418339815191525f6001612f9885610c80565b612fa29190613f8c565b6001600160a01b039094165f9081526020838152604080832087845282528083208690559482526001909301909252502055565b612fdf82613475565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561302357610b648282612517565b6108a36134d8565b61303583836134f7565b610b64335f858585612580565b5f6107dd825490565b5f610a3c8383613558565b5f816130c457604051630cfa9a4960e01b81526001600160a01b038581166004830152841690630cfa9a4990602401602060405180830381865afa1580156130a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c9190613f71565b60405163044ce7c360e41b81526001600160a01b0385811660048301528416906344ce7c3090602401602060405180830381865afa158015613108573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c789190613f71565b5f81815260018301602052604081205461317157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107dd565b505f6107dd565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131c557602002820191905f5260205f20905b8154815260200190600101908083116131b1575b50505050509050919050565b6060826131e6576131e18261357e565b610a3c565b81511580156131fd57506001600160a01b0384163b155b1561322657604051639996b31560e01b81526001600160a01b038516600482015260240161090b565b5080610a3c565b6132356135c3565b816132a25760405163c421a75960e01b81526001600160a01b03858116600483015284169063c421a7599060240160a060405180830381865afa15801561327e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906141f3565b604051630264211160e11b81526001600160a01b0385811660048301528416906304c842229060240160a060405180830381865afa1580156132e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7891906141f3565b80515f9015801561331d57506020820151155b801561332b57506040820151155b801561333957506060820151155b80156107dd575050608001511590565b6133516135aa565b611fd357604051631afcd79f60e31b815260040160405180910390fd5b613376613349565b5f805160206143618339815191528061338f8482614285565b5060018101610a158382614285565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106133dc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613408576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061342657662386f26fc10000830492506010015b6305f5e100831061343e576305f5e100830492506008015b612710831061345257612710830492506004015b60648310613464576064830492506002015b600a83106107dd5760010192915050565b806001600160a01b03163b5f036134aa57604051634c9c8ce360e01b81526001600160a01b038216600482015260240161090b565b5f8051602061438183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611fd35760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661352057604051633250574960e11b81525f600482015260240161090b565b5f61352c83835f611d9e565b90506001600160a01b03811615610b64576040516339e3563760e11b81525f600482015260240161090b565b5f825f01828154811061356d5761356d613f31565b905f5260205f200154905092915050565b80511561358e5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f6135b36127d4565b54600160401b900460ff16919050565b6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b5080545f8255905f5260205f20908101906135a791905b808211156127ab575f8155600101613604565b6001600160e01b0319811681146135a7575f80fd5b5f6020828403121561363c575f80fd5b8135610a3c81613617565b5f5b83811015613661578181015183820152602001613649565b50505f910152565b5f8151808452613680816020860160208601613647565b601f01601f19169290920160200192915050565b602081525f610a3c6020830184613669565b5f602082840312156136b6575f80fd5b5035919050565b6001600160a01b03811681146135a7575f80fd5b5f80604083850312156136e2575f80fd5b82356136ed816136bd565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715613731576137316136fb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561375f5761375f6136fb565b604052919050565b5f6001600160401b0382111561377f5761377f6136fb565b5060051b60200190565b5f805f6060848603121561379b575f80fd5b833592506020808501356137ae816136bd565b925060408501356001600160401b038111156137c8575f80fd5b8501601f810187136137d8575f80fd5b80356137eb6137e682613767565b613737565b81815260059190911b82018301908381019089831115613809575f80fd5b928401925b82841015613830578335613821816136bd565b8252928401929084019061380e565b80955050505050509250925092565b5f60a0828403121561384f575f80fd5b61385761370f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f80610180858703121561389f575f80fd5b84356138aa816136bd565b9350602085013592506138c0866040870161383f565b91506138cf8660e0870161383f565b905092959194509250565b5f805f606084860312156138ec575f80fd5b83356138f7816136bd565b92506020840135613907816136bd565b929592945050506040919091013590565b60a081016107dd828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b5f805f805f60a08688031215613965575f80fd5b8535613970816136bd565b9450602086013593506040860135613987816136bd565b92506060860135613997816136bd565b949793965091946080013592915050565b5f82601f8301126139b7575f80fd5b81356001600160401b038111156139d0576139d06136fb565b6139e3601f8201601f1916602001613737565b8181528460208386010111156139f7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613a24575f80fd5b8235613a2f816136bd565b915060208301356001600160401b03811115613a49575f80fd5b613a55858286016139a8565b9150509250929050565b5f805f8060808587031215613a72575f80fd5b8435613a7d816136bd565b9350602085013592506040850135613a94816136bd565b9396929550929360600135925050565b5f60208284031215613ab4575f80fd5b8135610a3c816136bd565b5f8060408385031215613ad0575f80fd5b823591506020830135613ae2816136bd565b809150509250929050565b5f8060408385031215613afe575f80fd5b8235613b09816136bd565b91506020838101356001600160401b03811115613b24575f80fd5b8401601f81018613613b34575f80fd5b8035613b426137e682613767565b81815260059190911b82018301908381019088831115613b60575f80fd5b928401925b82841015613b7e57833582529284019290840190613b65565b80955050505050509250929050565b5f8060408385031215613b9e575f80fd5b823591506020808401356001600160401b03811115613bbb575f80fd5b8401601f81018613613bcb575f80fd5b8035613bd96137e682613767565b81815260059190911b82018301908381019088831115613bf7575f80fd5b928401925b82841015613b7e578335613c0f816136bd565b82529284019290840190613bfc565b80151581146135a7575f80fd5b5f8060408385031215613c3c575f80fd5b8235613c47816136bd565b91506020830135613ae281613c1e565b5f805f8060808587031215613c6a575f80fd5b8435613c75816136bd565b9350602085013592506040850135613c8c816136bd565b91506060850135613c9c816136bd565b939692955090935050565b5f8060208385031215613cb8575f80fd5b82356001600160401b0380821115613cce575f80fd5b818501915085601f830112613ce1575f80fd5b813581811115613cef575f80fd5b8660208260051b8501011115613d03575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015613d6a57603f19888603018452613d58858351613669565b94509285019290850190600101613d3c565b5092979650505050505050565b5f805f8060808587031215613d8a575f80fd5b8435613d95816136bd565b93506020850135613da5816136bd565b92506040850135915060608501356001600160401b03811115613dc6575f80fd5b613dd2878288016139a8565b91505092959194509250565b602080825282518282018190525f9190848201906040850190845b81811015613e1557835183529284019291840191600101613df9565b50909695505050505050565b5f805f805f8060c08789031215613e36575f80fd5b8635613e41816136bd565b9550602087013594506040870135613e58816136bd565b93506060870135613e68816136bd565b92506080870135915060a0870135613e7f81613c1e565b809150509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613e155783516001600160a01b031683529284019291840191600101613ea8565b5f8060408385031215613ede575f80fd5b8235613ee9816136bd565b91506020830135613ae2816136bd565b600181811c90821680613f0d57607f821691505b602082108103613f2b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613f6a57613f6a613f45565b5060010190565b5f60208284031215613f81575f80fd5b8151610a3c81613c1e565b818103818111156107dd576107dd613f45565b5f808335601e19843603018112613fb4575f80fd5b8301803591506001600160401b03821115613fcd575f80fd5b602001915036819003821315613fe1575f80fd5b9250929050565b828482375f8382015f81528351614003818360208801613647565b0195945050505050565b8082018281125f8312801582168215821617156114ac576114ac613f45565b5f835161403d818460208801613647565b835190830190614051818360208801613647565b01949350505050565b6101408101614094828580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160a0830152602083015160c0830152604083015160e083015260608301516101008301526080830151610120830152610a3c565b5f602082840312156140da575f80fd5b5051919050565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925290151560a082015260c00190565b5f825161412c818460208701613647565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90610b7890830184613669565b5f60208284031215614178575f80fd5b8151610a3c81613617565b7f68747470733a2f2f6170692e73697a652e6372656469742f636f6c6c656374698152636f6e732f60e01b60208201525f82516141c7816024850160208701613647565b602f60f81b6024939091019283015250602501919050565b634e487b7160e01b5f52603160045260245ffd5b5f60a08284031215614203575f80fd5b61420b61370f565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b601f821115610b6457805f5260205f20601f840160051c810160208510156142665750805b601f840160051c820191505b818110156109d6575f8155600101614272565b81516001600160401b0381111561429e5761429e6136fb565b6142b2816142ac8454613ef9565b84614241565b602080601f8311600181146142e5575f84156142ce5750858301515b5f19600386901b1c1916600185901b178555611781565b5f85815260208120601f198616915b82811015614313578886015182559484019460019091019084016142f4565b508582101561433057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed02a264697066735822122003abfeed6c386c88a16ffbbf7a5897b7c6d1d273227a7bd7ff4dab3f8c8fc58964736f6c63430008170033", + "nonce": "0x145", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionType": "CREATE", + "contractName": "SizeFactory", + "contractAddress": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "gas": "0x388367", + "value": "0x0", + "input": "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613208620001005f395f81816119ea01528181611a130152611b5601526132085ff3fe60806040526004361061025f575f3560e01c806386eeeb5a1161013f578063ad3cb1cc116100b3578063d152e23611610078578063d152e23614610762578063d547741f14610781578063e8d353c7146107a0578063eb44fdd3146107bf578063ec2c9016146107de578063f0fb716f146107ff575f80fd5b8063ad3cb1cc146106b6578063b1ef804d146106e6578063b4cd6bd114610705578063c4d66de814610724578063c8fb624714610743575f80fd5b80639e42bfa3116101045780639e42bfa3146106065780639feffdb014610625578063a217fddf14610644578063a78ec6ae14610657578063a7b2b31014610676578063ac9650d81461068a575f80fd5b806386eeeb5a1461056b57806388d765201461058a57806391c769ce146105a957806391d14854146105c8578063973cf867146105e7575f80fd5b806352d1902d116101d65780636ec934da1161019b5780636ec934da146104865780636ed41835146104a5578063732218f9146104c45780637643d7ec146104e35780637b8dedad1461050457806381de274c14610540575f80fd5b806352d1902d146103de57806354fd4d50146103f25780635ec49544146104295780635fb7f10c14610448578063678b9bad14610467575f80fd5b806327fa35c31161022757806327fa35c31461033b5780632f2ff15d1461034f57806336568abe1461036e57806337c11b2a1461038d578063495e6d89146103ac5780634f1ef286146103cb575f80fd5b806301a6c8721461026357806301ffc9a7146102845780631286a2dc146102b85780631e4fcddb146102ef578063248a9ca31461030e575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461222c565b61081e565b005b34801561028f575f80fd5b506102a361029e366004612247565b610884565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506007546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b3480156102fa575f80fd5b5061028261030936600461222c565b6108ba565b348015610319575f80fd5b5061032d61032836600461227e565b610947565b6040519081526020016102af565b348015610346575f80fd5b5061032d610967565b34801561035a575f80fd5b50610282610369366004612295565b610976565b348015610379575f80fd5b50610282610388366004612295565b610998565b348015610398575f80fd5b50600a546102d7906001600160a01b031681565b3480156103b7575f80fd5b5061032d6103c63660046122c3565b6109d0565b6102826103d93660046123cf565b610a67565b3480156103e9575f80fd5b5061032d610a86565b3480156103fd575f80fd5b5060408051808201909152600681526576312e382e3160d01b60208201525b6040516102af91906124a8565b348015610434575f80fd5b5061041c6104433660046124ba565b610aa1565b348015610453575f80fd5b5061032d6104623660046122c3565b610b20565b348015610472575f80fd5b506102a3610481366004612537565b610b70565b348015610491575f80fd5b506102a36104a036600461222c565b610bf3565b3480156104b0575f80fd5b506102826104bf3660046125c8565b610bfe565b3480156104cf575f80fd5b506102826104de366004612680565b610c0a565b3480156104ee575f80fd5b506104f7610cb8565b6040516102af91906126c3565b34801561050f575f80fd5b5061032d61051e366004612725565b600860209081525f938452604080852082529284528284209052825290205481565b34801561054b575f80fd5b5061032d61055a36600461222c565b60096020525f908152604090205481565b348015610576575f80fd5b506102a3610585366004612764565b610fe6565b348015610595575f80fd5b506102826105a43660046127a4565b611056565b3480156105b4575f80fd5b506102826105c33660046127f4565b6110d8565b3480156105d3575f80fd5b506102a36105e2366004612295565b6110e3565b3480156105f2575f80fd5b506006546102d7906001600160a01b031681565b348015610611575f80fd5b5061028261062036600461281e565b611119565b348015610630575f80fd5b506102a361063f366004612537565b611126565b34801561064f575f80fd5b5061032d5f81565b348015610662575f80fd5b506102a361067136600461284f565b61116e565b348015610681575f80fd5b506102826111d3565b348015610695575f80fd5b506106a96106a436600461288d565b61121e565b6040516102af91906128fb565b3480156106c1575f80fd5b5061041c604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156106f1575f80fd5b50610282610700366004612680565b611303565b348015610710575f80fd5b5061028261071f36600461222c565b61134e565b34801561072f575f80fd5b5061028261073e36600461222c565b6113db565b34801561074e575f80fd5b5061028261075d36600461281e565b61156c565b34801561076d575f80fd5b506102d761077c366004612963565b611576565b34801561078c575f80fd5b5061028261079b366004612295565b611633565b3480156107ab575f80fd5b506102d76107ba366004612a1c565b61164f565b3480156107ca575f80fd5b506102d76107d936600461227e565b61172e565b3480156107e9575f80fd5b506107f2611739565b6040516102af9190612a48565b34801561080a575f80fd5b506102d7610819366004612aaa565b6117ce565b5f610828816118b2565b600a546040516001600160a01b038085169216907f24b8a2b6435960c7b1b405f08e684a0ed2e4d467b56f325250b56e2a10dbabae905f90a350600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6001600160e01b03198216637965db0b60e01b14806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6108c4816118b2565b6001600160a01b0382166108eb5760405163de0ce17d60e01b815260040160405180910390fd5b6007546040516001600160a01b038085169216907faefd875bf3940c57f185da0affbb82ce03656890d6e1d29310e8b4bf9d20b7c1905f90a350600780546001600160a01b0319166001600160a01b0392909216919091179055565b5f9081525f805160206131b3833981519152602052604090206001015490565b5f6109715f6118bc565b905090565b61097f82610947565b610988816118b2565b61099283836118c5565b50505050565b6001600160a01b03811633146109c15760405163334bd91960e11b815260040160405180910390fd5b6109cb8282611966565b505050565b600a5460405163495e6d8960e01b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f92169063495e6d899060a4015b602060405180830381865afa158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612b15565b90505b95945050505050565b610a6f6119df565b610a7882611a85565b610a828282611a8f565b5050565b5f610a8f611b4b565b505f8051602061319383398151915290565b6060610aac84610bf3565b610ad95760405163e2a7bea360e01b81526001600160a01b03851660048201526024015b60405180910390fd5b610b188484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611b9492505050565b949350505050565b600a546040516317edfc4360e21b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490525f921690635fb7f10c9060a401610a1c565b600a5460405163678b9bad60e01b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f92169063678b9bad906084015b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612b2c565b5f6108b48183611ba1565b6109cb83838333611056565b610c163382600b610fe6565b610c55573381600b5b60405163062709f360e41b81526001600160a01b03938416600482015292909116602483015260ff166044820152606401610ad0565b600a546040516301bc3d7160e71b81526001600160a01b039091169063de1eb88090610c879084908690600401612b5f565b5f604051808303815f87803b158015610c9e575f80fd5b505af1158015610cb0573d5f803e3d5ffd5b505050505050565b6060610cc35f6118bc565b6001600160401b03811115610cda57610cda61231a565b604051908082528060200260200182016040528015610d0d57816020015b6060815260200190600190039081610cf85790505b5090505f5b8151811015610fe2575f610d268183611bc2565b90505f610da06064836001600160a01b0316637c90a6ca6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612bb4565b60200151670de0b6b3a7640000611bcd565b9050816001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ddf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e039190612c0d565b604001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610e41573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e689190810190612cc6565b826001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040161010060405180830381865afa158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190612c0d565b606001516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f07573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f2e9190810190612cc6565b610f3783611bd9565b846001600160a01b03166354fd4d506040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f72573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f999190810190612cc6565b604051602001610fac9493929190612d2e565b604051602081830303815290604052848481518110610fcd57610fcd612dba565b60209081029190910101525050600101610d12565b5090565b5f826001600160a01b0316846001600160a01b0316036110085750600161104f565b6001600160a01b038084165f8181526009602090815260408083205480845260088352818420958a168452948252808320938352929052205461104b9084611c68565b9150505b9392505050565b6110623382600b610fe6565b61106f573381600b610c1f565b600a546040516318d5932d60e01b81526001600160a01b03909116906318d5932d906110a5908490889088908890600401612dce565b5f604051808303815f87803b1580156110bc575f80fd5b505af11580156110ce573d5f803e3d5ffd5b5050505050505050565b610a82823383611c8a565b5f9182525f805160206131b3833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6111238133610c0a565b50565b600a546040516309feffdb60e41b81526001600160a01b038681166004830152602482018690528481166044830152606482018490525f921690639feffdb090608401610bb4565b5f826001600160a01b0316846001600160a01b0316036111905750600161104f565b506001600160a01b038281165f8181526009602090815260408083205483526008825280832094881683529381528382209282529190915220548116811461104f565b60405133907fecbee29490a7e5456f4e3aab0700477764e3f16dda5a21ea92f43f1cfcb15799905f90a2335f90815260096020526040812080549161121783612e6a565b9190505550565b604080515f815260208101909152606090826001600160401b038111156112475761124761231a565b60405190808252806020026020018201604052801561127a57816020015b60608152602001906001900390816112655790505b5091505f5b838110156112fb576112d63086868481811061129d5761129d612dba565b90506020028101906112af9190612e95565b856040516020016112c293929190612ede565b604051602081830303815290604052611d72565b8382815181106112e8576112e8612dba565b602090810291909101015260010161127f565b505092915050565b61130f3382600b610fe6565b61131c573381600b610c1f565b600a546040516393c0d3f360e01b81526001600160a01b03909116906393c0d3f390610c879084908690600401612b5f565b5f611358816118b2565b6001600160a01b03821661137f5760405163de0ce17d60e01b815260040160405180910390fd5b6006546040516001600160a01b038085169216907ffb3d0b43c5121de915eeb8fa2fb4bb792b6b05d5d6f3df7630aac9d9e8697312905f90a350600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f6113e4611ddb565b805490915060ff600160401b82041615906001600160401b03165f8115801561140a5750825b90505f826001600160401b031660011480156114255750303b155b905081158015611433575080155b156114515760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561147b57845460ff60401b1916600160401b1785555b611483611e03565b61148b611e03565b611493611e03565b61149d5f876118c5565b506114c87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a876118c5565b506114f37ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab876118c5565b5061151e7f1eae1854c74a696c6de86fd3c6383d5c1e2c33fbc86e1aa6b6c872d95bd24038876118c5565b508315610cb057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6111238133611303565b5f80611581816118b2565b60405163145b6cb960e11b815273e8dc58c7f234e49f024ce03e926be80fc2db0f7d906328b6d972906115b8908690600401612f03565b602060405180830381865af41580156115d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f79190612fe0565b6040519092506001600160a01b038316907f970cbcaabfe7c54976df22e530fb6ef3a9202796c410ae94972a9b109d5b2ca8905f90a250919050565b61163c82610947565b611645816118b2565b6109928383611966565b5f8061165a816118b2565b6007546040516302a8408560e11b81526001600160a01b03918216600482015233602482018190528683166044830152918516606482015273b4a15fb08dbe6a161ff1d411be2d9f67f060611890630550810a90608401602060405180830381865af41580156116cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f09190612fe0565b6040519093506001600160a01b038416907f798adeb18dd44bd81e89d3ab4aa52d11e6d22b3ab80b11da6844ec0eda2a0810905f90a2505092915050565b5f6108b48183611bc2565b60606117445f6118bc565b6001600160401b0381111561175b5761175b61231a565b604051908082528060200260200182016040528015611784578160200160208202803683370190505b5090505f5b8151811015610fe25761179c5f82611bc2565b8282815181106117ae576117ae612dba565b6001600160a01b0390921660209283029190910190910152600101611789565b5f806117d9816118b2565b60065460405163d41bcfc560e01b815233917322c26a06ef6c51bbca1cf5276e1606e89402979a9163d41bcfc591611829916001600160a01b039091169085908c908c908c908c906004016130c8565b602060405180830381865af4158015611844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118689190612fe0565b92506118745f84611e0b565b506040516001600160a01b038416907ffa970ff5f178441bbe297db8d35a584c9bd6628b17b82d80dc8f5b80063102ca905f90a25050949350505050565b6111238133611e1f565b5f6108b4825490565b5f5f805160206131b38339815191526118de84846110e3565b61195d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556119133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108b4565b5f9150506108b4565b5f5f805160206131b383398151915261197f84846110e3565b1561195d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108b4565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a6557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a595f80516020613193833981519152546001600160a01b031690565b6001600160a01b031614155b15611a835760405163703e46dd60e11b815260040160405180910390fd5b565b5f610a82816118b2565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ae9575060408051601f3d908101601f19168201909252611ae691810190612b15565b60015b611b1157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ad0565b5f805160206131938339815191528114611b4157604051632a87526960e21b815260048101829052602401610ad0565b6109cb8383611e58565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a835760405163703e46dd60e11b815260040160405180910390fd5b606061104f83835f611ead565b6001600160a01b0381165f908152600183016020526040812054151561104f565b5f61104f8383611f4d565b5f610b18848484611f73565b60605f611be583611f97565b60010190505f816001600160401b03811115611c0357611c0361231a565b6040519080825280601f01601f191660200182016040528015611c2d576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c3757509392505050565b5f81600c811115611c7b57611c7b612b4b565b6001901b831615159392505050565b6001600160a01b038316611cb15760405163de0ce17d60e01b815260040160405180910390fd5b611cba8161206e565b611cda57604051632e40743360e01b815260048101829052602401610ad0565b6001600160a01b0382165f9081526009602052604090205481846001600160a01b0316846001600160a01b03167f89733de2d64cea40de091169750607b26e8d46142312fba65fb6476c790bad4984604051611d3891815260200190565b60405180910390a45f9081526008602090815260408083206001600160a01b03968716845282528083209490951682529290925291902055565b60605f80846001600160a01b031684604051611d8e9190613177565b5f60405180830381855af49150503d805f8114611dc6576040519150601f19603f3d011682016040523d82523d5f602084013e611dcb565b606091505b5091509150610a5e858383612087565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108b4565b611a836120e3565b5f61104f836001600160a01b038416612108565b611e2982826110e3565b610a825760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610ad0565b611e6182612154565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611ea5576109cb8282611d72565b610a826121b7565b606081471015611ed95760405163cf47918160e01b815247600482015260248101839052604401610ad0565b5f80856001600160a01b03168486604051611ef49190613177565b5f6040518083038185875af1925050503d805f8114611f2e576040519150601f19603f3d011682016040523d82523d5f602084013e611f33565b606091505b5091509150611f43868383612087565b9695505050505050565b5f825f018281548110611f6257611f62612dba565b905f5260205f200154905092915050565b5f825f190484118302158202611f905763ad251c275f526004601cfd5b5091020490565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611fd55772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061201f57662386f26fc10000830492506010015b6305f5e1008310612037576305f5e100830492506008015b612710831061204b57612710830492506004015b6064831061205d576064830492506002015b600a83106108b45760010192915050565b5f8061207d6001611000612e82565b9092111592915050565b60608261209c57612097826121d6565b61104f565b81511580156120b357506001600160a01b0384163b155b156120dc57604051639996b31560e01b81526001600160a01b0385166004820152602401610ad0565b508061104f565b6120eb6121ff565b611a8357604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461214d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b4565b505f6108b4565b806001600160a01b03163b5f0361218957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ad0565b5f8051602061319383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611a835760405163b398979f60e01b815260040160405180910390fd5b8051156121e65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f612208611ddb565b54600160401b900460ff16919050565b6001600160a01b0381168114611123575f80fd5b5f6020828403121561223c575f80fd5b813561104f81612218565b5f60208284031215612257575f80fd5b81356001600160e01b03198116811461104f575f80fd5b803561227981612218565b919050565b5f6020828403121561228e575f80fd5b5035919050565b5f80604083850312156122a6575f80fd5b8235915060208301356122b881612218565b809150509250929050565b5f805f805f60a086880312156122d7575f80fd5b85356122e281612218565b94506020860135935060408601356122f981612218565b9250606086013561230981612218565b949793965091946080013592915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156123505761235061231a565b60405290565b60405161014081016001600160401b03811182821017156123505761235061231a565b604051601f8201601f191681016001600160401b03811182821017156123a1576123a161231a565b604052919050565b5f6001600160401b038211156123c1576123c161231a565b50601f01601f191660200190565b5f80604083850312156123e0575f80fd5b82356123eb81612218565b915060208301356001600160401b03811115612405575f80fd5b8301601f81018513612415575f80fd5b8035612428612423826123a9565b612379565b81815286602083850101111561243c575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f5b8381101561247557818101518382015260200161245d565b50505f910152565b5f815180845261249481602086016020860161245b565b601f01601f19169290920160200192915050565b602081525f61104f602083018461247d565b5f805f604084860312156124cc575f80fd5b83356124d781612218565b925060208401356001600160401b03808211156124f2575f80fd5b818601915086601f830112612505575f80fd5b813581811115612513575f80fd5b876020828501011115612524575f80fd5b6020830194508093505050509250925092565b5f805f806080858703121561254a575f80fd5b843561255581612218565b935060208501359250604085013561256c81612218565b9396929550929360600135925050565b5f60a0828403121561258c575f80fd5b61259461232e565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b5f805f61016084860312156125db575f80fd5b833592506125ec856020860161257c565b91506125fb8560c0860161257c565b90509250925092565b5f82601f830112612613575f80fd5b813560206001600160401b0382111561262e5761262e61231a565b8160051b61263d828201612379565b9283528481018201928281019087851115612656575f80fd5b83870192505b848310156126755782358252918301919083019061265c565b979650505050505050565b5f8060408385031215612691575f80fd5b82356001600160401b038111156126a6575f80fd5b6126b285828601612604565b92505060208301356122b881612218565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261270685835161247d565b945092850192908501906001016126ea565b5092979650505050505050565b5f805f60608486031215612737575f80fd5b83359250602084013561274981612218565b9150604084013561275981612218565b809150509250925092565b5f805f60608486031215612776575f80fd5b833561278181612218565b9250602084013561279181612218565b91506040840135600d8110612759575f80fd5b5f805f8061018085870312156127b8575f80fd5b843593506127c9866020870161257c565b92506127d88660c0870161257c565b91506101608501356127e981612218565b939692955090935050565b5f8060408385031215612805575f80fd5b823561281081612218565b946020939093013593505050565b5f6020828403121561282e575f80fd5b81356001600160401b03811115612843575f80fd5b610b1884828501612604565b5f805f60608486031215612861575f80fd5b833561286c81612218565b9250602084013561287c81612218565b929592945050506040919091013590565b5f806020838503121561289e575f80fd5b82356001600160401b03808211156128b4575f80fd5b818501915085601f8301126128c7575f80fd5b8135818111156128d5575f80fd5b8660208260051b85010111156128e9575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561271857603f1988860301845261293e85835161247d565b94509285019290850190600101612922565b803563ffffffff81168114612279575f80fd5b5f6101408284031215612974575f80fd5b61297c612356565b6129858361226e565b815261299360208401612950565b60208201526129a460408401612950565b60408201526129b56060840161226e565b60608201526129c66080840161226e565b60808201526129d760a0840161226e565b60a08201526129e860c0840161226e565b60c082015260e083013560e0820152610100808401358183015250610120612a1181850161226e565b908201529392505050565b5f8060408385031215612a2d575f80fd5b8235612a3881612218565b915060208301356122b881612218565b602080825282518282018190525f9190848201906040850190845b81811015612a885783516001600160a01b031683529284019291840191600101612a63565b50909695505050505050565b5f60c08284031215612aa4575f80fd5b50919050565b5f805f80848603610260811215612abf575f80fd5b612ac98787612a94565b945060a060bf1982011215612adc575f80fd5b60c086019350604061015f1982011215612af4575f80fd5b5061016085019150612b0a866101a08701612a94565b905092959194509250565b5f60208284031215612b25575f80fd5b5051919050565b5f60208284031215612b3c575f80fd5b8151801515811461104f575f80fd5b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b03831681526040602080830182905283519183018290525f9184820191906060850190845b81811015612ba757845183529383019391830191600101612b8b565b5090979650505050505050565b5f60a08284031215612bc4575f80fd5b612bcc61232e565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b805161227981612218565b5f610100808385031215612c1f575f80fd5b604051908101906001600160401b0382118183101715612c4157612c4161231a565b81604052835181526020840151602082015260408401519150612c6382612218565b816040820152612c7560608501612c02565b6060820152612c8660808501612c02565b6080820152612c9760a08501612c02565b60a0820152612ca860c08501612c02565b60c0820152612cb960e08501612c02565b60e0820152949350505050565b5f60208284031215612cd6575f80fd5b81516001600160401b03811115612ceb575f80fd5b8201601f81018413612cfb575f80fd5b8051612d09612423826123a9565b818152856020838501011115612d1d575f80fd5b610a5e82602083016020860161245b565b66029b4bd32903e160cd1b81525f8551612d4f816007850160208a0161245b565b8083019050620103e160ed1b8060078301528651612d7481600a850160208b0161245b565b600a92019182018190528551612d9181600d850160208a0161245b565b600d9201918201528351612dac81601084016020880161245b565b016010019695505050505050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0385168152602081018490526101808101612e1e604083018580518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b825160e08301526020830151610100830152604083015161012083015260608301516101408301526080830151610160830152610a5e565b634e487b7160e01b5f52601160045260245ffd5b5f60018201612e7b57612e7b612e56565b5060010190565b818103818111156108b4576108b4612e56565b5f808335601e19843603018112612eaa575f80fd5b8301803591506001600160401b03821115612ec3575f80fd5b602001915036819003821315612ed7575f80fd5b9250929050565b828482375f8382015f81528351612ef981836020880161245b565b0195945050505050565b81516001600160a01b0316815261014081016020830151612f2c602084018263ffffffff169052565b506040830151612f44604084018263ffffffff169052565b506060830151612f5f60608401826001600160a01b03169052565b506080830151612f7a60808401826001600160a01b03169052565b5060a0830151612f9560a08401826001600160a01b03169052565b5060c0830151612fb060c08401826001600160a01b03169052565b5060e083810151908301526101008084015190830152610120808401516001600160a01b038116828501526112fb565b5f60208284031215612ff0575f80fd5b815161104f81612218565b803561300681612218565b6001600160a01b0316825260208101356001600160401b03811680821461302b575f80fd5b80602085015250505050565b803561304281612218565b6001600160a01b03908116835260208201359061305e82612218565b908116602084015260408201359061307582612218565b908116604084015260608201359061308c82612218565b90811660608401526080820135906130a382612218565b908116608084015260a0820135906130ba82612218565b80821660a085015250505050565b5f6102a08201905060018060a01b0380891683528088166020840152863560408401526020870135606084015260408701356080840152606087013560a0840152608087013560c084015260a087013561312181612218565b1660e0830152843561010083015260208501356101208301526040850135610140830152606085013561016083015260808501356101808301526131696101a0830185612ffb565b6126756101e0830184613037565b5f825161318881846020870161245b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c0dc8864e841f2aab5145e7160a959acaf73c71a60a5e9aa5756212f1828845964736f6c63430008170033", + "nonce": "0x146", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x831fc5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x48a9e4d02fc1f1825538fd3849d7c13fe5bafe6c8be59eba14943e5688f7f17c", + "transactionIndex": "0x3b", + "blockHash": "0x1080a192ea014b26cb3180df32f54c5f926b7883f297648f6da39d2d236f7d37", + "blockNumber": "0x238958e", + "gasUsed": "0x74797", + "effectiveGasPrice": "0x468345e", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x22c26a06ef6c51bbca1cf5276e1606e89402979a", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0x9bd92f847", + "l1GasPrice": "0x37244abc", + "l1GasUsed": "0x58e2" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2c3b449", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x25181b56a374b33bcf3027c960ec044e6ec7d17ce07e9ea3b95bd17befe270c3", + "transactionIndex": "0xa9", + "blockHash": "0xfc86bb27917a6867ef2d164e94142674f17d73e0d2e26ea404be5bfa3583ca97", + "blockNumber": "0x238958f", + "gasUsed": "0x885ee", + "effectiveGasPrice": "0x45da5be", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xb4a15fb08dbe6a161ff1d411be2d9f67f0606118", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xc82fca19", + "l1GasPrice": "0x37244abc", + "l1GasUsed": "0x60c6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x15c4f10", + "logs": [ + { + "address": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x82d62a352b00ec3570d122f3abf98c1f13dda1cbb5e534ea6d5529b87829245f", + "blockNumber": "0x2389592", + "blockTimestamp": "0x68fb8807", + "transactionHash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionIndex": "0x89", + "logIndex": "0x144", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2d9b603b95331a517801e44f1ace507bc29fdd466954cceca087f84bd7758982", + "transactionIndex": "0x89", + "blockHash": "0x82d62a352b00ec3570d122f3abf98c1f13dda1cbb5e534ea6d5529b87829245f", + "blockNumber": "0x2389592", + "gasUsed": "0x3a9efe", + "effectiveGasPrice": "0x4486791", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0xe2e228d52444fc80fe08b72ea5af0fff57ade926", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xed1392f2", + "l1GasPrice": "0x382071bb", + "l1GasUsed": "0x25642" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1273b4d", + "logs": [ + { + "address": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x5511227f1e9a082d20763db2209687ec16f02e4353ad3b33d42375baa4297d0a", + "blockNumber": "0x2389593", + "blockTimestamp": "0x68fb8809", + "transactionHash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionIndex": "0x58", + "logIndex": "0x16b", + "removed": false + } + ], + "logsBloom": "0x00000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000090000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe5a6775eb2b9f320b110f3e4dbd10eb8a6fdbb77753543d50d889eea1ea73655", + "transactionIndex": "0x58", + "blockHash": "0x5511227f1e9a082d20763db2209687ec16f02e4353ad3b33d42375baa4297d0a", + "blockNumber": "0x2389593", + "gasUsed": "0x2b78c6", + "effectiveGasPrice": "0x44214c0", + "from": "0xa5040d66a8e609fce17d115f4726a2311331bb21", + "to": null, + "contractAddress": "0x64b8ab92d0fced27c00a0b4ca21488418bea230f", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x2", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0xcbc33408", + "l1GasPrice": "0x382071bb", + "l1GasUsed": "0x1c0f1" + } + ], + "libraries": [ + "src/factory/libraries/MarketFactoryLibrary.sol:MarketFactoryLibrary:0x22C26A06ef6C51BbCa1cF5276E1606e89402979a", + "src/factory/libraries/NonTransferrableRebasingTokenVaultLibrary.sol:NonTransferrableRebasingTokenVaultLibrary:0xB4A15fB08Dbe6a161FF1D411be2d9F67F0606118", + "src/factory/libraries/PriceFeedFactoryLibrary.sol:PriceFeedFactoryLibrary:0xe8Dc58C7f234e49F024cE03e926BE80FC2dB0f7d" + ], + "pending": [], + "returns": {}, + "timestamp": 1761314932405, + "chain": 8453, + "commit": "2aea4c3d" +} \ No newline at end of file diff --git a/script/ProposeSafeTxUpgradeToV1_8.s.sol b/script/ProposeSafeTxUpgradeToV1_8.s.sol deleted file mode 100644 index e17c65ca..00000000 --- a/script/ProposeSafeTxUpgradeToV1_8.s.sol +++ /dev/null @@ -1,187 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.23; - -import {MulticallUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import {console} from "forge-std/console.sol"; - -import {NonTransferrableScaledTokenV1_5} from "@deprecated/token/NonTransferrableScaledTokenV1_5.sol"; - -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {CollectionsManager} from "@src/collections/CollectionsManager.sol"; -import {SizeFactory} from "@src/factory/SizeFactory.sol"; -import {Size} from "@src/market/Size.sol"; -import {NonTransferrableRebasingTokenVault} from "@src/market/token/NonTransferrableRebasingTokenVault.sol"; - -import {BaseScript} from "@script/BaseScript.sol"; -import {Contract, Networks} from "@script/Networks.sol"; - -import {Safe} from "@safe-utils/Safe.sol"; - -import {ISizeFactory} from "@src/factory/interfaces/ISizeFactory.sol"; -import {ISize} from "@src/market/interfaces/ISize.sol"; -import {Tenderly} from "@tenderly-utils/Tenderly.sol"; - -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; - -import {AaveAdapter} from "@src/market/token/adapters/AaveAdapter.sol"; -import {ERC4626Adapter} from "@src/market/token/adapters/ERC4626Adapter.sol"; - -import {IPool} from "@aave/interfaces/IPool.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ISizeV1_8} from "@src/market/interfaces/v1.8/ISizeV1_8.sol"; - -contract ProposeSafeTxUpgradeToV1_8Script is BaseScript, Networks { - using Tenderly for *; - using Safe for *; - - address signer; - string derivationPath; - - ISizeFactory sizeFactory; - address safeAddress; - - address[] users; - address curator; - address rateProvider; - ISize[] collectionMarkets; - - modifier parseEnv() { - signer = vm.envAddress("SIGNER"); - derivationPath = vm.envString("LEDGER_PATH"); - sizeFactory = ISizeFactory(contracts[block.chainid][Contract.SIZE_FACTORY]); - - string memory accountSlug = vm.envString("TENDERLY_ACCOUNT_NAME"); - string memory projectSlug = vm.envString("TENDERLY_PROJECT_NAME"); - string memory accessKey = vm.envString("TENDERLY_ACCESS_KEY"); - - tenderly.initialize(accountSlug, projectSlug, accessKey); - - safeAddress = vm.envAddress("OWNER"); - safe.initialize(safeAddress); - - users = vm.envOr("USERS", ",", new address[](0)); - curator = vm.envOr("CURATOR", address(0)); - rateProvider = vm.envOr("RATE_PROVIDER", address(0)); - collectionMarkets = getCollectionMarkets(sizeFactory); - - console.log("users", users.length); - console.log("curator", curator); - console.log("rateProvider", rateProvider); - console.log("collectionMarkets", collectionMarkets.length); - - _; - } - - function getCollectionMarkets(ISizeFactory _sizeFactory) - public - view - virtual - returns (ISize[] memory _collectionMarkets) - { - _collectionMarkets = new ISize[](4); - ISize[] memory markets = getUnpausedMarkets(_sizeFactory); - uint256 collectionMarketsLength = 0; - for (uint256 i = 0; i < markets.length; i++) { - string memory symbol = markets[i].data().underlyingCollateralToken.symbol(); - if ( - Strings.equal(symbol, "WETH") || Strings.equal(symbol, "cbBTC") || Strings.equal(symbol, "cbETH") - || Strings.equal(symbol, "wstETH") - ) { - _collectionMarkets[collectionMarketsLength++] = markets[i]; - } - } - - require( - block.chainid == ETHEREUM_MAINNET || (block.chainid == BASE_MAINNET && collectionMarketsLength == 4), - "Invalid number of collection markets" - ); - } - - function getTargetsAndDatas( - ISizeFactory _sizeFactory, - address[] memory _users, - address _curator, - address _rateProvider, - ISize[] memory _collectionMarkets - ) public returns (address[] memory targets, bytes[] memory datas) { - ISize[] memory markets = _sizeFactory.getMarkets(); - NonTransferrableScaledTokenV1_5 v1_5saToken = - NonTransferrableScaledTokenV1_5(address(markets[0].data().borrowTokenVault)); - - /* deployments start */ - Size sizeV1_8Implementation = new Size(); - SizeFactory sizeFactoryV1_8Implementation = new SizeFactory(); - NonTransferrableRebasingTokenVault borrowTokenVaultV1_8Implementation = new NonTransferrableRebasingTokenVault(); - CollectionsManager collectionsManager = CollectionsManager( - address( - new ERC1967Proxy( - address(new CollectionsManager()), - abi.encodeCall(CollectionsManager.initialize, ISizeFactory(address(_sizeFactory))) - ) - ) - ); - AaveAdapter aaveAdapter = new AaveAdapter(NonTransferrableRebasingTokenVault(address(v1_5saToken))); - ERC4626Adapter erc4626Adapter = new ERC4626Adapter(NonTransferrableRebasingTokenVault(address(v1_5saToken))); - /* deployment end */ - - targets = new address[](markets.length + 2); - datas = new bytes[](markets.length + 2); - - // Size.upgradeToAndCall(v1_8, reinitialize) for all markets - for (uint256 i = 0; i < markets.length; i++) { - targets[i] = address(markets[i]); - datas[i] = abi.encodeCall( - UUPSUpgradeable.upgradeToAndCall, - (address(sizeV1_8Implementation), abi.encodeCall(ISizeV1_8.reinitialize, ())) - ); - } - - // NonTransferrableScaledTokenV1_5.upgradeToAndCall(v1_8, reinitialize(name, symbol)) - targets[markets.length] = address(v1_5saToken); - datas[markets.length] = abi.encodeCall( - UUPSUpgradeable.upgradeToAndCall, - ( - address(borrowTokenVaultV1_8Implementation), - abi.encodeCall( - NonTransferrableRebasingTokenVault.reinitialize, - ("Size USD Coin Vault", "svUSDC", aaveAdapter, erc4626Adapter) - ) - ) - ); - - // SizeFactory.upgradeToAndCall(v1_8, multicall[reinitialize, setSizeImplementation, setNonTransferrableRebasingTokenVaultImplementation]) - bytes[] memory multicallDatas = new bytes[](3); - multicallDatas[0] = abi.encodeCall( - SizeFactory.reinitialize, (collectionsManager, _users, _curator, _rateProvider, _collectionMarkets) - ); - multicallDatas[1] = abi.encodeCall(SizeFactory.setSizeImplementation, (address(sizeV1_8Implementation))); - multicallDatas[2] = abi.encodeCall( - SizeFactory.setNonTransferrableRebasingTokenVaultImplementation, - (address(borrowTokenVaultV1_8Implementation)) - ); - - targets[markets.length + 1] = address(_sizeFactory); - datas[markets.length + 1] = abi.encodeCall( - UUPSUpgradeable.upgradeToAndCall, - (address(sizeFactoryV1_8Implementation), abi.encodeCall(MulticallUpgradeable.multicall, (multicallDatas))) - ); - } - - function run() external virtual parseEnv ignoreGas { - vm.startBroadcast(); - - (address[] memory targets, bytes[] memory datas) = - getTargetsAndDatas(sizeFactory, users, curator, rateProvider, collectionMarkets); - - vm.stopBroadcast(); - - safe.proposeTransactions(targets, datas, signer, derivationPath); - - Tenderly.VirtualTestnet memory vnet = tenderly.createVirtualTestnet("upgrade-to-v1_8-now", block.chainid); - tenderly.setStorageAt(vnet, safe.instance().safe, Safe.SAFE_THRESHOLD_STORAGE_SLOT, bytes32(uint256(1))); - tenderly.sendTransaction( - vnet.id, signer, safe.instance().safe, safe.getExecTransactionsData(targets, datas, signer, derivationPath) - ); - } -} diff --git a/script/ProposeSafeTxUpgradeToV1_8_1.s.sol b/script/ProposeSafeTxUpgradeToV1_8_1.s.sol new file mode 100644 index 00000000..1ae8b066 --- /dev/null +++ b/script/ProposeSafeTxUpgradeToV1_8_1.s.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.23; + +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {BaseScript} from "@script/BaseScript.sol"; +import {CollectionsManager} from "@src/collections/CollectionsManager.sol"; +import {ICollectionsManager} from "@src/collections/interfaces/ICollectionsManager.sol"; +import {SizeFactory} from "@src/factory/SizeFactory.sol"; + +import {Contract, Networks} from "@script/Networks.sol"; +import {console} from "forge-std/console.sol"; + +import {Safe} from "@safe-utils/Safe.sol"; + +contract ProposeSafeTxUpgradeToV1_8_1Script is BaseScript, Networks { + using Safe for *; + + address signer; + string derivationPath; + SizeFactory private sizeFactory; + ICollectionsManager private collectionsManager; + + modifier parseEnv() { + safe.initialize(vm.envAddress("OWNER")); + signer = vm.envAddress("SIGNER"); + derivationPath = vm.envString("LEDGER_PATH"); + + _; + } + + function run() public parseEnv broadcast { + console.log("ProposeSafeTxUpgradeToV1_8_1Script"); + + (address[] memory targets, bytes[] memory datas) = getUpgradeToV1_8_1Data(); + + safe.proposeTransactions(targets, datas, signer, derivationPath); + + console.log("ProposeSafeTxUpgradeToV1_8_1Script: done"); + } + + function getUpgradeToV1_8_1Data() public returns (address[] memory targets, bytes[] memory datas) { + sizeFactory = SizeFactory(contracts[block.chainid][Contract.SIZE_FACTORY]); + collectionsManager = sizeFactory.collectionsManager(); + + CollectionsManager newCollectionsManagerImplementation = new CollectionsManager(); + console.log( + "ProposeSafeTxUpgradeToV1_8_1Script: newCollectionsManagerImplementation", + address(newCollectionsManagerImplementation) + ); + SizeFactory newSizeFactoryImplementation = new SizeFactory(); + console.log( + "ProposeSafeTxUpgradeToV1_8_1Script: newSizeFactoryImplementation", address(newSizeFactoryImplementation) + ); + + targets = new address[](2); + datas = new bytes[](2); + + // Upgrade SizeFactory + targets[0] = address(sizeFactory); + datas[0] = abi.encodeCall(UUPSUpgradeable.upgradeToAndCall, (address(newSizeFactoryImplementation), "")); + + // Upgrade CollectionsManager + targets[1] = address(collectionsManager); + datas[1] = abi.encodeCall(UUPSUpgradeable.upgradeToAndCall, (address(newCollectionsManagerImplementation), "")); + } +} diff --git a/script/UpgradeToV1_8Testnet.s.sol b/script/UpgradeToV1_8Testnet.s.sol deleted file mode 100644 index 456e6c38..00000000 --- a/script/UpgradeToV1_8Testnet.s.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.23; - -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; -import {ProposeSafeTxUpgradeToV1_8Script} from "@script/ProposeSafeTxUpgradeToV1_8.s.sol"; -import {ISizeFactory} from "@src/factory/interfaces/ISizeFactory.sol"; -import {ISize} from "@src/market/interfaces/ISize.sol"; - -contract UpgradeToV1_8TestnetScript is ProposeSafeTxUpgradeToV1_8Script { - function getCollectionMarkets(ISizeFactory _sizeFactory) - public - view - override - returns (ISize[] memory _collectionMarkets) - { - _collectionMarkets = new ISize[](1); - ISize[] memory markets = getUnpausedMarkets(_sizeFactory); - uint256 collectionMarketsLength = 0; - for (uint256 i = 0; i < markets.length; i++) { - string memory symbol = markets[i].data().underlyingCollateralToken.symbol(); - if (Strings.equal(symbol, "WETH")) { - _collectionMarkets[collectionMarketsLength++] = markets[i]; - } - } - - require(collectionMarketsLength == 1, "Invalid number of collection markets"); - } - - function run() external override parseEnv broadcast { - (address[] memory targets, bytes[] memory datas) = - getTargetsAndDatas(sizeFactory, users, curator, rateProvider, collectionMarkets); - - for (uint256 i = 0; i < targets.length; i++) { - (bool success,) = targets[i].call(datas[i]); - require(success, "Upgrade failed"); - } - } -} diff --git a/src/collections/CollectionsManagerBase.sol b/src/collections/CollectionsManagerBase.sol index d5ea822f..5df7016e 100644 --- a/src/collections/CollectionsManagerBase.sol +++ b/src/collections/CollectionsManagerBase.sol @@ -11,9 +11,14 @@ import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; struct MarketInformation { bool initialized; + CopyLimitOrderConfig ___deprecated_copyLoanOfferConfig; + CopyLimitOrderConfig ___deprecated_copyBorrowOfferConfig; + EnumerableSet.AddressSet rateProviders; +} + +struct UserCollectionCopyLimitOrderConfigs { CopyLimitOrderConfig copyLoanOfferConfig; CopyLimitOrderConfig copyBorrowOfferConfig; - EnumerableSet.AddressSet rateProviders; } /// @title CollectionManagerStorage @@ -33,6 +38,11 @@ abstract contract CollectionsManagerBase { mapping(uint256 collectionId => mapping(ISize market => MarketInformation marketInformation) collection) collections; // mapping of user to collection Ids set mapping(address user => EnumerableSet.UintSet collectionIds) userToCollectionIds; + // mapping of user to collection Ids to CopyLimitOrderConfig + mapping( + address user + => mapping(uint256 collectionId => UserCollectionCopyLimitOrderConfigs userCollectionCopyLimitOrderConfigs) + ) userToCollectionCopyLimitOrderConfigs; /*////////////////////////////////////////////////////////////// ERRORS diff --git a/src/collections/actions/CollectionsManagerCuratorActions.sol b/src/collections/actions/CollectionsManagerCuratorActions.sol index aa2e1266..b31e3dde 100644 --- a/src/collections/actions/CollectionsManagerCuratorActions.sol +++ b/src/collections/actions/CollectionsManagerCuratorActions.sol @@ -51,32 +51,9 @@ abstract contract CollectionsManagerCuratorActions is /// @inheritdoc ICollectionsManagerCuratorActions function addMarketsToCollection(uint256 collectionId, ISize[] memory markets) - external /* onlyCollectionCuratorAuthorized(collectionId) */ + external + onlyCollectionCuratorAuthorized(collectionId) { - CopyLimitOrderConfig[] memory fullCopies = new CopyLimitOrderConfig[](markets.length); - for (uint256 i = 0; i < markets.length; i++) { - fullCopies[i] = CopyLimitOrderConfig({ - minTenor: 0, - maxTenor: type(uint256).max, - minAPR: 0, - maxAPR: type(uint256).max, - offsetAPR: 0 - }); - } - setCollectionMarketConfigs(collectionId, markets, fullCopies, fullCopies); - } - - /// @inheritdoc ICollectionsManagerCuratorActions - function setCollectionMarketConfigs( - uint256 collectionId, - ISize[] memory markets, - CopyLimitOrderConfig[] memory copyLoanOfferConfigs, - CopyLimitOrderConfig[] memory copyBorrowOfferConfigs - ) public onlyCollectionCuratorAuthorized(collectionId) { - if (markets.length != copyLoanOfferConfigs.length || markets.length != copyBorrowOfferConfigs.length) { - revert Errors.ARRAY_LENGTHS_MISMATCH(); - } - // slither-disable-start calls-loop for (uint256 i = 0; i < markets.length; i++) { if (!sizeFactory.isMarket(address(markets[i]))) { @@ -85,15 +62,9 @@ abstract contract CollectionsManagerCuratorActions is if (PausableUpgradeable(address(markets[i])).paused()) { revert Errors.PAUSED_MARKET(address(markets[i])); } - OfferLibrary.validateCopyLimitOrderConfigs(copyLoanOfferConfigs[i], copyBorrowOfferConfigs[i]); - collections[collectionId][markets[i]].initialized = true; - collections[collectionId][markets[i]].copyLoanOfferConfig = copyLoanOfferConfigs[i]; - collections[collectionId][markets[i]].copyBorrowOfferConfig = copyBorrowOfferConfigs[i]; - emit MarketAddedToCollection( - collectionId, address(markets[i]), copyLoanOfferConfigs[i], copyBorrowOfferConfigs[i] - ); + emit MarketAddedToCollection(collectionId, address(markets[i])); } // slither-disable-end calls-loop } diff --git a/src/collections/actions/CollectionsManagerUserActions.sol b/src/collections/actions/CollectionsManagerUserActions.sol index d1a4afbb..63f5d2ce 100644 --- a/src/collections/actions/CollectionsManagerUserActions.sol +++ b/src/collections/actions/CollectionsManagerUserActions.sol @@ -2,8 +2,11 @@ pragma solidity 0.8.23; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {UserCollectionCopyLimitOrderConfigs} from "@src/collections/CollectionsManagerBase.sol"; import {CollectionsManagerView} from "@src/collections/actions/CollectionsManagerView.sol"; import {ICollectionsManagerUserActions} from "@src/collections/interfaces/ICollectionsManagerUserActions.sol"; +import {CopyLimitOrderConfig, OfferLibrary} from "@src/market/libraries/OfferLibrary.sol"; /// @title CollectionsManagerUserActions /// @custom:security-contact security@size.credit @@ -17,6 +20,14 @@ abstract contract CollectionsManagerUserActions is ICollectionsManagerUserAction //////////////////////////////////////////////////////////////*/ function subscribeUserToCollections(address user, uint256[] memory collectionIds) external onlySizeFactory { + CopyLimitOrderConfig memory fullCopy = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + for (uint256 i = 0; i < collectionIds.length; i++) { if (!isValidCollectionId(collectionIds[i])) { revert InvalidCollectionId(collectionIds[i]); @@ -25,11 +36,15 @@ abstract contract CollectionsManagerUserActions is ICollectionsManagerUserAction bool added = userToCollectionIds[user].add(collectionIds[i]); if (added) { emit SubscribedToCollection(user, collectionIds[i]); + _setUserCollectionCopyLimitOrderConfigs(user, collectionIds[i], fullCopy, fullCopy); } } } function unsubscribeUserFromCollections(address user, uint256[] memory collectionIds) external onlySizeFactory { + // slither-disable-next-line uninitialized-local + CopyLimitOrderConfig memory nullCopy; + for (uint256 i = 0; i < collectionIds.length; i++) { if (!isValidCollectionId(collectionIds[i])) { revert InvalidCollectionId(collectionIds[i]); @@ -38,7 +53,35 @@ abstract contract CollectionsManagerUserActions is ICollectionsManagerUserAction bool removed = userToCollectionIds[user].remove(collectionIds[i]); if (removed) { emit UnsubscribedFromCollection(user, collectionIds[i]); + _setUserCollectionCopyLimitOrderConfigs(user, collectionIds[i], nullCopy, nullCopy); } } } + + function setUserCollectionCopyLimitOrderConfigs( + address user, + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) external onlySizeFactory { + _setUserCollectionCopyLimitOrderConfigs(user, collectionId, copyLoanOfferConfig, copyBorrowOfferConfig); + } + + function _setUserCollectionCopyLimitOrderConfigs( + address user, + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) private { + if (!isValidCollectionId(collectionId)) { + revert InvalidCollectionId(collectionId); + } + OfferLibrary.validateCopyLimitOrderConfigs(copyLoanOfferConfig, copyBorrowOfferConfig); + + userToCollectionCopyLimitOrderConfigs[user][collectionId] = UserCollectionCopyLimitOrderConfigs({ + copyLoanOfferConfig: copyLoanOfferConfig, + copyBorrowOfferConfig: copyBorrowOfferConfig + }); + emit SetUserCollectionCopyLimitOrderConfigs(user, collectionId, copyLoanOfferConfig, copyBorrowOfferConfig); + } } diff --git a/src/collections/actions/CollectionsManagerView.sol b/src/collections/actions/CollectionsManagerView.sol index 7357dbd7..7977b702 100644 --- a/src/collections/actions/CollectionsManagerView.sol +++ b/src/collections/actions/CollectionsManagerView.sol @@ -231,19 +231,38 @@ abstract contract CollectionsManagerView is ICollectionsManagerView, Collections COPY LIMIT ORDER VIEW //////////////////////////////////////////////////////////////*/ + /// @inheritdoc ICollectionsManagerView + function getUserDefinedCollectionCopyLoanOfferConfig(address user, uint256 collectionId) + external + view + returns (CopyLimitOrderConfig memory) + { + return _getUserDefinedCollectionCopyLimitOrderConfig(user, collectionId, true); + } + + /// @inheritdoc ICollectionsManagerView + function getUserDefinedCollectionCopyBorrowOfferConfig(address user, uint256 collectionId) + external + view + returns (CopyLimitOrderConfig memory) + { + return _getUserDefinedCollectionCopyLimitOrderConfig(user, collectionId, false); + } + /// @dev Reverts if the collection id is invalid or the market is not in the collection + /// @dev Changed in v1.8.1 function _getCopyLimitOrderConfig(address user, uint256 collectionId, ISize market, bool isLoanOffer) private view returns (CopyLimitOrderConfig memory copyLimitOrder) { - copyLimitOrder = _getUserDefinedCopyLimitOrderConfig(user, market, isLoanOffer); + copyLimitOrder = _getUserDefinedMarketCopyLimitOrderConfig(user, market, isLoanOffer); if (copyLimitOrder.isNull()) { - copyLimitOrder = _getCollectionMarketCopyLimitOrderConfig(collectionId, market, isLoanOffer); + copyLimitOrder = _getUserDefinedCollectionCopyLimitOrderConfig(user, collectionId, isLoanOffer); } } - function _getUserDefinedCopyLimitOrderConfig(address user, ISize market, bool isLoanOffer) + function _getUserDefinedMarketCopyLimitOrderConfig(address user, ISize market, bool isLoanOffer) private view returns (CopyLimitOrderConfig memory copyLimitOrder) @@ -253,37 +272,13 @@ abstract contract CollectionsManagerView is ICollectionsManagerView, Collections : market.getUserDefinedCopyBorrowOfferConfig(user); } - function _getCollectionMarketCopyLimitOrderConfig(uint256 collectionId, ISize market, bool isLoanOffer) + function _getUserDefinedCollectionCopyLimitOrderConfig(address user, uint256 collectionId, bool isLoanOffer) private view returns (CopyLimitOrderConfig memory copyLimitOrder) { - if (!isValidCollectionId(collectionId)) { - revert InvalidCollectionId(collectionId); - } - if (!collections[collectionId][market].initialized) { - revert MarketNotInCollection(collectionId, address(market)); - } return isLoanOffer - ? collections[collectionId][market].copyLoanOfferConfig - : collections[collectionId][market].copyBorrowOfferConfig; - } - - /// @inheritdoc ICollectionsManagerView - function getCollectionMarketCopyLoanOfferConfig(uint256 collectionId, ISize market) - public - view - returns (CopyLimitOrderConfig memory copyLimitOrder) - { - return _getCollectionMarketCopyLimitOrderConfig(collectionId, market, true); - } - - /// @inheritdoc ICollectionsManagerView - function getCollectionMarketCopyBorrowOfferConfig(uint256 collectionId, ISize market) - public - view - returns (CopyLimitOrderConfig memory copyLimitOrder) - { - return _getCollectionMarketCopyLimitOrderConfig(collectionId, market, false); + ? userToCollectionCopyLimitOrderConfigs[user][collectionId].copyLoanOfferConfig + : userToCollectionCopyLimitOrderConfigs[user][collectionId].copyBorrowOfferConfig; } } diff --git a/src/collections/interfaces/ICollectionsManagerCuratorActions.sol b/src/collections/interfaces/ICollectionsManagerCuratorActions.sol index 8304beb7..55309f46 100644 --- a/src/collections/interfaces/ICollectionsManagerCuratorActions.sol +++ b/src/collections/interfaces/ICollectionsManagerCuratorActions.sol @@ -2,22 +2,20 @@ pragma solidity 0.8.23; import {ISize} from "@src/market/interfaces/ISize.sol"; -import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; + /// @title ICollectionsManagerCuratorActions /// @custom:security-contact security@size.credit /// @author Size (https://size.credit/) - interface ICollectionsManagerCuratorActions { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ - event MarketAddedToCollection( - uint256 indexed collectionId, - address indexed market, - CopyLimitOrderConfig copyLoanOfferConfig, - CopyLimitOrderConfig copyBorrowOfferConfig - ); + event MarketAddedToCollection(uint256 indexed collectionId, address indexed market); + // deprecated in v1.8.1 + // CopyLimitOrderConfig copyLoanOfferConfig, + // CopyLimitOrderConfig copyBorrowOfferConfig + event MarketRemovedFromCollection(uint256 indexed collectionId, address indexed market); event RateProviderAddedToMarket(uint256 indexed collectionId, address indexed market, address indexed rateProvider); event RateProviderRemovedFromMarket( @@ -45,12 +43,13 @@ interface ICollectionsManagerCuratorActions { /// @param copyLoanOfferConfigs The copy limit order parameters for loan offers /// @param copyBorrowOfferConfigs The copy limit order parameters for borrow offers /// @dev This function has the same effect as calling `addMarketsToCollection` but with a custom config for each market - function setCollectionMarketConfigs( - uint256 collectionId, - ISize[] memory markets, - CopyLimitOrderConfig[] memory copyLoanOfferConfigs, - CopyLimitOrderConfig[] memory copyBorrowOfferConfigs - ) external; + /// @dev Removed in v1.8.1 + // function setCollectionMarketConfigs( + // uint256 collectionId, + // ISize[] memory markets, + // CopyLimitOrderConfig[] memory copyLoanOfferConfigs, + // CopyLimitOrderConfig[] memory copyBorrowOfferConfigs + // ) external; /// @notice Removes markets from a collection /// @param collectionId The collection ID diff --git a/src/collections/interfaces/ICollectionsManagerUserActions.sol b/src/collections/interfaces/ICollectionsManagerUserActions.sol index 24aeda82..66258f1e 100644 --- a/src/collections/interfaces/ICollectionsManagerUserActions.sol +++ b/src/collections/interfaces/ICollectionsManagerUserActions.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; +import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; + /// @title ICollectionsManagerUserActions /// @custom:security-contact security@size.credit /// @author Size (https://size.credit/) @@ -11,6 +13,12 @@ interface ICollectionsManagerUserActions { event SubscribedToCollection(address indexed user, uint256 indexed collectionId); event UnsubscribedFromCollection(address indexed user, uint256 indexed collectionId); + event SetUserCollectionCopyLimitOrderConfigs( + address indexed user, + uint256 indexed collectionId, + CopyLimitOrderConfig copyLoanOfferConfig, + CopyLimitOrderConfig copyBorrowOfferConfig + ); /*////////////////////////////////////////////////////////////// ACTIONS @@ -27,4 +35,18 @@ interface ICollectionsManagerUserActions { /// @param collectionIds The collection IDs to unsubscribe the user from /// @dev Only callable by the SizeFactory function unsubscribeUserFromCollections(address user, uint256[] memory collectionIds) external; + + /// @notice Set the copy limit order configs for a user and collection + /// @param user The user to set the copy limit order configs for + /// @param collectionId The collection ID to set the copy limit order configs for + /// @param copyLoanOfferConfig The copy limit order config for the loan offer + /// @param copyBorrowOfferConfig The copy limit order config for the borrow offer + /// @dev Only callable by the SizeFactory + /// @dev Added in v1.8.1 + function setUserCollectionCopyLimitOrderConfigs( + address user, + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) external; } diff --git a/src/collections/interfaces/ICollectionsManagerView.sol b/src/collections/interfaces/ICollectionsManagerView.sol index 914e68a7..0a6bc72a 100644 --- a/src/collections/interfaces/ICollectionsManagerView.sol +++ b/src/collections/interfaces/ICollectionsManagerView.sol @@ -124,16 +124,36 @@ interface ICollectionsManagerView { /// @param collectionId The collection ID to get the copy loan offer config for /// @param market The market to get the copy loan offer config for /// @return config The copy loan offer config - function getCollectionMarketCopyLoanOfferConfig(uint256 collectionId, ISize market) - external - view - returns (CopyLimitOrderConfig memory); + /// @dev deprecated in v1.8.1 + // function getCollectionMarketCopyLoanOfferConfig(uint256 collectionId, ISize market) + // external + // view + // returns (CopyLimitOrderConfig memory); /// @notice Get the copy borrow offer config for a collection market /// @param collectionId The collection ID to get the copy borrow offer config for /// @param market The market to get the copy borrow offer config for /// @return config The copy borrow offer config - function getCollectionMarketCopyBorrowOfferConfig(uint256 collectionId, ISize market) + // @dev deprecated in v1.8.1 + // function getCollectionMarketCopyBorrowOfferConfig(uint256 collectionId, ISize market) + // external + // view + // returns (CopyLimitOrderConfig memory); + + /// @notice Get the user defined copy loan offer config for a user and collection + /// @param user The user to get the user defined copy loan offer config for + /// @param collectionId The collection ID to get the user defined copy loan offer config for + /// @return config The user defined copy loan offer config for the collection + function getUserDefinedCollectionCopyLoanOfferConfig(address user, uint256 collectionId) + external + view + returns (CopyLimitOrderConfig memory); + + /// @notice Get the user defined copy borrow offer config for a user and collection + /// @param user The user to get the user defined copy borrow offer config for + /// @param collectionId The collection ID to get the user defined copy borrow offer config for + /// @return config The user defined copy borrow offer config for the collection + function getUserDefinedCollectionCopyBorrowOfferConfig(address user, uint256 collectionId) external view returns (CopyLimitOrderConfig memory); diff --git a/src/factory/SizeFactory.sol b/src/factory/SizeFactory.sol index a34e3f05..d9fb4a67 100644 --- a/src/factory/SizeFactory.sol +++ b/src/factory/SizeFactory.sol @@ -69,7 +69,6 @@ contract SizeFactory is ISizeFactory, SizeFactoryOffchainGetters, SizeFactoryEvents, - ERC721Holder, // required for `reinitialize` MulticallUpgradeable, AccessControlUpgradeable, UUPSUpgradeable @@ -92,84 +91,6 @@ contract SizeFactory is _grantRole(BORROW_RATE_UPDATER_ROLE, _owner); } - /// @inheritdoc ISizeFactoryV1_8 - // slither-disable-start calls-loop - // slither-disable-start reentrancy-benign - // slither-disable-start uninitialized-local - function reinitialize( - ICollectionsManager _collectionsManager, - address[] memory _users, - address _curator, - address _rateProvider, - ISize[] memory _collectionMarkets - ) external onlyRole(DEFAULT_ADMIN_ROLE) reinitializer(1_08_01) { - if (address(_collectionsManager) == address(0)) { - revert Errors.NULL_ADDRESS(); - } - - collectionsManager = _collectionsManager; - emit CollectionsManagerSet(address(0), address(_collectionsManager)); - - if (_curator == address(0) || _rateProvider == address(0)) { - // no migration required - return; - } - - uint256[] memory collectionIds = new uint256[](1); - collectionIds[0] = collectionsManager.createCollection(); - - CopyLimitOrderConfig[] memory noCopies = new CopyLimitOrderConfig[](_collectionMarkets.length); - CopyLimitOrderConfig[] memory fullCopies = new CopyLimitOrderConfig[](_collectionMarkets.length); - for (uint256 i = 0; i < _collectionMarkets.length; i++) { - noCopies[i] = - CopyLimitOrderConfig({minTenor: 0, maxTenor: 0, minAPR: 0, maxAPR: 0, offsetAPR: type(int256).min}); - - fullCopies[i] = CopyLimitOrderConfig({ - minTenor: 0, - maxTenor: type(uint256).max, - minAPR: 0, - maxAPR: type(uint256).max, - offsetAPR: 0 - }); - } - collectionsManager.setCollectionMarketConfigs(collectionIds[0], _collectionMarkets, fullCopies, noCopies); - address[] memory rateProviders = new address[](1); - rateProviders[0] = _rateProvider; - for (uint256 i = 0; i < _collectionMarkets.length; i++) { - collectionsManager.addRateProvidersToCollectionMarket( - collectionIds[0], _collectionMarkets[i], rateProviders - ); - } - - Action[] memory actions = new Action[](2); - actions[0] = Action.BUY_CREDIT_LIMIT; - actions[1] = Action.SELL_CREDIT_LIMIT; - - for (uint256 i = 0; i < _users.length; i++) { - collectionsManager.subscribeUserToCollections(_users[i], collectionIds); - _setAuthorization(address(this), _users[i], Authorization.getActionsBitmap(actions)); - for (uint256 j = 0; j < _collectionMarkets.length; j++) { - BuyCreditLimitOnBehalfOfParams memory buyCreditLimitOnBehalfOfParams; - buyCreditLimitOnBehalfOfParams.onBehalfOf = _users[i]; - - _collectionMarkets[j].buyCreditLimitOnBehalfOf(buyCreditLimitOnBehalfOfParams); - - SellCreditLimitOnBehalfOfParams memory sellCreditLimitOnBehalfOfParams; - sellCreditLimitOnBehalfOfParams.onBehalfOf = _users[i]; - - _collectionMarkets[j].sellCreditLimitOnBehalfOf(sellCreditLimitOnBehalfOfParams); - } - _setAuthorization(address(this), _users[i], Authorization.nullActionsBitmap()); - } - - ERC721EnumerableUpgradeable(address(_collectionsManager)).safeTransferFrom( - address(this), address(_curator), collectionIds[0] - ); - } - // slither-disable-end uninitialized-local - // slither-disable-end reentrancy-benign - // slither-disable-end calls-loop - function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} /// @inheritdoc ISizeFactory @@ -317,6 +238,30 @@ contract SizeFactory is collectionsManager.unsubscribeUserFromCollections(onBehalfOf, collectionIds); } + function setUserCollectionCopyLimitOrderConfigs( + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) external { + return setUserCollectionCopyLimitOrderConfigsOnBehalfOf( + collectionId, copyLoanOfferConfig, copyBorrowOfferConfig, msg.sender + ); + } + + function setUserCollectionCopyLimitOrderConfigsOnBehalfOf( + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig, + address onBehalfOf + ) public { + if (!isAuthorized(msg.sender, onBehalfOf, Action.MANAGE_COLLECTION_SUBSCRIPTIONS)) { + revert Errors.UNAUTHORIZED_ACTION(msg.sender, onBehalfOf, uint8(Action.MANAGE_COLLECTION_SUBSCRIPTIONS)); + } + collectionsManager.setUserCollectionCopyLimitOrderConfigs( + onBehalfOf, collectionId, copyLoanOfferConfig, copyBorrowOfferConfig + ); + } + /// @inheritdoc ISizeFactoryV1_8 function getLoanOfferAPR(address user, uint256 collectionId, ISize market, address rateProvider, uint256 tenor) external diff --git a/src/factory/interfaces/ISizeFactoryV1_8.sol b/src/factory/interfaces/ISizeFactoryV1_8.sol index ff6096ba..02ae113b 100644 --- a/src/factory/interfaces/ISizeFactoryV1_8.sol +++ b/src/factory/interfaces/ISizeFactoryV1_8.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.23; import {ICollectionsManager} from "@src/collections/interfaces/ICollectionsManager.sol"; import {ISize} from "@src/market/interfaces/ISize.sol"; +import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; /// @title ISizeFactoryV1_8 /// @custom:security-contact security@size.credit @@ -21,13 +22,14 @@ interface ISizeFactoryV1_8 { /// On mainnet, there are no off-chain collections. On Base, there is only one off-chain collection. /// Although users could theoretically DoS/grief the reinitialization process by sybil copying the rate provider with multiple accounts, /// these addresses are filtered on the backend by liquidity, so this is not a concern. - function reinitialize( - ICollectionsManager _collectionsManager, - address[] memory _users, - address _curator, - address _rateProvider, - ISize[] memory _collectionMarkets - ) external; + /// @dev Deprecated in v1.8.1 + // function reinitialize( + // ICollectionsManager _collectionsManager, + // address[] memory _users, + // address _curator, + // address _rateProvider, + // ISize[] memory _collectionMarkets + // ) external; /// @notice Call a market with data. This can be used to batch operations on multiple markets. /// @param market The market to call @@ -50,6 +52,23 @@ interface ISizeFactoryV1_8 { /// @notice Same as `unsubscribeFromCollections` but `onBehalfOf` function unsubscribeFromCollectionsOnBehalfOf(uint256[] memory collectionIds, address onBehalfOf) external; + /// @notice Set the copy limit order configs for a user and collection + /// @dev Added in v1.8.1 + function setUserCollectionCopyLimitOrderConfigs( + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) external; + + /// @notice Same as `setUserCollectionCopyLimitOrderConfigs` but `onBehalfOf` + /// @dev Added in v1.8.1 + function setUserCollectionCopyLimitOrderConfigsOnBehalfOf( + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig, + address onBehalfOf + ) external; + /// @notice Get the loan offer APR /// @param user The user /// @param collectionId The collection id diff --git a/src/market/interfaces/ISize.sol b/src/market/interfaces/ISize.sol index a289717b..e5b2439c 100644 --- a/src/market/interfaces/ISize.sol +++ b/src/market/interfaces/ISize.sol @@ -36,7 +36,7 @@ import {ISizeAdmin} from "@src/market/interfaces/ISizeAdmin.sol"; import {ISizeV1_7} from "@src/market/interfaces/v1.7/ISizeV1_7.sol"; import {ISizeV1_8} from "@src/market/interfaces/v1.8/ISizeV1_8.sol"; -string constant VERSION = "v1.8"; +string constant VERSION = "v1.8.1"; /// @title ISize /// @custom:security-contact security@size.credit diff --git a/test/BaseTest.sol b/test/BaseTest.sol index ebf8f9ec..8b60a915 100644 --- a/test/BaseTest.sol +++ b/test/BaseTest.sol @@ -490,6 +490,16 @@ contract BaseTest is Test, Deploy, AssertsHelper { ); } + function _setUserCollectionCopyLimitOrderConfigs( + address user, + uint256 collectionId, + CopyLimitOrderConfig memory copyLoanOfferConfig, + CopyLimitOrderConfig memory copyBorrowOfferConfig + ) internal { + vm.prank(user); + sizeFactory.setUserCollectionCopyLimitOrderConfigs(collectionId, copyLoanOfferConfig, copyBorrowOfferConfig); + } + function _setAuthorization(address user, address operator, ActionsBitmap actionsBitmap) internal { vm.prank(user); sizeFactory.setAuthorization(operator, actionsBitmap); diff --git a/test/fork/v1.8/ForkCollections.t.sol b/test/fork/v1.8/ForkCollections.t.sol index 39874c9c..b454f45d 100644 --- a/test/fork/v1.8/ForkCollections.t.sol +++ b/test/fork/v1.8/ForkCollections.t.sol @@ -14,8 +14,6 @@ import {IERC4626Morpho} from "@test/fork/v1.8/interfaces/IERC4626Morpho.sol"; import {Errors} from "@src/market/libraries/Errors.sol"; -import {ProposeSafeTxUpgradeToV1_8Script} from "@script/ProposeSafeTxUpgradeToV1_8.s.sol"; - import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import {SizeFactory} from "@src/factory/SizeFactory.sol"; import {Size} from "@src/market/Size.sol"; @@ -26,11 +24,14 @@ import { SellCreditMarketParams } from "@src/market/libraries/actions/SellCreditMarket.sol"; +import {ICollectionsManagerView} from "@src/collections/interfaces/ICollectionsManagerView.sol"; import {RESERVED_ID} from "@src/market/libraries/LoanLibrary.sol"; -contract ForkCollectionsTest is ForkTest, Networks { - ProposeSafeTxUpgradeToV1_8Script script; +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import {ProposeSafeTxUpgradeToV1_8_1Script} from "@script/ProposeSafeTxUpgradeToV1_8_1.s.sol"; +import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; +contract ForkCollectionsTest is ForkTest, Networks { address[] users; ISize[] collectionMarkets; address curator; @@ -43,8 +44,8 @@ contract ForkCollectionsTest is ForkTest, Networks { function setUp() public override(ForkTest) { vm.createSelectFork("base_archive"); - // 2025-05-12 16h50 UTC - vm.rollFork(30139655); + // 2025-10-21 14h10 UTC + vm.rollFork(37133235); sizeFactory = importSizeFactory("base-production-size-factory"); size = SizeMock(address(sizeFactory.getMarket(0))); @@ -53,64 +54,21 @@ contract ForkCollectionsTest is ForkTest, Networks { variablePool = size.data().variablePool; owner = Networks.contracts[block.chainid][Contract.SIZE_GOVERNANCE]; - script = new ProposeSafeTxUpgradeToV1_8Script(); - users = new address[](2); users[0] = 0x87CDad83a779D785A729a91dBb9FE0DB8be14b3b; users[1] = 0x000000f840D8A851718d7DC470bFf1ed09F69107; - collectionMarkets = script.getCollectionMarkets(sizeFactory); curator = makeAddr("curator"); rateProvider = 0x39EB0e1039732d8d2380B682Bc00Ad07b864F176; - _getPreviousState(); - - _upgradeToV1_8(); - _labels(); } - function _getPreviousState() internal { - usersPreviousLoanAPRsPerCollectionMarket = new uint256[][](users.length); - for (uint256 i = 0; i < users.length; i++) { - usersPreviousLoanAPRsPerCollectionMarket[i] = new uint256[](collectionMarkets.length); - for (uint256 j = 0; j < collectionMarkets.length; j++) { - ISize collectionMarket = collectionMarkets[j]; - (bool success, bytes memory data) = address(collectionMarket).call( - abi.encodeWithSignature("getLoanOfferAPR(address,uint256)", users[i], tenor) - ); - assertEq(success, true); - usersPreviousLoanAPRsPerCollectionMarket[i][j] = abi.decode(data, (uint256)); - } - } - } - - function _upgradeToV1_8() internal { - (address[] memory targets, bytes[] memory datas) = - script.getTargetsAndDatas(sizeFactory, users, curator, rateProvider, collectionMarkets); - - for (uint256 i = 0; i < targets.length; i++) { - vm.prank(owner); - (bool success,) = targets[i].call(datas[i]); - assertTrue(success); - } - } - - function testFork_ForkCollections_users_subscribing_to_existing_RP_now_have_1_collection() public view { - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < collectionMarkets.length; j++) { - ISize collectionMarket = collectionMarkets[j]; - uint256 loanAPR = collectionMarket.getLoanOfferAPR(users[i], collectionId, rateProvider, tenor); - assertEq(loanAPR, usersPreviousLoanAPRsPerCollectionMarket[i][j]); - } - } - } - function testFork_ForkCollections_market_orders_on_users_subscribing_to_existing_RP_now_fail_if_no_collection_is_passed( ) public { _deposit(alice, weth, 100e18); vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_OFFER.selector, users[0])); + vm.expectRevert(abi.encodeWithSelector(Errors.TENOR_OUT_OF_RANGE.selector, tenor, 8640, 8640)); size.sellCreditMarketOnBehalfOf( SellCreditMarketOnBehalfOfParams({ params: SellCreditMarketParams({ @@ -128,24 +86,77 @@ contract ForkCollectionsTest is ForkTest, Networks { recipient: alice }) ); + } - vm.prank(alice); - size.sellCreditMarketOnBehalfOf( - SellCreditMarketOnBehalfOfParams({ - params: SellCreditMarketParams({ - lender: users[0], - creditPositionId: RESERVED_ID, - amount: 10e6, - tenor: tenor, - maxAPR: type(uint256).max, - deadline: block.timestamp, - exactAmountIn: false, - collectionId: collectionId, - rateProvider: rateProvider - }), - onBehalfOf: alice, - recipient: alice - }) + function testFork_ForkCollections_v1_8_1() public { + vm.createSelectFork("base_archive"); + + _upgradeToV1_8_1(); + + CopyLimitOrderConfig memory loanOfferConfig = + CopyLimitOrderConfig({minTenor: 20 days, maxTenor: 40 days, minAPR: 0.05e18, maxAPR: 0.1e18, offsetAPR: 0}); + + CopyLimitOrderConfig memory borrowOfferConfig = CopyLimitOrderConfig({ + minTenor: 10 days, + maxTenor: 20 days, + minAPR: 0.02e18, + maxAPR: 0.05e18, + offsetAPR: -0.01e18 + }); + + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, loanOfferConfig, borrowOfferConfig); + + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(alice, collectionId).minTenor, + loanOfferConfig.minTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(alice, collectionId).maxTenor, + loanOfferConfig.maxTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(alice, collectionId).minAPR, + loanOfferConfig.minAPR ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(alice, collectionId).maxAPR, + loanOfferConfig.maxAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(alice, collectionId).offsetAPR, + loanOfferConfig.offsetAPR + ); + + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(alice, collectionId).minTenor, + borrowOfferConfig.minTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(alice, collectionId).maxTenor, + borrowOfferConfig.maxTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(alice, collectionId).minAPR, + borrowOfferConfig.minAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(alice, collectionId).maxAPR, + borrowOfferConfig.maxAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(alice, collectionId) + .offsetAPR, + borrowOfferConfig.offsetAPR + ); + } + + function _upgradeToV1_8_1() internal { + ProposeSafeTxUpgradeToV1_8_1Script proposeSafeTxUpgradeToV1_8_1Script = new ProposeSafeTxUpgradeToV1_8_1Script(); + + (address[] memory targets, bytes[] memory datas) = proposeSafeTxUpgradeToV1_8_1Script.getUpgradeToV1_8_1Data(); + for (uint256 i = 0; i < targets.length; i++) { + vm.prank(owner); + Address.functionCall(targets[i], datas[i]); + } } } diff --git a/test/fork/v1.8/ForkVaults.t.sol b/test/fork/v1.8/ForkVaults.t.sol index 6cfe6e08..6ae9776b 100644 --- a/test/fork/v1.8/ForkVaults.t.sol +++ b/test/fork/v1.8/ForkVaults.t.sol @@ -16,8 +16,6 @@ import {IERC4626Morpho} from "@test/fork/v1.8/interfaces/IERC4626Morpho.sol"; import {Errors} from "@src/market/libraries/Errors.sol"; -import {ProposeSafeTxUpgradeToV1_8Script} from "@script/ProposeSafeTxUpgradeToV1_8.s.sol"; - import {SizeFactory} from "@src/factory/SizeFactory.sol"; import {Size} from "@src/market/Size.sol"; import {ISize} from "@src/market/interfaces/ISize.sol"; @@ -31,8 +29,8 @@ contract ForkVaultsTest is ForkTest, Networks { function setUp() public override(ForkTest) { vm.createSelectFork("mainnet"); - // 2025-04-28 14h30 UTC - vm.rollFork(22368140); + // 2025-10-21 13h00 UTC + vm.rollFork(23626090); sizeFactory = importSizeFactory("mainnet-size-factory"); size = SizeMock(address(sizeFactory.getMarket(0))); @@ -41,24 +39,9 @@ contract ForkVaultsTest is ForkTest, Networks { variablePool = size.data().variablePool; owner = Networks.contracts[block.chainid][Contract.SIZE_GOVERNANCE]; - _upgradeToV1_8(); - _labels(); } - function _upgradeToV1_8() internal { - ProposeSafeTxUpgradeToV1_8Script script = new ProposeSafeTxUpgradeToV1_8Script(); - - (address[] memory targets, bytes[] memory datas) = - script.getTargetsAndDatas(sizeFactory, new address[](0), address(0), address(0), new ISize[](0)); - - for (uint256 i = 0; i < targets.length; i++) { - vm.prank(owner); - (bool success,) = targets[i].call(datas[i]); - assertTrue(success); - } - } - function testFork_ForkVaults_aave() public { NonTransferrableRebasingTokenVault borrowTokenVault = size.data().borrowTokenVault; @@ -70,11 +53,13 @@ contract ForkVaultsTest is ForkTest, Networks { uint256 usdcBalanceAfter = usdc.balanceOf(address(aToken)); assertEq(usdcBalanceAfter, usdcBalanceBefore + 100e6); - assertEq(borrowTokenVault.balanceOf(alice), 100e6); + assertEq( + borrowTokenVault.balanceOf(alice), 100e6 - 1, "Depending on rounding, the deposit balance may be 1 wei less" + ); _withdraw(alice, usdc, type(uint256).max); - assertEq(usdc.balanceOf(alice), 100e6); + assertEq(usdc.balanceOf(alice), 100e6 - 1, "Depending on rounding, the withdrawn balance may be 1 wei less"); } function testForkFuzz_ForkVaults_aave_deposit_withdraw(uint256 amount) public { diff --git a/test/local/actions/v1.7/Authorization.ManageCollectionSubscriptions.t.sol b/test/local/actions/v1.7/Authorization.ManageCollectionSubscriptions.t.sol index e40380b8..9e6469f7 100644 --- a/test/local/actions/v1.7/Authorization.ManageCollectionSubscriptions.t.sol +++ b/test/local/actions/v1.7/Authorization.ManageCollectionSubscriptions.t.sol @@ -5,6 +5,7 @@ import {IAToken} from "@aave/interfaces/IAToken.sol"; import {UserView} from "@src/market/SizeView.sol"; import {ISize} from "@src/market/interfaces/ISize.sol"; import {Errors} from "@src/market/libraries/Errors.sol"; +import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; import {Action, Authorization} from "@src/factory/libraries/Authorization.sol"; import {BaseTest} from "@test/BaseTest.sol"; @@ -54,4 +55,61 @@ contract AuthorizationManageCollectionSubscriptionsTest is BaseTest { vm.prank(alice); sizeFactory.unsubscribeFromCollectionsOnBehalfOf(collectionIds, bob); } + + function test_AuthorizationManageCollectionSubscriptions_setUserCollectionCopyLimitOrderConfigsOnBehalfOf() + public + { + _setAuthorization(alice, candy, Authorization.getActionsBitmap(Action.MANAGE_COLLECTION_SUBSCRIPTIONS)); + + CopyLimitOrderConfig memory copyLoanOfferConfig = CopyLimitOrderConfig({ + minTenor: 30 days, + maxTenor: 90 days, + minAPR: 0.05e18, // 5% + maxAPR: 0.15e18, // 15% + offsetAPR: 0.01e18 // 1% offset + }); + + CopyLimitOrderConfig memory copyBorrowOfferConfig = CopyLimitOrderConfig({ + minTenor: 60 days, + maxTenor: 120 days, + minAPR: 0.08e18, // 8% + maxAPR: 0.2e18, // 20% + offsetAPR: -0.02e18 // -2% offset + }); + + // Should not revert when authorized + vm.prank(candy); + sizeFactory.setUserCollectionCopyLimitOrderConfigsOnBehalfOf( + collectionId, copyLoanOfferConfig, copyBorrowOfferConfig, alice + ); + } + + function test_AuthorizationManageCollectionSubscriptions_setUserCollectionCopyLimitOrderConfigsOnBehalfOf_validation( + ) public { + CopyLimitOrderConfig memory copyLoanOfferConfig = CopyLimitOrderConfig({ + minTenor: 30 days, + maxTenor: 90 days, + minAPR: 0.05e18, + maxAPR: 0.15e18, + offsetAPR: 0.01e18 + }); + + CopyLimitOrderConfig memory copyBorrowOfferConfig = CopyLimitOrderConfig({ + minTenor: 60 days, + maxTenor: 120 days, + minAPR: 0.08e18, + maxAPR: 0.2e18, + offsetAPR: -0.02e18 + }); + + vm.expectRevert( + abi.encodeWithSelector( + Errors.UNAUTHORIZED_ACTION.selector, alice, bob, Action.MANAGE_COLLECTION_SUBSCRIPTIONS + ) + ); + vm.prank(alice); + sizeFactory.setUserCollectionCopyLimitOrderConfigsOnBehalfOf( + collectionId, copyLoanOfferConfig, copyBorrowOfferConfig, bob + ); + } } diff --git a/test/local/token/NonTransferrableRebasingTokenVault.t.sol b/test/local/token/NonTransferrableRebasingTokenVault.t.sol index f1f71866..fec40a0e 100644 --- a/test/local/token/NonTransferrableRebasingTokenVault.t.sol +++ b/test/local/token/NonTransferrableRebasingTokenVault.t.sol @@ -626,4 +626,34 @@ contract NonTransferrableRebasingTokenVaultTest is BaseTest { vm.expectRevert(); token.reinitialize("name", "symbol", AaveAdapter(address(0)), ERC4626Adapter(address(0))); } + + function test_NonTransferrableRebasingTokenVault_requestAaveWithdraw_onlyAdapterId() public { + // Test that requestAaveWithdraw reverts when called by non-Aave adapter (not in adapter map) + vm.expectRevert(abi.encodeWithSelector(EnumerableMap.EnumerableMapNonexistentKey.selector, alice)); + vm.prank(alice); + token.requestAaveWithdraw(100e6, alice); + + // Create and set an ERC4626 adapter + ERC4626Adapter erc4626Adapter = new ERC4626Adapter(token); + vm.prank(owner); + token.setAdapter(ERC4626_ADAPTER_ID, erc4626Adapter); + + // Test that ERC4626 adapter cannot call requestAaveWithdraw (wrong adapter ID) + vm.expectRevert(abi.encodeWithSelector(Errors.UNAUTHORIZED.selector, address(erc4626Adapter))); + vm.prank(address(erc4626Adapter)); + token.requestAaveWithdraw(100e6, alice); + + // Verify that the Aave adapter CAN call requestAaveWithdraw (positive test) + deal(address(underlying), address(size), 100e6); + vm.prank(address(size)); + underlying.approve(address(token), 100e6); + vm.prank(address(size)); + token.deposit(alice, 100e6); + + IAdapter aaveAdapter = token.getWhitelistedVaultAdapter(DEFAULT_VAULT); + + // This should succeed since it's the Aave adapter + vm.prank(address(aaveAdapter)); + token.requestAaveWithdraw(50e6, alice); + } } diff --git a/test/local/v1.8/Collections.t.sol b/test/local/v1.8/Collections.t.sol index 280f2aab..aaa960e1 100644 --- a/test/local/v1.8/Collections.t.sol +++ b/test/local/v1.8/Collections.t.sol @@ -752,30 +752,515 @@ contract CollectionsTest is BaseTest { assertEq(collectionsManager.isCopyingCollectionMarketRateProvider(alice, collectionId + 1, size1, bob), false); assertEq(collectionsManager.isCopyingCollectionMarketRateProvider(alice, collectionId, size2, bob), false); assertEq(collectionsManager.isCopyingCollectionMarketRateProvider(alice, collectionId, size1, bob), true); + } + + function test_Collections_subscribeToCollections_can_leave_inverted_curves_O_n_m_check() public {} + + // ============ v1.8.1 Tests: Per-Collection Config ============ + + function test_Collections_setUserCollectionCopyLimitOrderConfigs_basic() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + _buyCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(60 days, 0.08e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Verify default full copy after subscription + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 60 days), 0.08e18); + + // Update per-collection config with restricted tenor + CopyLimitOrderConfig memory restrictedLoanConfig = CopyLimitOrderConfig({ + minTenor: 50 days, + maxTenor: 70 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, restrictedLoanConfig, fullCopy); + + // Should still work for borrow offer + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + + // Should work for loan offer within bounds + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 60 days), 0.08e18); + + // Should revert for loan offer outside bounds + vm.expectRevert( + abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 30 days, 50 days, 70 days) + ); + size.getLoanOfferAPR(alice, collectionId, bob, 30 days); + } + + function test_Collections_perMarket_precedence_over_perCollection() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + _buyCreditLimit( + bob, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(30 days), uint256(0.08e18), uint256(90 days), uint256(0.1e18)) + ); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); - vm.expectRevert(abi.encodeWithSelector(CollectionsManagerBase.InvalidCollectionId.selector, collectionId + 1)); - collectionsManager.getCollectionMarketCopyLoanOfferConfig(collectionId + 1, size1); + // Set per-collection config with restricted tenor + CopyLimitOrderConfig memory collectionConfig = CopyLimitOrderConfig({ + minTenor: 50 days, + maxTenor: 70 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _subscribeToCollection(alice, collectionId); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, collectionConfig, fullCopy); + // Verify per-collection config is active (should fail because 30 days < 50 days minTenor) vm.expectRevert( - abi.encodeWithSelector(CollectionsManagerBase.MarketNotInCollection.selector, collectionId, size2) + abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 30 days, 50 days, 70 days) ); - collectionsManager.getCollectionMarketCopyLoanOfferConfig(collectionId, size2); + size.getLoanOfferAPR(alice, collectionId, bob, 30 days); + + // Set per-market config with different tenor + CopyLimitOrderConfig memory marketConfig = CopyLimitOrderConfig({ + minTenor: 20 days, + maxTenor: 80 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _setCopyLimitOrderConfigs(alice, marketConfig, fullCopy); - CopyLimitOrderConfig memory config = - collectionsManager.getCollectionMarketCopyLoanOfferConfig(collectionId, size1); - assertEq(config.minTenor, 0); - assertEq(config.maxTenor, type(uint256).max); - assertEq(config.minAPR, 0); - assertEq(config.maxAPR, type(uint256).max); - assertEq(config.offsetAPR, 0); + // Per-market should take precedence - 30 days is now valid + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 30 days), 0.08e18); - config = collectionsManager.getCollectionMarketCopyBorrowOfferConfig(collectionId, size1); - assertEq(config.minTenor, 0); - assertEq(config.maxTenor, type(uint256).max); - assertEq(config.minAPR, 0); - assertEq(config.maxAPR, type(uint256).max); - assertEq(config.offsetAPR, 0); + // 90 days is outside per-market bounds (20-80 days) so should revert + vm.expectRevert( + abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 90 days, 20 days, 80 days) + ); + size.getLoanOfferAPR(alice, collectionId, bob, 90 days); } - function test_Collections_subscribeToCollections_can_leave_inverted_curves_O_n_m_check() public {} + function test_Collections_perCollection_config_with_offset() public { + _buyCreditLimit( + bob, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(30 days), uint256(0.05e18), uint256(60 days), uint256(0.08e18)) + ); + _sellCreditLimit( + bob, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(30 days), uint256(0.07e18), uint256(60 days), uint256(0.18e18)) + ); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Set per-collection config with offset + CopyLimitOrderConfig memory loanConfigWithOffset = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0.02e18 + }); + CopyLimitOrderConfig memory borrowConfigWithOffset = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: -0.01e18 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, loanConfigWithOffset, borrowConfigWithOffset); + + // Verify offset is applied + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 30 days), 0.07e18); // 0.05 + 0.02 + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.06e18); // 0.07 - 0.01 + } + + function test_Collections_perCollection_config_with_minMaxAPR() public { + _buyCreditLimit( + bob, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(30 days), uint256(0.02e18), uint256(60 days), uint256(0.15e18)) + ); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Set per-collection config with min/max APR + CopyLimitOrderConfig memory loanConfig = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0.05e18, + maxAPR: 0.1e18, + offsetAPR: 0 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, loanConfig, noCopy); + + // APR below minAPR should be clamped + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); // clamped from 0.02 + + // APR above maxAPR should be clamped + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 60 days), 0.1e18); // clamped from 0.15 + } + + function test_Collections_multiple_collections_different_configs() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + _buyCreditLimit( + bob, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(20 days), uint256(0.07e18), uint256(40 days), uint256(0.08e18)) + ); + + _sellCreditLimit(candy, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.06e18)); + _buyCreditLimit( + candy, + block.timestamp + 365 days, + YieldCurveHelper.customCurve(uint256(50 days), uint256(0.085e18), uint256(90 days), uint256(0.09e18)) + ); + + // Create two collections with different rate providers + uint256 collectionId1 = _createCollection(james); + _addMarketToCollection(james, collectionId1, size); + _addRateProviderToCollectionMarket(james, collectionId1, size, bob); + + uint256 collectionId2 = _createCollection(james); + _addMarketToCollection(james, collectionId2, size); + _addRateProviderToCollectionMarket(james, collectionId2, size, candy); + + _subscribeToCollection(alice, collectionId1); + _subscribeToCollection(alice, collectionId2); + + // Set different configs for each collection + CopyLimitOrderConfig memory config1 = + CopyLimitOrderConfig({minTenor: 0, maxTenor: 40 days, minAPR: 0, maxAPR: type(uint256).max, offsetAPR: 0}); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId1, config1, fullCopy); + + CopyLimitOrderConfig memory config2 = CopyLimitOrderConfig({ + minTenor: 50 days, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId2, config2, fullCopy); + + // Collection 1 should work for 30 days + assertEq(size.getLoanOfferAPR(alice, collectionId1, bob, 30 days), 0.075e18); + + // Collection 1 should fail for 50 days (outside maxTenor of 40 days) + vm.expectRevert(abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 50 days, 0, 40 days)); + size.getLoanOfferAPR(alice, collectionId1, bob, 50 days); + + // Collection 2 should work for 60 days + // APR for 60 days: 0.085 + (0.09 - 0.085) * (60 - 50) / (90 - 50) = 0.085 + 0.00125 = 0.08625 + assertApproxEqAbs(size.getLoanOfferAPR(alice, collectionId2, candy, 60 days), 0.08625e18, 1e15); + + // Collection 2 should fail for 30 days (outside minTenor of 50 days) + vm.expectRevert( + abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 30 days, 50 days, type(uint256).max) + ); + size.getLoanOfferAPR(alice, collectionId2, candy, 30 days); + } + + function test_Collections_unsubscribe_clears_perCollection_config() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Set per-collection config + CopyLimitOrderConfig memory restrictedConfig = CopyLimitOrderConfig({ + minTenor: 20 days, + maxTenor: 40 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, restrictedConfig); + + // Verify config is active + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + + // Unsubscribe + _unsubscribeFromCollection(alice, collectionId); + + // Should revert since alice is no longer subscribed + vm.expectRevert( + abi.encodeWithSelector( + ICollectionsManagerView.InvalidCollectionMarketRateProvider.selector, + collectionId, + address(size), + address(bob) + ) + ); + size.getBorrowOfferAPR(alice, collectionId, bob, 30 days); + } + + function test_Collections_perCollection_config_market_order() public { + _deposit(alice, usdc, 1000e6); + _deposit(candy, weth, 100e18); + + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + _buyCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.08e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Set per-collection config with offset to keep spread + CopyLimitOrderConfig memory loanConfig = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0.01e18 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, loanConfig, fullCopy); + + // Verify APRs with collection config + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + assertEq(size.getLoanOfferAPR(alice, collectionId, bob, 30 days), 0.09e18); // 0.08 + 0.01 + + // Market order should succeed + vm.prank(candy); + size.sellCreditMarket( + SellCreditMarketParams({ + lender: alice, + creditPositionId: RESERVED_ID, + amount: 50e6, + tenor: 30 days, + maxAPR: type(uint256).max, + deadline: block.timestamp + 365 days, + exactAmountIn: false, + collectionId: collectionId, + rateProvider: bob + }) + ); + } + + function test_Collections_perCollection_config_cannot_set_for_invalid_collection() public { + uint256 invalidCollectionId = 999; + + vm.expectRevert( + abi.encodeWithSelector(CollectionsManagerBase.InvalidCollectionId.selector, invalidCollectionId) + ); + _setUserCollectionCopyLimitOrderConfigs(alice, invalidCollectionId, fullCopy, fullCopy); + } + + function test_Collections_perCollection_config_only_borrow_offer() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + _buyCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(60 days, 0.08e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Set per-collection config with only borrow offer + CopyLimitOrderConfig memory borrowConfig = CopyLimitOrderConfig({ + minTenor: 20 days, + maxTenor: 40 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, borrowConfig); + + // Borrow offer should work within bounds + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + + // Borrow offer should fail outside bounds + vm.expectRevert( + abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 50 days, 20 days, 40 days) + ); + size.getBorrowOfferAPR(alice, collectionId, bob, 50 days); + + // Loan offer should fail since it's set to noCopy + vm.expectRevert(abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 60 days, 0, 0)); + size.getLoanOfferAPR(alice, collectionId, bob, 60 days); + } + + function test_Collections_perCollection_update_config_multiple_times() public { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // First config + CopyLimitOrderConfig memory config1 = + CopyLimitOrderConfig({minTenor: 0, maxTenor: 40 days, minAPR: 0, maxAPR: type(uint256).max, offsetAPR: 0}); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, config1); + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.05e18); + + // Update to second config + CopyLimitOrderConfig memory config2 = CopyLimitOrderConfig({ + minTenor: 20 days, + maxTenor: 50 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0.01e18 + }); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, config2); + assertEq(size.getBorrowOfferAPR(alice, collectionId, bob, 30 days), 0.06e18); // 0.05 + 0.01 + + // Update to third config (null) + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, nullCopy); + vm.expectRevert(abi.encodeWithSelector(ICollectionsManagerView.InvalidTenor.selector, 30 days, 0, 0)); + size.getBorrowOfferAPR(alice, collectionId, bob, 30 days); + } + + // ============ addMarketsToCollection revert tests ============ + + function test_Collections_addMarketsToCollection_invalid_market() public { + uint256 collectionId = _createCollection(james); + + // Create a fake market address that is not registered in the factory + ISize invalidMarket = ISize(address(0x999999)); + + ISize[] memory markets = new ISize[](1); + markets[0] = invalidMarket; + + vm.prank(james); + vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_MARKET.selector, address(invalidMarket))); + collectionsManager.addMarketsToCollection(collectionId, markets); + + // Verify the market was not added to the collection + assertEq(collectionsManager.collectionContainsMarket(collectionId, invalidMarket), false); + } + + function test_Collections_addMarketsToCollection_paused_market() public { + uint256 collectionId = _createCollection(james); + + // Pause the size market (owner is address(this) from BaseTest.setUp) + size.pause(); + + // Verify the market is paused + assertTrue(size.paused()); + + ISize[] memory markets = new ISize[](1); + markets[0] = size; + + vm.prank(james); + vm.expectRevert(abi.encodeWithSelector(Errors.PAUSED_MARKET.selector, address(size))); + collectionsManager.addMarketsToCollection(collectionId, markets); + + // Verify the market was not added to the collection + assertEq(collectionsManager.collectionContainsMarket(collectionId, size), false); + } + + // ============ onlySizeFactory revert tests ============ + + function test_Collections_subscribeUserToCollections_onlySizeFactory_revert() public { + uint256 collectionId = _createCollection(james); + uint256[] memory collectionIds = new uint256[](1); + collectionIds[0] = collectionId; + + // Try to call subscribeUserToCollections directly on collectionsManager (not through sizeFactory) + vm.expectRevert(abi.encodeWithSelector(CollectionsManagerBase.OnlySizeFactory.selector, alice)); + vm.prank(alice); + collectionsManager.subscribeUserToCollections(alice, collectionIds); + } + + function test_Collections_unsubscribeUserFromCollections_onlySizeFactory_revert() public { + uint256 collectionId = _createCollection(james); + + // First subscribe through the proper channel (sizeFactory) + _subscribeToCollection(alice, collectionId); + + uint256[] memory collectionIds = new uint256[](1); + collectionIds[0] = collectionId; + + // Try to call unsubscribeUserFromCollections directly on collectionsManager (not through sizeFactory) + vm.expectRevert(abi.encodeWithSelector(CollectionsManagerBase.OnlySizeFactory.selector, alice)); + vm.prank(alice); + collectionsManager.unsubscribeUserFromCollections(alice, collectionIds); + } + + function test_Collections_setUserCollectionCopyLimitOrderConfigs_onlySizeFactory_revert() public { + uint256 collectionId = _createCollection(james); + + // First subscribe through the proper channel (sizeFactory) + _subscribeToCollection(alice, collectionId); + + CopyLimitOrderConfig memory config = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + + // Try to call setUserCollectionCopyLimitOrderConfigs directly on collectionsManager (not through sizeFactory) + vm.expectRevert(abi.encodeWithSelector(CollectionsManagerBase.OnlySizeFactory.selector, alice)); + vm.prank(alice); + collectionsManager.setUserCollectionCopyLimitOrderConfigs(alice, collectionId, config, config); + } + + // ============ Validation Tests ============ + + function test_Collections_setUserCollectionCopyLimitOrderConfigs_validation_minTenor_greater_than_maxTenor() + public + { + _sellCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.05e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Create invalid config where minTenor > maxTenor + CopyLimitOrderConfig memory invalidBorrowConfig = CopyLimitOrderConfig({ + minTenor: 60 days, // minTenor > maxTenor + maxTenor: 30 days, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + + vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_TENOR_RANGE.selector, 60 days, 30 days)); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, noCopy, invalidBorrowConfig); + } + + function test_Collections_setUserCollectionCopyLimitOrderConfigs_validation_minAPR_greater_than_maxAPR() public { + _buyCreditLimit(bob, block.timestamp + 365 days, YieldCurveHelper.pointCurve(30 days, 0.08e18)); + + uint256 collectionId = _createCollection(james); + _addMarketToCollection(james, collectionId, size); + _addRateProviderToCollectionMarket(james, collectionId, size, bob); + + _subscribeToCollection(alice, collectionId); + + // Create invalid config where minAPR > maxAPR + CopyLimitOrderConfig memory invalidLoanConfig = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0.2e18, // minAPR > maxAPR + maxAPR: 0.1e18, + offsetAPR: 0 + }); + + vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_APR_RANGE.selector, 0.2e18, 0.1e18)); + _setUserCollectionCopyLimitOrderConfigs(alice, collectionId, invalidLoanConfig, noCopy); + } } diff --git a/test/local/v1.8/CollectionsManagerCuratorActions.t.sol b/test/local/v1.8/CollectionsManagerCuratorActions.t.sol index 6f6e203c..900b45b9 100644 --- a/test/local/v1.8/CollectionsManagerCuratorActions.t.sol +++ b/test/local/v1.8/CollectionsManagerCuratorActions.t.sol @@ -58,110 +58,6 @@ contract CollectionsManagerCuratorActionsTest is BaseTest { assertEq(collectionsManager.collectionContainsMarket(type(uint256).max, size), false); } - function test_CollectionsManagerCuratorActions_addMarketsToCollection_input_validation() public { - uint256 collectionId = _createCollection(alice); - - CopyLimitOrderConfig[] memory copyLoanOfferConfigs = new CopyLimitOrderConfig[](1); - copyLoanOfferConfigs[0] = CopyLimitOrderConfig({ - minTenor: 0, - maxTenor: type(uint256).max, - minAPR: 0, - maxAPR: type(uint256).max, - offsetAPR: 0 - }); - CopyLimitOrderConfig[] memory copyBorrowOfferConfigs = new CopyLimitOrderConfig[](1); - copyBorrowOfferConfigs[0] = CopyLimitOrderConfig({ - minTenor: 0, - maxTenor: type(uint256).max, - minAPR: 0, - maxAPR: type(uint256).max, - offsetAPR: 0 - }); - ISize[] memory markets = new ISize[](2); - markets[0] = size; - - vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(Errors.ARRAY_LENGTHS_MISMATCH.selector)); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - markets = new ISize[](1); - markets[0] = ISize(address(0)); - - vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_MARKET.selector, address(0))); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - markets[0] = size; - - copyLoanOfferConfigs[0].minTenor = 4; - copyLoanOfferConfigs[0].maxTenor = 3; - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_TENOR_RANGE.selector, 4, 3)); - vm.prank(alice); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - copyLoanOfferConfigs[0].minTenor = 0; - copyLoanOfferConfigs[0].maxTenor = type(uint256).max; - copyLoanOfferConfigs[0].minAPR = 7; - copyLoanOfferConfigs[0].maxAPR = 5; - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_APR_RANGE.selector, 7, 5)); - vm.prank(alice); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - copyLoanOfferConfigs[0].minAPR = 0; - copyLoanOfferConfigs[0].maxAPR = type(uint256).max; - copyBorrowOfferConfigs[0].minTenor = 4; - copyBorrowOfferConfigs[0].maxTenor = 3; - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_TENOR_RANGE.selector, 4, 3)); - vm.prank(alice); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - copyBorrowOfferConfigs[0].minTenor = 0; - copyBorrowOfferConfigs[0].maxTenor = type(uint256).max; - copyBorrowOfferConfigs[0].minAPR = 7; - copyBorrowOfferConfigs[0].maxAPR = 5; - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_APR_RANGE.selector, 7, 5)); - vm.prank(alice); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - - copyBorrowOfferConfigs[0].minTenor = 15 days; - copyBorrowOfferConfigs[0].maxTenor = 45 days; - copyBorrowOfferConfigs[0].minAPR = 0.06e18; - copyBorrowOfferConfigs[0].maxAPR = 0.08e18; - copyLoanOfferConfigs[0].minTenor = 10 days; - copyLoanOfferConfigs[0].maxTenor = 30 days; - copyLoanOfferConfigs[0].minAPR = 0.03e18; - copyLoanOfferConfigs[0].maxAPR = 0.05e18; - vm.expectRevert( - abi.encodeWithSelector( - Errors.INVALID_OFFER_CONFIGS.selector, - 15 days, - 45 days, - 0.06e18, - 0.08e18, - 10 days, - 30 days, - 0.03e18, - 0.05e18 - ) - ); - vm.prank(alice); - collectionsManager.setCollectionMarketConfigs( - collectionId, markets, copyLoanOfferConfigs, copyBorrowOfferConfigs - ); - } - function test_CollectionsManagerCuratorActions_addMarketsToCollection_curator() public { uint256 collectionId = _createCollection(alice); diff --git a/test/local/v1.8/CollectionsManagerUserActions.t.sol b/test/local/v1.8/CollectionsManagerUserActions.t.sol index 45d5cffa..7ad9df68 100644 --- a/test/local/v1.8/CollectionsManagerUserActions.t.sol +++ b/test/local/v1.8/CollectionsManagerUserActions.t.sol @@ -2,6 +2,8 @@ pragma solidity 0.8.23; import {CollectionsManagerBase} from "@src/collections/CollectionsManagerBase.sol"; + +import {CopyLimitOrderConfig} from "@src/market/libraries/OfferLibrary.sol"; import {BaseTest} from "@test/BaseTest.sol"; contract CollectionsManagerUserActionsTest is BaseTest { @@ -11,6 +13,55 @@ contract CollectionsManagerUserActionsTest is BaseTest { _subscribeToCollection(bob, collectionId); assertEq(sizeFactory.collectionsManager().isSubscribedToCollection(bob, collectionId), true); + + CopyLimitOrderConfig memory expectedConfig = CopyLimitOrderConfig({ + minTenor: 0, + maxTenor: type(uint256).max, + minAPR: 0, + maxAPR: type(uint256).max, + offsetAPR: 0 + }); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(bob, collectionId).minTenor, + expectedConfig.minTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(bob, collectionId).maxTenor, + expectedConfig.maxTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(bob, collectionId).minAPR, + expectedConfig.minAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(bob, collectionId).maxAPR, + expectedConfig.maxAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyLoanOfferConfig(bob, collectionId).offsetAPR, + expectedConfig.offsetAPR + ); + + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(bob, collectionId).minTenor, + expectedConfig.minTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(bob, collectionId).maxTenor, + expectedConfig.maxTenor + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(bob, collectionId).minAPR, + expectedConfig.minAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(bob, collectionId).maxAPR, + expectedConfig.maxAPR + ); + assertEq( + sizeFactory.collectionsManager().getUserDefinedCollectionCopyBorrowOfferConfig(bob, collectionId).offsetAPR, + expectedConfig.offsetAPR + ); } function test_CollectionsManagerUserActions_subscribeToCollection_invalid() public { @@ -61,6 +112,6 @@ contract CollectionsManagerUserActionsTest is BaseTest { vm.expectRevert(abi.encodeWithSelector(CollectionsManagerBase.OnlySizeFactory.selector, bob)); vm.prank(bob); - collectionsManager.subscribeUserToCollections(alice, collectionIds); + collectionsManager.subscribeUserToCollections(bob, collectionIds); } } diff --git a/test/local/v1.8/SizeFactoryReinitializeV1_8.t.sol b/test/local/v1.8/SizeFactoryReinitializeV1_8.t.sol deleted file mode 100644 index 80df85b8..00000000 --- a/test/local/v1.8/SizeFactoryReinitializeV1_8.t.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.23; - -import {ERC721EnumerableUpgradeable} from - "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; - -import {ICollectionsManager} from "@src/collections/interfaces/ICollectionsManager.sol"; -import {Action} from "@src/factory/libraries/Authorization.sol"; -import {YieldCurveHelper} from "@test/helpers/libraries/YieldCurveHelper.sol"; - -import {ISize} from "@src/market/interfaces/ISize.sol"; -import {Errors} from "@src/market/libraries/Errors.sol"; -import {BaseTest} from "@test/BaseTest.sol"; - -contract SizeFactoryReinitializeV1_8Test is BaseTest { - bytes32 internal COLLECTIONS_MANAGER_SLOT = bytes32(uint256(7)); - - function setUp() public override { - super.setUp(); - _deploySizeMarket2(); - vm.store(address(sizeFactory), COLLECTIONS_MANAGER_SLOT, bytes32(uint256(uint160(address(0))))); - } - - function test_SizeFactoryReinitializeV1_8_input_validation() public { - vm.expectRevert(abi.encodeWithSelector(Errors.NULL_ADDRESS.selector)); - sizeFactory.reinitialize( - ICollectionsManager(address(0)), new address[](0), address(0), address(0), new ISize[](0) - ); - - address[] memory users = new address[](1); - users[0] = alice; - - ISize[] memory invalidCollectionMarkets = new ISize[](1); - invalidCollectionMarkets[0] = ISize(address(this)); - - vm.expectRevert(abi.encodeWithSelector(Errors.INVALID_MARKET.selector, address(this))); - sizeFactory.reinitialize(collectionsManager, users, candy, bob, invalidCollectionMarkets); - } - - function test_SizeFactoryReinitializeV1_8_simple() public { - sizeFactory.reinitialize(collectionsManager, new address[](0), address(0), address(0), new ISize[](0)); - - assertEq(address(sizeFactory.collectionsManager()), address(collectionsManager)); - } - - function test_SizeFactoryReinitializeV1_8_full() public { - _buyCreditLimit(james, block.timestamp + 365 days, YieldCurveHelper.pointCurve(365 days, 0.03e18)); - address[] memory users = new address[](3); - users[0] = alice; - users[1] = bob; - users[2] = candy; - address curator = liquidator; - address rateProvider = james; - ISize[] memory collectionMarkets = new ISize[](1); - collectionMarkets[0] = size1; - - sizeFactory.reinitialize(collectionsManager, users, curator, rateProvider, collectionMarkets); - - uint256 collectionId = 0; - - assertEq(address(sizeFactory.collectionsManager()), address(collectionsManager)); - assertEq(ERC721EnumerableUpgradeable(address(collectionsManager)).ownerOf(collectionId), curator); - - for (uint256 i = 0; i < users.length; i++) { - assertEq(collectionsManager.getSubscribedCollections(users[i]).length, 1); - assertEq(size.getLoanOfferAPR(users[i], collectionId, rateProvider, 365 days), 0.03e18); - - assertEq(sizeFactory.isAuthorized(address(sizeFactory), users[i], Action.BUY_CREDIT_LIMIT), false); - assertEq(sizeFactory.isAuthorized(address(sizeFactory), users[i], Action.SELL_CREDIT_LIMIT), false); - } - } -}