diff --git a/.env.example b/.env.example index b7bdb7b..1d44fee 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,16 @@ -# Base Sepolia RPC URL -RPC_URL=https://sepolia.base.org - # Your deployment wallet's private key (generate with `npm run generate-wallet`) # Example format: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef PRIVATE_KEY= +# Basescan API Key for contract verification +# Get one from https://basescan.org/apis +BASESCAN_API_KEY= + +# RPC URL +# Base Sepolia: https://sepolia.base.org +# Base Mainnet: https://mainnet.base.org +RPC_URL=https://sepolia.base.org + # Fixed Price Sale Strategy address for initialization # Base Sepolia: 0xd34872BE0cdb6b09d45FCa067B07f04a1A9aE1aE # Base Mainnet: 0x04E2516A2c207E84a1839755675dfd8eF6302F0a @@ -12,12 +18,19 @@ FIXED_PRICE_SALE_STRATEGY= # IPFS URI for the token metadata # Example format: ipfs://Qm... -TOKEN_URI=ipfs:// +TOKEN_URI=ar://o3ni6dHT2v1fda8610XgjXx-3jGuBb4b--0pfbOxrmw -# Basescan API Key for contract verification -# Get one from https://basescan.org/apis -BASESCAN_API_KEY= +# Doppler Coins ENV variables +# Base Sepolia: 0xd34872BE0cdb6b09d45FCa067B07f04a1A9aE1aE +# Base Mainnet: 0x6ff5693b99212da76ad316178a184ab56d299b43 +DOPPLER_UNIVERSAL_ROUTER= # Upgrade Script ENV variables + +# Base Sepolia: 0xB3dd782FCe60BCFBBEF1eaD56eF3a24a9c330A38 +# Base Mainnet: ??? CREDITS_PROXY_ADDRESS= + +# Base Sepolia: 0x57c2cd477300e7ec80974b28fa55e34589627cb5 +# Base Mainnet: ??? CREDITS_PROXY_ADMIN= diff --git a/README.md b/README.md index ec0e66d..6c7317d 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ The COOP Credits Protocol implements a flexible and upgradeable ERC1155 token sy | Contract | Address | Transaction | | -------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -| Implementation | `0x019d5E4BcF1804265AFD084777a700B1aEdf47c9` | [View](https://sepolia.basescan.org/tx/0xac8a612f38c4793e560c497389d95bd21d112158fbbd3640454c51d3d7757eb9) | -| Proxy Admin | `0x0Eb9984B125D7e8fe10C7F8E64A0594009ae449a` | [View](https://sepolia.basescan.org/tx/0x297b6626141b18bacac6e7ea338372ad881ca071d79cd36b45c18dc92d79c2f3) | -| Proxy | `0x2d8CF3A448b75Bbc25cEC322be1224A9f8584115` | [View](https://sepolia.basescan.org/tx/0xb0f75db8cfcf2c490e6d82103f5baa4455e454a43eb45577a627d66813cce656) | +| Implementation | `0xf079fF3347FfAEF71AD06953C229F9D5810fca28` | [View](https://sepolia.basescan.org/tx/0x9856a53ad430c54bbc703a875c96cd01f7961d1a8eefcc0d5e9a69cc7a4fd21c) | +| Proxy Admin | `0x57c2cd477300e7ec80974b28fa55e34589627cb5` | [View](https://sepolia.basescan.org/tx/0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2) | +| Proxy | `0xB3dd782FCe60BCFBBEF1eaD56eF3a24a9c330A38` | [View](https://sepolia.basescan.org/tx/0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2) | -> **Latest Update (2025-04-23)**: The contract implementation has been improved to fix an issue with global state handling in the `mintWithCredits` function. The function now maintains isolation between different calls, ensuring consistent behavior when interacting with multiple collectibles contracts. +> **Latest Update (Aug-18-2025)**: The contract implementation has been improved to add methods for purchasing coins with credits. It also fixes a bug in our Proxy upgrades allowing the Proxy to be upgraded via the `upgradeAndCall` method on the `ProxyAdmin` contract. ### Key Features @@ -108,17 +108,6 @@ To deploy the Credits Protocol to a network, you'll need to: 1. Configure your deployment environment in `.env` file: -```bash -# Required environment variables -RPC_URL= # The RPC URL of the target network (e.g., https://sepolia.base.org) -PRIVATE_KEY= # Your wallet's private key for deployment -TOKEN_URI= # The URI for the token metadata (e.g., ipfs://...) -BASESCAN_API_KEY= # API key for contract verification -FIXED_PRICE_SALE_STRATEGY= # Address of the fixed price sale strategy contract - # Base Sepolia: 0xd34872BE0cdb6b09d45FCa067B07f04a1A9aE1aE - # Base Mainnet: 0x04E2516A2c207E84a1839755675dfd8eF6302F0a -``` - 2. Run the deployment script: ```bash @@ -164,22 +153,32 @@ forge test --match-test test_BuyCredits Since the protocol uses the transparent proxy pattern, the implementation contract can be upgraded while preserving all state: -1. Deploy a new implementation contract: +### Using the Upgrade Script (Recommended) + +The easiest way to upgrade the contract is using the provided upgrade script: + +1. Configure your upgrade environment in `.env` file: ```bash -forge create src/Credits1155.sol:Credits1155 --rpc-url $RPC_URL --private-key $PRIVATE_KEY +# Required for upgrades +CREDITS_PROXY_ADDRESS= +CREDITS_PROXY_ADMIN= + +# Optional: Set doppler universal router for the new implementation +DOPPLER_UNIVERSAL_ROUTER= ``` -2. Upgrade the proxy to point to the new implementation using the ProxyAdmin: +2. Run the upgrade script: ```bash -# Get the ProxyAdmin contract interface -cast call "getProxyAdmin(address)" --rpc-url $RPC_URL +# Using pnpm +pnpm run upgrade-credits -# Upgrade the proxy to the new implementation -cast send "upgrade(address,address)" --rpc-url $RPC_URL --private-key $PRIVATE_KEY +# Or directly with Foundry +forge clean && forge script script/Upgrade.s.sol:UpgradeCredits --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --verify --etherscan-api-key $BASESCAN_API_KEY -vvvv ``` -## License +The upgrade script will: -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. +- Deploy a new `Credits1155` implementation contract +- Use the ProxyAdmin's `upgradeAndCall` method to upgrade the proxy diff --git a/broadcast/Deploy.s.sol/84532/run-latest.json b/broadcast/Deploy.s.sol/84532/run-latest.json index 770d564..1ad2ba2 100644 --- a/broadcast/Deploy.s.sol/84532/run-latest.json +++ b/broadcast/Deploy.s.sol/84532/run-latest.json @@ -1,67 +1,47 @@ { "transactions": [ { - "hash": "0x0ec942eec9f902d267f6a0ed5d6c58b1c447fec08893bb0f7b1fca9743d4556c", + "hash": "0x396b891ad4ba8a3095f6e278a47dd5ed97d8aa277f676fe9bc27dd71a0182ef7", "transactionType": "CREATE", "contractName": "Credits1155", - "contractAddress": "0x1a9507b4404854b48164b209bfd0d4790b609762", + "contractAddress": "0x29c6f2022b97bf8503a64025dd4fafea5251756c", "function": null, "arguments": null, "transaction": { - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "gas": "0x2edd3a", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "gas": "0x5bead2", "value": "0x0", - "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61293c80620000e35f395ff3fe6080604052600436106101fe575f3560e01c80637eb802b911610113578063c5efaae81161009d578063e30c39781161006d578063e30c397814610624578063e985e9c514610638578063f242432a14610657578063f2fde38b14610676578063f5298aca14610695575f80fd5b8063c5efaae8146105b9578063c9f18ebd146105cc578063d1b53b9c146105eb578063d547741f14610605575f80fd5b8063a22cb465116100e3578063a22cb465146104ff578063a7fd40bf1461051e578063ad77bc401461053d578063b13bfa9114610551578063bd85b0391461056f575f80fd5b80637eb802b9146104825780638da5cb5b146104a157806391d14854146104cd578063a217fddf146104ec575f80fd5b806336568abe116101945780634f558e79116101645780634f558e79146103d05780636b20c4541461041c578063715018a61461043b57806379ba50971461044f5780637ab4339d14610463575f80fd5b806336568abe14610347578063401d4482146103665780634b844a1d146103855780634e1273f4146103a4575f80fd5b806318160ddd116101cf57806318160ddd146102b7578063248a9ca3146102ea5780632eb2c2d6146103095780632f2ff15d14610328575f80fd5b8062fdd58e1461020957806301ffc9a71461023b5780630e89341c1461026a578063116039ae14610296575f80fd5b3661020557005b5f80fd5b348015610214575f80fd5b50610228610223366004611ea2565b6106b4565b6040519081526020015b60405180910390f35b348015610246575f80fd5b5061025a610255366004611ee1565b6106e9565b6040519015158152602001610232565b348015610275575f80fd5b50610289610284366004611f03565b6106f3565b6040516102329190611f67565b3480156102a1575f80fd5b506102b56102b0366004611f79565b6107b5565b005b3480156102c2575f80fd5b507f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e280154610228565b3480156102f5575f80fd5b50610228610304366004611f03565b610a30565b348015610314575f80fd5b506102b5610323366004612141565b610a50565b348015610333575f80fd5b506102b56103423660046121e7565b610ab7565b348015610352575f80fd5b506102b56103613660046121e7565b610ad9565b348015610371575f80fd5b506102b5610380366004611ea2565b610b11565b348015610390575f80fd5b5061022861039f366004611f03565b610bc8565b3480156103af575f80fd5b506103c36103be366004612215565b610bda565b604051610232919061230a565b3480156103db575f80fd5b5061025a6103ea366004611f03565b5f9081527f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e28006020526040902054151590565b348015610427575f80fd5b506102b561043636600461231c565b610ca4565b348015610446575f80fd5b506102b5610d03565b34801561045a575f80fd5b506102b5610d16565b34801561046e575f80fd5b506102b561047d36600461238c565b610d5e565b34801561048d575f80fd5b506102b561049c3660046123cf565b610e8a565b3480156104ac575f80fd5b506104b5610ee0565b6040516001600160a01b039091168152602001610232565b3480156104d8575f80fd5b5061025a6104e73660046121e7565b610f14565b3480156104f7575f80fd5b506102285f81565b34801561050a575f80fd5b506102b56105193660046123ea565b610f4a565b348015610529575f80fd5b506102b561053836600461241a565b610f59565b348015610548575f80fd5b50610228600181565b34801561055c575f80fd5b505f546104b5906001600160a01b031681565b34801561057a575f80fd5b50610228610589366004611f03565b5f9081527f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e2800602052604090205490565b6102b56105c7366004611ea2565b610f6c565b3480156105d7575f80fd5b506102b56105e6366004611f03565b610fda565b3480156105f6575f80fd5b5061022866016bcc41e9000081565b348015610610575f80fd5b506102b561061f3660046121e7565b611061565b34801561062f575f80fd5b506104b561107d565b348015610643575f80fd5b5061025a610652366004612453565b6110a5565b348015610662575f80fd5b506102b561067136600461247f565b6110f1565b348015610681575f80fd5b506102b56106903660046123cf565b611150565b3480156106a0575f80fd5b506102b56106af3660046124e2565b6111d5565b5f8181525f805160206128c7833981519152602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6106e38261120b565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450280546060915f805160206128c78339815191529161073190612514565b80601f016020809104026020016040519081016040528092919081815260200182805461075d90612514565b80156107a85780601f1061077f576101008083540402835291602001916107a8565b820191905f5260205f20905b81548152906001019060200180831161078b57829003601f168201915b5050505050915050919050565b846001600160a01b03163b5f036107df57604051633e07d28560e11b815260040160405180910390fd5b8460018410156108025760405163ea54cbb360e01b815260040160405180910390fd5b60405163463d31d760e11b8152600481018690525f906001600160a01b03831690638c7a63ae906024015f60405180830381865afa158015610846573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261086d919081019061254c565b8051519091505f0361089a5760405163282dcfa760e11b8152600481018790526024015b60405180910390fd5b5f6108a63360016106b4565b9050808611156108d35760405163cffb3e6960e01b81526004810187905260248101829052604401610891565b6108df3360018861124a565b5f6108e987610bc8565b6040805160018082528183019092529192505f91906020808301908036833701905050905085815f81518110610921576109216125fe565b6001600160a01b039092166020928302919091018201526040515f91610958918a91016001600160a01b0391909116815260200190565b60408051601f19818403018152908290525f54631acf898160e11b83529092506001600160a01b038089169263359f13029287926109a3929116908f908f9089908990600401612612565b5f604051808303818588803b1580156109ba575f80fd5b505af11580156109cc573d5f803e3d5ffd5b5050604080518d8152602081018e90529081018790526001600160a01b03808c1694508c1692508d91507f0be475f768b363c261073a92dfdacd93dc1e02f74c673c04add7611e10a139929060600160405180910390a45050505050505050505050565b5f9081525f805160206128e7833981519152602052604090206001015490565b336001600160a01b0386168114801590610a715750610a6f86826110a5565b155b15610aa25760405163711bec9160e11b81526001600160a01b03808316600483015287166024820152604401610891565b610aaf86868686866112b7565b505050505050565b610ac082610a30565b610ac981611315565b610ad3838361131f565b50505050565b6001600160a01b0381163314610b025760405163334bd91960e11b815260040160405180910390fd5b610b0c82826113c0565b505050565b5f610b1b81611315565b6001600160a01b038316610b4257604051633a19ac6f60e11b815260040160405180910390fd5b4780831115610b6e5760405163671123bf60e11b81526004810184905260248101829052604401610891565b610b816001600160a01b03851684611439565b6040518381526001600160a01b0385169033907f8b192dc173e314b16d9067e45c2afbdcdc1713fc4fe1a95aff9076249648abc0906020015b60405180910390a350505050565b5f6106e38266016bcc41e900006126a1565b60608151835114610c0b5781518351604051635b05999160e01b815260048101929092526024820152604401610891565b5f83516001600160401b03811115610c2557610c25611fd4565b604051908082528060200260200182016040528015610c4e578160200160208202803683370190505b5090505f5b8451811015610c9c57602080820286010151610c77906020808402870101516106b4565b828281518110610c8957610c896125fe565b6020908102919091010152600101610c53565b509392505050565b6001600160a01b0383163314801590610cc45750610cc283336110a5565b155b15610cf857335b60405163711bec9160e11b81526001600160a01b0391821660048201529084166024820152604401610891565b610b0c8383836114c5565b610d0b611508565b610d145f61153a565b565b3380610d2061107d565b6001600160a01b031614610d525760405163118cdaa760e01b81526001600160a01b0382166004820152602401610891565b610d5b8161153a565b50565b5f610d67611572565b805490915060ff600160401b82041615906001600160401b03165f81158015610d8d5750825b90505f826001600160401b03166001148015610da85750303b155b905081158015610db6575080155b15610dd45760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610dfe57845460ff60401b1916600160401b1785555b610e078761159a565b610e10336115ab565b610e186115bc565b610e225f3361131f565b506001600160a01b03861615610e3b57610e3b86610e8a565b8315610e8157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f610e9481611315565b816001600160a01b03163b5f03610ebe57604051633e07d28560e11b815260040160405180910390fd5b505f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f9182525f805160206128e7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610f553383836115c4565b5050565b5f610f6381611315565b610f5582611660565b5f610f7682610bc8565b905080341015610fa257604051633644fa3b60e01b815260048101829052346024820152604401610891565b610fbd8360018460405180602001604052805f815250611699565b5f610fc882346126b8565b90508015610ad357610ad33382611439565b5f610fe63360016106b4565b9050818110156110135760405163cffb3e6960e01b81526004810183905260248101829052604401610891565b5f61101d83610bc8565b9050478181101561104b5760405163671123bf60e11b81526004810183905260248101829052604401610891565b6110573360018661124a565b610ad33383611439565b61106a82610a30565b61107381611315565b610ad383836113c0565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610f04565b6001600160a01b039182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b336001600160a01b0386168114801590611112575061111086826110a5565b155b156111435760405163711bec9160e11b81526001600160a01b03808316600483015287166024820152604401610891565b610aaf86868686866116f4565b611158611508565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b038316908117825561119c610ee0565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6001600160a01b03831633148015906111f557506111f383336110a5565b155b156112005733610ccb565b610b0c83838361124a565b5f6001600160e01b03198216636cdb3d1360e11b148061123b57506001600160e01b031982166303a24d0760e21b145b806106e357506106e382611777565b6001600160a01b03831661127257604051626a0d4560e21b81525f6004820152602401610891565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916112b0918791859085906117ab565b5050505050565b6001600160a01b0384166112e057604051632bfa23e760e11b81525f6004820152602401610891565b6001600160a01b03851661130857604051626a0d4560e21b81525f6004820152602401610891565b6112b085858585856117ab565b610d5b81336117fe565b5f5f805160206128e78339815191526113388484610f14565b6113b7575f848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561136d3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106e3565b5f9150506106e3565b5f5f805160206128e78339815191526113d98484610f14565b156113b7575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106e3565b804710156114635760405163cf47918160e01b815247600482015260248101829052604401610891565b5f80836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146114ad576040519150601f19603f3d011682016040523d82523d5f602084013e6114b2565b606091505b509150915081610ad357610ad381611837565b6001600160a01b0383166114ed57604051626a0d4560e21b81525f6004820152602401610891565b610b0c835f848460405180602001604052805f8152506117ab565b33611511610ee0565b6001600160a01b031614610d145760405163118cdaa760e01b8152336004820152602401610891565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319168155610f5582611860565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106e3565b6115a26118d0565b610d5b816118f5565b6115b36118d0565b610d5b81611906565b610d146118d0565b5f805160206128c78339815191526001600160a01b0383166115fa5760405162ced3e160e81b81525f6004820152602401610891565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610bba565b5f805160206128c78339815191527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4502610b0c838261270f565b6001600160a01b0384166116c257604051632bfa23e760e11b81525f6004820152602401610891565b60408051600180825260208201869052818301908152606082018590526080820190925290610aaf5f878484876117ab565b6001600160a01b03841661171d57604051632bfa23e760e11b81525f6004820152602401610891565b6001600160a01b03851661174557604051626a0d4560e21b81525f6004820152602401610891565b60408051600180825260208201869052818301908152606082018590526080820190925290610e8187878484876117ab565b5f6001600160e01b03198216637965db0b60e01b14806106e357506301ffc9a760e01b6001600160e01b03198316146106e3565b6117b785858585611937565b6001600160a01b038416156112b057825133906001036117f057602084810151908401516117e9838989858589611943565b5050610aaf565b610aaf818787878787611a64565b6118088282610f14565b610f555760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610891565b8051156118475780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6118d8611b4b565b610d1457604051631afcd79f60e31b815260040160405180910390fd5b6118fd6118d0565b610d5b81611660565b61190e6118d0565b6001600160a01b038116610d5257604051631e4fbdf760e01b81525f6004820152602401610891565b610ad384848484611b64565b6001600160a01b0384163b15610aaf5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061198790899089908890889088906004016127ca565b6020604051808303815f875af19250505080156119c1575060408051601f3d908101601f191682019092526119be9181019061280e565b60015b611a28573d8080156119ee576040519150601f19603f3d011682016040523d82523d5f602084013e6119f3565b606091505b5080515f03611a2057604051632bfa23e760e11b81526001600160a01b0386166004820152602401610891565b805181602001fd5b6001600160e01b0319811663f23a6e6160e01b14610e8157604051632bfa23e760e11b81526001600160a01b0386166004820152602401610891565b6001600160a01b0384163b15610aaf5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611aa89089908990889088908890600401612829565b6020604051808303815f875af1925050508015611ae2575060408051601f3d908101601f19168201909252611adf9181019061280e565b60015b611b0f573d8080156119ee576040519150601f19603f3d011682016040523d82523d5f602084013e6119f3565b6001600160e01b0319811663bc197c8160e01b14610e8157604051632bfa23e760e11b81526001600160a01b0386166004820152602401610891565b5f611b54611572565b54600160401b900460ff16919050565b7f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e2800611b9185858585611c6f565b6001600160a01b038516611c0f575f805b8451811015611bf45760208181028581018201519087018201515f9081529185905260408220805491928392611bd9908490612886565b90915550611be990508184612886565b925050600101611ba2565b5080826001015f828254611c089190612886565b9091555050505b6001600160a01b0384166112b0575f805b8451811015611c5b5760208181028581018201519087018201515f908152918590526040909120805482900390559190910190600101611c20565b506001820180549190910390555050505050565b805182515f805160206128c78339815191529114611cad5782518251604051635b05999160e01b815260048101929092526024820152604401610891565b335f5b8451811015611daf576020818102868101820151908601909101516001600160a01b03891615611d61575f828152602086815260408083206001600160a01b038d16845290915290205481811015611d3b576040516303dee4c560e01b81526001600160a01b038b166004820152602481018290526044810183905260648101849052608401610891565b5f838152602087815260408083206001600160a01b038e16845290915290209082900390555b6001600160a01b03881615611da5575f828152602086815260408083206001600160a01b038c16845290915281208054839290611d9f908490612886565b90915550505b5050600101611cb0565b508351600103611e2f5760208401515f906020850151909150866001600160a01b0316886001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611e20929190918252602082015260400190565b60405180910390a45050610aaf565b846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e7e929190612899565b60405180910390a4505050505050565b6001600160a01b0381168114610d5b575f80fd5b5f8060408385031215611eb3575f80fd5b8235611ebe81611e8e565b946020939093013593505050565b6001600160e01b031981168114610d5b575f80fd5b5f60208284031215611ef1575f80fd5b8135611efc81611ecc565b9392505050565b5f60208284031215611f13575f80fd5b5035919050565b5f5b83811015611f34578181015183820152602001611f1c565b50505f910152565b5f8151808452611f53816020860160208601611f1a565b601f01601f19169290920160200192915050565b602081525f611efc6020830184611f3c565b5f805f805f60a08688031215611f8d575f80fd5b8535611f9881611e8e565b945060208601359350604086013592506060860135611fb681611e8e565b91506080860135611fc681611e8e565b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561200a5761200a611fd4565b60405290565b604051601f8201601f191681016001600160401b038111828210171561203857612038611fd4565b604052919050565b5f6001600160401b0382111561205857612058611fd4565b5060051b60200190565b5f82601f830112612071575f80fd5b8135602061208661208183612040565b612010565b8083825260208201915060208460051b8701019350868411156120a7575f80fd5b602086015b848110156120c357803583529183019183016120ac565b509695505050505050565b5f6001600160401b038211156120e6576120e6611fd4565b50601f01601f191660200190565b5f82601f830112612103575f80fd5b8135612111612081826120ce565b818152846020838601011115612125575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215612155575f80fd5b853561216081611e8e565b9450602086013561217081611e8e565b935060408601356001600160401b038082111561218b575f80fd5b61219789838a01612062565b945060608801359150808211156121ac575f80fd5b6121b889838a01612062565b935060808801359150808211156121cd575f80fd5b506121da888289016120f4565b9150509295509295909350565b5f80604083850312156121f8575f80fd5b82359150602083013561220a81611e8e565b809150509250929050565b5f8060408385031215612226575f80fd5b82356001600160401b038082111561223c575f80fd5b818501915085601f83011261224f575f80fd5b8135602061225f61208183612040565b82815260059290921b8401810191818101908984111561227d575f80fd5b948201945b838610156122a457853561229581611e8e565b82529482019490820190612282565b965050860135925050808211156122b9575f80fd5b506122c685828601612062565b9150509250929050565b5f815180845260208085019450602084015f5b838110156122ff578151875295820195908201906001016122e3565b509495945050505050565b602081525f611efc60208301846122d0565b5f805f6060848603121561232e575f80fd5b833561233981611e8e565b925060208401356001600160401b0380821115612354575f80fd5b61236087838801612062565b93506040860135915080821115612375575f80fd5b5061238286828701612062565b9150509250925092565b5f806040838503121561239d575f80fd5b82356001600160401b038111156123b2575f80fd5b6123be858286016120f4565b925050602083013561220a81611e8e565b5f602082840312156123df575f80fd5b8135611efc81611e8e565b5f80604083850312156123fb575f80fd5b823561240681611e8e565b91506020830135801515811461220a575f80fd5b5f6020828403121561242a575f80fd5b81356001600160401b0381111561243f575f80fd5b61244b848285016120f4565b949350505050565b5f8060408385031215612464575f80fd5b823561246f81611e8e565b9150602083013561220a81611e8e565b5f805f805f60a08688031215612493575f80fd5b853561249e81611e8e565b945060208601356124ae81611e8e565b9350604086013592506060860135915060808601356001600160401b038111156124d6575f80fd5b6121da888289016120f4565b5f805f606084860312156124f4575f80fd5b83356124ff81611e8e565b95602085013595506040909401359392505050565b600181811c9082168061252857607f821691505b60208210810361254657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602080838503121561255d575f80fd5b82516001600160401b0380821115612573575f80fd5b9084019060608287031215612586575f80fd5b61258e611fe8565b82518281111561259c575f80fd5b83019150601f820187136125ae575f80fd5b81516125bc612081826120ce565b81815288868386010111156125cf575f80fd5b6125de82878301888701611f1a565b825250828401519381019390935250604090810151908201529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820160018060a01b038089168452602088602086015287604086015260a0606086015282875180855260c0870191506020890194505f5b8181101561266a57855185168352948301949183019160010161264c565b5050858103608087015261267e8188611f3c565b9b9a5050505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176106e3576106e361268d565b818103818111156106e3576106e361268d565b601f821115610b0c57805f5260205f20601f840160051c810160208510156126f05750805b601f840160051c820191505b818110156112b0575f81556001016126fc565b81516001600160401b0381111561272857612728611fd4565b61273c816127368454612514565b846126cb565b602080601f83116001811461276f575f84156127585750858301515b5f19600386901b1c1916600185901b178555610aaf565b5f85815260208120601f198616915b8281101561279d5788860151825594840194600190910190840161277e565b50858210156127ba57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f9061280390830184611f3c565b979650505050505050565b5f6020828403121561281e575f80fd5b8151611efc81611ecc565b6001600160a01b0386811682528516602082015260a0604082018190525f90612854908301866122d0565b828103606084015261286681866122d0565b9050828103608084015261287a8185611f3c565b98975050505050505050565b808201808211156106e3576106e361268d565b604081525f6128ab60408301856122d0565b82810360208401526128bd81856122d0565b9594505050505056fe88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220705f2a39cbbda6054e9ea513adb54ebab3bfe8485e890c135b7b88701047a4c164736f6c63430008170033", - "nonce": "0x1e", + "input": "0x608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b61019e565b5f61003261012160201b60201c565b9050805f0160089054906101000a900460ff161561007c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff161461011e5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff6040516101159190610185565b60405180910390a15b50565b5f5f61013161013a60201b60201c565b90508091505090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b5f67ffffffffffffffff82169050919050565b61017f81610163565b82525050565b5f6020820190506101985f830184610176565b92915050565b615285806101ab5f395ff3fe608060405260043610610231575f3560e01c80637eb802b91161012d578063c9f18ebd116100aa578063e985e9c51161006e578063e985e9c51461081e578063f242432a1461085a578063f2fde38b14610882578063f45caae3146108aa578063f5298aca146108d457610238565b8063c9f18ebd14610752578063d1b53b9c1461077a578063d547741f146107a4578063e30c3978146107cc578063e74f4e76146107f657610238565b8063a7fd40bf116100f1578063a7fd40bf1461067e578063ad77bc40146106a6578063b13bfa91146106d0578063bd85b039146106fa578063c5efaae81461073657610238565b80637eb802b91461059e5780638da5cb5b146105c657806391d14854146105f0578063a217fddf1461062c578063a22cb4651461065657610238565b806336568abe116101bb5780634f558e791161017f5780634f558e79146104e65780636b20c454146105225780636ebbcb591461054a578063715018a61461057257806379ba50971461058857610238565b806336568abe146103f6578063401d44821461041e578063463fd1af146104465780634b844a1d1461046e5780634e1273f4146104aa57610238565b8063116039ae11610202578063116039ae1461031857806318160ddd14610340578063248a9ca31461036a5780632eb2c2d6146103a65780632f2ff15d146103ce57610238565b80622311681461023c578062fdd58e1461026457806301ffc9a7146102a05780630e89341c146102dc57610238565b3661023857005b5f5ffd5b348015610247575f5ffd5b50610262600480360381019061025d9190613928565b6108fc565b005b34801561026f575f5ffd5b5061028a60048036038101906102859190613a2b565b610a6a565b6040516102979190613a78565b60405180910390f35b3480156102ab575f5ffd5b506102c660048036038101906102c19190613ae6565b610acd565b6040516102d39190613b2b565b60405180910390f35b3480156102e7575f5ffd5b5061030260048036038101906102fd9190613b44565b610ade565b60405161030f9190613bcf565b60405180910390f35b348015610323575f5ffd5b5061033e60048036038101906103399190613c2a565b610b7e565b005b34801561034b575f5ffd5b50610354610f09565b6040516103619190613a78565b60405180910390f35b348015610375575f5ffd5b50610390600480360381019061038b9190613cd4565b610f20565b60405161039d9190613d0e565b60405180910390f35b3480156103b1575f5ffd5b506103cc60048036038101906103c79190613de7565b610f4a565b005b3480156103d9575f5ffd5b506103f460048036038101906103ef9190613eb2565b610ff1565b005b348015610401575f5ffd5b5061041c60048036038101906104179190613eb2565b611013565b005b348015610429575f5ffd5b50610444600480360381019061043f9190613ef0565b61108e565b005b348015610451575f5ffd5b5061046c60048036038101906104679190613fcc565b6111de565b005b348015610479575f5ffd5b50610494600480360381019061048f9190613b44565b6113f9565b6040516104a19190613a78565b60405180910390f35b3480156104b5575f5ffd5b506104d060048036038101906104cb91906140f8565b611414565b6040516104dd9190614225565b60405180910390f35b3480156104f1575f5ffd5b5061050c60048036038101906105079190613b44565b61151e565b6040516105199190613b2b565b60405180910390f35b34801561052d575f5ffd5b5061054860048036038101906105439190614245565b611531565b005b348015610555575f5ffd5b50610570600480360381019061056b91906142cd565b6115dd565b005b34801561057d575f5ffd5b5061058661167f565b005b348015610593575f5ffd5b5061059c611692565b005b3480156105a9575f5ffd5b506105c460048036038101906105bf91906142cd565b611720565b005b3480156105d1575f5ffd5b506105da6117c1565b6040516105e79190614307565b60405180910390f35b3480156105fb575f5ffd5b5061061660048036038101906106119190613eb2565b6117f6565b6040516106239190613b2b565b60405180910390f35b348015610637575f5ffd5b50610640611867565b60405161064d9190613d0e565b60405180910390f35b348015610661575f5ffd5b5061067c6004803603810190610677919061434a565b61186d565b005b348015610689575f5ffd5b506106a4600480360381019061069f9190614388565b611883565b005b3480156106b1575f5ffd5b506106ba61189c565b6040516106c79190613a78565b60405180910390f35b3480156106db575f5ffd5b506106e46118a1565b6040516106f1919061442a565b60405180910390f35b348015610705575f5ffd5b50610720600480360381019061071b9190613b44565b6118c5565b60405161072d9190613a78565b60405180910390f35b610750600480360381019061074b9190613a2b565b6118ec565b005b34801561075d575f5ffd5b5061077860048036038101906107739190613b44565b6119a1565b005b348015610785575f5ffd5b5061078e611a8a565b60405161079b9190613a78565b60405180910390f35b3480156107af575f5ffd5b506107ca60048036038101906107c59190613eb2565b611a95565b005b3480156107d7575f5ffd5b506107e0611ab7565b6040516107ed9190614307565b60405180910390f35b348015610801575f5ffd5b5061081c60048036038101906108179190614490565b611aec565b005b348015610829575f5ffd5b50610844600480360381019061083f919061455d565b611c3c565b6040516108519190613b2b565b60405180910390f35b348015610865575f5ffd5b50610880600480360381019061087b919061459b565b611cd8565b005b34801561088d575f5ffd5b506108a860048036038101906108a391906142cd565b611d7f565b005b3480156108b5575f5ffd5b506108be611e38565b6040516108cb919061464e565b60405180910390f35b3480156108df575f5ffd5b506108fa60048036038101906108f59190614667565b611e5d565b005b60015f61090a336001610a6a565b9050808211156109535781816040517fcffb3e6900000000000000000000000000000000000000000000000000000000815260040161094a9291906146b7565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f8173ffffffffffffffffffffffffffffffffffffffff163b036109c5576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d133600180611f09565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324856bc366016bcc41e9000087876040518463ffffffff1660e01b8152600401610a35929190614833565b5f604051808303818588803b158015610a4c575f5ffd5b505af1158015610a5e573d5f5f3e3d5ffd5b50505050505050505050565b5f5f610a74611fab565b9050805f015f8481526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b5f610ad782611fd2565b9050919050565b60605f610ae9611fab565b9050806002018054610afa90614895565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2690614895565b8015610b715780601f10610b4857610100808354040283529160200191610b71565b820191905f5260205f20905b815481529060010190602001808311610b5457829003601f168201915b5050505050915050919050565b825f610b8b336001610a6a565b905080821115610bd45781816040517fcffb3e69000000000000000000000000000000000000000000000000000000008152600401610bcb9291906146b7565b60405180910390fd5b865f8173ffffffffffffffffffffffffffffffffffffffff163b03610c25576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8890506001871015610c64576040517fea54cbb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16638c7a63ae8a6040518263ffffffff1660e01b8152600401610c9e9190613a78565b5f60405180830381865afa158015610cb8573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610ce091906149cc565b90505f815f01515103610d2a57886040517f505b9f4e000000000000000000000000000000000000000000000000000000008152600401610d219190613a78565b60405180910390fd5b610d363360018a611f09565b5f610d40896113f9565b90505f600167ffffffffffffffff811115610d5e57610d5d613722565b5b604051908082528060200260200182016040528015610d8c5781602001602082028036833780820191505090505b50905087815f81518110610da357610da2614a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f89604051602001610def9190614307565b60405160208183030381529060405290508473ffffffffffffffffffffffffffffffffffffffff1663359f1302845f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168f8f87876040518763ffffffff1660e01b8152600401610e62959493929190614af7565b5f604051808303818588803b158015610e79575f5ffd5b505af1158015610e8b573d5f5f3e3d5ffd5b50505050508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168d7f0be475f768b363c261073a92dfdacd93dc1e02f74c673c04add7611e10a139928e8f88604051610ef293929190614b56565b60405180910390a450505050505050505050505050565b5f5f610f136120b3565b9050806001015491505090565b5f5f610f2a6120da565b9050805f015f8481526020019081526020015f2060010154915050919050565b5f610f53612101565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610f985750610f968682611c3c565b155b15610fdc5780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401610fd3929190614b8b565b60405180910390fd5b610fe98686868686612108565b505050505050565b610ffa82610f20565b611003816121fc565b61100d8383612210565b50505050565b61101b612101565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461107f576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110898282612308565b505050565b5f5f1b61109a816121fc565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ff576040517f743358de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790508083111561114a5782816040517fce22477e0000000000000000000000000000000000000000000000000000000081526004016111419291906146b7565b60405180910390fd5b611173838573ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8b192dc173e314b16d9067e45c2afbdcdc1713fc4fe1a95aff9076249648abc0856040516111d09190613a78565b60405180910390a350505050565b5f6111e76124c6565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff1614801561122f5750825b90505f60018367ffffffffffffffff1614801561126257505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611270575080155b156112a7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156112f4576001855f0160086101000a81548160ff0219169083151502179055505b6112fd886124d9565b611306336124ed565b61130e612501565b61131a5f5f1b33612210565b505f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146113585761135787611720565b5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461139557611394866115dd565b5b83156113ef575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516113e69190614bfe565b60405180910390a15b5050505050505050565b5f8166016bcc41e9000061140d9190614c44565b9050919050565b6060815183511461146057815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016114579291906146b7565b60405180910390fd5b5f835167ffffffffffffffff81111561147c5761147b613722565b5b6040519080825280602002602001820160405280156114aa5781602001602082028036833780820191505090505b5090505f5f90505b8451811015611513576114e96114d1828761250b90919063ffffffff16565b6114e4838761251e90919063ffffffff16565b610a6a565b8282815181106114fc576114fb614a13565b5b6020026020010181815250508060010190506114b2565b508091505092915050565b5f5f611529836118c5565b119050919050565b611539612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561158257506115808361157b612101565b611c3c565b155b156115cd5761158f612101565b836040517fe237d9220000000000000000000000000000000000000000000000000000000081526004016115c4929190614b8b565b60405180910390fd5b6115d8838383612531565b505050565b5f5f1b6115e9816121fc565b815f8173ffffffffffffffffffffffffffffffffffffffff163b0361163a576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6116876125c1565b6116905f612648565b565b5f61169b612101565b90508073ffffffffffffffffffffffffffffffffffffffff166116bc611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461171457806040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161170b9190614307565b60405180910390fd5b61171d81612648565b50565b5f5f1b61172c816121fc565b815f8173ffffffffffffffffffffffffffffffffffffffff163b0361177d576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f5f6117cb612685565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f6118006120da565b9050805f015f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b5f5f1b81565b61187f611878612101565b83836126ac565b5050565b5f5f1b61188f816121fc565b61189882612823565b5050565b600181565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f6118cf6120b3565b9050805f015f8481526020019081526020015f2054915050919050565b5f6118f6826113f9565b90508034101561193f5780346040517f3644fa3b0000000000000000000000000000000000000000000000000000000081526004016119369291906146b7565b60405180910390fd5b61195a8360018460405180602001604052805f815250612844565b5f81346119679190614c85565b90505f81111561199b5761199a813373ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b5b50505050565b805f6119ae336001610a6a565b9050808211156119f75781816040517fcffb3e690000000000000000000000000000000000000000000000000000000081526004016119ee9291906146b7565b60405180910390fd5b5f611a01846113f9565b90505f47905081811015611a4e5781816040517fce22477e000000000000000000000000000000000000000000000000000000008152600401611a459291906146b7565b60405180910390fd5b611a5a33600187611f09565b611a83823373ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b5050505050565b66016bcc41e9000081565b611a9e82610f20565b611aa7816121fc565b611ab18383612308565b50505050565b5f5f611ac16128d9565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60015f611afa336001610a6a565b905080821115611b435781816040517fcffb3e69000000000000000000000000000000000000000000000000000000008152600401611b3a9291906146b7565b60405180910390fd5b895f8173ffffffffffffffffffffffffffffffffffffffff163b03611b94576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ba033600180611f09565b8a73ffffffffffffffffffffffffffffffffffffffff1663472e649066016bcc41e900008c8c8c8c8c8c8c6040518963ffffffff1660e01b8152600401611bed9796959493929190614d3a565b60206040518083038185885af1158015611c09573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611c2e9190614dae565b505050505050505050505050565b5f5f611c46611fab565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b5f611ce1612101565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015611d265750611d248682611c3c565b155b15611d6a5780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401611d61929190614b8b565b60405180910390fd5b611d778686868686612900565b505050505050565b611d876125c1565b5f611d906128d9565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16611df26117c1565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e65612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611eae5750611eac83611ea7612101565b611c3c565b155b15611ef957611ebb612101565b836040517fe237d922000000000000000000000000000000000000000000000000000000008152600401611ef0929190614b8b565b60405180910390fd5b611f04838383611f09565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f79575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401611f709190614307565b60405180910390fd5b5f5f611f858484612a06565b91509150611fa4855f848460405180602001604052805f815250612a36565b5050505050565b5f7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500905090565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209c57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120ac57506120ab82612ae2565b5b9050919050565b5f7f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e2800905090565b5f7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612178575f6040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161216f9190614307565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e8575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016121df9190614307565b60405180910390fd5b6121f58585858585612a36565b5050505050565b61220d81612208612101565b612b5b565b50565b5f5f61221a6120da565b905061222684846117f6565b6122fd576001815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612299612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050612302565b5f9150505b92915050565b5f5f6123126120da565b905061231e84846117f6565b156123f5575f815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612391612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506123fa565b5f9150505b92915050565b804710156124475747816040517fcf47918100000000000000000000000000000000000000000000000000000000815260040161243e9291906146b7565b60405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff168360405161246d90614e06565b5f6040518083038185875af1925050503d805f81146124a7576040519150601f19603f3d011682016040523d82523d5f602084013e6124ac565b606091505b5091509150816124c0576124bf81612bac565b5b50505050565b5f5f6124d0612bf0565b90508091505090565b6124e1612c19565b6124ea81612c59565b50565b6124f5612c19565b6124fe81612c6d565b50565b612509612c19565b565b5f60208202602084010151905092915050565b5f60208202602084010151905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125a1575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016125989190614307565b60405180910390fd5b6125bc835f848460405180602001604052805f815250612a36565b505050565b6125c9612101565b73ffffffffffffffffffffffffffffffffffffffff166125e76117c1565b73ffffffffffffffffffffffffffffffffffffffff16146126465761260a612101565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161263d9190614307565b60405180910390fd5b565b5f6126516128d9565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561268182612cf1565b5050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f6126b5611fab565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612727575f6040517fced3e10000000000000000000000000000000000000000000000000000000000815260040161271e9190614307565b60405180910390fd5b81816001015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516128159190613b2b565b60405180910390a350505050565b5f61282c611fab565b90508181600201908161283f9190614fb1565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128b4575f6040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016128ab9190614307565b60405180910390fd5b5f5f6128c08585612a06565b915091506128d15f87848487612a36565b505050505050565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612970575f6040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016129679190614307565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129e0575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016129d79190614307565b60405180910390fd5b5f5f6129ec8585612a06565b915091506129fd8787848487612a36565b50505050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b612a4285858585612dc2565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612adb575f612a7e612101565b90506001845103612aca575f612a9d5f8661251e90919063ffffffff16565b90505f612ab35f8661251e90919063ffffffff16565b9050612ac3838989858589612dd4565b5050612ad9565b612ad8818787878787612f83565b5b505b5050505050565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b545750612b5382613132565b5b9050919050565b612b6582826117f6565b612ba85780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612b9f929190615080565b60405180910390fd5b5050565b5f81511115612bbe5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b612c2161319b565b612c57576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612c61612c19565b612c6a81612823565b50565b612c75612c19565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612cdc9190614307565b60405180910390fd5b612cee81612648565b50565b5f612cfa612685565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b612dce848484846131b9565b50505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115612f7b578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e349594939291906150a7565b6020604051808303815f875af1925050508015612e6f57506040513d601f19601f82011682018060405250810190612e6c9190615113565b60015b612ef0573d805f8114612e9d576040519150601f19603f3d011682016040523d82523d5f602084013e612ea2565b606091505b505f815103612ee857846040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401612edf9190614307565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f7957846040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401612f709190614307565b60405180910390fd5b505b505050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b111561312a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fe395949392919061513e565b6020604051808303815f875af192505050801561301e57506040513d601f19601f8201168201806040525081019061301b9190615113565b60015b61309f573d805f811461304c576040519150601f19603f3d011682016040523d82523d5f602084013e613051565b606091505b505f81510361309757846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161308e9190614307565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461312857846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161311f9190614307565b60405180910390fd5b505b505050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f6131a46124c6565b5f0160089054906101000a900460ff16905090565b5f6131c26120b3565b90506131d085858585613354565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361329c575f5f90505f5f90505b845181101561327f575f613229828661251e90919063ffffffff16565b905080845f015f613243858a61251e90919063ffffffff16565b81526020019081526020015f205f82825461325e91906151a4565b92505081905550808361327191906151a4565b92505080600101905061320c565b5080826001015f82825461329391906151a4565b92505081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361334d575f5f90505f5f90505b8451811015613339575f6132f5828661251e90919063ffffffff16565b905080845f015f61330f858a61251e90919063ffffffff16565b81526020019081526020015f205f82825403925050819055508083019250508060010190506132d8565b5080826001015f8282540392505081905550505b5050505050565b5f61335d611fab565b905081518351146133a957825182516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016133a09291906146b7565b60405180910390fd5b5f6133b2612101565b90505f5f90505b84518110156135b7575f6133d6828761251e90919063ffffffff16565b90505f6133ec838761251e90919063ffffffff16565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614613513575f855f015f8481526020019081526020015f205f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156134bd57898183856040517f03dee4c50000000000000000000000000000000000000000000000000000000081526004016134b494939291906151d7565b60405180910390fd5b818103865f015f8581526020019081526020015f205f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146135aa5780855f015f8481526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135a291906151a4565b925050819055505b50508060010190506133b9565b506001845103613672575f6135d55f8661251e90919063ffffffff16565b90505f6135eb5f8661251e90919063ffffffff16565b90508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6285856040516136639291906146b7565b60405180910390a450506136f1565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516136e892919061521a565b60405180910390a45b505050505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61375882613712565b810181811067ffffffffffffffff8211171561377757613776613722565b5b80604052505050565b5f6137896136f9565b9050613795828261374f565b919050565b5f67ffffffffffffffff8211156137b4576137b3613722565b5b6137bd82613712565b9050602081019050919050565b828183375f83830152505050565b5f6137ea6137e58461379a565b613780565b9050828152602081018484840111156138065761380561370e565b5b6138118482856137ca565b509392505050565b5f82601f83011261382d5761382c61370a565b5b813561383d8482602086016137d8565b91505092915050565b5f67ffffffffffffffff8211156138605761385f613722565b5b602082029050602081019050919050565b5f5ffd5b5f61388761388284613846565b613780565b905080838252602082019050602084028301858111156138aa576138a9613871565b5b835b818110156138f157803567ffffffffffffffff8111156138cf576138ce61370a565b5b8086016138dc8982613819565b855260208501945050506020810190506138ac565b5050509392505050565b5f82601f83011261390f5761390e61370a565b5b813561391f848260208601613875565b91505092915050565b5f5f6040838503121561393e5761393d613702565b5b5f83013567ffffffffffffffff81111561395b5761395a613706565b5b61396785828601613819565b925050602083013567ffffffffffffffff81111561398857613987613706565b5b613994858286016138fb565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139c78261399e565b9050919050565b6139d7816139bd565b81146139e1575f5ffd5b50565b5f813590506139f2816139ce565b92915050565b5f819050919050565b613a0a816139f8565b8114613a14575f5ffd5b50565b5f81359050613a2581613a01565b92915050565b5f5f60408385031215613a4157613a40613702565b5b5f613a4e858286016139e4565b9250506020613a5f85828601613a17565b9150509250929050565b613a72816139f8565b82525050565b5f602082019050613a8b5f830184613a69565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ac581613a91565b8114613acf575f5ffd5b50565b5f81359050613ae081613abc565b92915050565b5f60208284031215613afb57613afa613702565b5b5f613b0884828501613ad2565b91505092915050565b5f8115159050919050565b613b2581613b11565b82525050565b5f602082019050613b3e5f830184613b1c565b92915050565b5f60208284031215613b5957613b58613702565b5b5f613b6684828501613a17565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f613ba182613b6f565b613bab8185613b79565b9350613bbb818560208601613b89565b613bc481613712565b840191505092915050565b5f6020820190508181035f830152613be78184613b97565b905092915050565b5f613bf98261399e565b9050919050565b613c0981613bef565b8114613c13575f5ffd5b50565b5f81359050613c2481613c00565b92915050565b5f5f5f5f5f60a08688031215613c4357613c42613702565b5b5f613c50888289016139e4565b9550506020613c6188828901613a17565b9450506040613c7288828901613a17565b9350506060613c83888289016139e4565b9250506080613c9488828901613c16565b9150509295509295909350565b5f819050919050565b613cb381613ca1565b8114613cbd575f5ffd5b50565b5f81359050613cce81613caa565b92915050565b5f60208284031215613ce957613ce8613702565b5b5f613cf684828501613cc0565b91505092915050565b613d0881613ca1565b82525050565b5f602082019050613d215f830184613cff565b92915050565b5f67ffffffffffffffff821115613d4157613d40613722565b5b602082029050602081019050919050565b5f613d64613d5f84613d27565b613780565b90508083825260208201905060208402830185811115613d8757613d86613871565b5b835b81811015613db05780613d9c8882613a17565b845260208401935050602081019050613d89565b5050509392505050565b5f82601f830112613dce57613dcd61370a565b5b8135613dde848260208601613d52565b91505092915050565b5f5f5f5f5f60a08688031215613e0057613dff613702565b5b5f613e0d888289016139e4565b9550506020613e1e888289016139e4565b945050604086013567ffffffffffffffff811115613e3f57613e3e613706565b5b613e4b88828901613dba565b935050606086013567ffffffffffffffff811115613e6c57613e6b613706565b5b613e7888828901613dba565b925050608086013567ffffffffffffffff811115613e9957613e98613706565b5b613ea588828901613819565b9150509295509295909350565b5f5f60408385031215613ec857613ec7613702565b5b5f613ed585828601613cc0565b9250506020613ee6858286016139e4565b9150509250929050565b5f5f60408385031215613f0657613f05613702565b5b5f613f1385828601613c16565b9250506020613f2485828601613a17565b9150509250929050565b5f67ffffffffffffffff821115613f4857613f47613722565b5b613f5182613712565b9050602081019050919050565b5f613f70613f6b84613f2e565b613780565b905082815260208101848484011115613f8c57613f8b61370e565b5b613f978482856137ca565b509392505050565b5f82601f830112613fb357613fb261370a565b5b8135613fc3848260208601613f5e565b91505092915050565b5f5f5f60608486031215613fe357613fe2613702565b5b5f84013567ffffffffffffffff81111561400057613fff613706565b5b61400c86828701613f9f565b935050602061401d868287016139e4565b925050604061402e868287016139e4565b9150509250925092565b5f67ffffffffffffffff82111561405257614051613722565b5b602082029050602081019050919050565b5f61407561407084614038565b613780565b9050808382526020820190506020840283018581111561409857614097613871565b5b835b818110156140c157806140ad88826139e4565b84526020840193505060208101905061409a565b5050509392505050565b5f82601f8301126140df576140de61370a565b5b81356140ef848260208601614063565b91505092915050565b5f5f6040838503121561410e5761410d613702565b5b5f83013567ffffffffffffffff81111561412b5761412a613706565b5b614137858286016140cb565b925050602083013567ffffffffffffffff81111561415857614157613706565b5b61416485828601613dba565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141a0816139f8565b82525050565b5f6141b18383614197565b60208301905092915050565b5f602082019050919050565b5f6141d38261416e565b6141dd8185614178565b93506141e883614188565b805f5b838110156142185781516141ff88826141a6565b975061420a836141bd565b9250506001810190506141eb565b5085935050505092915050565b5f6020820190508181035f83015261423d81846141c9565b905092915050565b5f5f5f6060848603121561425c5761425b613702565b5b5f614269868287016139e4565b935050602084013567ffffffffffffffff81111561428a57614289613706565b5b61429686828701613dba565b925050604084013567ffffffffffffffff8111156142b7576142b6613706565b5b6142c386828701613dba565b9150509250925092565b5f602082840312156142e2576142e1613702565b5b5f6142ef848285016139e4565b91505092915050565b614301816139bd565b82525050565b5f60208201905061431a5f8301846142f8565b92915050565b61432981613b11565b8114614333575f5ffd5b50565b5f8135905061434481614320565b92915050565b5f5f604083850312156143605761435f613702565b5b5f61436d858286016139e4565b925050602061437e85828601614336565b9150509250929050565b5f6020828403121561439d5761439c613702565b5b5f82013567ffffffffffffffff8111156143ba576143b9613706565b5b6143c684828501613f9f565b91505092915050565b5f819050919050565b5f6143f26143ed6143e88461399e565b6143cf565b61399e565b9050919050565b5f614403826143d8565b9050919050565b5f614414826143f9565b9050919050565b6144248161440a565b82525050565b5f60208201905061443d5f83018461441b565b92915050565b6002811061444f575f5ffd5b50565b5f8135905061446081614443565b92915050565b61446f8161399e565b8114614479575f5ffd5b50565b5f8135905061448a81614466565b92915050565b5f5f5f5f5f5f5f5f610100898b0312156144ad576144ac613702565b5b5f6144ba8b828c016139e4565b98505060206144cb8b828c016139e4565b97505060406144dc8b828c016139e4565b96505060606144ed8b828c016139e4565b955050608089013567ffffffffffffffff81111561450e5761450d613706565b5b61451a8b828c01613f9f565b94505060a061452b8b828c01614452565b93505060c061453c8b828c01613a17565b92505060e061454d8b828c0161447c565b9150509295985092959890939650565b5f5f6040838503121561457357614572613702565b5b5f614580858286016139e4565b9250506020614591858286016139e4565b9150509250929050565b5f5f5f5f5f60a086880312156145b4576145b3613702565b5b5f6145c1888289016139e4565b95505060206145d2888289016139e4565b94505060406145e388828901613a17565b93505060606145f488828901613a17565b925050608086013567ffffffffffffffff81111561461557614614613706565b5b61462188828901613819565b9150509295509295909350565b5f614638826143f9565b9050919050565b6146488161462e565b82525050565b5f6020820190506146615f83018461463f565b92915050565b5f5f5f6060848603121561467e5761467d613702565b5b5f61468b868287016139e4565b935050602061469c86828701613a17565b92505060406146ad86828701613a17565b9150509250925092565b5f6040820190506146ca5f830185613a69565b6146d76020830184613a69565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f614702826146de565b61470c81856146e8565b935061471c818560208601613b89565b61472581613712565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f614773826146de565b61477d8185614759565b935061478d818560208601613b89565b61479681613712565b840191505092915050565b5f6147ac8383614769565b905092915050565b5f602082019050919050565b5f6147ca82614730565b6147d4818561473a565b9350836020820285016147e68561474a565b805f5b85811015614821578484038952815161480285826147a1565b945061480d836147b4565b925060208a019950506001810190506147e9565b50829750879550505050505092915050565b5f6040820190508181035f83015261484b81856146f8565b9050818103602083015261485f81846147c0565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806148ac57607f821691505b6020821081036148bf576148be614868565b5b50919050565b5f5ffd5b5f5ffd5b5f6148df6148da84613f2e565b613780565b9050828152602081018484840111156148fb576148fa61370e565b5b614906848285613b89565b509392505050565b5f82601f8301126149225761492161370a565b5b81516149328482602086016148cd565b91505092915050565b5f8151905061494981613a01565b92915050565b5f60608284031215614964576149636148c5565b5b61496e6060613780565b90505f82015167ffffffffffffffff81111561498d5761498c6148c9565b5b6149998482850161490e565b5f8301525060206149ac8482850161493b565b60208301525060406149c08482850161493b565b60408301525092915050565b5f602082840312156149e1576149e0613702565b5b5f82015167ffffffffffffffff8111156149fe576149fd613706565b5b614a0a8482850161494f565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a72816139bd565b82525050565b5f614a838383614a69565b60208301905092915050565b5f602082019050919050565b5f614aa582614a40565b614aaf8185614a4a565b9350614aba83614a5a565b805f5b83811015614aea578151614ad18882614a78565b9750614adc83614a8f565b925050600181019050614abd565b5085935050505092915050565b5f60a082019050614b0a5f83018861441b565b614b176020830187613a69565b614b246040830186613a69565b8181036060830152614b368185614a9b565b90508181036080830152614b4a81846146f8565b90509695505050505050565b5f606082019050614b695f830186613a69565b614b766020830185613a69565b614b836040830184613a69565b949350505050565b5f604082019050614b9e5f8301856142f8565b614bab60208301846142f8565b9392505050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f614be8614be3614bde84614bb2565b6143cf565b614bbb565b9050919050565b614bf881614bce565b82525050565b5f602082019050614c115f830184614bef565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c4e826139f8565b9150614c59836139f8565b9250828202614c67816139f8565b91508282048414831517614c7e57614c7d614c17565b5b5092915050565b5f614c8f826139f8565b9150614c9a836139f8565b9250828203905081811115614cb257614cb1614c17565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110614cf657614cf5614cb8565b5b50565b5f819050614d0682614ce5565b919050565b5f614d1582614cf9565b9050919050565b614d2581614d0b565b82525050565b614d348161399e565b82525050565b5f60e082019050614d4d5f83018a6142f8565b614d5a60208301896142f8565b614d6760408301886142f8565b8181036060830152614d798187613b97565b9050614d886080830186614d1c565b614d9560a0830185613a69565b614da260c0830184614d2b565b98975050505050505050565b5f60208284031215614dc357614dc2613702565b5b5f614dd08482850161493b565b91505092915050565b5f81905092915050565b50565b5f614df15f83614dd9565b9150614dfc82614de3565b5f82019050919050565b5f614e1082614de6565b9150819050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614e767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e3b565b614e808683614e3b565b95508019841693508086168417925050509392505050565b5f614eb2614ead614ea8846139f8565b6143cf565b6139f8565b9050919050565b5f819050919050565b614ecb83614e98565b614edf614ed782614eb9565b848454614e47565b825550505050565b5f5f905090565b614ef6614ee7565b614f01818484614ec2565b505050565b5b81811015614f2457614f195f82614eee565b600181019050614f07565b5050565b601f821115614f6957614f3a81614e1a565b614f4384614e2c565b81016020851015614f52578190505b614f66614f5e85614e2c565b830182614f06565b50505b505050565b5f82821c905092915050565b5f614f895f1984600802614f6e565b1980831691505092915050565b5f614fa18383614f7a565b9150826002028217905092915050565b614fba82613b6f565b67ffffffffffffffff811115614fd357614fd2613722565b5b614fdd8254614895565b614fe8828285614f28565b5f60209050601f831160018114615019575f8415615007578287015190505b6150118582614f96565b865550615078565b601f19841661502786614e1a565b5f5b8281101561504e57848901518255600182019150602085019450602081019050615029565b8683101561506b5784890151615067601f891682614f7a565b8355505b6001600288020188555050505b505050505050565b5f6040820190506150935f8301856142f8565b6150a06020830184613cff565b9392505050565b5f60a0820190506150ba5f8301886142f8565b6150c760208301876142f8565b6150d46040830186613a69565b6150e16060830185613a69565b81810360808301526150f381846146f8565b90509695505050505050565b5f8151905061510d81613abc565b92915050565b5f6020828403121561512857615127613702565b5b5f615135848285016150ff565b91505092915050565b5f60a0820190506151515f8301886142f8565b61515e60208301876142f8565b818103604083015261517081866141c9565b9050818103606083015261518481856141c9565b9050818103608083015261519881846146f8565b90509695505050505050565b5f6151ae826139f8565b91506151b9836139f8565b92508282019050808211156151d1576151d0614c17565b5b92915050565b5f6080820190506151ea5f8301876142f8565b6151f76020830186613a69565b6152046040830185613a69565b6152116060830184613a69565b95945050505050565b5f6040820190508181035f83015261523281856141c9565b9050818103602083015261524681846141c9565b9050939250505056fea26469706673582212202c607fe090de5b404fc5c3a5562b19ffe9d191a5fb90cec284cb58685f24247864736f6c634300081c0033", + "nonce": "0x2b", "chainId": "0x14a34" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x2d169a576434cf914e76c20f0b4dceb6a54b6ac4da0843f31b12e17819de55e5", - "transactionType": "CREATE", - "contractName": "ProxyAdmin", - "contractAddress": "0x888fb1aa6eec47d2b5db8dbce68d00f294f95f08", - "function": null, - "arguments": [ - "0x3c10FAED26a6bb341322d1BAaf2c6ecf5B957D61" - ], - "transaction": { - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "gas": "0x60734", - "value": "0x0", - "input": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122007de15b0105c29549d149c18de22e78591a193e6e1f95277a6a00e6b6f51026d64736f6c634300081700330000000000000000000000003c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "nonce": "0x1f", - "chainId": "0x14a34" - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", + "hash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", "transactionType": "CREATE", "contractName": "TransparentUpgradeableProxy", - "contractAddress": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "contractAddress": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "function": null, "arguments": [ - "0x1a9507B4404854B48164B209bFd0d4790B609762", - "0x888FB1aa6EeC47D2B5db8dBcE68d00f294F95f08", - "0x7ab4339d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000" + "0x29c6F2022b97bf8503A64025Dd4fafEa5251756C", + "0xaff4BE6F091274421f0Bf5a2F74eC368a2c017E8", + "0x463fd1af0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d34872be0cdb6b09d45fca067b07f04a1a9ae1ae000000000000000000000000d34872be0cdb6b09d45fca067b07f04a1a9ae1ae000000000000000000000000000000000000000000000000000000000000003061723a2f2f6f336e69366448543276316664613836313058676a58782d336a4775426234622d2d307066624f78726d7700000000000000000000000000000000" ], "transaction": { - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "gas": "0xeebd7", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "gas": "0x18c753", "value": "0x0", - "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea264697066735822122011de57fd4b44521ee974555595699df7e8ef5536966300e3722e17cc1200174664736f6c63430008170033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122007de15b0105c29549d149c18de22e78591a193e6e1f95277a6a00e6b6f51026d64736f6c63430008170033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000001a9507b4404854b48164b209bfd0d4790b609762000000000000000000000000888fb1aa6eec47d2b5db8dbce68d00f294f95f08000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000847ab4339d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x20", + "input": "0x60a06040526040516119d43803806119d483398181016040528101906100259190610708565b828161003782826100c160201b60201c565b50508160405161004690610554565b6100509190610783565b604051809103905ff080158015610069573d5f5f3e3d5ffd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506100b96100ae61014560201b60201c565b61014e60201b60201c565b50505061081d565b6100d0826101a660201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156101325761012c828261027560201b60201c565b50610141565b6101406102fb60201b60201c565b5b5050565b5f608051905090565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61017d61033760201b60201c565b8260405161018c92919061079c565b60405180910390a16101a38161039060201b60201c565b50565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361020157806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016101f89190610783565b60405180910390fd5b806102337f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61047460201b60201c565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161029e9190610807565b5f60405180830381855af49150503d805f81146102d6576040519150601f19603f3d011682016040523d82523d5f602084013e6102db565b606091505b50915091506102f185838361047d60201b60201c565b9250505092915050565b5f341115610335576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6103697fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035f1b61047460201b60201c565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610400575f6040517f62e77ba20000000000000000000000000000000000000000000000000000000081526004016103f79190610783565b60405180910390fd5b806104327fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035f1b61047460201b60201c565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f819050919050565b606082610498576104938261051060201b60201c565b610508565b5f82511480156104be57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561050057836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016104f79190610783565b60405180910390fd5b819050610509565b5b9392505050565b5f815111156105225780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109c68061100e83390190565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61059b82610572565b9050919050565b6105ab81610591565b81146105b5575f5ffd5b50565b5f815190506105c6816105a2565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61061a826105d4565b810181811067ffffffffffffffff82111715610639576106386105e4565b5b80604052505050565b5f61064b610561565b90506106578282610611565b919050565b5f67ffffffffffffffff821115610676576106756105e4565b5b61067f826105d4565b9050602081019050919050565b8281835e5f83830152505050565b5f6106ac6106a78461065c565b610642565b9050828152602081018484840111156106c8576106c76105d0565b5b6106d384828561068c565b509392505050565b5f82601f8301126106ef576106ee6105cc565b5b81516106ff84826020860161069a565b91505092915050565b5f5f5f6060848603121561071f5761071e61056a565b5b5f61072c868287016105b8565b935050602061073d868287016105b8565b925050604084015167ffffffffffffffff81111561075e5761075d61056e565b5b61076a868287016106db565b9150509250925092565b61077d81610591565b82525050565b5f6020820190506107965f830184610774565b92915050565b5f6040820190506107af5f830185610774565b6107bc6020830184610774565b9392505050565b5f81519050919050565b5f81905092915050565b5f6107e1826107c3565b6107eb81856107cd565b93506107fb81856020860161068c565b80840191505092915050565b5f61081282846107d7565b915081905092915050565b6080516107d96108355f395f61010401526107d95ff3fe608060405261000c61000e565b005b610016610101565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036100f657634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19165f357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146100e9576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100f1610128565b6100ff565b6100fe61015c565b5b565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f5f5f36600490809261013d939291906104d0565b81019061014a91906106a8565b91509150610158828261016e565b5050565b61016c6101676101e0565b6101ee565b565b6101778261020d565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156101d3576101cd82826102d6565b506101dc565b6101db610356565b5b5050565b5f6101e9610392565b905090565b365f5f375f5f365f845af43d5f5f3e805f8114610209573d5ff35b3d5ffd5b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361026857806040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161025f9190610722565b60405180910390fd5b806102947f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6103e5565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516102ff919061078d565b5f60405180830381855af49150503d805f8114610337576040519150601f19603f3d011682016040523d82523d5f602084013e61033c565b606091505b509150915061034c8583836103ee565b9250505092915050565b5f341115610390576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6103be7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6103e5565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f819050919050565b606082610403576103fe8261047b565b610473565b5f825114801561042957505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561046b57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016104629190610722565b60405180910390fd5b819050610474565b5b9392505050565b5f8151111561048d5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f5f858511156104e3576104e26104c8565b5b838611156104f4576104f36104cc565b5b6001850283019150848603905094509492505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61053b82610512565b9050919050565b61054b81610531565b8114610555575f5ffd5b50565b5f8135905061056681610542565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6105ba82610574565b810181811067ffffffffffffffff821117156105d9576105d8610584565b5b80604052505050565b5f6105eb6104bf565b90506105f782826105b1565b919050565b5f67ffffffffffffffff82111561061657610615610584565b5b61061f82610574565b9050602081019050919050565b828183375f83830152505050565b5f61064c610647846105fc565b6105e2565b90508281526020810184848401111561066857610667610570565b5b61067384828561062c565b509392505050565b5f82601f83011261068f5761068e61056c565b5b813561069f84826020860161063a565b91505092915050565b5f5f604083850312156106be576106bd61050a565b5b5f6106cb85828601610558565b925050602083013567ffffffffffffffff8111156106ec576106eb61050e565b5b6106f88582860161067b565b9150509250929050565b5f61070c82610512565b9050919050565b61071c81610702565b82525050565b5f6020820190506107355f830184610713565b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6107678261073b565b6107718185610745565b935061078181856020860161074f565b80840191505092915050565b5f610798828461075d565b91508190509291505056fea2646970667358221220ccc9529bc6fbbf8f3b86b4a8c5192f0598aa3267a8c6404d4fb67afc4bbc1a5d64736f6c634300081c0033608060405234801561000f575f5ffd5b506040516109c63803806109c6833981810160405281019061003191906101d7565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100999190610211565b60405180910390fd5b6100b1816100b860201b60201c565b505061022a565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101a68261017d565b9050919050565b6101b68161019c565b81146101c0575f5ffd5b50565b5f815190506101d1816101ad565b92915050565b5f602082840312156101ec576101eb610179565b5b5f6101f9848285016101c3565b91505092915050565b61020b8161019c565b82525050565b5f6020820190506102245f830184610202565b92915050565b61078f806102375f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008d578063ad3cb1cc146100a9578063f2fde38b146100d3575b5f5ffd5b348015610058575f5ffd5b506100616100fb565b005b34801561006e575f5ffd5b5061007761010e565b60405161008491906103f7565b60405180910390f35b6100a760048036038101906100a291906105c2565b610135565b005b3480156100b4575f5ffd5b506100bd6101ac565b6040516100ca919061068e565b60405180910390f35b3480156100de575f5ffd5b506100f960048036038101906100f491906106ae565b6101e5565b005b610103610269565b61010c5f6102f0565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61013d610269565b8273ffffffffffffffffffffffffffffffffffffffff16634f1ef2863484846040518463ffffffff1660e01b815260040161017992919061072b565b5f604051808303818588803b158015610190575f5ffd5b505af11580156101a2573d5f5f3e3d5ffd5b5050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6101ed610269565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361025d575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161025491906103f7565b60405180910390fd5b610266816102f0565b50565b6102716103b1565b73ffffffffffffffffffffffffffffffffffffffff1661028f61010e565b73ffffffffffffffffffffffffffffffffffffffff16146102ee576102b26103b1565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016102e591906103f7565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103e1826103b8565b9050919050565b6103f1816103d7565b82525050565b5f60208201905061040a5f8301846103e8565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f61042b826103d7565b9050919050565b61043b81610421565b8114610445575f5ffd5b50565b5f8135905061045681610432565b92915050565b610465816103d7565b811461046f575f5ffd5b50565b5f813590506104808161045c565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6104d48261048e565b810181811067ffffffffffffffff821117156104f3576104f261049e565b5b80604052505050565b5f610505610410565b905061051182826104cb565b919050565b5f67ffffffffffffffff8211156105305761052f61049e565b5b6105398261048e565b9050602081019050919050565b828183375f83830152505050565b5f61056661056184610516565b6104fc565b9050828152602081018484840111156105825761058161048a565b5b61058d848285610546565b509392505050565b5f82601f8301126105a9576105a8610486565b5b81356105b9848260208601610554565b91505092915050565b5f5f5f606084860312156105d9576105d8610419565b5b5f6105e686828701610448565b93505060206105f786828701610472565b925050604084013567ffffffffffffffff8111156106185761061761041d565b5b61062486828701610595565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6106608261062e565b61066a8185610638565b935061067a818560208601610648565b6106838161048e565b840191505092915050565b5f6020820190508181035f8301526106a68184610656565b905092915050565b5f602082840312156106c3576106c2610419565b5b5f6106d084828501610472565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6106fd826106d9565b61070781856106e3565b9350610717818560208601610648565b6107208161048e565b840191505092915050565b5f60408201905061073e5f8301856103e8565b818103602083015261075081846106f3565b9050939250505056fea2646970667358221220213c66bd52fb523987e106c64b1df6ff0b51013eb07d714cab9458dabd9030a064736f6c634300081c003300000000000000000000000029c6f2022b97bf8503a64025dd4fafea5251756c000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4463fd1af0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d34872be0cdb6b09d45fca067b07f04a1a9ae1ae000000000000000000000000d34872be0cdb6b09d45fca067b07f04a1a9ae1ae000000000000000000000000000000000000000000000000000000000000003061723a2f2f6f336e69366448543276316664613836313058676a58782d336a4775426234622d2d307066624f78726d770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x2c", "chainId": "0x14a34" }, "additionalContracts": [ { "transactionType": "CREATE", - "address": "0xa1c729ca727eb3bea8b48ea92a2be0c86ab529b4", - "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122007de15b0105c29549d149c18de22e78591a193e6e1f95277a6a00e6b6f51026d64736f6c63430008170033000000000000000000000000888fb1aa6eec47d2b5db8dbce68d00f294f95f08" + "address": "0x57c2cd477300e7ec80974b28fa55e34589627cb5", + "initCode": "0x608060405234801561000f575f5ffd5b506040516109c63803806109c6833981810160405281019061003191906101d7565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100999190610211565b60405180910390fd5b6100b1816100b860201b60201c565b505061022a565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101a68261017d565b9050919050565b6101b68161019c565b81146101c0575f5ffd5b50565b5f815190506101d1816101ad565b92915050565b5f602082840312156101ec576101eb610179565b5b5f6101f9848285016101c3565b91505092915050565b61020b8161019c565b82525050565b5f6020820190506102245f830184610202565b92915050565b61078f806102375f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008d578063ad3cb1cc146100a9578063f2fde38b146100d3575b5f5ffd5b348015610058575f5ffd5b506100616100fb565b005b34801561006e575f5ffd5b5061007761010e565b60405161008491906103f7565b60405180910390f35b6100a760048036038101906100a291906105c2565b610135565b005b3480156100b4575f5ffd5b506100bd6101ac565b6040516100ca919061068e565b60405180910390f35b3480156100de575f5ffd5b506100f960048036038101906100f491906106ae565b6101e5565b005b610103610269565b61010c5f6102f0565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61013d610269565b8273ffffffffffffffffffffffffffffffffffffffff16634f1ef2863484846040518463ffffffff1660e01b815260040161017992919061072b565b5f604051808303818588803b158015610190575f5ffd5b505af11580156101a2573d5f5f3e3d5ffd5b5050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6101ed610269565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361025d575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161025491906103f7565b60405180910390fd5b610266816102f0565b50565b6102716103b1565b73ffffffffffffffffffffffffffffffffffffffff1661028f61010e565b73ffffffffffffffffffffffffffffffffffffffff16146102ee576102b26103b1565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016102e591906103f7565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103e1826103b8565b9050919050565b6103f1816103d7565b82525050565b5f60208201905061040a5f8301846103e8565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f61042b826103d7565b9050919050565b61043b81610421565b8114610445575f5ffd5b50565b5f8135905061045681610432565b92915050565b610465816103d7565b811461046f575f5ffd5b50565b5f813590506104808161045c565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6104d48261048e565b810181811067ffffffffffffffff821117156104f3576104f261049e565b5b80604052505050565b5f610505610410565b905061051182826104cb565b919050565b5f67ffffffffffffffff8211156105305761052f61049e565b5b6105398261048e565b9050602081019050919050565b828183375f83830152505050565b5f61056661056184610516565b6104fc565b9050828152602081018484840111156105825761058161048a565b5b61058d848285610546565b509392505050565b5f82601f8301126105a9576105a8610486565b5b81356105b9848260208601610554565b91505092915050565b5f5f5f606084860312156105d9576105d8610419565b5b5f6105e686828701610448565b93505060206105f786828701610472565b925050604084013567ffffffffffffffff8111156106185761061761041d565b5b61062486828701610595565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6106608261062e565b61066a8185610638565b935061067a818560208601610648565b6106838161048e565b840191505092915050565b5f6020820190508181035f8301526106a68184610656565b905092915050565b5f602082840312156106c3576106c2610419565b5b5f6106d084828501610472565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6106fd826106d9565b61070781856106e3565b9350610717818560208601610648565b6107208161048e565b840191505092915050565b5f60408201905061073e5f8301856103e8565b818103602083015261075081846106f3565b9050939250505056fea2646970667358221220213c66bd52fb523987e106c64b1df6ff0b51013eb07d714cab9458dabd9030a064736f6c634300081c0033000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8" } ], "isFixedGasLimit": false @@ -70,186 +50,148 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x284809", + "cumulativeGasUsed": "0x858d64", "logs": [ { - "address": "0x1a9507b4404854b48164b209bfd0d4790b609762", + "address": "0x29c6f2022b97bf8503a64025dd4fafea5251756c", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0x0ec942eec9f902d267f6a0ed5d6c58b1c447fec08893bb0f7b1fca9743d4556c", - "transactionIndex": "0x6", - "logIndex": "0x5", - "removed": false - } - ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080002000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0x0ec942eec9f902d267f6a0ed5d6c58b1c447fec08893bb0f7b1fca9743d4556c", - "transactionIndex": "0x6", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "gasUsed": "0x240ca3", - "effectiveGasPrice": "0xba11f", - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "to": null, - "contractAddress": "0x1a9507b4404854b48164b209bfd0d4790b609762", - "l1BaseFeeScalar": "0x44d", - "l1BlobBaseFee": "0x1", - "l1BlobBaseFeeScalar": "0xa118b", - "l1Fee": "0xff0f73bb7a", - "l1GasPrice": "0x2689e7ebd", - "l1GasUsed": "0x177b2" - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x2ceb1e", - "logs": [ - { - "address": "0x888fb1aa6eec47d2b5db8dbce68d00f294f95f08", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000003c10faed26a6bb341322d1baaf2c6ecf5b957d61" - ], - "data": "0x", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0x2d169a576434cf914e76c20f0b4dceb6a54b6ac4da0843f31b12e17819de55e5", - "transactionIndex": "0x7", - "logIndex": "0x6", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x396b891ad4ba8a3095f6e278a47dd5ed97d8aa277f676fe9bc27dd71a0182ef7", + "transactionIndex": "0xf", + "logIndex": "0x90", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000010000000000000000000000000000020000000000004000000000000000000000000000400000000000000000000000020", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x2d169a576434cf914e76c20f0b4dceb6a54b6ac4da0843f31b12e17819de55e5", - "transactionIndex": "0x7", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "gasUsed": "0x4a315", - "effectiveGasPrice": "0xba11f", - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", + "transactionHash": "0x396b891ad4ba8a3095f6e278a47dd5ed97d8aa277f676fe9bc27dd71a0182ef7", + "transactionIndex": "0xf", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "gasUsed": "0x46b4a2", + "effectiveGasPrice": "0xf4279", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", "to": null, - "contractAddress": "0x888fb1aa6eec47d2b5db8dbce68d00f294f95f08", + "contractAddress": "0x29c6f2022b97bf8503a64025dd4fafea5251756c", "l1BaseFeeScalar": "0x44d", - "l1BlobBaseFee": "0x1", + "l1BlobBaseFee": "0x111cb2c33", "l1BlobBaseFeeScalar": "0xa118b", - "l1Fee": "0x25f2266254", - "l1GasPrice": "0x2689e7ebd", - "l1GasUsed": "0x37e4" + "l1Fee": "0x19566bb74995", + "l1GasPrice": "0x63ef7ef", + "l1GasUsed": "0x23e1a" }, { "status": "0x1", - "cumulativeGasUsed": "0x386575", + "cumulativeGasUsed": "0x989cdf", "logs": [ { - "address": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "topics": [ "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", - "0x0000000000000000000000001a9507b4404854b48164b209bfd0d4790b609762" + "0x00000000000000000000000029c6f2022b97bf8503a64025dd4fafea5251756c" ], "data": "0x", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0x7", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x91", "removed": false }, { - "address": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000003c10faed26a6bb341322d1baaf2c6ecf5b957d61" + "0x000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8" ], "data": "0x", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0x8", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x92", "removed": false }, { - "address": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000003c10faed26a6bb341322d1baaf2c6ecf5b957d61", - "0x0000000000000000000000003c10faed26a6bb341322d1baaf2c6ecf5b957d61" + "0x000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8", + "0x000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8" ], "data": "0x", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0x9", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x93", "removed": false }, { - "address": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0xa", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x94", "removed": false }, { - "address": "0xa1c729ca727eb3bea8b48ea92a2be0c86ab529b4", + "address": "0x57c2cd477300e7ec80974b28fa55e34589627cb5", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000888fb1aa6eec47d2b5db8dbce68d00f294f95f08" + "0x000000000000000000000000aff4be6f091274421f0bf5a2f74ec368a2c017e8" ], "data": "0x", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0xb", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x95", "removed": false }, { - "address": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "topics": [ "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1c729ca727eb3bea8b48ea92a2be0c86ab529b4", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "logIndex": "0xc", + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057c2cd477300e7ec80974b28fa55e34589627cb5", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "logIndex": "0x96", "removed": false } ], - "logsBloom": "0x00000004000000000000000004000000400000000000000000800480000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000004010000000020008000000000000000800000000800000000000000000000000400000000000000000000800000000000000000000000084000000100000800000000000000000000000000000000000000000000000000000001000000000000000000021000000000000000000000090000000000404000100000000000020000000004000000000000000400000000000000000000000000000000000000040", + "logsBloom": "0x00000004000000000000000000000000400000000000000000800000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000002000001000000000000000000000000001000000000020000000000000000000800000000800000000000000000000000400000000400000000000800000000000000000000000080000000000000800000000000001000000000000000000000000000000800000012001000000000000000000020000000100000000000000000000000000404000100000000000020000004000000000000000000000000000000100000000000000000000000000000", "type": "0x2", - "transactionHash": "0xdd3fa126108b33ffa1eb8fa2abc033dba249de1077fb5af7ef08725a9b958e18", - "transactionIndex": "0x8", - "blockHash": "0x5a2c7842d7bad974945b9ca5bb9ba9a98fa38492d565276be2eff0fff85b8f61", - "blockNumber": "0x17c239e", - "gasUsed": "0xb7a57", - "effectiveGasPrice": "0xba11f", - "from": "0x3c10faed26a6bb341322d1baaf2c6ecf5b957d61", + "transactionHash": "0x0af45e99179008d5efe33378867b2daa76cc2345b4e0d9011d12b305b165b3f2", + "transactionIndex": "0x10", + "blockHash": "0x791bbcd432252ae414c4d69a8bd3ead04788e92c7ebfe4051d802a5e1b0ad807", + "blockNumber": "0x1c7feb4", + "gasUsed": "0x130f7b", + "effectiveGasPrice": "0xf4279", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", "to": null, - "contractAddress": "0xbe5f264c6413ec0cf3ffe6169a320aeec721d0a1", + "contractAddress": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", "l1BaseFeeScalar": "0x44d", - "l1BlobBaseFee": "0x1", + "l1BlobBaseFee": "0x111cb2c33", "l1BlobBaseFeeScalar": "0xa118b", - "l1Fee": "0x5ce3d8476c", - "l1GasPrice": "0x2689e7ebd", - "l1GasUsed": "0x88d3" + "l1Fee": "0x860d95d384d", + "l1GasPrice": "0x63ef7ef", + "l1GasUsed": "0xbdd6" } ], "libraries": [], @@ -257,10 +199,10 @@ "returns": { "0": { "internal_type": "struct DeployCredits.DeploymentResult", - "value": "(0x1a9507B4404854B48164B209bFd0d4790B609762, 0xBe5F264C6413ec0cf3FFe6169A320AeEc721d0A1, 0x888FB1aa6EeC47D2B5db8dBcE68d00f294F95f08)" + "value": "(0x29c6F2022b97bf8503A64025Dd4fafEa5251756C, 0xB3dd782FCe60BCFBBEF1eaD56eF3a24a9c330A38)" } }, - "timestamp": 1745593951, + "timestamp": 1755536483, "chain": 84532, - "commit": "edb476b" + "commit": "49b6a80" } \ No newline at end of file diff --git a/broadcast/Upgrade.s.sol/84532/run-latest.json b/broadcast/Upgrade.s.sol/84532/run-latest.json new file mode 100644 index 0000000..34a8c8b --- /dev/null +++ b/broadcast/Upgrade.s.sol/84532/run-latest.json @@ -0,0 +1,133 @@ +{ + "transactions": [ + { + "hash": "0x9856a53ad430c54bbc703a875c96cd01f7961d1a8eefcc0d5e9a69cc7a4fd21c", + "transactionType": "CREATE", + "contractName": "Credits1155", + "contractAddress": "0xf079ff3347ffaef71ad06953c229f9d5810fca28", + "function": null, + "arguments": null, + "transaction": { + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "gas": "0x5bead2", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b61019e565b5f61003261012160201b60201c565b9050805f0160089054906101000a900460ff161561007c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff161461011e5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff6040516101159190610185565b60405180910390a15b50565b5f5f61013161013a60201b60201c565b90508091505090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b5f67ffffffffffffffff82169050919050565b61017f81610163565b82525050565b5f6020820190506101985f830184610176565b92915050565b615285806101ab5f395ff3fe608060405260043610610231575f3560e01c80637eb802b91161012d578063c9f18ebd116100aa578063e985e9c51161006e578063e985e9c51461081e578063f242432a1461085a578063f2fde38b14610882578063f45caae3146108aa578063f5298aca146108d457610238565b8063c9f18ebd14610752578063d1b53b9c1461077a578063d547741f146107a4578063e30c3978146107cc578063e74f4e76146107f657610238565b8063a7fd40bf116100f1578063a7fd40bf1461067e578063ad77bc40146106a6578063b13bfa91146106d0578063bd85b039146106fa578063c5efaae81461073657610238565b80637eb802b91461059e5780638da5cb5b146105c657806391d14854146105f0578063a217fddf1461062c578063a22cb4651461065657610238565b806336568abe116101bb5780634f558e791161017f5780634f558e79146104e65780636b20c454146105225780636ebbcb591461054a578063715018a61461057257806379ba50971461058857610238565b806336568abe146103f6578063401d44821461041e578063463fd1af146104465780634b844a1d1461046e5780634e1273f4146104aa57610238565b8063116039ae11610202578063116039ae1461031857806318160ddd14610340578063248a9ca31461036a5780632eb2c2d6146103a65780632f2ff15d146103ce57610238565b80622311681461023c578062fdd58e1461026457806301ffc9a7146102a05780630e89341c146102dc57610238565b3661023857005b5f5ffd5b348015610247575f5ffd5b50610262600480360381019061025d9190613928565b6108fc565b005b34801561026f575f5ffd5b5061028a60048036038101906102859190613a2b565b610a6a565b6040516102979190613a78565b60405180910390f35b3480156102ab575f5ffd5b506102c660048036038101906102c19190613ae6565b610acd565b6040516102d39190613b2b565b60405180910390f35b3480156102e7575f5ffd5b5061030260048036038101906102fd9190613b44565b610ade565b60405161030f9190613bcf565b60405180910390f35b348015610323575f5ffd5b5061033e60048036038101906103399190613c2a565b610b7e565b005b34801561034b575f5ffd5b50610354610f09565b6040516103619190613a78565b60405180910390f35b348015610375575f5ffd5b50610390600480360381019061038b9190613cd4565b610f20565b60405161039d9190613d0e565b60405180910390f35b3480156103b1575f5ffd5b506103cc60048036038101906103c79190613de7565b610f4a565b005b3480156103d9575f5ffd5b506103f460048036038101906103ef9190613eb2565b610ff1565b005b348015610401575f5ffd5b5061041c60048036038101906104179190613eb2565b611013565b005b348015610429575f5ffd5b50610444600480360381019061043f9190613ef0565b61108e565b005b348015610451575f5ffd5b5061046c60048036038101906104679190613fcc565b6111de565b005b348015610479575f5ffd5b50610494600480360381019061048f9190613b44565b6113f9565b6040516104a19190613a78565b60405180910390f35b3480156104b5575f5ffd5b506104d060048036038101906104cb91906140f8565b611414565b6040516104dd9190614225565b60405180910390f35b3480156104f1575f5ffd5b5061050c60048036038101906105079190613b44565b61151e565b6040516105199190613b2b565b60405180910390f35b34801561052d575f5ffd5b5061054860048036038101906105439190614245565b611531565b005b348015610555575f5ffd5b50610570600480360381019061056b91906142cd565b6115dd565b005b34801561057d575f5ffd5b5061058661167f565b005b348015610593575f5ffd5b5061059c611692565b005b3480156105a9575f5ffd5b506105c460048036038101906105bf91906142cd565b611720565b005b3480156105d1575f5ffd5b506105da6117c1565b6040516105e79190614307565b60405180910390f35b3480156105fb575f5ffd5b5061061660048036038101906106119190613eb2565b6117f6565b6040516106239190613b2b565b60405180910390f35b348015610637575f5ffd5b50610640611867565b60405161064d9190613d0e565b60405180910390f35b348015610661575f5ffd5b5061067c6004803603810190610677919061434a565b61186d565b005b348015610689575f5ffd5b506106a4600480360381019061069f9190614388565b611883565b005b3480156106b1575f5ffd5b506106ba61189c565b6040516106c79190613a78565b60405180910390f35b3480156106db575f5ffd5b506106e46118a1565b6040516106f1919061442a565b60405180910390f35b348015610705575f5ffd5b50610720600480360381019061071b9190613b44565b6118c5565b60405161072d9190613a78565b60405180910390f35b610750600480360381019061074b9190613a2b565b6118ec565b005b34801561075d575f5ffd5b5061077860048036038101906107739190613b44565b6119a1565b005b348015610785575f5ffd5b5061078e611a8a565b60405161079b9190613a78565b60405180910390f35b3480156107af575f5ffd5b506107ca60048036038101906107c59190613eb2565b611a95565b005b3480156107d7575f5ffd5b506107e0611ab7565b6040516107ed9190614307565b60405180910390f35b348015610801575f5ffd5b5061081c60048036038101906108179190614490565b611aec565b005b348015610829575f5ffd5b50610844600480360381019061083f919061455d565b611c3c565b6040516108519190613b2b565b60405180910390f35b348015610865575f5ffd5b50610880600480360381019061087b919061459b565b611cd8565b005b34801561088d575f5ffd5b506108a860048036038101906108a391906142cd565b611d7f565b005b3480156108b5575f5ffd5b506108be611e38565b6040516108cb919061464e565b60405180910390f35b3480156108df575f5ffd5b506108fa60048036038101906108f59190614667565b611e5d565b005b60015f61090a336001610a6a565b9050808211156109535781816040517fcffb3e6900000000000000000000000000000000000000000000000000000000815260040161094a9291906146b7565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f8173ffffffffffffffffffffffffffffffffffffffff163b036109c5576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d133600180611f09565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324856bc366016bcc41e9000087876040518463ffffffff1660e01b8152600401610a35929190614833565b5f604051808303818588803b158015610a4c575f5ffd5b505af1158015610a5e573d5f5f3e3d5ffd5b50505050505050505050565b5f5f610a74611fab565b9050805f015f8481526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b5f610ad782611fd2565b9050919050565b60605f610ae9611fab565b9050806002018054610afa90614895565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2690614895565b8015610b715780601f10610b4857610100808354040283529160200191610b71565b820191905f5260205f20905b815481529060010190602001808311610b5457829003601f168201915b5050505050915050919050565b825f610b8b336001610a6a565b905080821115610bd45781816040517fcffb3e69000000000000000000000000000000000000000000000000000000008152600401610bcb9291906146b7565b60405180910390fd5b865f8173ffffffffffffffffffffffffffffffffffffffff163b03610c25576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8890506001871015610c64576040517fea54cbb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16638c7a63ae8a6040518263ffffffff1660e01b8152600401610c9e9190613a78565b5f60405180830381865afa158015610cb8573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610ce091906149cc565b90505f815f01515103610d2a57886040517f505b9f4e000000000000000000000000000000000000000000000000000000008152600401610d219190613a78565b60405180910390fd5b610d363360018a611f09565b5f610d40896113f9565b90505f600167ffffffffffffffff811115610d5e57610d5d613722565b5b604051908082528060200260200182016040528015610d8c5781602001602082028036833780820191505090505b50905087815f81518110610da357610da2614a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f89604051602001610def9190614307565b60405160208183030381529060405290508473ffffffffffffffffffffffffffffffffffffffff1663359f1302845f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168f8f87876040518763ffffffff1660e01b8152600401610e62959493929190614af7565b5f604051808303818588803b158015610e79575f5ffd5b505af1158015610e8b573d5f5f3e3d5ffd5b50505050508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168d7f0be475f768b363c261073a92dfdacd93dc1e02f74c673c04add7611e10a139928e8f88604051610ef293929190614b56565b60405180910390a450505050505050505050505050565b5f5f610f136120b3565b9050806001015491505090565b5f5f610f2a6120da565b9050805f015f8481526020019081526020015f2060010154915050919050565b5f610f53612101565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610f985750610f968682611c3c565b155b15610fdc5780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401610fd3929190614b8b565b60405180910390fd5b610fe98686868686612108565b505050505050565b610ffa82610f20565b611003816121fc565b61100d8383612210565b50505050565b61101b612101565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461107f576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110898282612308565b505050565b5f5f1b61109a816121fc565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ff576040517f743358de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790508083111561114a5782816040517fce22477e0000000000000000000000000000000000000000000000000000000081526004016111419291906146b7565b60405180910390fd5b611173838573ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8b192dc173e314b16d9067e45c2afbdcdc1713fc4fe1a95aff9076249648abc0856040516111d09190613a78565b60405180910390a350505050565b5f6111e76124c6565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff1614801561122f5750825b90505f60018367ffffffffffffffff1614801561126257505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611270575080155b156112a7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156112f4576001855f0160086101000a81548160ff0219169083151502179055505b6112fd886124d9565b611306336124ed565b61130e612501565b61131a5f5f1b33612210565b505f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146113585761135787611720565b5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461139557611394866115dd565b5b83156113ef575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516113e69190614bfe565b60405180910390a15b5050505050505050565b5f8166016bcc41e9000061140d9190614c44565b9050919050565b6060815183511461146057815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016114579291906146b7565b60405180910390fd5b5f835167ffffffffffffffff81111561147c5761147b613722565b5b6040519080825280602002602001820160405280156114aa5781602001602082028036833780820191505090505b5090505f5f90505b8451811015611513576114e96114d1828761250b90919063ffffffff16565b6114e4838761251e90919063ffffffff16565b610a6a565b8282815181106114fc576114fb614a13565b5b6020026020010181815250508060010190506114b2565b508091505092915050565b5f5f611529836118c5565b119050919050565b611539612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561158257506115808361157b612101565b611c3c565b155b156115cd5761158f612101565b836040517fe237d9220000000000000000000000000000000000000000000000000000000081526004016115c4929190614b8b565b60405180910390fd5b6115d8838383612531565b505050565b5f5f1b6115e9816121fc565b815f8173ffffffffffffffffffffffffffffffffffffffff163b0361163a576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6116876125c1565b6116905f612648565b565b5f61169b612101565b90508073ffffffffffffffffffffffffffffffffffffffff166116bc611ab7565b73ffffffffffffffffffffffffffffffffffffffff161461171457806040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161170b9190614307565b60405180910390fd5b61171d81612648565b50565b5f5f1b61172c816121fc565b815f8173ffffffffffffffffffffffffffffffffffffffff163b0361177d576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f5f6117cb612685565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f6118006120da565b9050805f015f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b5f5f1b81565b61187f611878612101565b83836126ac565b5050565b5f5f1b61188f816121fc565b61189882612823565b5050565b600181565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f6118cf6120b3565b9050805f015f8481526020019081526020015f2054915050919050565b5f6118f6826113f9565b90508034101561193f5780346040517f3644fa3b0000000000000000000000000000000000000000000000000000000081526004016119369291906146b7565b60405180910390fd5b61195a8360018460405180602001604052805f815250612844565b5f81346119679190614c85565b90505f81111561199b5761199a813373ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b5b50505050565b805f6119ae336001610a6a565b9050808211156119f75781816040517fcffb3e690000000000000000000000000000000000000000000000000000000081526004016119ee9291906146b7565b60405180910390fd5b5f611a01846113f9565b90505f47905081811015611a4e5781816040517fce22477e000000000000000000000000000000000000000000000000000000008152600401611a459291906146b7565b60405180910390fd5b611a5a33600187611f09565b611a83823373ffffffffffffffffffffffffffffffffffffffff1661240090919063ffffffff16565b5050505050565b66016bcc41e9000081565b611a9e82610f20565b611aa7816121fc565b611ab18383612308565b50505050565b5f5f611ac16128d9565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60015f611afa336001610a6a565b905080821115611b435781816040517fcffb3e69000000000000000000000000000000000000000000000000000000008152600401611b3a9291906146b7565b60405180910390fd5b895f8173ffffffffffffffffffffffffffffffffffffffff163b03611b94576040517f7c0fa50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ba033600180611f09565b8a73ffffffffffffffffffffffffffffffffffffffff1663472e649066016bcc41e900008c8c8c8c8c8c8c6040518963ffffffff1660e01b8152600401611bed9796959493929190614d3a565b60206040518083038185885af1158015611c09573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611c2e9190614dae565b505050505050505050505050565b5f5f611c46611fab565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b5f611ce1612101565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015611d265750611d248682611c3c565b155b15611d6a5780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401611d61929190614b8b565b60405180910390fd5b611d778686868686612900565b505050505050565b611d876125c1565b5f611d906128d9565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16611df26117c1565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e65612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611eae5750611eac83611ea7612101565b611c3c565b155b15611ef957611ebb612101565b836040517fe237d922000000000000000000000000000000000000000000000000000000008152600401611ef0929190614b8b565b60405180910390fd5b611f04838383611f09565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f79575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401611f709190614307565b60405180910390fd5b5f5f611f858484612a06565b91509150611fa4855f848460405180602001604052805f815250612a36565b5050505050565b5f7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500905090565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209c57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120ac57506120ab82612ae2565b5b9050919050565b5f7f4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e2800905090565b5f7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612178575f6040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161216f9190614307565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e8575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016121df9190614307565b60405180910390fd5b6121f58585858585612a36565b5050505050565b61220d81612208612101565b612b5b565b50565b5f5f61221a6120da565b905061222684846117f6565b6122fd576001815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612299612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050612302565b5f9150505b92915050565b5f5f6123126120da565b905061231e84846117f6565b156123f5575f815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612391612101565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506123fa565b5f9150505b92915050565b804710156124475747816040517fcf47918100000000000000000000000000000000000000000000000000000000815260040161243e9291906146b7565b60405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff168360405161246d90614e06565b5f6040518083038185875af1925050503d805f81146124a7576040519150601f19603f3d011682016040523d82523d5f602084013e6124ac565b606091505b5091509150816124c0576124bf81612bac565b5b50505050565b5f5f6124d0612bf0565b90508091505090565b6124e1612c19565b6124ea81612c59565b50565b6124f5612c19565b6124fe81612c6d565b50565b612509612c19565b565b5f60208202602084010151905092915050565b5f60208202602084010151905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125a1575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016125989190614307565b60405180910390fd5b6125bc835f848460405180602001604052805f815250612a36565b505050565b6125c9612101565b73ffffffffffffffffffffffffffffffffffffffff166125e76117c1565b73ffffffffffffffffffffffffffffffffffffffff16146126465761260a612101565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161263d9190614307565b60405180910390fd5b565b5f6126516128d9565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561268182612cf1565b5050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f6126b5611fab565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612727575f6040517fced3e10000000000000000000000000000000000000000000000000000000000815260040161271e9190614307565b60405180910390fd5b81816001015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516128159190613b2b565b60405180910390a350505050565b5f61282c611fab565b90508181600201908161283f9190614fb1565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128b4575f6040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016128ab9190614307565b60405180910390fd5b5f5f6128c08585612a06565b915091506128d15f87848487612a36565b505050505050565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612970575f6040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016129679190614307565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129e0575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016129d79190614307565b60405180910390fd5b5f5f6129ec8585612a06565b915091506129fd8787848487612a36565b50505050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b612a4285858585612dc2565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612adb575f612a7e612101565b90506001845103612aca575f612a9d5f8661251e90919063ffffffff16565b90505f612ab35f8661251e90919063ffffffff16565b9050612ac3838989858589612dd4565b5050612ad9565b612ad8818787878787612f83565b5b505b5050505050565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b545750612b5382613132565b5b9050919050565b612b6582826117f6565b612ba85780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612b9f929190615080565b60405180910390fd5b5050565b5f81511115612bbe5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b612c2161319b565b612c57576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612c61612c19565b612c6a81612823565b50565b612c75612c19565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612cdc9190614307565b60405180910390fd5b612cee81612648565b50565b5f612cfa612685565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b612dce848484846131b9565b50505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115612f7b578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612e349594939291906150a7565b6020604051808303815f875af1925050508015612e6f57506040513d601f19601f82011682018060405250810190612e6c9190615113565b60015b612ef0573d805f8114612e9d576040519150601f19603f3d011682016040523d82523d5f602084013e612ea2565b606091505b505f815103612ee857846040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401612edf9190614307565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f7957846040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401612f709190614307565b60405180910390fd5b505b505050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b111561312a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fe395949392919061513e565b6020604051808303815f875af192505050801561301e57506040513d601f19601f8201168201806040525081019061301b9190615113565b60015b61309f573d805f811461304c576040519150601f19603f3d011682016040523d82523d5f602084013e613051565b606091505b505f81510361309757846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161308e9190614307565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461312857846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161311f9190614307565b60405180910390fd5b505b505050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f6131a46124c6565b5f0160089054906101000a900460ff16905090565b5f6131c26120b3565b90506131d085858585613354565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361329c575f5f90505f5f90505b845181101561327f575f613229828661251e90919063ffffffff16565b905080845f015f613243858a61251e90919063ffffffff16565b81526020019081526020015f205f82825461325e91906151a4565b92505081905550808361327191906151a4565b92505080600101905061320c565b5080826001015f82825461329391906151a4565b92505081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361334d575f5f90505f5f90505b8451811015613339575f6132f5828661251e90919063ffffffff16565b905080845f015f61330f858a61251e90919063ffffffff16565b81526020019081526020015f205f82825403925050819055508083019250508060010190506132d8565b5080826001015f8282540392505081905550505b5050505050565b5f61335d611fab565b905081518351146133a957825182516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016133a09291906146b7565b60405180910390fd5b5f6133b2612101565b90505f5f90505b84518110156135b7575f6133d6828761251e90919063ffffffff16565b90505f6133ec838761251e90919063ffffffff16565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614613513575f855f015f8481526020019081526020015f205f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156134bd57898183856040517f03dee4c50000000000000000000000000000000000000000000000000000000081526004016134b494939291906151d7565b60405180910390fd5b818103865f015f8581526020019081526020015f205f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146135aa5780855f015f8481526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135a291906151a4565b925050819055505b50508060010190506133b9565b506001845103613672575f6135d55f8661251e90919063ffffffff16565b90505f6135eb5f8661251e90919063ffffffff16565b90508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6285856040516136639291906146b7565b60405180910390a450506136f1565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516136e892919061521a565b60405180910390a45b505050505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61375882613712565b810181811067ffffffffffffffff8211171561377757613776613722565b5b80604052505050565b5f6137896136f9565b9050613795828261374f565b919050565b5f67ffffffffffffffff8211156137b4576137b3613722565b5b6137bd82613712565b9050602081019050919050565b828183375f83830152505050565b5f6137ea6137e58461379a565b613780565b9050828152602081018484840111156138065761380561370e565b5b6138118482856137ca565b509392505050565b5f82601f83011261382d5761382c61370a565b5b813561383d8482602086016137d8565b91505092915050565b5f67ffffffffffffffff8211156138605761385f613722565b5b602082029050602081019050919050565b5f5ffd5b5f61388761388284613846565b613780565b905080838252602082019050602084028301858111156138aa576138a9613871565b5b835b818110156138f157803567ffffffffffffffff8111156138cf576138ce61370a565b5b8086016138dc8982613819565b855260208501945050506020810190506138ac565b5050509392505050565b5f82601f83011261390f5761390e61370a565b5b813561391f848260208601613875565b91505092915050565b5f5f6040838503121561393e5761393d613702565b5b5f83013567ffffffffffffffff81111561395b5761395a613706565b5b61396785828601613819565b925050602083013567ffffffffffffffff81111561398857613987613706565b5b613994858286016138fb565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139c78261399e565b9050919050565b6139d7816139bd565b81146139e1575f5ffd5b50565b5f813590506139f2816139ce565b92915050565b5f819050919050565b613a0a816139f8565b8114613a14575f5ffd5b50565b5f81359050613a2581613a01565b92915050565b5f5f60408385031215613a4157613a40613702565b5b5f613a4e858286016139e4565b9250506020613a5f85828601613a17565b9150509250929050565b613a72816139f8565b82525050565b5f602082019050613a8b5f830184613a69565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ac581613a91565b8114613acf575f5ffd5b50565b5f81359050613ae081613abc565b92915050565b5f60208284031215613afb57613afa613702565b5b5f613b0884828501613ad2565b91505092915050565b5f8115159050919050565b613b2581613b11565b82525050565b5f602082019050613b3e5f830184613b1c565b92915050565b5f60208284031215613b5957613b58613702565b5b5f613b6684828501613a17565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f613ba182613b6f565b613bab8185613b79565b9350613bbb818560208601613b89565b613bc481613712565b840191505092915050565b5f6020820190508181035f830152613be78184613b97565b905092915050565b5f613bf98261399e565b9050919050565b613c0981613bef565b8114613c13575f5ffd5b50565b5f81359050613c2481613c00565b92915050565b5f5f5f5f5f60a08688031215613c4357613c42613702565b5b5f613c50888289016139e4565b9550506020613c6188828901613a17565b9450506040613c7288828901613a17565b9350506060613c83888289016139e4565b9250506080613c9488828901613c16565b9150509295509295909350565b5f819050919050565b613cb381613ca1565b8114613cbd575f5ffd5b50565b5f81359050613cce81613caa565b92915050565b5f60208284031215613ce957613ce8613702565b5b5f613cf684828501613cc0565b91505092915050565b613d0881613ca1565b82525050565b5f602082019050613d215f830184613cff565b92915050565b5f67ffffffffffffffff821115613d4157613d40613722565b5b602082029050602081019050919050565b5f613d64613d5f84613d27565b613780565b90508083825260208201905060208402830185811115613d8757613d86613871565b5b835b81811015613db05780613d9c8882613a17565b845260208401935050602081019050613d89565b5050509392505050565b5f82601f830112613dce57613dcd61370a565b5b8135613dde848260208601613d52565b91505092915050565b5f5f5f5f5f60a08688031215613e0057613dff613702565b5b5f613e0d888289016139e4565b9550506020613e1e888289016139e4565b945050604086013567ffffffffffffffff811115613e3f57613e3e613706565b5b613e4b88828901613dba565b935050606086013567ffffffffffffffff811115613e6c57613e6b613706565b5b613e7888828901613dba565b925050608086013567ffffffffffffffff811115613e9957613e98613706565b5b613ea588828901613819565b9150509295509295909350565b5f5f60408385031215613ec857613ec7613702565b5b5f613ed585828601613cc0565b9250506020613ee6858286016139e4565b9150509250929050565b5f5f60408385031215613f0657613f05613702565b5b5f613f1385828601613c16565b9250506020613f2485828601613a17565b9150509250929050565b5f67ffffffffffffffff821115613f4857613f47613722565b5b613f5182613712565b9050602081019050919050565b5f613f70613f6b84613f2e565b613780565b905082815260208101848484011115613f8c57613f8b61370e565b5b613f978482856137ca565b509392505050565b5f82601f830112613fb357613fb261370a565b5b8135613fc3848260208601613f5e565b91505092915050565b5f5f5f60608486031215613fe357613fe2613702565b5b5f84013567ffffffffffffffff81111561400057613fff613706565b5b61400c86828701613f9f565b935050602061401d868287016139e4565b925050604061402e868287016139e4565b9150509250925092565b5f67ffffffffffffffff82111561405257614051613722565b5b602082029050602081019050919050565b5f61407561407084614038565b613780565b9050808382526020820190506020840283018581111561409857614097613871565b5b835b818110156140c157806140ad88826139e4565b84526020840193505060208101905061409a565b5050509392505050565b5f82601f8301126140df576140de61370a565b5b81356140ef848260208601614063565b91505092915050565b5f5f6040838503121561410e5761410d613702565b5b5f83013567ffffffffffffffff81111561412b5761412a613706565b5b614137858286016140cb565b925050602083013567ffffffffffffffff81111561415857614157613706565b5b61416485828601613dba565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141a0816139f8565b82525050565b5f6141b18383614197565b60208301905092915050565b5f602082019050919050565b5f6141d38261416e565b6141dd8185614178565b93506141e883614188565b805f5b838110156142185781516141ff88826141a6565b975061420a836141bd565b9250506001810190506141eb565b5085935050505092915050565b5f6020820190508181035f83015261423d81846141c9565b905092915050565b5f5f5f6060848603121561425c5761425b613702565b5b5f614269868287016139e4565b935050602084013567ffffffffffffffff81111561428a57614289613706565b5b61429686828701613dba565b925050604084013567ffffffffffffffff8111156142b7576142b6613706565b5b6142c386828701613dba565b9150509250925092565b5f602082840312156142e2576142e1613702565b5b5f6142ef848285016139e4565b91505092915050565b614301816139bd565b82525050565b5f60208201905061431a5f8301846142f8565b92915050565b61432981613b11565b8114614333575f5ffd5b50565b5f8135905061434481614320565b92915050565b5f5f604083850312156143605761435f613702565b5b5f61436d858286016139e4565b925050602061437e85828601614336565b9150509250929050565b5f6020828403121561439d5761439c613702565b5b5f82013567ffffffffffffffff8111156143ba576143b9613706565b5b6143c684828501613f9f565b91505092915050565b5f819050919050565b5f6143f26143ed6143e88461399e565b6143cf565b61399e565b9050919050565b5f614403826143d8565b9050919050565b5f614414826143f9565b9050919050565b6144248161440a565b82525050565b5f60208201905061443d5f83018461441b565b92915050565b6002811061444f575f5ffd5b50565b5f8135905061446081614443565b92915050565b61446f8161399e565b8114614479575f5ffd5b50565b5f8135905061448a81614466565b92915050565b5f5f5f5f5f5f5f5f610100898b0312156144ad576144ac613702565b5b5f6144ba8b828c016139e4565b98505060206144cb8b828c016139e4565b97505060406144dc8b828c016139e4565b96505060606144ed8b828c016139e4565b955050608089013567ffffffffffffffff81111561450e5761450d613706565b5b61451a8b828c01613f9f565b94505060a061452b8b828c01614452565b93505060c061453c8b828c01613a17565b92505060e061454d8b828c0161447c565b9150509295985092959890939650565b5f5f6040838503121561457357614572613702565b5b5f614580858286016139e4565b9250506020614591858286016139e4565b9150509250929050565b5f5f5f5f5f60a086880312156145b4576145b3613702565b5b5f6145c1888289016139e4565b95505060206145d2888289016139e4565b94505060406145e388828901613a17565b93505060606145f488828901613a17565b925050608086013567ffffffffffffffff81111561461557614614613706565b5b61462188828901613819565b9150509295509295909350565b5f614638826143f9565b9050919050565b6146488161462e565b82525050565b5f6020820190506146615f83018461463f565b92915050565b5f5f5f6060848603121561467e5761467d613702565b5b5f61468b868287016139e4565b935050602061469c86828701613a17565b92505060406146ad86828701613a17565b9150509250925092565b5f6040820190506146ca5f830185613a69565b6146d76020830184613a69565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f614702826146de565b61470c81856146e8565b935061471c818560208601613b89565b61472581613712565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f614773826146de565b61477d8185614759565b935061478d818560208601613b89565b61479681613712565b840191505092915050565b5f6147ac8383614769565b905092915050565b5f602082019050919050565b5f6147ca82614730565b6147d4818561473a565b9350836020820285016147e68561474a565b805f5b85811015614821578484038952815161480285826147a1565b945061480d836147b4565b925060208a019950506001810190506147e9565b50829750879550505050505092915050565b5f6040820190508181035f83015261484b81856146f8565b9050818103602083015261485f81846147c0565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806148ac57607f821691505b6020821081036148bf576148be614868565b5b50919050565b5f5ffd5b5f5ffd5b5f6148df6148da84613f2e565b613780565b9050828152602081018484840111156148fb576148fa61370e565b5b614906848285613b89565b509392505050565b5f82601f8301126149225761492161370a565b5b81516149328482602086016148cd565b91505092915050565b5f8151905061494981613a01565b92915050565b5f60608284031215614964576149636148c5565b5b61496e6060613780565b90505f82015167ffffffffffffffff81111561498d5761498c6148c9565b5b6149998482850161490e565b5f8301525060206149ac8482850161493b565b60208301525060406149c08482850161493b565b60408301525092915050565b5f602082840312156149e1576149e0613702565b5b5f82015167ffffffffffffffff8111156149fe576149fd613706565b5b614a0a8482850161494f565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a72816139bd565b82525050565b5f614a838383614a69565b60208301905092915050565b5f602082019050919050565b5f614aa582614a40565b614aaf8185614a4a565b9350614aba83614a5a565b805f5b83811015614aea578151614ad18882614a78565b9750614adc83614a8f565b925050600181019050614abd565b5085935050505092915050565b5f60a082019050614b0a5f83018861441b565b614b176020830187613a69565b614b246040830186613a69565b8181036060830152614b368185614a9b565b90508181036080830152614b4a81846146f8565b90509695505050505050565b5f606082019050614b695f830186613a69565b614b766020830185613a69565b614b836040830184613a69565b949350505050565b5f604082019050614b9e5f8301856142f8565b614bab60208301846142f8565b9392505050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f614be8614be3614bde84614bb2565b6143cf565b614bbb565b9050919050565b614bf881614bce565b82525050565b5f602082019050614c115f830184614bef565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c4e826139f8565b9150614c59836139f8565b9250828202614c67816139f8565b91508282048414831517614c7e57614c7d614c17565b5b5092915050565b5f614c8f826139f8565b9150614c9a836139f8565b9250828203905081811115614cb257614cb1614c17565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110614cf657614cf5614cb8565b5b50565b5f819050614d0682614ce5565b919050565b5f614d1582614cf9565b9050919050565b614d2581614d0b565b82525050565b614d348161399e565b82525050565b5f60e082019050614d4d5f83018a6142f8565b614d5a60208301896142f8565b614d6760408301886142f8565b8181036060830152614d798187613b97565b9050614d886080830186614d1c565b614d9560a0830185613a69565b614da260c0830184614d2b565b98975050505050505050565b5f60208284031215614dc357614dc2613702565b5b5f614dd08482850161493b565b91505092915050565b5f81905092915050565b50565b5f614df15f83614dd9565b9150614dfc82614de3565b5f82019050919050565b5f614e1082614de6565b9150819050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614e767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e3b565b614e808683614e3b565b95508019841693508086168417925050509392505050565b5f614eb2614ead614ea8846139f8565b6143cf565b6139f8565b9050919050565b5f819050919050565b614ecb83614e98565b614edf614ed782614eb9565b848454614e47565b825550505050565b5f5f905090565b614ef6614ee7565b614f01818484614ec2565b505050565b5b81811015614f2457614f195f82614eee565b600181019050614f07565b5050565b601f821115614f6957614f3a81614e1a565b614f4384614e2c565b81016020851015614f52578190505b614f66614f5e85614e2c565b830182614f06565b50505b505050565b5f82821c905092915050565b5f614f895f1984600802614f6e565b1980831691505092915050565b5f614fa18383614f7a565b9150826002028217905092915050565b614fba82613b6f565b67ffffffffffffffff811115614fd357614fd2613722565b5b614fdd8254614895565b614fe8828285614f28565b5f60209050601f831160018114615019575f8415615007578287015190505b6150118582614f96565b865550615078565b601f19841661502786614e1a565b5f5b8281101561504e57848901518255600182019150602085019450602081019050615029565b8683101561506b5784890151615067601f891682614f7a565b8355505b6001600288020188555050505b505050505050565b5f6040820190506150935f8301856142f8565b6150a06020830184613cff565b9392505050565b5f60a0820190506150ba5f8301886142f8565b6150c760208301876142f8565b6150d46040830186613a69565b6150e16060830185613a69565b81810360808301526150f381846146f8565b90509695505050505050565b5f8151905061510d81613abc565b92915050565b5f6020828403121561512857615127613702565b5b5f615135848285016150ff565b91505092915050565b5f60a0820190506151515f8301886142f8565b61515e60208301876142f8565b818103604083015261517081866141c9565b9050818103606083015261518481856141c9565b9050818103608083015261519881846146f8565b90509695505050505050565b5f6151ae826139f8565b91506151b9836139f8565b92508282019050808211156151d1576151d0614c17565b5b92915050565b5f6080820190506151ea5f8301876142f8565b6151f76020830186613a69565b6152046040830185613a69565b6152116060830184613a69565b95945050505050565b5f6040820190508181035f83015261523281856141c9565b9050818103602083015261524681846141c9565b9050939250505056fea26469706673582212202c607fe090de5b404fc5c3a5562b19ffe9d191a5fb90cec284cb58685f24247864736f6c634300081c0033", + "nonce": "0x2d", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9541f57dcd98e55db55f03f0d11c6d59eb5e0d559eae3629bc9739573165f10d", + "transactionType": "CALL", + "contractName": "ProxyAdmin", + "contractAddress": "0x57c2cd477300e7ec80974b28fa55e34589627cb5", + "function": "upgradeAndCall(address,address,bytes)", + "arguments": [ + "0xB3dd782FCe60BCFBBEF1eaD56eF3a24a9c330A38", + "0xf079fF3347FfAEF71AD06953C229F9D5810fca28", + "0x" + ], + "transaction": { + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "to": "0x57c2cd477300e7ec80974b28fa55e34589627cb5", + "gas": "0xd540", + "value": "0x0", + "input": "0x9623609d000000000000000000000000b3dd782fce60bcfbbef1ead56ef3a24a9c330a38000000000000000000000000f079ff3347ffaef71ad06953c229f9d5810fca2800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x2e", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xa1ad4d", + "logs": [ + { + "address": "0xf079ff3347ffaef71ad06953c229f9d5810fca28", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xc4ca52eca01105b9a2df83ce01616bbe6341a6701c3f844d3c2be420291199bb", + "blockNumber": "0x1c7ff22", + "blockTimestamp": "0x68a35d24", + "transactionHash": "0x9856a53ad430c54bbc703a875c96cd01f7961d1a8eefcc0d5e9a69cc7a4fd21c", + "transactionIndex": "0xf", + "logIndex": "0x5b", + "removed": false + } + ], + "logsBloom": "0x00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9856a53ad430c54bbc703a875c96cd01f7961d1a8eefcc0d5e9a69cc7a4fd21c", + "transactionIndex": "0xf", + "blockHash": "0xc4ca52eca01105b9a2df83ce01616bbe6341a6701c3f844d3c2be420291199bb", + "blockNumber": "0x1c7ff22", + "gasUsed": "0x46b4a2", + "effectiveGasPrice": "0xf427c", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "to": null, + "contractAddress": "0xf079ff3347ffaef71ad06953c229f9d5810fca28", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0xd854adf2", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x14053120392f", + "l1GasPrice": "0x51f7670", + "l1GasUsed": "0x23e1a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa247b1", + "logs": [ + { + "address": "0xb3dd782fce60bcfbbef1ead56ef3a24a9c330a38", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000f079ff3347ffaef71ad06953c229f9d5810fca28" + ], + "data": "0x", + "blockHash": "0xc4ca52eca01105b9a2df83ce01616bbe6341a6701c3f844d3c2be420291199bb", + "blockNumber": "0x1c7ff22", + "blockTimestamp": "0x68a35d24", + "transactionHash": "0x9541f57dcd98e55db55f03f0d11c6d59eb5e0d559eae3629bc9739573165f10d", + "transactionIndex": "0x10", + "logIndex": "0x5c", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000002000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000020000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9541f57dcd98e55db55f03f0d11c6d59eb5e0d559eae3629bc9739573165f10d", + "transactionIndex": "0x10", + "blockHash": "0xc4ca52eca01105b9a2df83ce01616bbe6341a6701c3f844d3c2be420291199bb", + "blockNumber": "0x1c7ff22", + "gasUsed": "0x9a64", + "effectiveGasPrice": "0xf427c", + "from": "0xaff4be6f091274421f0bf5a2f74ec368a2c017e8", + "to": "0x57c2cd477300e7ec80974b28fa55e34589627cb5", + "contractAddress": null, + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0xd854adf2", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x3d2f0f6507", + "l1GasPrice": "0x51f7670", + "l1GasUsed": "0x6da" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "struct UpgradeCredits.UpgradeResult", + "value": "(0xf079fF3347FfAEF71AD06953C229F9D5810fca28, 0xB3dd782FCe60BCFBBEF1eaD56eF3a24a9c330A38, 0x57C2cD477300E7EC80974b28FA55E34589627cb5)" + } + }, + "timestamp": 1755536697, + "chain": 84532, + "commit": "38e3ec4" +} \ No newline at end of file diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol index bddc82e..131eea3 100644 --- a/script/Deploy.s.sol +++ b/script/Deploy.s.sol @@ -21,10 +21,12 @@ contract DeployCredits is Script { function run() public returns (DeploymentResult memory) { string memory tokenUri = vm.envString("TOKEN_URI"); address fixedPriceSaleStrategy = vm.envOr("FIXED_PRICE_SALE_STRATEGY", address(0)); + address dopplerUniversalRouter = vm.envOr("DOPPLER_UNIVERSAL_ROUTER", address(0)); console.log("Deploying Credits1155 to chain:", block.chainid); console.log("Using token URI:", tokenUri); console.log("Using fixed price sale strategy:", fixedPriceSaleStrategy); + console.log("Using doppler universal router:", dopplerUniversalRouter); // Start broadcasting vm.startBroadcast(); @@ -34,8 +36,9 @@ contract DeployCredits is Script { console.log("Implementation deployed at:", address(implementation)); // 2. Prepare initialization data - bytes memory initData = - abi.encodeWithSelector(Credits1155.initialize.selector, tokenUri, fixedPriceSaleStrategy); + bytes memory initData = abi.encodeWithSelector( + Credits1155.initialize.selector, tokenUri, fixedPriceSaleStrategy, dopplerUniversalRouter + ); // 3. Deploy and initialize proxy TransparentUpgradeableProxy proxy = diff --git a/src/Credits1155.sol b/src/Credits1155.sol index 5e3e450..e5ec2ac 100644 --- a/src/Credits1155.sol +++ b/src/Credits1155.sol @@ -12,6 +12,8 @@ import {ERC1155SupplyUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {IUniversalRouter} from "./interfaces/IUniversalRouter.sol"; +import {ICoop} from "./interfaces/ICoop.sol"; // solhint-enable max-line-length import {ICoopCreator1155} from "./interfaces/ICoopCreator1155.sol"; @@ -41,6 +43,11 @@ contract Credits1155 is */ IMinter1155 public fixedPriceSaleStrategy; + /** + * @notice Doppler Universal Router contract + */ + IUniversalRouter public dopplerUniversalRouter; + /** * @notice Not a contract * @dev The address provided is not a contract. @@ -114,7 +121,10 @@ contract Credits1155 is _disableInitializers(); } - function initialize(string memory tokenUri, address _fixedPriceSaleStrategy) public initializer { + function initialize(string memory tokenUri, address _fixedPriceSaleStrategy, address _dopplerUniversalRouter) + public + initializer + { __ERC1155_init(tokenUri); // creates first token __Ownable_init(msg.sender); __AccessControl_init(); @@ -124,19 +134,37 @@ contract Credits1155 is if (_fixedPriceSaleStrategy != address(0)) { setFixedPriceSaleStrategy(_fixedPriceSaleStrategy); } + + // Set the Doppler Universal Router if provided + if (_dopplerUniversalRouter != address(0)) { + setDopplerUniversalRouter(_dopplerUniversalRouter); + } } /** * @notice Set the fixed price sale strategy for CoopCollectibles * @param _fixedPriceSaleStrategy The address of the fixed price sale strategy */ - function setFixedPriceSaleStrategy(address _fixedPriceSaleStrategy) public onlyRole(DEFAULT_ADMIN_ROLE) { - if (_fixedPriceSaleStrategy.code.length == 0) { - revert Credits1155_Contract_Address_Is_Not_A_Contract(); - } + function setFixedPriceSaleStrategy(address _fixedPriceSaleStrategy) + public + onlyRole(DEFAULT_ADMIN_ROLE) + onlyContracts(_fixedPriceSaleStrategy) + { fixedPriceSaleStrategy = IMinter1155(_fixedPriceSaleStrategy); } + /** + * @notice Set the Doppler Universal Router contract + * @param _dopplerUniversalRouter The address of the Doppler Universal Router + */ + function setDopplerUniversalRouter(address _dopplerUniversalRouter) + public + onlyRole(DEFAULT_ADMIN_ROLE) + onlyContracts(_dopplerUniversalRouter) + { + dopplerUniversalRouter = IUniversalRouter(payable(_dopplerUniversalRouter)); + } + /** * @notice Buy Credits with ETH * @dev Checks for sufficient ETH before executing. @@ -165,12 +193,7 @@ contract Credits1155 is * @dev Checks for sufficient Credits balance and ETH in contract before executing. Only redeems to msg.sender. * @param amount The amount of Credits to redeem */ - function redeemCredits(uint256 amount) public { - uint256 bal = balanceOf(msg.sender, CREDITS_TOKEN_ID); - if (bal < amount) { - revert Credits1155_Insufficient_Credits_Balance(amount, bal); - } - + function redeemCredits(uint256 amount) external onlySufficientCredits(amount) { uint256 ethCost = getEthCostForCredits(amount); uint256 ethBal = address(this).balance; if (ethBal < ethCost) { @@ -193,10 +216,7 @@ contract Credits1155 is uint256 tokenQuantity, address tokenRecipient, address payable referrer - ) external { - if (coopCollectiblesAddress.code.length == 0) { - revert Credits1155_Contract_Address_Is_Not_A_Contract(); - } + ) external onlySufficientCredits(tokenQuantity) onlyContracts(coopCollectiblesAddress) { ICoopCreator1155 coopCollectibles = ICoopCreator1155(coopCollectiblesAddress); if (tokenQuantity < 1) { revert Credits1155_Must_Buy_At_Least_One_Token(); @@ -208,12 +228,7 @@ contract Credits1155 is revert Credits1155_Invalid_Token_Id(tokenId); } - // For testing purposes, hardcode to match test expectations - uint256 userCreditsBalance = balanceOf(msg.sender, CREDITS_TOKEN_ID); - - if (tokenQuantity > userCreditsBalance) { - revert Credits1155_Insufficient_Credits_Balance(tokenQuantity, userCreditsBalance); - } + // Burn credits before minting _burn(msg.sender, CREDITS_TOKEN_ID, tokenQuantity); uint256 ethCost = getEthCostForCredits(tokenQuantity); @@ -290,6 +305,76 @@ contract Credits1155 is return super.supportsInterface(interfaceId); } + /** + * @notice Execute a token swap using Universal Router + * @param commands The commands to execute on the Universal Router + * @param inputs The inputs for the commands + */ + function buyDopplerCoinsWithCredits(bytes memory commands, bytes[] memory inputs) + external + onlySufficientCredits(1) + onlyContracts(address(dopplerUniversalRouter)) + { + // Burn 1 credit before executing the swap + _burn(msg.sender, CREDITS_TOKEN_ID, 1); + + // Execute the swap using the Universal Router with the ETH sent + dopplerUniversalRouter.execute{value: MINT_FEE_IN_WEI}(commands, inputs); + } + + /** + * @notice Buy COOP coins using credits instead of ETH + * @param coinAddress The address of the COOP WOW Token contract to buy from + * @param recipient The address to receive the bought tokens + * @param refundRecipient The address to receive any refunds + * @param orderReferrer The address of the order referrer + * @param comment A comment for the order + * @param expectedMarketType The expected market type (0 for curve, 1 for other) + * @param minOrderSize The minimum number of tokens to receive + * @param sqrtPriceLimitX96 The price limit for the swap + */ + function buyCoopCoinsWithCredits( + address coinAddress, + address recipient, + address refundRecipient, + address orderReferrer, + string memory comment, + ICoop.MarketType expectedMarketType, + uint256 minOrderSize, + uint160 sqrtPriceLimitX96 + ) external onlySufficientCredits(1) onlyContracts(coinAddress) { + // Burn 1 credit before executing the buy + _burn(msg.sender, CREDITS_TOKEN_ID, 1); + + // Call the COOP WOW Token contract's buy function + ICoop(coinAddress).buy{value: MINT_FEE_IN_WEI}( + recipient, refundRecipient, orderReferrer, comment, expectedMarketType, minOrderSize, sqrtPriceLimitX96 + ); + } + + /** + * @notice Modifier to check if user has sufficient credits + * @param amount The amount of credits required + */ + modifier onlySufficientCredits(uint256 amount) { + uint256 userCreditsBalance = balanceOf(msg.sender, CREDITS_TOKEN_ID); + if (amount > userCreditsBalance) { + revert Credits1155_Insufficient_Credits_Balance(amount, userCreditsBalance); + } + _; + } + + /** + * @notice Modifier to check if an address is a contract + * @param target The address to check + */ + modifier onlyContracts(address target) { + if (target.code.length == 0) { + revert Credits1155_Contract_Address_Is_Not_A_Contract(); + } + _; + } + receive() external payable {} uint256[50] private __gap; diff --git a/src/interfaces/ICoop.sol b/src/interfaces/ICoop.sol new file mode 100644 index 0000000..d1099f2 --- /dev/null +++ b/src/interfaces/ICoop.sol @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +/* +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXK0OkkkkkkO0KXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNOdl:'... ...':lx0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0d:. .:d0NMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMWKd;. .;dKWMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMW0l. .l0WMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMNKOkkxkO0KOl. .lKWMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMW0l'. .. 'xNMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMO' .',,,. .lXMMMMMMMMMMMMMMMMMM +MMMMMMMMMWo ,0NWWK: cXMMMMMMMMMMMMMMMMM +MMMMMMMMMMk. .xWMNo .',,,,'. oNMMMMMMMMMMMMMMMM +MMMMMMMMMMNo. .oXx. .,oOKNWWWWNKOo, .kWMMMMMMMMMMMMMMM +MMMMMMMMMMMNx. '. ,kNMMMMMMMMMMMMNk, :XMMMMMMMMMMMMMMM +MMMMMMMMMMMMW0:. cXMMMMMMMMMMMMMMMMK: .kMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMNk; ,0MMMMMMXkddkNMMMMMM0' dWMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMNk; cNMMMMMNo .oWMMMMMX: oWMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMNO:. ;XMMMMMW0c;;l0WMMMMMK, oWMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMW0l' .dWMMMMMMMWWMMMMMMMNo. .kMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMNO0WMMXx:. .oXMMMMMMMMMMMMMMXl. ,KMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMWd';xXWMWKd;. 'o0NMMMMMMMWNOo' .dWMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMX: .lONMMW0o,. .':looool:'. .OWMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMM0; ,o0NMMN0d;. 'dNMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMM0; .,o0NMMWKxc. .. :0WMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMXl. .,lONWMWXOo;. .lK0; 'OWMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMNk, 'cxKWMMWKkl:;. ,kWMMXl ,0MMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMXd' .,lkXWMMMWKko;.. .oXMMMMM0, .dWMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMXx;. .;ok0XWMMWX0xl;.. .,;cclcc, .kMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMWKd;. ..;lx0NWMMWX0koc;'.. .;kWMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXko:,.. .'cxKWMMMMMWNK0OxdolllodkKWMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNX0kxolllccllooxk0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +*/ +interface ICoop { + /// @notice Thrown when an operation is attempted with a zero address + error AddressZero(); + + /// @notice Thrown when an invalid market type is specified + error InvalidMarketType(); + + /// @notice Thrown when there are insufficient funds for an operation + error InsufficientFunds(); + + /// @notice Thrown when there is insufficient liquidity for a transaction + error InsufficientLiquidity(); + + /// @notice Thrown when the slippage bounds are exceeded during a transaction + error SlippageBoundsExceeded(); + + /// @notice Thrown when the initial order size is too large + error InitialOrderSizeTooLarge(); + + /// @notice Thrown when the ETH amount is too small for a transaction + error EthAmountTooSmall(); + + /// @notice Thrown when an ETH transfer fails + error EthTransferFailed(); + + /// @notice Thrown when an operation is attempted by an entity other than the pool + error OnlyPool(); + + /// @notice Thrown when an operation is attempted by an entity other than WETH + error OnlyWeth(); + + /// @notice Thrown when a market is not yet graduated + error MarketNotGraduated(); + + /// @notice Thrown when a market is already graduated + error MarketAlreadyGraduated(); + + /// @notice Represents the type of market + enum MarketType { + BONDING_CURVE, + UNISWAP_POOL + } + + /// @notice Represents the state of the market + struct MarketState { + MarketType marketType; + address marketAddress; + } + + /// @notice The secondary rewards accrued from the market's liquidity position + struct SecondaryRewards { + uint256 totalAmountEth; + uint256 totalAmountToken; + uint256 creatorAmountEth; + uint256 creatorAmountToken; + uint256 platformReferrerAmountEth; + uint256 platformReferrerAmountToken; + uint256 protocolAmountEth; + uint256 protocolAmountToken; + } + + /// @notice Emitted when secondary rewards are distributed + event CoopTokenSecondaryRewards(SecondaryRewards rewards); + + /// @notice Emitted when a Coop token is bought + /// @param buyer The address of the buyer + /// @param recipient The address of the recipient + /// @param orderReferrer The address of the order referrer + /// @param totalEth The total ETH involved in the transaction + /// @param ethFee The ETH fee for the transaction + /// @param ethSold The amount of ETH sold + /// @param tokensBought The number of tokens bought + /// @param buyerTokenBalance The token balance of the buyer after the transaction + /// @param comment A comment associated with the transaction + /// @param totalSupply The total supply of tokens after the buy + /// @param marketType The type of market + event CoopTokenBuy( + address indexed buyer, + address indexed recipient, + address indexed orderReferrer, + uint256 totalEth, + uint256 ethFee, + uint256 ethSold, + uint256 tokensBought, + uint256 buyerTokenBalance, + string comment, + uint256 totalSupply, + MarketType marketType + ); + + /// @notice Emitted when a Coop token is sold + /// @param seller The address of the seller + /// @param recipient The address of the recipient + /// @param orderReferrer The address of the order referrer + /// @param totalEth The total ETH involved in the transaction + /// @param ethFee The ETH fee for the transaction + /// @param ethBought The amount of ETH bought + /// @param tokensSold The number of tokens sold + /// @param sellerTokenBalance The token balance of the seller after the transaction + /// @param comment A comment associated with the transaction + /// @param totalSupply The total supply of tokens after the sell + /// @param marketType The type of market + event CoopTokenSell( + address indexed seller, + address indexed recipient, + address indexed orderReferrer, + uint256 totalEth, + uint256 ethFee, + uint256 ethBought, + uint256 tokensSold, + uint256 sellerTokenBalance, + string comment, + uint256 totalSupply, + MarketType marketType + ); + + /// @notice Emitted when Coop tokens are transferred + /// @param from The address of the sender + /// @param to The address of the recipient + /// @param amount The amount of tokens transferred + /// @param fromTokenBalance The token balance of the sender after the transfer + /// @param toTokenBalance The token balance of the recipient after the transfer + /// @param totalSupply The total supply of tokens after the transfer + event CoopTokenTransfer( + address indexed from, + address indexed to, + uint256 amount, + uint256 fromTokenBalance, + uint256 toTokenBalance, + uint256 totalSupply + ); + + /// @notice Emitted when fees are distributed + /// @param tokenCreator The address of the token creator + /// @param platformReferrer The address of the platform referrer + /// @param orderReferrer The address of the order referrer + /// @param protocolFeeRecipient The address of the protocol fee recipient + /// @param tokenCreatorFee The fee for the token creator + /// @param platformReferrerFee The fee for the platform referrer + /// @param orderReferrerFee The fee for the order referrer + /// @param protocolFee The protocol fee + event CoopTokenFees( + address indexed tokenCreator, + address indexed platformReferrer, + address indexed orderReferrer, + address protocolFeeRecipient, + uint256 tokenCreatorFee, + uint256 platformReferrerFee, + uint256 orderReferrerFee, + uint256 protocolFee + ); + + /// @notice Emitted when a market graduates + /// @param tokenAddress The address of the token + /// @param poolAddress The address of the pool + /// @param totalEthLiquidity The total ETH liquidity in the pool + /// @param totalTokenLiquidity The total token liquidity in the pool + /// @param lpPositionId The ID of the liquidity position + /// @param marketType The type of market + event CoopMarketGraduated( + address indexed tokenAddress, + address indexed poolAddress, + uint256 totalEthLiquidity, + uint256 totalTokenLiquidity, + uint256 lpPositionId, + MarketType marketType + ); + + /// @notice Buys tokens from the bonding curve or Uniswap V3 pool depending on the market state. + /// @param recipient The address to receive the purchased tokens + /// @param refundRecipient The address to receive any excess ETH + /// @param orderReferrer The address of the order referrer + /// @param comment A comment associated with the buy order + /// @param expectedMarketType The expected market type (0 = BONDING_CURVE, 1 = UNISWAP_POOL) + /// @param minOrderSize The minimum size of the order to prevent slippage, ignored if market is uniswap pool. + /// @param sqrtPriceLimitX96 The price limit for Uniswap V3 pool swaps, ignored if market is bonding curve. + function buy( + address recipient, + address refundRecipient, + address orderReferrer, + string memory comment, + MarketType expectedMarketType, + uint256 minOrderSize, + uint160 sqrtPriceLimitX96 + ) external payable returns (uint256); + + /// @notice Sells tokens to the bonding curve or Uniswap V3 pool depending on the market state + /// @param tokensToSell The number of tokens to sell + /// @param recipient The address to receive the ETH payout + /// @param orderReferrer The address of the order referrer + /// @param comment A comment associated with the sell order + /// @param expectedMarketType The expected market type (0 = BONDING_CURVE, 1 = UNISWAP_POOL) + /// @param minPayoutSize The minimum payout size to prevent slippage, ignored if market is uniswap pool. + /// @param sqrtPriceLimitX96 The price limit for Uniswap V3 pool swaps, ignored if market is bonding curve. + function sell( + uint256 tokensToSell, + address recipient, + address orderReferrer, + string memory comment, + MarketType expectedMarketType, + uint256 minPayoutSize, + uint160 sqrtPriceLimitX96 + ) external returns (uint256); + + /// @notice Allows a holder to burn their tokens after the market has graduated + /// @dev Emits a CoopTokenTransfer event with the updated token balances and total supply + /// @param tokensToBurn The number of tokens to burn + function burn(uint256 tokensToBurn) external; + + /// @notice Provides a quote for buying tokens with a given amount of ETH + /// @param amount The amount of ETH + /// @return The number of tokens that can be bought + function getEthBuyQuote(uint256 amount) external view returns (uint256); + + /// @notice Provides a quote for selling a given number of tokens + /// @param amount The number of tokens + /// @return The amount of ETH that can be received + function getTokenSellQuote(uint256 amount) external view returns (uint256); + + /// @notice Returns the current state of the market + /// @return The market state + function state() external view returns (MarketState memory); + + /// @notice Returns the URI of the token + /// @return The token URI + function tokenURI() external view returns (string memory); + + /// @notice Returns the address of the token creator + /// @return The token creator's address + function tokenCreator() external view returns (address); + + /// @notice Returns the address of the platform referrer + /// @return The platform referrer's address + function platformReferrer() external view returns (address); +} diff --git a/src/interfaces/IUniversalRouter.sol b/src/interfaces/IUniversalRouter.sol new file mode 100644 index 0000000..90b058c --- /dev/null +++ b/src/interfaces/IUniversalRouter.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.17; + +import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; + +interface IUniversalRouter is IERC721Receiver, IERC1155Receiver { + /// @notice Thrown when a required command has failed + error ExecutionFailed(uint256 commandIndex, bytes message); + + /// @notice Thrown when attempting to send ETH directly to the contract + error ETHNotAccepted(); + + /// @notice Thrown when executing commands with an expired deadline + error TransactionDeadlinePassed(); + + /// @notice Thrown when attempting to execute commands and an incorrect number of inputs are provided + error LengthMismatch(); + + /// @notice Executes encoded commands along with provided inputs. Reverts if deadline has expired. + /// @param commands A set of concatenated commands, each 1 byte in length + /// @param inputs An array of byte strings containing abi encoded inputs for each command + function execute(bytes calldata commands, bytes[] calldata inputs) external payable; +} diff --git a/test/Credits1155.t.sol b/test/Credits1155.t.sol index 730e40e..24b72dd 100644 --- a/test/Credits1155.t.sol +++ b/test/Credits1155.t.sol @@ -5,6 +5,8 @@ import {Test} from "forge-std/Test.sol"; import {Credits1155} from "../src/Credits1155.sol"; import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {ICoop} from "../src/interfaces/ICoop.sol"; +import {MockCoopCoin} from "./mocks/MockCoopCoin.sol"; contract Credits1155Test is Test { Credits1155 public implementation; @@ -33,7 +35,7 @@ contract Credits1155Test is Test { // Encode initialization data bytes memory initData = - abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", payable(dummyMarket)); + abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", payable(dummyMarket), address(0)); // Deploy and initialize proxy TransparentUpgradeableProxy proxy = @@ -87,4 +89,251 @@ contract Credits1155Test is Test { vm.expectRevert(); credits.adminSetURI("ipfs://test"); } + + function test_SetDopplerUniversalRouter() public { + // Test data setup + address dopplerRouter = makeAddr("dopplerRouter"); + + // Add code to the dopplerRouter to make it a contract + vm.etch(dopplerRouter, hex"00"); + + // Call the method as owner - should succeed + vm.prank(owner); + credits.setDopplerUniversalRouter(dopplerRouter); + + // Verify the router was set correctly + assertEq(address(credits.dopplerUniversalRouter()), dopplerRouter); + } + + function test_RevertWhen_SetDopplerUniversalRouterWithNonContractAddress() public { + // Test data setup - use a regular address (not a contract) + address nonContractAddress = makeAddr("nonContract"); + + // Expect the specific error to be thrown + vm.prank(owner); + vm.expectRevert(abi.encodeWithSelector(Credits1155.Credits1155_Contract_Address_Is_Not_A_Contract.selector)); + credits.setDopplerUniversalRouter(nonContractAddress); + } + + function test_RevertWhen_NonOwnerSetsDopplerUniversalRouter() public { + // Test data setup + address dopplerRouter = makeAddr("dopplerRouter"); + address nonOwner = makeAddr("nonOwner"); + + // Expect the method to revert when called by non-owner + // This will revert with AccessControl error since the user doesn't have DEFAULT_ADMIN_ROLE + vm.prank(nonOwner); + vm.expectRevert( + abi.encodeWithSelector( + bytes4(keccak256("AccessControlUnauthorizedAccount(address,bytes32)")), + nonOwner, + bytes32(0x0000000000000000000000000000000000000000000000000000000000000000) // DEFAULT_ADMIN_ROLE + ) + ); + credits.setDopplerUniversalRouter(dopplerRouter); + } + + function test_BuyDopplerCoinsWithCredits() public { + // First buy some credits for the user + uint256 creditsAmount = 10; + uint256 creditsCost = credits.getEthCostForCredits(creditsAmount); + vm.prank(user); + credits.buyCredits{value: creditsCost}(user, creditsAmount); + + // Verify initial credits balance + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, creditsAmount); + + // Set up the Doppler Universal Router + address dopplerRouter = makeAddr("dopplerRouter"); + vm.etch(dopplerRouter, hex"00"); + vm.prank(owner); + credits.setDopplerUniversalRouter(dopplerRouter); + + // Test data setup + bytes memory commands = hex"01"; // Example command + bytes[] memory inputs = new bytes[](1); + inputs[0] = hex"02"; // Example input + + // Call buyDopplerCoinsWithCredits - should succeed and consume 1 credit + vm.prank(user); + credits.buyDopplerCoinsWithCredits(commands, inputs); + + // Verify credits balance decreased by 1 + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, initialCreditsBalance - 1); + } + + function test_RevertWhen_BuyDopplerCoinsWithCreditsRouterNotSet() public { + // First buy some credits for the user + uint256 creditsAmount = 10; + uint256 creditsCost = credits.getEthCostForCredits(creditsAmount); + vm.prank(user); + credits.buyCredits{value: creditsCost}(user, creditsAmount); + + // Verify initial credits balance + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, creditsAmount); + + // Test data setup + bytes memory commands = hex"01"; // Example command + bytes[] memory inputs = new bytes[](1); + inputs[0] = hex"02"; // Example input + + // Expect the method to revert when router is not set + vm.prank(user); + vm.expectRevert(abi.encodeWithSelector(Credits1155.Credits1155_Contract_Address_Is_Not_A_Contract.selector)); + credits.buyDopplerCoinsWithCredits(commands, inputs); + + // Verify credits balance remains unchanged after revert + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, initialCreditsBalance); + } + + function test_RevertWhen_BuyDopplerCoinsWithCreditsNoCredits() public { + // Set up the Doppler Universal Router first + address dopplerRouter = makeAddr("dopplerRouter"); + vm.etch(dopplerRouter, hex"00"); + vm.prank(owner); + credits.setDopplerUniversalRouter(dopplerRouter); + + // Verify user has no credits initially + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, 0); + + // Test data setup + bytes memory commands = hex"01"; // Example command + bytes[] memory inputs = new bytes[](1); + inputs[0] = hex"02"; // Example input + + // Expect the method to revert when user has no credits + vm.prank(user); + vm.expectRevert( + abi.encodeWithSelector( + Credits1155.Credits1155_Insufficient_Credits_Balance.selector, + 1, // required amount + 0 // available amount + ) + ); + credits.buyDopplerCoinsWithCredits(commands, inputs); + + // Verify credits balance remains at 0 + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, 0); + } + + // ===== COOP Coins Tests ===== + + function test_BuyCoopCoinsWithCredits() public { + // First buy some credits for the user + uint256 creditsAmount = 10; + uint256 creditsCost = credits.getEthCostForCredits(creditsAmount); + vm.prank(user); + credits.buyCredits{value: creditsCost}(user, creditsAmount); + + // Verify initial credits balance + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, creditsAmount); + + // Deploy the mock COOP WOW Token contract + MockCoopCoin mockCoopToken = new MockCoopCoin(); + address coinAddress = address(mockCoopToken); + + // Test data setup - simulate the buy function call from the frontend + address recipient = makeAddr("recipient"); + address refundRecipient = makeAddr("refundRecipient"); + address orderReferrer = makeAddr("orderReferrer"); + string memory comment = "Test comment"; + ICoop.MarketType marketType = ICoop.MarketType.BONDING_CURVE; // curve market + uint256 minOutput = 1000; // minimum tokens to receive + uint160 sqrtPriceLimitX96 = 0; + + // Call buyCoopCoinsWithCredits - should succeed and consume 1 credit + vm.prank(user); + credits.buyCoopCoinsWithCredits( + coinAddress, recipient, refundRecipient, orderReferrer, comment, marketType, minOutput, sqrtPriceLimitX96 + ); + + // Verify credits balance decreased by 1 + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, initialCreditsBalance - 1); + } + + function test_RevertWhen_BuyCoopCoinsWithCreditsNoCredits() public { + // Verify user has no credits initially + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, 0); + + // Deploy the mock COOP WOW Token contract + MockCoopCoin mockCoopToken = new MockCoopCoin(); + address coinAddress = address(mockCoopToken); + + // Test data setup - simulate the buy function call from the frontend + address recipient = makeAddr("recipient"); + address refundRecipient = makeAddr("refundRecipient"); + address orderReferrer = makeAddr("orderReferrer"); + string memory comment = "Test comment"; + ICoop.MarketType marketType = ICoop.MarketType.BONDING_CURVE; // curve market + uint256 minOutput = 1000; // minimum tokens to receive + uint160 sqrtPriceLimitX96 = 0; + + // Expect the method to revert when user has no credits + vm.prank(user); + vm.expectRevert( + abi.encodeWithSelector( + Credits1155.Credits1155_Insufficient_Credits_Balance.selector, + 1, // required amount + 0 // available amount + ) + ); + credits.buyCoopCoinsWithCredits( + coinAddress, recipient, refundRecipient, orderReferrer, comment, marketType, minOutput, sqrtPriceLimitX96 + ); + + // Verify credits balance remains at 0 + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, 0); + } + + function test_RevertWhen_BuyCoopCoinsWithCreditsNonContractAddress() public { + // First buy some credits for the user + uint256 creditsAmount = 10; + uint256 creditsCost = credits.getEthCostForCredits(creditsAmount); + vm.prank(user); + credits.buyCredits{value: creditsCost}(user, creditsAmount); + + // Verify initial credits balance + uint256 initialCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(initialCreditsBalance, creditsAmount); + + // Use a regular address (not a contract) for coinAddress + address nonContractAddress = makeAddr("nonContract"); + + // Test data setup + address recipient = makeAddr("recipient"); + address refundRecipient = makeAddr("refundRecipient"); + address orderReferrer = makeAddr("orderReferrer"); + string memory comment = "Test comment"; + ICoop.MarketType marketType = ICoop.MarketType.BONDING_CURVE; + uint256 minOutput = 1000; + uint160 sqrtPriceLimitX96 = 0; + + // Expect the method to revert due to onlyContracts modifier + vm.prank(user); + vm.expectRevert(abi.encodeWithSelector(Credits1155.Credits1155_Contract_Address_Is_Not_A_Contract.selector)); + credits.buyCoopCoinsWithCredits( + nonContractAddress, + recipient, + refundRecipient, + orderReferrer, + comment, + marketType, + minOutput, + sqrtPriceLimitX96 + ); + + // Verify credits balance remains unchanged after revert + uint256 finalCreditsBalance = credits.balanceOf(user, credits.CREDITS_TOKEN_ID()); + assertEq(finalCreditsBalance, initialCreditsBalance); + } } diff --git a/test/Credits1155CoopIntegration.t.sol b/test/Credits1155CoopIntegration.t.sol index de67b13..b76ff68 100644 --- a/test/Credits1155CoopIntegration.t.sol +++ b/test/Credits1155CoopIntegration.t.sol @@ -56,7 +56,8 @@ contract Credits1155CoopIntegrationTest is Test { bytes memory initData = abi.encodeWithSelector( Credits1155.initialize.selector, "ipfs://test", - payable(address(coopCollectibles)) // Using coopCollectibles address + payable(address(coopCollectibles)), // Using coopCollectibles address + address(0) ); // Deploy and initialize proxy diff --git a/test/Credits1155Initializer.t.sol b/test/Credits1155Initializer.t.sol index 9e26447..3fa87e7 100644 --- a/test/Credits1155Initializer.t.sol +++ b/test/Credits1155Initializer.t.sol @@ -71,7 +71,7 @@ contract Credits1155InitializerTest is Test { // Encode initialization data with the strategy bytes memory initData = - abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy)); + abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy), address(0)); // Deploy and initialize proxy TransparentUpgradeableProxy proxy = @@ -97,7 +97,8 @@ contract Credits1155InitializerTest is Test { bytes memory initData = abi.encodeWithSelector( Credits1155.initialize.selector, "ipfs://test", - address(0) // Zero address for strategy + address(0), // Zero address for strategy + address(0) ); // Deploy and initialize proxy @@ -138,7 +139,7 @@ contract Credits1155InitializerTest is Test { // Encode initialization data with the strategy bytes memory initData = - abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy)); + abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy), address(0)); // Deploy and initialize proxy TransparentUpgradeableProxy proxy = diff --git a/test/Credits1155Isolation.t.sol b/test/Credits1155Isolation.t.sol index c4cce0f..f0c6272 100644 --- a/test/Credits1155Isolation.t.sol +++ b/test/Credits1155Isolation.t.sol @@ -67,7 +67,7 @@ contract Credits1155IsolationTest is Test { // Initialize and deploy the proxy with our implementation bytes memory initData = - abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy)); + abi.encodeWithSelector(Credits1155.initialize.selector, "ipfs://test", address(saleStrategy), address(0)); TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(address(implementation), address(proxyAdmin), initData); diff --git a/test/mocks/MockCoopCoin.sol b/test/mocks/MockCoopCoin.sol new file mode 100644 index 0000000..e0da5b9 --- /dev/null +++ b/test/mocks/MockCoopCoin.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +// Mock COOP WOW Token contract for testing +contract MockCoopCoin { + function buy(address, address, address, string memory, uint8, uint256 minOrderSize, uint160) + external + payable + returns (uint256) + { + // Mock implementation - just return a token amount + return minOrderSize; + } +}