diff --git a/.env.template b/.env.template new file mode 100644 index 00000000..acea525a --- /dev/null +++ b/.env.template @@ -0,0 +1,26 @@ +# Ethereum Sepolia Configuration +SEPOLIA_RPC_URL="https://gateway.tenderly.co/public/sepolia" +LAYER_ZERO_SEPOLIA_ENDPOINT_ADDRESS=0x6EDCE65403992e310A62460808c4b910D972f10f +LAYER_ZERO_SEPOLIA_CHAIN_ID=40161 # LayerZero chain ID for Ethereum Sepolia +RLC_SEPOLIA_ADAPTER_ADDRESS=0x +RLC_SEPOLIA_ADDRESS=0x + +# Arbitrum Sepolia Configuration +ARBITRUM_SEPOLIA_RPC_URL="https://arbitrum-sepolia.gateway.tenderly.co" +LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS=0x6EDCE65403992e310A62460808c4b910D972f10f +LAYER_ZERO_ARBITRUM_SEPOLIA_CHAIN_ID=40231 # LayerZero chain ID for Arbitrum Sepolia +RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS=0x + +# Token Configuration for OFT +RLC_OFT_TOKEN_NAME="RLC OFT" +RLC_TOKEN_SYMBOL="RLC" + +# Transaction Settings +OWNER_ADDRESS=0x + +# API Keys +ETHERSCAN_API_KEY= +ARBISCAN_API_KEY= + +# Account info for script execution - can be private key or mnemonic, depending on configuration +ACCOUNT= diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 34a4a527..91cbee1f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,8 +36,8 @@ jobs: run: | forge build --sizes id: build - - - name: Run Forge tests - run: | - forge test -vvv - id: test + #TDO: Uncomment when tests are available + # - name: Run Forge tests + # run: | + # forge test -vvv + # id: test diff --git a/.gitignore b/.gitignore index 85198aaa..4aed4505 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,14 @@ out/ !/broadcast /broadcast/*/31337/ /broadcast/**/dry-run/ +# Foundry broadcast files +broadcast/*/*/run-*.json +!broadcast/*/*/run-latest.json + # Docs docs/ # Dotenv file .env +.last_deploy.json diff --git a/.gitmodules b/.gitmodules index 888d42dc..f69ae656 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,21 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "lib/devtools"] + path = lib/devtools + url = https://github.com/LayerZero-Labs/devtools +[submodule "lib/layerzero-v2"] + path = lib/layerzero-v2 + url = https://github.com/LayerZero-Labs/layerzero-v2 +[submodule "lib/rlc-faucet-contract"] + path = lib/rlc-faucet-contract + url = https://github.com/iExecBlockchainComputing/rlc-faucet-contract +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/openzeppelin-foundry-upgrades"] + path = lib/openzeppelin-foundry-upgrades + url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..a8906ea1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +## vNEXT + +### Added +- Initial implementation of RLC OFT (Optimistic Fungible Token) bridge system +- RLCOFT contract deployed on Arbitrum Sepolia with 9 decimal places +- RLCAdapter contract deployed on Ethereum Sepolia to bridge existing RLC token +- Cross-chain message passing functionality using LayerZero protocol +- Configuration scripts for trustless omnichain communication setup +- Token transfer capabilities between Ethereum Sepolia and Arbitrum Sepolia +- `approveAndCall` function for one-step approval and contract interaction +- Burn capability for RLCOFT tokens +- Comprehensive deployment scripts using Foundry +- Configuration utilities to set trusted remote addresses +- Verification targets for block explorer verification +- End-to-end cross-chain transfer test scripts \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..af85e53e --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ +# Makefile for RLC OFT Project +-include .env + +# Test and utility targets +test: + @echo "Running tests..." + forge test -vvv + +clean: + @echo "Cleaning artifacts..." + forge clean + +# Deployment targets +deploy-adapter: + @echo "Deploying RLCAdapter on SEPOLIA..." + forge script script/RLCAdapter.s.sol:Deploy \ + --rpc-url $(SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv + +deploy-oft: + @echo "Deploying RLCOFT on Arbitrum SEPOLIA..." + forge script script/RLCOFT.s.sol:Deploy \ + --rpc-url $(ARBITRUM_SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv \ + +configure-adapter: + @echo "Configuring RLCAdapter on SEPOLIA..." + forge script script/RLCAdapter.s.sol:Configure \ + --rpc-url $(SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv +configure-oft: + @echo "Configuring RLCOFT on Arbitrum SEPOLIA..." + forge script script/RLCOFT.s.sol:Configure \ + --rpc-url $(ARBITRUM_SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv + +send-tokens-to-arbitrum-sepolia: + @echo "Sending tokens cross-chain... from SEPOLIA to Arbitrum SEPOLIA" + forge script script/SendEthereumToArbitrum.s.sol:SendTokensToArbitrumSepolia \ + --rpc-url $(SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv + +send-tokens-to-sepolia: + @echo "Sending tokens cross-chain... from Arbitrum SEPOLIA to SEPOLIA" + forge script script/SendArbitrumToEthereum.s.sol:SendTokensToSepolia \ + --rpc-url $(ARBITRUM_SEPOLIA_RPC_URL) \ + --account $(ACCOUNT) \ + --broadcast \ + -vvv + +# Verification targets +verify-adapter: + @echo "Verifying RLCAdapter on Sepolia Etherscan..." + forge verify-contract \ + --chain-id 11155111 \ + --watch \ + --constructor-args $(shell cast abi-encode "constructor(address,address,address)" $(RLC_SEPOLIA_ADDRESS) $(LAYER_ZERO_SEPOLIA_ENDPOINT_ADDRESS) $(OWNER_ADDRESS)) \ + --etherscan-api-key $(ETHERSCAN_API_KEY) \ + $(RLC_SEPOLIA_ADAPTER_ADDRESS) \ + src/RLCAdapter.sol:RLCAdapter + +verify-oft: + @echo "Verifying RLCOFT on Arbitrum Sepolia Etherscan..." + forge verify-contract \ + --chain-id 421614 \ + --watch \ + --constructor-args $(shell cast abi-encode "constructor(string,string,address,address)" $(RLC_OFT_TOKEN_NAME) $(RLC_TOKEN_SYMBOL) $(LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS) $(OWNER_ADDRESS)) \ + --etherscan-api-key $(ARBISCAN_API_KEY) \ + $(RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS) \ + src/RLCOFT.sol:RLCOFT + +# Combined verification target +verify-all: verify-adapter verify-oft + diff --git a/README.md b/README.md index 9265b455..f881031e 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,151 @@ -## Foundry +# RLC Layer Zero Bridge -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** +This project implements a cross-chain token bridge for the RLC token between Ethereum and Arbitrum using LayerZero's OFT (Omnichain Fungible Token) protocol. It enables seamless token transfers between Ethereum Sepolia and Arbitrum Sepolia testnets. -Foundry consists of: +## Architecture -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. +The system consists of two main components: -## Documentation +1. **RLCAdapter (on Ethereum Sepolia)**: Wraps the existing RLC ERC-20 token to make it compatible with LayerZero's cross-chain messaging. +2. **RLCOFT (on Arbitrum Sepolia)**: A new token that's minted when RLC tokens are locked in the adapter on Ethereum, and burned when tokens are sent back. -https://book.getfoundry.sh/ +[![Architecture Diagram](https://mermaid.ink/img/pako:eNqNVNtO4zAQ_RXLvAY2F3JpQEhpLrsPRUhQXqBoZRKXRjh2ZCdouf372nHSEhrYddV2MjnHZ-ZM4leYswLDED5wVG_AMllRIJdo73ViBdNmgzluK3CFa0ZKtIIaotblIr6VX7Bkj5ju0qflWXoZ2-bpj_LsbpeOClQ3mCtGH44oF9myT3_iLW5-p8tftwv0jPkN5gyktKhZSZseg2mhg73aI35fNny6dimnKpF_E-XL7H4R0eX8v4u4Fph3VasAMAoGG-_A4eHZmwWiuubsCQvQKHHxBkaWDPQObIMYESKAkBqfcP1FB3PAguWPuw1lc_ugY2kFLQSosBDoAb_15mqgjjucC2LOhDjMN6ikI7R0YYuWcYf2QIJJ-YT5h42lhRqnHFYgH5xLu3b1dT0qTweLhmnd7Rk56EQjJ_YU5mDecrpT2APEE91P9ZN82f2UV-lE919OKQPXlPx7Tj_BkiMq1mrTkWHbAvRvTpAQCV4DPLym65KQ8CD24izzDdFwSQ4PnMQ1576RM8J4eE9Q_njyiY-GV0Xz51bqZNmWb0eBnQXf8Vs1RM3NssSOzC03y4LANL_jkpeembjqs6u6WxPMD3xlnzE4N5jwUaAb_tDd6Mbgp7F9xlQTI4iestE_GuTlBBqwwrxCZSHPzFcFXUEpWuEVDGVY4DVqSaPOmXcJRW3Drp5pDkMpjg3Y1gVqcFIieUBVMFwjImS2RvSGsWoAyUsYvsI_MAysI8_yfNuZeY7tuUFgwGcYWjP3yLdN1_Jl5PiBab8b8KXbwDyaufbMOnYs27OsIPA8A3LWPmy2WrgoG8bP9ZnfHf2GPPpVN1qcy_cD85i1tJFKlj3UnHY8jXr_C5RA8AI)](https://mermaid.live/edit#pako:eNqNVNtO4zAQ_RXLvAY2F3JpQEhpLrsPRUhQXqBoZRKXRjh2ZCdouf372nHSEhrYddV2MjnHZ-ZM4leYswLDED5wVG_AMllRIJdo73ViBdNmgzluK3CFa0ZKtIIaotblIr6VX7Bkj5ju0qflWXoZ2-bpj_LsbpeOClQ3mCtGH44oF9myT3_iLW5-p8tftwv0jPkN5gyktKhZSZseg2mhg73aI35fNny6dimnKpF_E-XL7H4R0eX8v4u4Fph3VasAMAoGG-_A4eHZmwWiuubsCQvQKHHxBkaWDPQObIMYESKAkBqfcP1FB3PAguWPuw1lc_ugY2kFLQSosBDoAb_15mqgjjucC2LOhDjMN6ikI7R0YYuWcYf2QIJJ-YT5h42lhRqnHFYgH5xLu3b1dT0qTweLhmnd7Rk56EQjJ_YU5mDecrpT2APEE91P9ZN82f2UV-lE919OKQPXlPx7Tj_BkiMq1mrTkWHbAvRvTpAQCV4DPLym65KQ8CD24iyyDdFwSQ4PnMQ1576RM8J4eE9Q_njyiY-GV0Xz51bqZNmWb0eBnQXf8Vs1RM3NssSOzC03y4LANL_jkpeembjqs6u6WxPMD3xlnzE4N5jwUaAb_tDd6Mbgp7F9xlQTI4iestE_GuTlBBqwwrxCZSHPzFcFXUEpWuEVDGVY4DVqSaPOmXcJRW3Drp5pDkMpjg3Y1gVqcFIieUBVMFwjImS2RvSGsWoAyUsYvsI_MAysI8_yfNuZeY7tuUFgwGcYWjP3yLdN1_Jl5PiBab8b8KXbwDyaufbMOnYs27OsIPA8A3LWPmy2WrgoG8bP9ZnfHf2GPPpVN1qcy_cD85i1tJFKlj3UnHY8jXr_C5RA8AI) -## Usage +## Prerequisites -### Build +- [Foundry](https://book.getfoundry.sh/getting-started/installation.html) for contract compilation and deployment +- Ethereum wallet with Sepolia ETH and Arbitrum Sepolia ETH for gas +- RLC tokens on Sepolia testnet for bridge testing -```shell -$ forge build -``` +## Installation -### Test +1. Clone the repository -```shell -$ forge test -``` + ```bash + git clone https://github.com/iExecBlockchainComputing/rlc-multichain.git + cd rlc-multichain + ``` -### Format +2. Install dependencies -```shell -$ forge fmt -``` + ```bash + forge install + ``` -### Gas Snapshots +3. Create a `.env` file -```shell -$ forge snapshot -``` + ```sh + cp .env.template .env # and edit .env content + ``` -### Anvil +**Note:** To run scripts, you must save a wallet in the Foundry keystore. Use the following command to import a wallet with a raw private key: -```shell -$ anvil +```bash +cast wallet import --private-key ``` -### Deploy +Alternatively, you can use a mnemonic by specifying the `--mnemonic-path` option. Remember the `` you choose, and set it in your `.env` file under the `ACCOUNT` field. -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` +## Contract Overview + +Instead of duplicating code that may become outdated, here are links to the key contracts in the repository: + +- [RLCAdapter.sol](https://github.com/iExecBlockchainComputing/rlc-multichain/blob/main/src/RLCAdapter.sol) - Ethereum-side adapter that wraps the existing RLC token +- [RLCOFT.sol](https://github.com/iExecBlockchainComputing/rlc-multichain/blob/main/src/RLCOFT.sol) - Arbitrum-side token that implements the OFT standard + +## Deployment + +The deployment process involves four steps: + +1. Deploy the RLCAdapter on Ethereum Sepolia: + + ```bash + make deploy-adapter + ``` + +2. Deploy the RLCOFT on Arbitrum Sepolia: + + ```bash + make deploy-oft + ``` + +3. Configure the RLCAdapter to trust the RLCOFT contract: + + ```bash + make configure-adapter + ``` + +4. Configure the RLCOFT to trust the RLCAdapter contract: + + ```bash + make configure-oft + ``` + +After deployment, update your `.env` file with the deployed contract addresses. -### Cast +## Usage + +### Bridge RLC + +A. To send RLC tokens from Ethereum Sepolia to Arbitrum Sepolia: -```shell -$ cast +```bash +make send-tokens-to-arbitrum-sepolia ``` -### Help +This will: + +1. Approve the RLCAdapter to spend your RLC tokens +2. Initiate the cross-chain transfer through LayerZero +3. Lock tokens in the adapter and mint equivalent tokens on Arbitrum + +B. To send RLC tokens from Arbitrum Sepolia back to Ethereum Sepolia: -```shell -$ forge --help -$ anvil --help -$ cast --help +```bash +make send-tokens-to-sepolia ``` + +This will: + +1. Burn RLCOFT tokens on Arbitrum +2. Send a cross-chain message to the adapter +3. Release the original RLC tokens on Ethereum + +## How It Works + +1. **Ethereum → Arbitrum:** + - User approves RLCAdapter to spend RLC tokens + - RLCAdapter locks the RLC tokens + - LayerZero delivers a message to RLCOFT + - RLCOFT mints equivalent tokens to the recipient on Arbitrum + +2. **Arbitrum → Ethereum:** + - User initiates transfer from RLCOFT + - RLCOFT burns the tokens + - LayerZero delivers a message to RLCAdapter + - RLCAdapter unlocks the original RLC tokens to the recipient on Ethereum + +## Security Considerations + +- The bridge security relies on LayerZero's security model +- Administrative functions are protected by the Ownable pattern +- Use caution when setting trusted remotes to prevent unauthorized cross-chain interactions +- Always test thoroughly on testnets before deploying to mainnet + +## Gas Costs and Fees + +LayerZero transactions require fees to cover: + +1. Gas on the source chain +2. Gas on the destination chain (prepaid) +3. LayerZero relayer fees + +The scripts automatically calculate these fees and include them in the transaction. + +## Troubleshooting + +## References + +- [LayerZero Documentation](https://layerzero.gitbook.io/docs/) +- [OFT Contracts](https://github.com/LayerZero-Labs/solidity-examples/tree/main/contracts/token/oft) +- [iExec Platform Documentation](https://docs.iex.ec/) diff --git a/broadcast/ConfigureRLCAdapter.s.sol/11155111/run-latest.json b/broadcast/ConfigureRLCAdapter.s.sol/11155111/run-latest.json new file mode 100644 index 00000000..21e56c4d --- /dev/null +++ b/broadcast/ConfigureRLCAdapter.s.sol/11155111/run-latest.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x4458d24099a6052a35da8622a9926aeb30412b09579936b6351502bf9f1cb1a9", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "function": "setPeer(uint32,bytes32)", + "arguments": [ + "40231", + "0x000000000000000000000000126e7f4ff12869b9171c60bcfeac5b6e698b0fcc" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "gas": "0xb24d", + "value": "0x0", + "input": "0x3400288b0000000000000000000000000000000000000000000000000000000000009d27000000000000000000000000126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "nonce": "0x17", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x163beb7", + "logs": [ + { + "address": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "topics": [ + "0x238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000009d27000000000000000000000000126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "blockHash": "0x3533658a8fea0f376b4c2e22309e91ee447d2e91397a88ceea411e60209569e6", + "blockNumber": "0x7f1df5", + "blockTimestamp": "0x6825a668", + "transactionHash": "0x4458d24099a6052a35da8622a9926aeb30412b09579936b6351502bf9f1cb1a9", + "transactionIndex": "0x83", + "logIndex": "0x1c3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000800000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4458d24099a6052a35da8622a9926aeb30412b09579936b6351502bf9f1cb1a9", + "transactionIndex": "0x83", + "blockHash": "0x3533658a8fea0f376b4c2e22309e91ee447d2e91397a88ceea411e60209569e6", + "blockNumber": "0x7f1df5", + "gasUsed": "0x79eb", + "effectiveGasPrice": "0x208ed0c8b", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747297896, + "chain": 11155111, + "commit": "e4d5e19" +} \ No newline at end of file diff --git a/broadcast/ConfigureRLCOFT.s.sol/421614/run-latest.json b/broadcast/ConfigureRLCOFT.s.sol/421614/run-latest.json new file mode 100644 index 00000000..a6363ba9 --- /dev/null +++ b/broadcast/ConfigureRLCOFT.s.sol/421614/run-latest.json @@ -0,0 +1,67 @@ +{ + "transactions": [ + { + "hash": "0x3a8745bea85176de03780c3628e83dbcdeefd255512e2f0d795e43825484e69d", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "function": "setPeer(uint32,bytes32)", + "arguments": [ + "40161", + "0x0000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "gas": "0x110e6", + "value": "0x0", + "input": "0x3400288b0000000000000000000000000000000000000000000000000000000000009ce10000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "nonce": "0xf", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1c4022", + "logs": [ + { + "address": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "topics": [ + "0x238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000009ce10000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "blockHash": "0x38f8eac93e7c2240e0777ab696e3c07e256669c2cdd88888b8e1b00ee5ed130c", + "blockNumber": "0x920b34c", + "transactionHash": "0x3a8745bea85176de03780c3628e83dbcdeefd255512e2f0d795e43825484e69d", + "transactionIndex": "0x1c", + "logIndex": "0x17", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000800000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3a8745bea85176de03780c3628e83dbcdeefd255512e2f0d795e43825484e69d", + "transactionIndex": "0x1c", + "blockHash": "0x38f8eac93e7c2240e0777ab696e3c07e256669c2cdd88888b8e1b00ee5ed130c", + "blockNumber": "0x920b34c", + "gasUsed": "0xcb4c", + "effectiveGasPrice": "0x5f5e100", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "contractAddress": null, + "gasUsedForL1": "0xec1", + "l1BlockNumber": "0x7f1df5", + "timeboosted": false + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747297914, + "chain": 421614, + "commit": "e4d5e19" +} \ No newline at end of file diff --git a/broadcast/RLCAdapter.s.sol/11155111/run-latest.json b/broadcast/RLCAdapter.s.sol/11155111/run-latest.json new file mode 100644 index 00000000..c2af8947 --- /dev/null +++ b/broadcast/RLCAdapter.s.sol/11155111/run-latest.json @@ -0,0 +1,81 @@ +{ + "transactions": [ + { + "hash": "0xe948e1227a885aee5d43d532e528985ab3df04ee41b9cc3d2f28dcb865384722", + "transactionType": "CREATE", + "contractName": "RLCAdapter", + "contractAddress": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "function": null, + "arguments": [ + "0x26A738b6D33EF4D94FF084D3552961b8f00639Cd", + "0x6EDCE65403992e310A62460808c4b910D972f10f", + "0x316A389d7f0Ac46B19FCbE7076f125566f09CEBc" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "gas": "0x4e88fc", + "value": "0x0", + "input": "0x60e060405234801561000f575f80fd5b50604051614c85380380614c858339818101604052810190610031919061040f565b8282828273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561007d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a19190610495565b8282818181818a5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610118575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161010f91906104cf565b60405180910390fd5b610127816102e860201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101c1576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101fc91906104cf565b5f604051808303815f87803b158015610213575f80fd5b505af1158015610225573d5f803e3d5ffd5b505050505050505061023b6103a960201b60201c565b60ff168360ff16101561027a576040517f1e9714b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102886103a960201b60201c565b836102939190610515565b600a61029f9190610681565b60a081815250505050508273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505050506106cb565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6006905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103de826103b5565b9050919050565b6103ee816103d4565b81146103f8575f80fd5b50565b5f81519050610409816103e5565b92915050565b5f805f60608486031215610426576104256103b1565b5b5f610433868287016103fb565b9350506020610444868287016103fb565b9250506040610455868287016103fb565b9150509250925092565b5f60ff82169050919050565b6104748161045f565b811461047e575f80fd5b50565b5f8151905061048f8161046b565b92915050565b5f602082840312156104aa576104a96103b1565b5b5f6104b784828501610481565b91505092915050565b6104c9816103d4565b82525050565b5f6020820190506104e25f8301846104c0565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61051f8261045f565b915061052a8361045f565b9250828203905060ff811115610543576105426104e8565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561059e5780860481111561057a576105796104e8565b5b60018516156105895780820291505b808102905061059785610549565b945061055e565b94509492505050565b5f826105b65760019050610671565b816105c3575f9050610671565b81600181146105d957600281146105e357610612565b6001915050610671565b60ff8411156105f5576105f46104e8565b5b8360020a91508482111561060c5761060b6104e8565b5b50610671565b5060208310610133831016604e8410600b84101617156106475782820a905083811115610642576106416104e8565b5b610671565b6106548484846001610555565b9250905081840481111561066b5761066a6104e8565b5b81810290505b9392505050565b5f819050919050565b5f61068b82610678565b91506106968361045f565b92506106c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846105a7565b905092915050565b60805160a05160c0516145356107505f395f818161140001528181611e6a015261202501525f8181610d6f01528181611d6201528181611d8301528181611e270152611f6901525f81816109a401528181610c46015281816111f3015281816115c20152818161193c015281816120a6015281816122fb01526123f301526145355ff3fe6080604052600436106101ed575f3560e01c806382413eac1161010c578063bc70b3541161009f578063d045a0dc1161006e578063d045a0dc146106ec578063d424388514610708578063f2fde38b14610730578063fc0c546a14610758578063ff7bd03d14610782576101ed565b8063bc70b3541461063b578063bd815db014610677578063c7c7f5b314610693578063ca5eb5e1146106c4576101ed565b80639f68b964116100db5780639f68b96414610583578063b731ea0a146105ad578063b98bd070146105d7578063bb0b6a53146105ff576101ed565b806382413eac146104c9578063857749b0146105055780638da5cb5b1461052f578063963efcaa14610559576101ed565b80633b6f743b116101845780635e280f11116101535780635e280f11146104255780636fc1b31e1461044f578063715018a6146104775780637d25a05e1461048d576101ed565b80633b6f743b1461034757806352ae2879146103835780635535d461146103ad5780635a0dfe4d146103e9576101ed565b8063156a0d0f116101c0578063156a0d0f1461029f57806317442b70146102ca5780631f5e1334146102f55780633400288b1461031f576101ed565b80630d35b415146101f1578063111ecdad1461022f57806313137d6514610259578063134d4f2514610275575b5f80fd5b3480156101fc575f80fd5b506102176004803603810190610212919061259f565b6107be565b604051610226939291906127d5565b60405180910390f35b34801561023a575f80fd5b50610243610966565b6040516102509190612850565b60405180910390f35b610273600480360381019061026e9190612945565b61098b565b005b348015610280575f80fd5b50610289610aab565b6040516102969190612a18565b60405180910390f35b3480156102aa575f80fd5b506102b3610ab0565b6040516102c1929190612a8d565b60405180910390f35b3480156102d5575f80fd5b506102de610add565b6040516102ec929190612ab4565b60405180910390f35b348015610300575f80fd5b50610309610aeb565b6040516103169190612a18565b60405180910390f35b34801561032a575f80fd5b5061034560048036038101906103409190612b14565b610af0565b005b348015610352575f80fd5b5061036d60048036038101906103689190612b87565b610b06565b60405161037a9190612c0e565b60405180910390f35b34801561038e575f80fd5b50610397610b6e565b6040516103a49190612850565b60405180910390f35b3480156103b8575f80fd5b506103d360048036038101906103ce9190612c51565b610b75565b6040516103e09190612ce1565b60405180910390f35b3480156103f4575f80fd5b5061040f600480360381019061040a9190612b14565b610c1b565b60405161041c9190612d10565b60405180910390f35b348015610430575f80fd5b50610439610c44565b6040516104469190612d84565b60405180910390f35b34801561045a575f80fd5b5061047560048036038101906104709190612d9d565b610c68565b005b348015610482575f80fd5b5061048b610cea565b005b348015610498575f80fd5b506104b360048036038101906104ae9190612b14565b610cfd565b6040516104c09190612dc8565b60405180910390f35b3480156104d4575f80fd5b506104ef60048036038101906104ea9190612de1565b610d04565b6040516104fc9190612d10565b60405180910390f35b348015610510575f80fd5b50610519610d3e565b6040516105269190612e6d565b60405180910390f35b34801561053a575f80fd5b50610543610d46565b6040516105509190612850565b60405180910390f35b348015610564575f80fd5b5061056d610d6d565b60405161057a9190612e95565b60405180910390f35b34801561058e575f80fd5b50610597610d91565b6040516105a49190612d10565b60405180910390f35b3480156105b8575f80fd5b506105c1610d99565b6040516105ce9190612850565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f89190612f03565b610dbe565b005b34801561060a575f80fd5b5061062560048036038101906106209190612f4e565b610ddf565b6040516106329190612f88565b60405180910390f35b348015610646575f80fd5b50610661600480360381019061065c9190612fa1565b610df4565b60405161066e9190612ce1565b60405180910390f35b610691600480360381019061068c9190613067565b610ff6565b005b6106ad60048036038101906106a891906130d0565b6111c2565b6040516106bb9291906131c7565b60405180910390f35b3480156106cf575f80fd5b506106ea60048036038101906106e59190612d9d565b6111e9565b005b61070660048036038101906107019190612945565b61127a565b005b348015610713575f80fd5b5061072e60048036038101906107299190612d9d565b6112f7565b005b34801561073b575f80fd5b5061075660048036038101906107519190612d9d565b611379565b005b348015610763575f80fd5b5061076c6113fd565b6040516107799190612850565b60405180910390f35b34801561078d575f80fd5b506107a860048036038101906107a391906131ee565b611424565b6040516107b59190612d10565b60405180910390f35b6107c66124d9565b60606107d06124f1565b5f803073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561081b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083f919061322d565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610887573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ab9190613282565b905060405180604001604052808381526020018281525094505f67ffffffffffffffff8111156108de576108dd6132ad565b5b60405190808252806020026020018201604052801561091757816020015b610904612509565b8152602001906001900390816108fc5790505b5093505f80610940886040013589606001358a5f01602081019061093b9190612f4e565b611461565b915091506040518060400160405280838152602001828152509450505050509193909250565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a1b57336040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152600401610a129190612850565b60405180910390fd5b8660200135610a3a885f016020810190610a359190612f4e565b6114c0565b14610a9357865f016020810190610a519190612f4e565b87602001356040517fc26bebcc000000000000000000000000000000000000000000000000000000008152600401610a8a9291906132e9565b60405180910390fd5b610aa287878787878787611531565b50505050505050565b600281565b5f807f02e49c2c000000000000000000000000000000000000000000000000000000006001915091509091565b5f8060016002915091509091565b600181565b610af86116bb565b610b028282611742565b5050565b610b0e612522565b5f610b3384604001358560600135865f016020810190610b2e9190612f4e565b611461565b9150505f80610b4286846117a1565b91509150610b63865f016020810190610b5b9190612f4e565b838388611932565b935050505092915050565b5f30905090565b6003602052815f5260405f20602052805f5260405f205f91509150508054610b9c9061333d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc89061333d565b8015610c135780601f10610bea57610100808354040283529160200191610c13565b820191905f5260205f20905b815481529060010190602001808311610bf657829003601f168201915b505050505081565b5f8160015f8563ffffffff1663ffffffff1681526020019081526020015f205414905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c706116bb565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d441419781604051610cdf9190612850565b60405180910390a150565b610cf26116bb565b610cfb5f611a13565b565b5f92915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f6006905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f6001905090565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610dc66116bb565b610ddb828290610dd6919061359e565b611ad4565b5050565b6001602052805f5260405f205f915090505481565b60605f60035f8763ffffffff1663ffffffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f208054610e369061333d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e629061333d565b8015610ead5780601f10610e8457610100808354040283529160200191610ead565b820191905f5260205f20905b815481529060010190602001808311610e9057829003601f168201915b505050505090505f815103610f085783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050915050610fee565b5f8484905003610f1b5780915050610fee565b60028484905010610faf57610f7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611be9565b8084846002908092610f86939291906135ba565b604051602001610f9893929190613652565b604051602081830303815290604052915050610fee565b83836040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401610fe59291906136a3565b60405180910390fd5b949350505050565b5f5b828290508110156111155736838383818110611017576110166136c5565b5b905060200281019061102991906136fe565b905061104e815f015f0160208101906110429190612f4e565b825f0160200135610c1b565b6110585750611108565b3073ffffffffffffffffffffffffffffffffffffffff1663d045a0dc8260c00135835f018460a00135858061010001906110929190613726565b8760e00160208101906110a59190612d9d565b888061012001906110b69190613726565b6040518963ffffffff1660e01b81526004016110d8979695949392919061385b565b5f604051808303818588803b1580156110ef575f80fd5b505af1158015611101573d5f803e3d5ffd5b5050505050505b8080600101915050610ff8565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa15801561115e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611186919061392c565b6040517f8351eea70000000000000000000000000000000000000000000000000000000081526004016111b99190612ce1565b60405180910390fd5b6111ca61253a565b6111d26124f1565b6111dd858585611c42565b91509150935093915050565b6111f16116bb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b815260040161124a9190612850565b5f604051808303815f87803b158015611261575f80fd5b505af1158015611273573d5f803e3d5ffd5b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112df576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ee87878787878787611d47565b50505050505050565b6112ff6116bb565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c24277608160405161136e9190612850565b60405180910390a150565b6113816116bb565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113f1575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016113e89190612850565b60405180910390fd5b6113fa81611a13565b50565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f816020013560015f845f01602081019061143f9190612f4e565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b5f8061146c85611d5f565b9150819050838110156114b85780846040517f71c4efed0000000000000000000000000000000000000000000000000000000081526004016114af929190613973565b60405180910390fd5b935093915050565b5f8060015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f801b810361152857826040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815260040161151f919061399a565b60405180910390fd5b80915050919050565b5f61154461153f8787611dbe565b611de8565b90505f6115748261155d6115588a8a611df3565b611e24565b8b5f01602081019061156f9190612f4e565b611e62565b90506115808787611eb8565b1561164e575f6115be8a604001602081019061159c91906139b3565b8b5f0160208101906115ae9190612f4e565b846115b98c8c611ecb565b611f2d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637cb59012848b5f856040518563ffffffff1660e01b815260040161161f9493929190613a17565b5f604051808303815f87803b158015611636575f80fd5b505af1158015611648573d5f803e3d5ffd5b50505050505b8173ffffffffffffffffffffffffffffffffffffffff16887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c8b5f0160208101906116999190612f4e565b846040516116a8929190613a61565b60405180910390a3505050505050505050565b6116c3611f5f565b73ffffffffffffffffffffffffffffffffffffffff166116e1610d46565b73ffffffffffffffffffffffffffffffffffffffff161461174057611704611f5f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016117379190612850565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b82826040516117959291906132e9565b60405180910390a15050565b6060805f61180d85602001356117b686611f66565b878060a001906117c69190613726565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611f9a565b80925081945050505f81611822576001611825565b60025b9050611852865f01602081019061183c9190612f4e565b8288806080019061184d9190613726565b610df4565b92505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611928578073ffffffffffffffffffffffffffffffffffffffff1663043a78eb86866040518363ffffffff1660e01b81526004016118e7929190613a88565b602060405180830381865afa158015611902573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119269190613ad1565b505b5050509250929050565b61193a612522565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001611996896114c0565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016119cb929190613bcd565b6040805180830381865afa1580156119e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a099190613c48565b9050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5b8151811015611bae57611b06828281518110611af557611af46136c5565b5b602002602001015160400151611be9565b818181518110611b1957611b186136c5565b5b60200260200101516040015160035f848481518110611b3b57611b3a6136c5565b5b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f848481518110611b7357611b726136c5565b5b60200260200101516020015161ffff1661ffff1681526020019081526020015f209081611ba09190613e07565b508080600101915050611ad6565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051611bde9190613fed565b60405180910390a150565b5f60028201519050600361ffff168161ffff1614611c3e57816040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401611c359190612ce1565b60405180910390fd5b5050565b611c4a61253a565b611c526124f1565b5f80611c7933886040013589606001358a5f016020810190611c749190612f4e565b612008565b915091505f80611c8989846117a1565b91509150611cbb895f016020810190611ca29190612f4e565b83838b803603810190611cb5919061406e565b8b612073565b955060405180604001604052808581526020018481525094503373ffffffffffffffffffffffffffffffffffffffff16865f01517f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a8b5f016020810190611d229190612f4e565b8787604051611d3393929190614099565b60405180910390a350505050935093915050565b611d5687878787878787611531565b50505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083611dad9190614128565b611db79190614158565b9050919050565b5f82825f90602060ff1692611dd5939291906135ba565b90611de091906141a3565b905092915050565b5f815f1c9050919050565b5f8282602060ff1690602860ff1692611e0e939291906135ba565b90611e19919061422c565b60c01c905092915050565b5f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611e5b9190614158565b9050919050565b5f611eae84847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166121899092919063ffffffff16565b8290509392505050565b5f602860ff168383905011905092915050565b60608282602860ff16908092611ee3939291906135ba565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b606084848484604051602001611f469493929190614312565b6040516020818303038152906040529050949350505050565b5f33905090565b5f7f000000000000000000000000000000000000000000000000000000000000000082611f939190614128565b9050919050565b60605f80835111905080611fcf578484604051602001611fbb92919061437b565b604051602081830303815290604052611ffe565b8484611fda33612208565b85604051602001611fee94939291906143a6565b6040516020818303038152906040525b9150935093915050565b5f80612015858585611461565b809250819350505061206a8630847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612229909392919063ffffffff16565b94509492505050565b61207b61253a565b5f612088845f01516122ab565b90505f846020015111156120a4576120a384602001516122f8565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016121018c6114c0565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b815260040161213c929190613bcd565b60806040518083038185885af1158015612158573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061217d9190614478565b91505095945050505050565b612203838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016121bc9291906144a3565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061243e565b505050565b5f8173ffffffffffffffffffffffffffffffffffffffff165f1b9050919050565b6122a5848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161225e939291906144ca565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061243e565b50505050565b5f8134146122f057346040517f9f7041200000000000000000000000000000000000000000000000000000000081526004016122e79190612e95565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612386919061322d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123ed576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61243a337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff16612229909392919063ffffffff16565b5050565b5f8060205f8451602086015f885af18061245d576040513d5f823e3d81fd5b3d92505f519150505f8214612476576001811415612491565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b156124d357836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124ca9190612850565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f8152602001606081525090565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f80191681526020015f67ffffffffffffffff168152602001612566612522565b81525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156125965761259561257d565b5b81905092915050565b5f602082840312156125b4576125b3612575565b5b5f82013567ffffffffffffffff8111156125d1576125d0612579565b5b6125dd84828501612581565b91505092915050565b5f819050919050565b6125f8816125e6565b82525050565b604082015f8201516126125f8501826125ef565b50602082015161262560208501826125ef565b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b61266681612654565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126ae8261266c565b6126b88185612676565b93506126c8818560208601612686565b6126d181612694565b840191505092915050565b5f604083015f8301516126f15f86018261265d565b506020830151848203602086015261270982826126a4565b9150508091505092915050565b5f61272183836126dc565b905092915050565b5f602082019050919050565b5f61273f8261262b565b6127498185612635565b93508360208202850161275b85612645565b805f5b8581101561279657848403895281516127778582612716565b945061278283612729565b925060208a0199505060018101905061275e565b50829750879550505050505092915050565b604082015f8201516127bc5f8501826125ef565b5060208201516127cf60208501826125ef565b50505050565b5f60a0820190506127e85f8301866125fe565b81810360408301526127fa8185612735565b905061280960608301846127a8565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61283a82612811565b9050919050565b61284a81612830565b82525050565b5f6020820190506128635f830184612841565b92915050565b5f6060828403121561287e5761287d61257d565b5b81905092915050565b5f819050919050565b61289981612887565b81146128a3575f80fd5b50565b5f813590506128b481612890565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126128db576128da6128ba565b5b8235905067ffffffffffffffff8111156128f8576128f76128be565b5b602083019150836001820283011115612914576129136128c2565b5b9250929050565b61292481612830565b811461292e575f80fd5b50565b5f8135905061293f8161291b565b92915050565b5f805f805f805f60e0888a0312156129605761295f612575565b5b5f61296d8a828b01612869565b975050606061297e8a828b016128a6565b965050608088013567ffffffffffffffff81111561299f5761299e612579565b5b6129ab8a828b016128c6565b955095505060a06129be8a828b01612931565b93505060c088013567ffffffffffffffff8111156129df576129de612579565b5b6129eb8a828b016128c6565b925092505092959891949750929550565b5f61ffff82169050919050565b612a12816129fc565b82525050565b5f602082019050612a2b5f830184612a09565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a6581612a31565b82525050565b5f67ffffffffffffffff82169050919050565b612a8781612a6b565b82525050565b5f604082019050612aa05f830185612a5c565b612aad6020830184612a7e565b9392505050565b5f604082019050612ac75f830185612a7e565b612ad46020830184612a7e565b9392505050565b5f63ffffffff82169050919050565b612af381612adb565b8114612afd575f80fd5b50565b5f81359050612b0e81612aea565b92915050565b5f8060408385031215612b2a57612b29612575565b5b5f612b3785828601612b00565b9250506020612b48858286016128a6565b9150509250929050565b5f8115159050919050565b612b6681612b52565b8114612b70575f80fd5b50565b5f81359050612b8181612b5d565b92915050565b5f8060408385031215612b9d57612b9c612575565b5b5f83013567ffffffffffffffff811115612bba57612bb9612579565b5b612bc685828601612581565b9250506020612bd785828601612b73565b9150509250929050565b604082015f820151612bf55f8501826125ef565b506020820151612c0860208501826125ef565b50505050565b5f604082019050612c215f830184612be1565b92915050565b612c30816129fc565b8114612c3a575f80fd5b50565b5f81359050612c4b81612c27565b92915050565b5f8060408385031215612c6757612c66612575565b5b5f612c7485828601612b00565b9250506020612c8585828601612c3d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f612cb382612c8f565b612cbd8185612c99565b9350612ccd818560208601612686565b612cd681612694565b840191505092915050565b5f6020820190508181035f830152612cf98184612ca9565b905092915050565b612d0a81612b52565b82525050565b5f602082019050612d235f830184612d01565b92915050565b5f819050919050565b5f612d4c612d47612d4284612811565b612d29565b612811565b9050919050565b5f612d5d82612d32565b9050919050565b5f612d6e82612d53565b9050919050565b612d7e81612d64565b82525050565b5f602082019050612d975f830184612d75565b92915050565b5f60208284031215612db257612db1612575565b5b5f612dbf84828501612931565b91505092915050565b5f602082019050612ddb5f830184612a7e565b92915050565b5f805f8060a08587031215612df957612df8612575565b5b5f612e0687828801612869565b945050606085013567ffffffffffffffff811115612e2757612e26612579565b5b612e33878288016128c6565b93509350506080612e4687828801612931565b91505092959194509250565b5f60ff82169050919050565b612e6781612e52565b82525050565b5f602082019050612e805f830184612e5e565b92915050565b612e8f816125e6565b82525050565b5f602082019050612ea85f830184612e86565b92915050565b5f8083601f840112612ec357612ec26128ba565b5b8235905067ffffffffffffffff811115612ee057612edf6128be565b5b602083019150836020820283011115612efc57612efb6128c2565b5b9250929050565b5f8060208385031215612f1957612f18612575565b5b5f83013567ffffffffffffffff811115612f3657612f35612579565b5b612f4285828601612eae565b92509250509250929050565b5f60208284031215612f6357612f62612575565b5b5f612f7084828501612b00565b91505092915050565b612f8281612887565b82525050565b5f602082019050612f9b5f830184612f79565b92915050565b5f805f8060608587031215612fb957612fb8612575565b5b5f612fc687828801612b00565b9450506020612fd787828801612c3d565b935050604085013567ffffffffffffffff811115612ff857612ff7612579565b5b613004878288016128c6565b925092505092959194509250565b5f8083601f840112613027576130266128ba565b5b8235905067ffffffffffffffff811115613044576130436128be565b5b6020830191508360208202830111156130605761305f6128c2565b5b9250929050565b5f806020838503121561307d5761307c612575565b5b5f83013567ffffffffffffffff81111561309a57613099612579565b5b6130a685828601613012565b92509250509250929050565b5f604082840312156130c7576130c661257d565b5b81905092915050565b5f805f608084860312156130e7576130e6612575565b5b5f84013567ffffffffffffffff81111561310457613103612579565b5b61311086828701612581565b9350506020613121868287016130b2565b925050606061313286828701612931565b9150509250925092565b61314581612887565b82525050565b61315481612a6b565b82525050565b604082015f82015161316e5f8501826125ef565b50602082015161318160208501826125ef565b50505050565b608082015f82015161319b5f85018261313c565b5060208201516131ae602085018261314b565b5060408201516131c1604085018261315a565b50505050565b5f60c0820190506131da5f830185613187565b6131e760808301846127a8565b9392505050565b5f6060828403121561320357613202612575565b5b5f61321084828501612869565b91505092915050565b5f815190506132278161291b565b92915050565b5f6020828403121561324257613241612575565b5b5f61324f84828501613219565b91505092915050565b613261816125e6565b811461326b575f80fd5b50565b5f8151905061327c81613258565b92915050565b5f6020828403121561329757613296612575565b5b5f6132a48482850161326e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132e381612adb565b82525050565b5f6040820190506132fc5f8301856132da565b6133096020830184612f79565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061335457607f821691505b60208210810361336757613366613310565b5b50919050565b61337682612694565b810181811067ffffffffffffffff82111715613395576133946132ad565b5b80604052505050565b5f6133a761256c565b90506133b3828261336d565b919050565b5f67ffffffffffffffff8211156133d2576133d16132ad565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613409576134086132ad565b5b61341282612694565b9050602081019050919050565b828183375f83830152505050565b5f61343f61343a846133ef565b61339e565b90508281526020810184848401111561345b5761345a6133eb565b5b61346684828561341f565b509392505050565b5f82601f830112613482576134816128ba565b5b813561349284826020860161342d565b91505092915050565b5f606082840312156134b0576134af6133e3565b5b6134ba606061339e565b90505f6134c984828501612b00565b5f8301525060206134dc84828501612c3d565b602083015250604082013567ffffffffffffffff811115613500576134ff6133e7565b5b61350c8482850161346e565b60408301525092915050565b5f61352a613525846133b8565b61339e565b9050808382526020820190506020840283018581111561354d5761354c6128c2565b5b835b8181101561359457803567ffffffffffffffff811115613572576135716128ba565b5b80860161357f898261349b565b8552602085019450505060208101905061354f565b5050509392505050565b5f6135aa368484613518565b905092915050565b5f80fd5b5f80fd5b5f80858511156135cd576135cc6135b2565b5b838611156135de576135dd6135b6565b5b6001850283019150848603905094509492505050565b5f81905092915050565b5f61360882612c8f565b61361281856135f4565b9350613622818560208601612686565b80840191505092915050565b5f61363983856135f4565b935061364683858461341f565b82840190509392505050565b5f61365d82866135fe565b915061366a82848661362e565b9150819050949350505050565b5f6136828385612c99565b935061368f83858461341f565b61369883612694565b840190509392505050565b5f6020820190508181035f8301526136bc818486613677565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f823560016101400383360303811261371a576137196136f2565b5b80830191505092915050565b5f8083356001602003843603038112613742576137416136f2565b5b80840192508235915067ffffffffffffffff821115613764576137636136f6565b5b6020830192506001820236038313156137805761377f6136fa565b5b509250929050565b5f6137966020840184612b00565b905092915050565b6137a781612adb565b82525050565b5f6137bb60208401846128a6565b905092915050565b6137cc81612a6b565b81146137d6575f80fd5b50565b5f813590506137e7816137c3565b92915050565b5f6137fb60208401846137d9565b905092915050565b606082016138135f830183613788565b61381f5f85018261379e565b5061382d60208301836137ad565b61383a602085018261313c565b5061384860408301836137ed565b613855604085018261314b565b50505050565b5f60e08201905061386e5f83018a613803565b61387b6060830189612f79565b818103608083015261388e818789613677565b905061389d60a0830186612841565b81810360c08301526138b0818486613677565b905098975050505050505050565b5f6138d06138cb846133ef565b61339e565b9050828152602081018484840111156138ec576138eb6133eb565b5b6138f7848285612686565b509392505050565b5f82601f830112613913576139126128ba565b5b81516139238482602086016138be565b91505092915050565b5f6020828403121561394157613940612575565b5b5f82015167ffffffffffffffff81111561395e5761395d612579565b5b61396a848285016138ff565b91505092915050565b5f6040820190506139865f830185612e86565b6139936020830184612e86565b9392505050565b5f6020820190506139ad5f8301846132da565b92915050565b5f602082840312156139c8576139c7612575565b5b5f6139d5848285016137d9565b91505092915050565b5f819050919050565b5f613a016139fc6139f7846139de565b612d29565b6129fc565b9050919050565b613a11816139e7565b82525050565b5f608082019050613a2a5f830187612841565b613a376020830186612f79565b613a446040830185613a08565b8181036060830152613a568184612ca9565b905095945050505050565b5f604082019050613a745f8301856132da565b613a816020830184612e86565b9392505050565b5f6040820190508181035f830152613aa08185612ca9565b90508181036020830152613ab48184612ca9565b90509392505050565b5f81519050613acb81612b5d565b92915050565b5f60208284031215613ae657613ae5612575565b5b5f613af384828501613abd565b91505092915050565b5f82825260208201905092915050565b5f613b1682612c8f565b613b208185613afc565b9350613b30818560208601612686565b613b3981612694565b840191505092915050565b613b4d81612b52565b82525050565b5f60a083015f830151613b685f86018261379e565b506020830151613b7b602086018261313c565b5060408301518482036040860152613b938282613b0c565b91505060608301518482036060860152613bad8282613b0c565b9150506080830151613bc26080860182613b44565b508091505092915050565b5f6040820190508181035f830152613be58185613b53565b9050613bf46020830184612841565b9392505050565b5f60408284031215613c1057613c0f6133e3565b5b613c1a604061339e565b90505f613c298482850161326e565b5f830152506020613c3c8482850161326e565b60208301525092915050565b5f60408284031215613c5d57613c5c612575565b5b5f613c6a84828501613bfb565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613ccf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c94565b613cd98683613c94565b95508019841693508086168417925050509392505050565b5f613d0b613d06613d01846125e6565b612d29565b6125e6565b9050919050565b5f819050919050565b613d2483613cf1565b613d38613d3082613d12565b848454613ca0565b825550505050565b5f90565b613d4c613d40565b613d57818484613d1b565b505050565b5b81811015613d7a57613d6f5f82613d44565b600181019050613d5d565b5050565b601f821115613dbf57613d9081613c73565b613d9984613c85565b81016020851015613da8578190505b613dbc613db485613c85565b830182613d5c565b50505b505050565b5f82821c905092915050565b5f613ddf5f1984600802613dc4565b1980831691505092915050565b5f613df78383613dd0565b9150826002028217905092915050565b613e1082612c8f565b67ffffffffffffffff811115613e2957613e286132ad565b5b613e33825461333d565b613e3e828285613d7e565b5f60209050601f831160018114613e6f575f8415613e5d578287015190505b613e678582613dec565b865550613ece565b601f198416613e7d86613c73565b5f5b82811015613ea457848901518255600182019150602085019450602081019050613e7f565b86831015613ec15784890151613ebd601f891682613dd0565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613f08816129fc565b82525050565b5f606083015f830151613f235f86018261379e565b506020830151613f366020860182613eff565b5060408301518482036040860152613f4e8282613b0c565b9150508091505092915050565b5f613f668383613f0e565b905092915050565b5f602082019050919050565b5f613f8482613ed6565b613f8e8185613ee0565b935083602082028501613fa085613ef0565b805f5b85811015613fdb5784840389528151613fbc8582613f5b565b9450613fc783613f6e565b925060208a01995050600181019050613fa3565b50829750879550505050505092915050565b5f6020820190508181035f8301526140058184613f7a565b905092915050565b5f8135905061401b81613258565b92915050565b5f60408284031215614036576140356133e3565b5b614040604061339e565b90505f61404f8482850161400d565b5f8301525060206140628482850161400d565b60208301525092915050565b5f6040828403121561408357614082612575565b5b5f61409084828501614021565b91505092915050565b5f6060820190506140ac5f8301866132da565b6140b96020830185612e86565b6140c66040830184612e86565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614132826125e6565b915061413d836125e6565b92508261414d5761414c6140ce565b5b828204905092915050565b5f614162826125e6565b915061416d836125e6565b925082820261417b816125e6565b91508282048414831517614192576141916140fb565b5b5092915050565b5f82905092915050565b5f6141ae8383614199565b826141b98135612887565b925060208210156141f9576141f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613c94565b831692505b505092915050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f6142378383614199565b826142428135614201565b925060088210156142825761427d7fffffffffffffffff00000000000000000000000000000000000000000000000083600803600802613c94565b831692505b505092915050565b5f8160c01b9050919050565b5f6142a08261428a565b9050919050565b6142b86142b382612a6b565b614296565b82525050565b5f8160e01b9050919050565b5f6142d4826142be565b9050919050565b6142ec6142e782612adb565b6142ca565b82525050565b5f819050919050565b61430c614307826125e6565b6142f2565b82525050565b5f61431d82876142a7565b60088201915061432d82866142db565b60048201915061433d82856142fb565b60208201915061434d82846135fe565b915081905095945050505050565b5f819050919050565b61437561437082612887565b61435b565b82525050565b5f6143868285614364565b60208201915061439682846142a7565b6008820191508190509392505050565b5f6143b18287614364565b6020820191506143c182866142a7565b6008820191506143d18285614364565b6020820191506143e182846135fe565b915081905095945050505050565b5f815190506143fd81612890565b92915050565b5f81519050614411816137c3565b92915050565b5f6080828403121561442c5761442b6133e3565b5b614436606061339e565b90505f614445848285016143ef565b5f83015250602061445884828501614403565b602083015250604061446c84828501613bfb565b60408301525092915050565b5f6080828403121561448d5761448c612575565b5b5f61449a84828501614417565b91505092915050565b5f6040820190506144b65f830185612841565b6144c36020830184612e86565b9392505050565b5f6060820190506144dd5f830186612841565b6144ea6020830185612841565b6144f76040830184612e86565b94935050505056fea2646970667358221220efc62043773c6bcbb511fe4812d9b246da61fb87704dc91af48f8f96fafe110364736f6c6343000819003300000000000000000000000026a738b6d33ef4d94ff084d3552961b8f00639cd0000000000000000000000006edce65403992e310a62460808c4b910d972f10f000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "nonce": "0xc", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x17ada04", + "logs": [ + { + "address": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc" + ], + "data": "0x", + "blockHash": "0xea68e17db9726e1dbeecd0adb2f36dcf1dd62eb7d0a25e48492249cb8a345636", + "blockNumber": "0x7ecddd", + "blockTimestamp": "0x6821c5bc", + "transactionHash": "0xe948e1227a885aee5d43d532e528985ab3df04ee41b9cc3d2f28dcb865384722", + "transactionIndex": "0xd3", + "logIndex": "0x173", + "removed": false + }, + { + "address": "0x6edce65403992e310a62460808c4b910d972f10f", + "topics": [ + "0x6ee10e9ed4d6ce9742703a498707862f4b00f1396a87195eb93267b3d7983981" + ], + "data": "0x0000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "blockHash": "0xea68e17db9726e1dbeecd0adb2f36dcf1dd62eb7d0a25e48492249cb8a345636", + "blockNumber": "0x7ecddd", + "blockTimestamp": "0x6821c5bc", + "transactionHash": "0xe948e1227a885aee5d43d532e528985ab3df04ee41b9cc3d2f28dcb865384722", + "transactionIndex": "0xd3", + "logIndex": "0x174", + "removed": false + } + ], + "logsBloom": "0x00000000000000000002000000000000000000000000000000800000000000000000000000000000200000000000000040000002000000000000000000001000000000000000000000000000000000000001000000000000000000000000000000000000020000000200000001000800000000000080000000000000000000400000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000200000000000000000000", + "type": "0x2", + "transactionHash": "0xe948e1227a885aee5d43d532e528985ab3df04ee41b9cc3d2f28dcb865384722", + "transactionIndex": "0xd3", + "blockHash": "0xea68e17db9726e1dbeecd0adb2f36dcf1dd62eb7d0a25e48492249cb8a345636", + "blockNumber": "0x7ecddd", + "gasUsed": "0x3c6960", + "effectiveGasPrice": "0xf4b9c", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": null, + "contractAddress": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747043772, + "chain": 11155111, + "commit": "91c7a70" +} \ No newline at end of file diff --git a/broadcast/RLCOFT.s.sol/421614/run-latest.json b/broadcast/RLCOFT.s.sol/421614/run-latest.json new file mode 100644 index 00000000..469d8008 --- /dev/null +++ b/broadcast/RLCOFT.s.sol/421614/run-latest.json @@ -0,0 +1,83 @@ +{ + "transactions": [ + { + "hash": "0x797392fe323ff655c07197d9e38e71ec5c968b5a213fe0c26aad4fee303551a6", + "transactionType": "CREATE", + "contractName": "RLCOFT", + "contractAddress": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "function": null, + "arguments": [ + "iExec RLC Token", + "RLC", + "0x6EDCE65403992e310A62460808c4b910D972f10f", + "0x316A389d7f0Ac46B19FCbE7076f125566f09CEBc" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "gas": "0x6481de", + "value": "0x0", + "input": "0x60c060405234801561000f575f80fd5b50604051615de6380380615de6833981810160405281019061003191906104f4565b83838383838361004561027c60201b60201c565b8484818181818d5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100bc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100b3919061059f565b60405180910390fd5b6100cb8161028460201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610165576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101a0919061059f565b5f604051808303815f87803b1580156101b7575f80fd5b505af11580156101c9573d5f803e3d5ffd5b50505050505050506101df61034560201b60201c565b60ff168360ff16101561021e576040517f1e9714b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61022c61034560201b60201c565b8361023791906105f1565b600a610243919061075d565b60a08181525050505050816008908161025c91906109ab565b50806009908161026c91906109ab565b5050505050505050505050610a7a565b5f6009905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6006905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6103ac82610366565b810181811067ffffffffffffffff821117156103cb576103ca610376565b5b80604052505050565b5f6103dd61034d565b90506103e982826103a3565b919050565b5f67ffffffffffffffff82111561040857610407610376565b5b61041182610366565b9050602081019050919050565b8281835e5f83830152505050565b5f61043e610439846103ee565b6103d4565b90508281526020810184848401111561045a57610459610362565b5b61046584828561041e565b509392505050565b5f82601f8301126104815761048061035e565b5b815161049184826020860161042c565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104c38261049a565b9050919050565b6104d3816104b9565b81146104dd575f80fd5b50565b5f815190506104ee816104ca565b92915050565b5f805f806080858703121561050c5761050b610356565b5b5f85015167ffffffffffffffff8111156105295761052861035a565b5b6105358782880161046d565b945050602085015167ffffffffffffffff8111156105565761055561035a565b5b6105628782880161046d565b9350506040610573878288016104e0565b9250506060610584878288016104e0565b91505092959194509250565b610599816104b9565b82525050565b5f6020820190506105b25f830184610590565b92915050565b5f60ff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6105fb826105b8565b9150610606836105b8565b9250828203905060ff81111561061f5761061e6105c4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561067a57808604811115610656576106556105c4565b5b60018516156106655780820291505b808102905061067385610625565b945061063a565b94509492505050565b5f82610692576001905061074d565b8161069f575f905061074d565b81600181146106b557600281146106bf576106ee565b600191505061074d565b60ff8411156106d1576106d06105c4565b5b8360020a9150848211156106e8576106e76105c4565b5b5061074d565b5060208310610133831016604e8410600b84101617156107235782820a90508381111561071e5761071d6105c4565b5b61074d565b6107308484846001610631565b92509050818404811115610747576107466105c4565b5b81810290505b9392505050565b5f819050919050565b5f61076782610754565b9150610772836105b8565b925061079f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610683565b905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806107f557607f821691505b602082108103610808576108076107b1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261086a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261082f565b610874868361082f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6108af6108aa6108a584610754565b61088c565b610754565b9050919050565b5f819050919050565b6108c883610895565b6108dc6108d4826108b6565b84845461083b565b825550505050565b5f90565b6108f06108e4565b6108fb8184846108bf565b505050565b5b8181101561091e576109135f826108e8565b600181019050610901565b5050565b601f821115610963576109348161080e565b61093d84610820565b8101602085101561094c578190505b61096061095885610820565b830182610900565b50505b505050565b5f82821c905092915050565b5f6109835f1984600802610968565b1980831691505092915050565b5f61099b8383610974565b9150826002028217905092915050565b6109b4826107a7565b67ffffffffffffffff8111156109cd576109cc610376565b5b6109d782546107de565b6109e2828285610922565b5f60209050601f831160018114610a13575f8415610a01578287015190505b610a0b8582610990565b865550610a72565b601f198416610a218661080e565b5f5b82811015610a4857848901518255600182019150602085019450602081019050610a23565b86831015610a655784890151610a61601f891682610974565b8355505b6001600288020188555050505b505050505050565b60805160a0516152fe610ae85f395f818161120f0152818161270401528181612725015281816127c90152612b1801525f8181610d1b01528181611010015281816116b101528181611b940152818161209001528181612c1201528181612de50152612edd01526152fe5ff3fe608060405260043610610266575f3560e01c80637d25a05e11610143578063bc70b354116100b5578063d045a0dc11610079578063d045a0dc14610975578063d424388514610991578063dd62ed3e146109b9578063f2fde38b146109f5578063fc0c546a14610a1d578063ff7bd03d14610a4757610266565b8063bc70b35414610888578063bd815db0146108c4578063c7c7f5b3146108e0578063ca5eb5e114610911578063cae9ca511461093957610266565b8063963efcaa11610107578063963efcaa1461076a5780639f68b96414610794578063a9059cbb146107be578063b731ea0a146107fa578063b98bd07014610824578063bb0b6a531461084c57610266565b80637d25a05e1461067457806382413eac146106b0578063857749b0146106ec5780638da5cb5b1461071657806395d89b411461074057610266565b8063313ce567116101dc5780635535d461116101a05780635535d461146105585780635a0dfe4d146105945780635e280f11146105d05780636fc1b31e146105fa57806370a0823114610622578063715018a61461065e57610266565b8063313ce567146104645780633400288b1461048e5780633b6f743b146104b657806342966c68146104f257806352ae28791461052e57610266565b8063134d4f251161022e578063134d4f2514610354578063156a0d0f1461037e57806317442b70146103a957806318160ddd146103d45780631f5e1334146103fe57806323b872dd1461042857610266565b806306fdde031461026a578063095ea7b3146102945780630d35b415146102d0578063111ecdad1461030e57806313137d6514610338575b5f80fd5b348015610275575f80fd5b5061027e610a83565b60405161028b9190613148565b60405180910390f35b34801561029f575f80fd5b506102ba60048036038101906102b59190613206565b610b13565b6040516102c7919061325e565b60405180910390f35b3480156102db575f80fd5b506102f660048036038101906102f19190613299565b610b35565b6040516103059392919061349e565b60405180910390f35b348015610319575f80fd5b50610322610cdd565b60405161032f91906134e9565b60405180910390f35b610352600480360381019061034d91906135b4565b610d02565b005b34801561035f575f80fd5b50610368610e22565b6040516103759190613687565b60405180910390f35b348015610389575f80fd5b50610392610e27565b6040516103a09291906136fc565b60405180910390f35b3480156103b4575f80fd5b506103bd610e54565b6040516103cb929190613723565b60405180910390f35b3480156103df575f80fd5b506103e8610e62565b6040516103f59190613759565b60405180910390f35b348015610409575f80fd5b50610412610e6b565b60405161041f9190613687565b60405180910390f35b348015610433575f80fd5b5061044e60048036038101906104499190613772565b610e70565b60405161045b919061325e565b60405180910390f35b34801561046f575f80fd5b50610478610e9e565b60405161048591906137dd565b60405180910390f35b348015610499575f80fd5b506104b460048036038101906104af919061382f565b610ea6565b005b3480156104c1575f80fd5b506104dc60048036038101906104d79190613897565b610ebc565b6040516104e9919061391e565b60405180910390f35b3480156104fd575f80fd5b5061051860048036038101906105139190613937565b610f24565b604051610525919061325e565b60405180910390f35b348015610539575f80fd5b50610542610f38565b60405161054f91906134e9565b60405180910390f35b348015610563575f80fd5b5061057e6004803603810190610579919061398c565b610f3f565b60405161058b9190613a1c565b60405180910390f35b34801561059f575f80fd5b506105ba60048036038101906105b5919061382f565b610fe5565b6040516105c7919061325e565b60405180910390f35b3480156105db575f80fd5b506105e461100e565b6040516105f19190613a97565b60405180910390f35b348015610605575f80fd5b50610620600480360381019061061b9190613ab0565b611032565b005b34801561062d575f80fd5b5061064860048036038101906106439190613ab0565b6110b4565b6040516106559190613759565b60405180910390f35b348015610669575f80fd5b506106726110fa565b005b34801561067f575f80fd5b5061069a6004803603810190610695919061382f565b61110d565b6040516106a79190613adb565b60405180910390f35b3480156106bb575f80fd5b506106d660048036038101906106d19190613af4565b611114565b6040516106e3919061325e565b60405180910390f35b3480156106f7575f80fd5b5061070061114e565b60405161070d91906137dd565b60405180910390f35b348015610721575f80fd5b5061072a611156565b60405161073791906134e9565b60405180910390f35b34801561074b575f80fd5b5061075461117d565b6040516107619190613148565b60405180910390f35b348015610775575f80fd5b5061077e61120d565b60405161078b9190613759565b60405180910390f35b34801561079f575f80fd5b506107a8611231565b6040516107b5919061325e565b60405180910390f35b3480156107c9575f80fd5b506107e460048036038101906107df9190613206565b611235565b6040516107f1919061325e565b60405180910390f35b348015610805575f80fd5b5061080e611257565b60405161081b91906134e9565b60405180910390f35b34801561082f575f80fd5b5061084a60048036038101906108459190613bba565b61127c565b005b348015610857575f80fd5b50610872600480360381019061086d9190613c05565b61129d565b60405161087f9190613c3f565b60405180910390f35b348015610893575f80fd5b506108ae60048036038101906108a99190613c58565b6112b2565b6040516108bb9190613a1c565b60405180910390f35b6108de60048036038101906108d99190613d1e565b6114b4565b005b6108fa60048036038101906108f59190613d87565b611680565b604051610908929190613e7e565b60405180910390f35b34801561091c575f80fd5b5061093760048036038101906109329190613ab0565b6116a7565b005b348015610944575f80fd5b5061095f600480360381019061095a9190613ea5565b611738565b60405161096c919061325e565b60405180910390f35b61098f600480360381019061098a91906135b4565b6117d1565b005b34801561099c575f80fd5b506109b760048036038101906109b29190613ab0565b61184e565b005b3480156109c4575f80fd5b506109df60048036038101906109da9190613f16565b6118d0565b6040516109ec9190613759565b60405180910390f35b348015610a00575f80fd5b50610a1b6004803603810190610a169190613ab0565b611952565b005b348015610a28575f80fd5b50610a316119d6565b604051610a3e91906134e9565b60405180910390f35b348015610a52575f80fd5b50610a6d6004803603810190610a689190613f54565b6119dd565b604051610a7a919061325e565b60405180910390f35b606060088054610a9290613fac565b80601f0160208091040260200160405190810160405280929190818152602001828054610abe90613fac565b8015610b095780601f10610ae057610100808354040283529160200191610b09565b820191905f5260205f20905b815481529060010190602001808311610aec57829003601f168201915b5050505050905090565b5f80610b1d611a1a565b9050610b2a818585611a21565b600191505092915050565b610b3d613045565b6060610b4761305d565b5f803073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb69190613ff0565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c22919061402f565b905060405180604001604052808381526020018281525094505f67ffffffffffffffff811115610c5557610c5461405a565b5b604051908082528060200260200182016040528015610c8e57816020015b610c7b613075565b815260200190600190039081610c735790505b5093505f80610cb7886040013589606001358a5f016020810190610cb29190613c05565b611a33565b915091506040518060400160405280838152602001828152509450505050509193909250565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610d9257336040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152600401610d8991906134e9565b60405180910390fd5b8660200135610db1885f016020810190610dac9190613c05565b611a92565b14610e0a57865f016020810190610dc89190613c05565b87602001356040517fc26bebcc000000000000000000000000000000000000000000000000000000008152600401610e01929190614096565b60405180910390fd5b610e1987878787878787611b03565b50505050505050565b600281565b5f807f02e49c2c000000000000000000000000000000000000000000000000000000006001915091509091565b5f8060016002915091509091565b5f600754905090565b600181565b5f80610e7a611a1a565b9050610e87858285611c8d565b610e92858585611d1f565b60019150509392505050565b5f6009905090565b610eae611e0f565b610eb88282611e96565b5050565b610ec461308e565b5f610ee984604001358560600135865f016020810190610ee49190613c05565b611a33565b9150505f80610ef88684611ef5565b91509150610f19865f016020810190610f119190613c05565b838388612086565b935050505092915050565b5f610f2f3383612167565b60019050919050565b5f30905090565b6003602052815f5260405f20602052805f5260405f205f91509150508054610f6690613fac565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9290613fac565b8015610fdd5780601f10610fb457610100808354040283529160200191610fdd565b820191905f5260205f20905b815481529060010190602001808311610fc057829003601f168201915b505050505081565b5f8160015f8563ffffffff1663ffffffff1681526020019081526020015f205414905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61103a611e0f565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197816040516110a991906134e9565b60405180910390a150565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611102611e0f565b61110b5f6121e6565b565b5f92915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f6006905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606009805461118c90613fac565b80601f01602080910402602001604051908101604052809291908181526020018280546111b890613fac565b80156112035780601f106111da57610100808354040283529160200191611203565b820191905f5260205f20905b8154815290600101906020018083116111e657829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f90565b5f8061123f611a1a565b905061124c818585611d1f565b600191505092915050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611284611e0f565b61129982829061129491906142ee565b6122a7565b5050565b6001602052805f5260405f205f915090505481565b60605f60035f8763ffffffff1663ffffffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f2080546112f490613fac565b80601f016020809104026020016040519081016040528092919081815260200182805461132090613fac565b801561136b5780601f106113425761010080835404028352916020019161136b565b820191905f5260205f20905b81548152906001019060200180831161134e57829003601f168201915b505050505090505f8151036113c65783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050509150506114ac565b5f84849050036113d957809150506114ac565b6002848490501061146d5761143084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123bc565b80848460029080926114449392919061430a565b604051602001611456939291906143a2565b6040516020818303038152906040529150506114ac565b83836040517f9a6d49cd0000000000000000000000000000000000000000000000000000000081526004016114a39291906143f3565b60405180910390fd5b949350505050565b5f5b828290508110156115d357368383838181106114d5576114d4614415565b5b90506020028101906114e7919061444e565b905061150c815f015f0160208101906115009190613c05565b825f0160200135610fe5565b61151657506115c6565b3073ffffffffffffffffffffffffffffffffffffffff1663d045a0dc8260c00135835f018460a00135858061010001906115509190614476565b8760e00160208101906115639190613ab0565b888061012001906115749190614476565b6040518963ffffffff1660e01b815260040161159697969594939291906145ab565b5f604051808303818588803b1580156115ad575f80fd5b505af11580156115bf573d5f803e3d5ffd5b5050505050505b80806001019150506114b6565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa15801561161c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611644919061467c565b6040517f8351eea70000000000000000000000000000000000000000000000000000000081526004016116779190613a1c565b60405180910390fd5b6116886130a6565b61169061305d565b61169b858585612415565b91509150935093915050565b6116af611e0f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b815260040161170891906134e9565b5f604051808303815f87803b15801561171f575f80fd5b505af1158015611731573d5f803e3d5ffd5b5050505050565b5f808590506117478686610b13565b156117c4578073ffffffffffffffffffffffffffffffffffffffff16638f4ffcb133873088886040518663ffffffff1660e01b815260040161178d9594939291906146c3565b5f604051808303815f87803b1580156117a4575f80fd5b505af11580156117b6573d5f803e3d5ffd5b5050505060019150506117c9565b5f9150505b949350505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611836576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118458787878787878761251a565b50505050505050565b611856611e0f565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760816040516118c591906134e9565b60405180910390a150565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61195a611e0f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ca575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119c191906134e9565b60405180910390fd5b6119d3816121e6565b50565b5f30905090565b5f816020013560015f845f0160208101906119f89190613c05565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b5f33905090565b611a2e8383836001612532565b505050565b5f80611a3e85612701565b915081905083811015611a8a5780846040517f71c4efed000000000000000000000000000000000000000000000000000000008152600401611a8192919061470f565b60405180910390fd5b935093915050565b5f8060015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f801b8103611afa57826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401611af19190614736565b60405180910390fd5b80915050919050565b5f611b16611b118787612760565b61278a565b90505f611b4682611b2f611b2a8a8a612795565b6127c6565b8b5f016020810190611b419190613c05565b612804565b9050611b528787612852565b15611c20575f611b908a6040016020810190611b6e919061474f565b8b5f016020810190611b809190613c05565b84611b8b8c8c612865565b6128c7565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637cb59012848b5f856040518563ffffffff1660e01b8152600401611bf194939291906147b3565b5f604051808303815f87803b158015611c08575f80fd5b505af1158015611c1a573d5f803e3d5ffd5b50505050505b8173ffffffffffffffffffffffffffffffffffffffff16887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c8b5f016020810190611c6b9190613c05565b84604051611c7a9291906147fd565b60405180910390a3505050505050505050565b5f611c9884846118d0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d195781811015611d0a578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611d0193929190614824565b60405180910390fd5b611d1884848484035f612532565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d8f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611d8691906134e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dff575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611df691906134e9565b60405180910390fd5b611e0a8383836128f9565b505050565b611e17611a1a565b73ffffffffffffffffffffffffffffffffffffffff16611e35611156565b73ffffffffffffffffffffffffffffffffffffffff1614611e9457611e58611a1a565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e8b91906134e9565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051611ee9929190614096565b60405180910390a15050565b6060805f611f618560200135611f0a86612b15565b878060a00190611f1a9190614476565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612b49565b80925081945050505f81611f76576001611f79565b60025b9050611fa6865f016020810190611f909190613c05565b82888060800190611fa19190614476565b6112b2565b92505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461207c578073ffffffffffffffffffffffffffffffffffffffff1663043a78eb86866040518363ffffffff1660e01b815260040161203b929190614859565b602060405180830381865afa158015612056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207a91906148a2565b505b5050509250929050565b61208e61308e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff1681526020016120ea89611a92565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b815260040161211f92919061499e565b6040805180830381865afa158015612139573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215d9190614a19565b9050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121d7575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016121ce91906134e9565b60405180910390fd5b6121e2825f836128f9565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5b8151811015612381576122d98282815181106122c8576122c7614415565b5b6020026020010151604001516123bc565b8181815181106122ec576122eb614415565b5b60200260200101516040015160035f84848151811061230e5761230d614415565b5b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f84848151811061234657612345614415565b5b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816123739190614bd8565b5080806001019150506122a9565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674816040516123b19190614dbe565b60405180910390a150565b5f60028201519050600361ffff168161ffff161461241157816040517f9a6d49cd0000000000000000000000000000000000000000000000000000000081526004016124089190613a1c565b60405180910390fd5b5050565b61241d6130a6565b61242561305d565b5f8061244c33886040013589606001358a5f0160208101906124479190613c05565b612bb7565b915091505f8061245c8984611ef5565b9150915061248e895f0160208101906124759190613c05565b83838b8036038101906124889190614e2b565b8b612bdf565b955060405180604001604052808581526020018481525094503373ffffffffffffffffffffffffffffffffffffffff16865f01517f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a8b5f0160208101906124f59190613c05565b878760405161250693929190614e56565b60405180910390a350505050935093915050565b61252987878787878787611b03565b50505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125a2575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161259991906134e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612612575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161260991906134e9565b60405180910390fd5b8160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156126fb578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516126f29190613759565b60405180910390a35b50505050565b5f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008361274f9190614ee5565b6127599190614f15565b9050919050565b5f82825f90602060ff16926127779392919061430a565b906127829190614f60565b905092915050565b5f815f1c9050919050565b5f8282602060ff1690602860ff16926127b09392919061430a565b906127bb9190614fe9565b60c01c905092915050565b5f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166127fd9190614f15565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361283e5761dead93505b6128488484612cf5565b8290509392505050565b5f602860ff168383905011905092915050565b60608282602860ff1690809261287d9392919061430a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b6060848484846040516020016128e094939291906150cf565b6040516020818303038152906040529050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612949578060075f82825461293d9190615118565b92505081905550612a19565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156129d3578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016129ca93929190614824565b60405180910390fd5b81810360055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a60578060075f8282540392505081905550612aab565b8060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b089190613759565b60405180910390a3505050565b5f7f000000000000000000000000000000000000000000000000000000000000000082612b429190614ee5565b9050919050565b60605f80835111905080612b7e578484604051602001612b6a92919061516b565b604051602081830303815290604052612bad565b8484612b8933612d74565b85604051602001612b9d9493929190615196565b6040516020818303038152906040525b9150935093915050565b5f80612bc4858585611a33565b8092508193505050612bd68683612167565b94509492505050565b612be76130a6565b5f612bf4845f0151612d95565b90505f84602001511115612c1057612c0f8460200151612de2565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff168152602001612c6d8c611a92565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b8152600401612ca892919061499e565b60806040518083038185885af1158015612cc4573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612ce99190615268565b91505095945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d65575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612d5c91906134e9565b60405180910390fd5b612d705f83836128f9565b5050565b5f8173ffffffffffffffffffffffffffffffffffffffff165f1b9050919050565b5f813414612dda57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401612dd19190613759565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e709190613ff0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ed7576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f24337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff16612f28909392919063ffffffff16565b5050565b612fa4848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612f5d93929190615293565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612faa565b50505050565b5f8060205f8451602086015f885af180612fc9576040513d5f823e3d81fd5b3d92505f519150505f8214612fe2576001811415612ffd565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561303f57836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161303691906134e9565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f8152602001606081525090565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f80191681526020015f67ffffffffffffffff1681526020016130d261308e565b81525090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61311a826130d8565b61312481856130e2565b93506131348185602086016130f2565b61313d81613100565b840191505092915050565b5f6020820190508181035f8301526131608184613110565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6131a282613179565b9050919050565b6131b281613198565b81146131bc575f80fd5b50565b5f813590506131cd816131a9565b92915050565b5f819050919050565b6131e5816131d3565b81146131ef575f80fd5b50565b5f81359050613200816131dc565b92915050565b5f806040838503121561321c5761321b613171565b5b5f613229858286016131bf565b925050602061323a858286016131f2565b9150509250929050565b5f8115159050919050565b61325881613244565b82525050565b5f6020820190506132715f83018461324f565b92915050565b5f80fd5b5f60e082840312156132905761328f613277565b5b81905092915050565b5f602082840312156132ae576132ad613171565b5b5f82013567ffffffffffffffff8111156132cb576132ca613175565b5b6132d78482850161327b565b91505092915050565b6132e9816131d3565b82525050565b604082015f8201516133035f8501826132e0565b50602082015161331660208501826132e0565b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b61335781613345565b82525050565b5f82825260208201905092915050565b5f613377826130d8565b613381818561335d565b93506133918185602086016130f2565b61339a81613100565b840191505092915050565b5f604083015f8301516133ba5f86018261334e565b50602083015184820360208601526133d2828261336d565b9150508091505092915050565b5f6133ea83836133a5565b905092915050565b5f602082019050919050565b5f6134088261331c565b6134128185613326565b93508360208202850161342485613336565b805f5b8581101561345f578484038952815161344085826133df565b945061344b836133f2565b925060208a01995050600181019050613427565b50829750879550505050505092915050565b604082015f8201516134855f8501826132e0565b50602082015161349860208501826132e0565b50505050565b5f60a0820190506134b15f8301866132ef565b81810360408301526134c381856133fe565b90506134d26060830184613471565b949350505050565b6134e381613198565b82525050565b5f6020820190506134fc5f8301846134da565b92915050565b5f6060828403121561351757613516613277565b5b81905092915050565b5f819050919050565b61353281613520565b811461353c575f80fd5b50565b5f8135905061354d81613529565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261357457613573613553565b5b8235905067ffffffffffffffff81111561359157613590613557565b5b6020830191508360018202830111156135ad576135ac61355b565b5b9250929050565b5f805f805f805f60e0888a0312156135cf576135ce613171565b5b5f6135dc8a828b01613502565b97505060606135ed8a828b0161353f565b965050608088013567ffffffffffffffff81111561360e5761360d613175565b5b61361a8a828b0161355f565b955095505060a061362d8a828b016131bf565b93505060c088013567ffffffffffffffff81111561364e5761364d613175565b5b61365a8a828b0161355f565b925092505092959891949750929550565b5f61ffff82169050919050565b6136818161366b565b82525050565b5f60208201905061369a5f830184613678565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136d4816136a0565b82525050565b5f67ffffffffffffffff82169050919050565b6136f6816136da565b82525050565b5f60408201905061370f5f8301856136cb565b61371c60208301846136ed565b9392505050565b5f6040820190506137365f8301856136ed565b61374360208301846136ed565b9392505050565b613753816131d3565b82525050565b5f60208201905061376c5f83018461374a565b92915050565b5f805f6060848603121561378957613788613171565b5b5f613796868287016131bf565b93505060206137a7868287016131bf565b92505060406137b8868287016131f2565b9150509250925092565b5f60ff82169050919050565b6137d7816137c2565b82525050565b5f6020820190506137f05f8301846137ce565b92915050565b5f63ffffffff82169050919050565b61380e816137f6565b8114613818575f80fd5b50565b5f8135905061382981613805565b92915050565b5f806040838503121561384557613844613171565b5b5f6138528582860161381b565b92505060206138638582860161353f565b9150509250929050565b61387681613244565b8114613880575f80fd5b50565b5f813590506138918161386d565b92915050565b5f80604083850312156138ad576138ac613171565b5b5f83013567ffffffffffffffff8111156138ca576138c9613175565b5b6138d68582860161327b565b92505060206138e785828601613883565b9150509250929050565b604082015f8201516139055f8501826132e0565b50602082015161391860208501826132e0565b50505050565b5f6040820190506139315f8301846138f1565b92915050565b5f6020828403121561394c5761394b613171565b5b5f613959848285016131f2565b91505092915050565b61396b8161366b565b8114613975575f80fd5b50565b5f8135905061398681613962565b92915050565b5f80604083850312156139a2576139a1613171565b5b5f6139af8582860161381b565b92505060206139c085828601613978565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f6139ee826139ca565b6139f881856139d4565b9350613a088185602086016130f2565b613a1181613100565b840191505092915050565b5f6020820190508181035f830152613a3481846139e4565b905092915050565b5f819050919050565b5f613a5f613a5a613a5584613179565b613a3c565b613179565b9050919050565b5f613a7082613a45565b9050919050565b5f613a8182613a66565b9050919050565b613a9181613a77565b82525050565b5f602082019050613aaa5f830184613a88565b92915050565b5f60208284031215613ac557613ac4613171565b5b5f613ad2848285016131bf565b91505092915050565b5f602082019050613aee5f8301846136ed565b92915050565b5f805f8060a08587031215613b0c57613b0b613171565b5b5f613b1987828801613502565b945050606085013567ffffffffffffffff811115613b3a57613b39613175565b5b613b468782880161355f565b93509350506080613b59878288016131bf565b91505092959194509250565b5f8083601f840112613b7a57613b79613553565b5b8235905067ffffffffffffffff811115613b9757613b96613557565b5b602083019150836020820283011115613bb357613bb261355b565b5b9250929050565b5f8060208385031215613bd057613bcf613171565b5b5f83013567ffffffffffffffff811115613bed57613bec613175565b5b613bf985828601613b65565b92509250509250929050565b5f60208284031215613c1a57613c19613171565b5b5f613c278482850161381b565b91505092915050565b613c3981613520565b82525050565b5f602082019050613c525f830184613c30565b92915050565b5f805f8060608587031215613c7057613c6f613171565b5b5f613c7d8782880161381b565b9450506020613c8e87828801613978565b935050604085013567ffffffffffffffff811115613caf57613cae613175565b5b613cbb8782880161355f565b925092505092959194509250565b5f8083601f840112613cde57613cdd613553565b5b8235905067ffffffffffffffff811115613cfb57613cfa613557565b5b602083019150836020820283011115613d1757613d1661355b565b5b9250929050565b5f8060208385031215613d3457613d33613171565b5b5f83013567ffffffffffffffff811115613d5157613d50613175565b5b613d5d85828601613cc9565b92509250509250929050565b5f60408284031215613d7e57613d7d613277565b5b81905092915050565b5f805f60808486031215613d9e57613d9d613171565b5b5f84013567ffffffffffffffff811115613dbb57613dba613175565b5b613dc78682870161327b565b9350506020613dd886828701613d69565b9250506060613de9868287016131bf565b9150509250925092565b613dfc81613520565b82525050565b613e0b816136da565b82525050565b604082015f820151613e255f8501826132e0565b506020820151613e3860208501826132e0565b50505050565b608082015f820151613e525f850182613df3565b506020820151613e656020850182613e02565b506040820151613e786040850182613e11565b50505050565b5f60c082019050613e915f830185613e3e565b613e9e6080830184613471565b9392505050565b5f805f8060608587031215613ebd57613ebc613171565b5b5f613eca878288016131bf565b9450506020613edb878288016131f2565b935050604085013567ffffffffffffffff811115613efc57613efb613175565b5b613f088782880161355f565b925092505092959194509250565b5f8060408385031215613f2c57613f2b613171565b5b5f613f39858286016131bf565b9250506020613f4a858286016131bf565b9150509250929050565b5f60608284031215613f6957613f68613171565b5b5f613f7684828501613502565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613fc357607f821691505b602082108103613fd657613fd5613f7f565b5b50919050565b5f81519050613fea816131a9565b92915050565b5f6020828403121561400557614004613171565b5b5f61401284828501613fdc565b91505092915050565b5f81519050614029816131dc565b92915050565b5f6020828403121561404457614043613171565b5b5f6140518482850161401b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614090816137f6565b82525050565b5f6040820190506140a95f830185614087565b6140b66020830184613c30565b9392505050565b6140c682613100565b810181811067ffffffffffffffff821117156140e5576140e461405a565b5b80604052505050565b5f6140f7613168565b905061410382826140bd565b919050565b5f67ffffffffffffffff8211156141225761412161405a565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156141595761415861405a565b5b61416282613100565b9050602081019050919050565b828183375f83830152505050565b5f61418f61418a8461413f565b6140ee565b9050828152602081018484840111156141ab576141aa61413b565b5b6141b684828561416f565b509392505050565b5f82601f8301126141d2576141d1613553565b5b81356141e284826020860161417d565b91505092915050565b5f60608284031215614200576141ff614133565b5b61420a60606140ee565b90505f6142198482850161381b565b5f83015250602061422c84828501613978565b602083015250604082013567ffffffffffffffff8111156142505761424f614137565b5b61425c848285016141be565b60408301525092915050565b5f61427a61427584614108565b6140ee565b9050808382526020820190506020840283018581111561429d5761429c61355b565b5b835b818110156142e457803567ffffffffffffffff8111156142c2576142c1613553565b5b8086016142cf89826141eb565b8552602085019450505060208101905061429f565b5050509392505050565b5f6142fa368484614268565b905092915050565b5f80fd5b5f80fd5b5f808585111561431d5761431c614302565b5b8386111561432e5761432d614306565b5b6001850283019150848603905094509492505050565b5f81905092915050565b5f614358826139ca565b6143628185614344565b93506143728185602086016130f2565b80840191505092915050565b5f6143898385614344565b935061439683858461416f565b82840190509392505050565b5f6143ad828661434e565b91506143ba82848661437e565b9150819050949350505050565b5f6143d283856139d4565b93506143df83858461416f565b6143e883613100565b840190509392505050565b5f6020820190508181035f83015261440c8184866143c7565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f823560016101400383360303811261446a57614469614442565b5b80830191505092915050565b5f808335600160200384360303811261449257614491614442565b5b80840192508235915067ffffffffffffffff8211156144b4576144b3614446565b5b6020830192506001820236038313156144d0576144cf61444a565b5b509250929050565b5f6144e6602084018461381b565b905092915050565b6144f7816137f6565b82525050565b5f61450b602084018461353f565b905092915050565b61451c816136da565b8114614526575f80fd5b50565b5f8135905061453781614513565b92915050565b5f61454b6020840184614529565b905092915050565b606082016145635f8301836144d8565b61456f5f8501826144ee565b5061457d60208301836144fd565b61458a6020850182613df3565b50614598604083018361453d565b6145a56040850182613e02565b50505050565b5f60e0820190506145be5f83018a614553565b6145cb6060830189613c30565b81810360808301526145de8187896143c7565b90506145ed60a08301866134da565b81810360c08301526146008184866143c7565b905098975050505050505050565b5f61462061461b8461413f565b6140ee565b90508281526020810184848401111561463c5761463b61413b565b5b6146478482856130f2565b509392505050565b5f82601f83011261466357614662613553565b5b815161467384826020860161460e565b91505092915050565b5f6020828403121561469157614690613171565b5b5f82015167ffffffffffffffff8111156146ae576146ad613175565b5b6146ba8482850161464f565b91505092915050565b5f6080820190506146d65f8301886134da565b6146e3602083018761374a565b6146f060408301866134da565b81810360608301526147038184866143c7565b90509695505050505050565b5f6040820190506147225f83018561374a565b61472f602083018461374a565b9392505050565b5f6020820190506147495f830184614087565b92915050565b5f6020828403121561476457614763613171565b5b5f61477184828501614529565b91505092915050565b5f819050919050565b5f61479d6147986147938461477a565b613a3c565b61366b565b9050919050565b6147ad81614783565b82525050565b5f6080820190506147c65f8301876134da565b6147d36020830186613c30565b6147e060408301856147a4565b81810360608301526147f281846139e4565b905095945050505050565b5f6040820190506148105f830185614087565b61481d602083018461374a565b9392505050565b5f6060820190506148375f8301866134da565b614844602083018561374a565b614851604083018461374a565b949350505050565b5f6040820190508181035f83015261487181856139e4565b9050818103602083015261488581846139e4565b90509392505050565b5f8151905061489c8161386d565b92915050565b5f602082840312156148b7576148b6613171565b5b5f6148c48482850161488e565b91505092915050565b5f82825260208201905092915050565b5f6148e7826139ca565b6148f181856148cd565b93506149018185602086016130f2565b61490a81613100565b840191505092915050565b61491e81613244565b82525050565b5f60a083015f8301516149395f8601826144ee565b50602083015161494c6020860182613df3565b506040830151848203604086015261496482826148dd565b9150506060830151848203606086015261497e82826148dd565b91505060808301516149936080860182614915565b508091505092915050565b5f6040820190508181035f8301526149b68185614924565b90506149c560208301846134da565b9392505050565b5f604082840312156149e1576149e0614133565b5b6149eb60406140ee565b90505f6149fa8482850161401b565b5f830152506020614a0d8482850161401b565b60208301525092915050565b5f60408284031215614a2e57614a2d613171565b5b5f614a3b848285016149cc565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614aa07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a65565b614aaa8683614a65565b95508019841693508086168417925050509392505050565b5f614adc614ad7614ad2846131d3565b613a3c565b6131d3565b9050919050565b5f819050919050565b614af583614ac2565b614b09614b0182614ae3565b848454614a71565b825550505050565b5f90565b614b1d614b11565b614b28818484614aec565b505050565b5b81811015614b4b57614b405f82614b15565b600181019050614b2e565b5050565b601f821115614b9057614b6181614a44565b614b6a84614a56565b81016020851015614b79578190505b614b8d614b8585614a56565b830182614b2d565b50505b505050565b5f82821c905092915050565b5f614bb05f1984600802614b95565b1980831691505092915050565b5f614bc88383614ba1565b9150826002028217905092915050565b614be1826139ca565b67ffffffffffffffff811115614bfa57614bf961405a565b5b614c048254613fac565b614c0f828285614b4f565b5f60209050601f831160018114614c40575f8415614c2e578287015190505b614c388582614bbd565b865550614c9f565b601f198416614c4e86614a44565b5f5b82811015614c7557848901518255600182019150602085019450602081019050614c50565b86831015614c925784890151614c8e601f891682614ba1565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614cd98161366b565b82525050565b5f606083015f830151614cf45f8601826144ee565b506020830151614d076020860182614cd0565b5060408301518482036040860152614d1f82826148dd565b9150508091505092915050565b5f614d378383614cdf565b905092915050565b5f602082019050919050565b5f614d5582614ca7565b614d5f8185614cb1565b935083602082028501614d7185614cc1565b805f5b85811015614dac5784840389528151614d8d8582614d2c565b9450614d9883614d3f565b925060208a01995050600181019050614d74565b50829750879550505050505092915050565b5f6020820190508181035f830152614dd68184614d4b565b905092915050565b5f60408284031215614df357614df2614133565b5b614dfd60406140ee565b90505f614e0c848285016131f2565b5f830152506020614e1f848285016131f2565b60208301525092915050565b5f60408284031215614e4057614e3f613171565b5b5f614e4d84828501614dde565b91505092915050565b5f606082019050614e695f830186614087565b614e76602083018561374a565b614e83604083018461374a565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614eef826131d3565b9150614efa836131d3565b925082614f0a57614f09614e8b565b5b828204905092915050565b5f614f1f826131d3565b9150614f2a836131d3565b9250828202614f38816131d3565b91508282048414831517614f4f57614f4e614eb8565b5b5092915050565b5f82905092915050565b5f614f6b8383614f56565b82614f768135613520565b92506020821015614fb657614fb17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614a65565b831692505b505092915050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f614ff48383614f56565b82614fff8135614fbe565b9250600882101561503f5761503a7fffffffffffffffff00000000000000000000000000000000000000000000000083600803600802614a65565b831692505b505092915050565b5f8160c01b9050919050565b5f61505d82615047565b9050919050565b615075615070826136da565b615053565b82525050565b5f8160e01b9050919050565b5f6150918261507b565b9050919050565b6150a96150a4826137f6565b615087565b82525050565b5f819050919050565b6150c96150c4826131d3565b6150af565b82525050565b5f6150da8287615064565b6008820191506150ea8286615098565b6004820191506150fa82856150b8565b60208201915061510a828461434e565b915081905095945050505050565b5f615122826131d3565b915061512d836131d3565b925082820190508082111561514557615144614eb8565b5b92915050565b5f819050919050565b61516561516082613520565b61514b565b82525050565b5f6151768285615154565b6020820191506151868284615064565b6008820191508190509392505050565b5f6151a18287615154565b6020820191506151b18286615064565b6008820191506151c18285615154565b6020820191506151d1828461434e565b915081905095945050505050565b5f815190506151ed81613529565b92915050565b5f8151905061520181614513565b92915050565b5f6080828403121561521c5761521b614133565b5b61522660606140ee565b90505f615235848285016151df565b5f830152506020615248848285016151f3565b602083015250604061525c848285016149cc565b60408301525092915050565b5f6080828403121561527d5761527c613171565b5b5f61528a84828501615207565b91505092915050565b5f6060820190506152a65f8301866134da565b6152b360208301856134da565b6152c0604083018461374a565b94935050505056fea2646970667358221220d9f7322516ed78dbcdb2227dc6f40171a24a4f5cd50edf49887430f976c62b5f64736f6c63430008190033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006edce65403992e310a62460808c4b910d972f10f000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc000000000000000000000000000000000000000000000000000000000000000f694578656320524c4320546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003524c430000000000000000000000000000000000000000000000000000000000", + "nonce": "0xe", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x5cd8ed", + "logs": [ + { + "address": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc" + ], + "data": "0x", + "blockHash": "0x1280d6e47091fde6457e45d703cd725e2fc45ebe72688ac8e27682f74ab7b900", + "blockNumber": "0x920b2a5", + "transactionHash": "0x797392fe323ff655c07197d9e38e71ec5c968b5a213fe0c26aad4fee303551a6", + "transactionIndex": "0x12", + "logIndex": "0x8", + "removed": false + }, + { + "address": "0x6edce65403992e310a62460808c4b910d972f10f", + "topics": [ + "0x6ee10e9ed4d6ce9742703a498707862f4b00f1396a87195eb93267b3d7983981" + ], + "data": "0x000000000000000000000000126e7f4ff12869b9171c60bcfeac5b6e698b0fcc000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "blockHash": "0x1280d6e47091fde6457e45d703cd725e2fc45ebe72688ac8e27682f74ab7b900", + "blockNumber": "0x920b2a5", + "transactionHash": "0x797392fe323ff655c07197d9e38e71ec5c968b5a213fe0c26aad4fee303551a6", + "transactionIndex": "0x12", + "logIndex": "0x9", + "removed": false + } + ], + "logsBloom": "0x00000000000000000002000000000000000000000000000000800000000000000000000000000000200000000000000000000002000008000000000000000000000000000000000000000000000000000001000800000000000000000000000000000000020000000200000000000800000000000080000000000000000000400000000000000020000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000200000000000000000000", + "type": "0x2", + "transactionHash": "0x797392fe323ff655c07197d9e38e71ec5c968b5a213fe0c26aad4fee303551a6", + "transactionIndex": "0x12", + "blockHash": "0x1280d6e47091fde6457e45d703cd725e2fc45ebe72688ac8e27682f74ab7b900", + "blockNumber": "0x920b2a5", + "gasUsed": "0x4c4dbf", + "effectiveGasPrice": "0x5f5e100", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": null, + "contractAddress": "0x126e7f4ff12869b9171c60bcfeac5b6e698b0fcc", + "gasUsedForL1": "0x36a08", + "l1BlockNumber": "0x7f1df2", + "timeboosted": false + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747297872, + "chain": 421614, + "commit": "e4d5e19" +} \ No newline at end of file diff --git a/broadcast/SendArbitrumToEthereum.s.sol/421614/run-latest.json b/broadcast/SendArbitrumToEthereum.s.sol/421614/run-latest.json new file mode 100644 index 00000000..f6fce537 --- /dev/null +++ b/broadcast/SendArbitrumToEthereum.s.sol/421614/run-latest.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x435e2293653a3e80c93290803faa0d152181b835", + "function": "send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address)", + "arguments": [ + "(40161, 0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc, 4995000000000000000000, 4495500000000000000000, 0x0003010021010000000000000000000000000000fde800000000000000000000000000000000, 0x, 0x)", + "(2498199536925004, 0)", + "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x435e2293653a3e80c93290803faa0d152181b835", + "gas": "0x4deff", + "value": "0x8e01967f9f94c", + "input": "0xc7c7f5b300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000008e01967f9f94c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000009ce1000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc00000000000000000000000000000000000000000000010ec78cd35b142c00000000000000000000000000000000000000000000000000f3b39857d1f88e000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000260003010021010000000000000000000000000000fde800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x5c76c", + "logs": [ + { + "address": "0x435e2293653a3e80c93290803faa0d152181b835", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x00000000000000000000000000000000000000000000010ec78cd35b142c0000", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x4f7cd4da19abb31b0ec98b9066b9e857b1bf9c0e", + "topics": [ + "0x61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a" + ], + "data": "0x0000000000000000000000005df3a1cebbd9c8ba7f8df51fd632a9aef830889700000000000000000000000000000000000000000000000000055f26163b8be0", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x4f7cd4da19abb31b0ec98b9066b9e857b1bf9c0e", + "topics": [ + "0x07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db24644" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000053f488e93b4f1b60e8e83aa374dbe1780a1ee8a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000380f351be6d6c", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x6edce65403992e310a62460808c4b910d972f10f", + "topics": [ + "0x1ab700d4ced0c005b164c0f789fd09fcbb0156d4c2041b8a3bfbcd961cd1567f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000004f7cd4da19abb31b0ec98b9066b9e857b1bf9c0e000000000000000000000000000000000000000000000000000000000000009901000000000000000500009d27000000000000000000000000435e2293653a3e80c93290803faa0d152181b83500009ce10000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e50fc48ed278d48c1bf5626addcd897deaac89f7af7aa7dcee401631a93d4561af000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc0000000129b9a6c00000000000000000000000000000000000000000000000000000000000000000000000000000260003010021010000000000000000000000000000fde8000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x435e2293653a3e80c93290803faa0d152181b835", + "topics": [ + "0x85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a", + "0x0fc48ed278d48c1bf5626addcd897deaac89f7af7aa7dcee401631a93d4561af", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000009ce100000000000000000000000000000000000000000000010ec78cd35b142c000000000000000000000000000000000000000000000000010ec78cd35b142c0000", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "logIndex": "0x4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000002000000000000000000000000000000000000000000000010000000000000200000000000000000000000008000000000000000000000000002000000000000000008000000000000001000000000000000000000000000000000020000808200000000000800000000000080000000000010000000000000000000000020000000080000000000000000000000010000000000000000000000008000000000102000000000000000040000400000000440000000000000000002000000000000000080000000000400000000000000000000000020000000040000000000000000000000002000000000008200000000000000000000", + "type": "0x2", + "transactionHash": "0x8024565ba6656a187f2ae70799a225e2ee0dc474259ae34f8338b1ae2a74928b", + "transactionIndex": "0x4", + "blockHash": "0x948a28436f7555ed175b09dbc21ae718c426bd5c3fe70632138e91f95c075205", + "blockNumber": "0x920b051", + "gasUsed": "0x3a70f", + "effectiveGasPrice": "0x6407e90", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x435e2293653a3e80c93290803faa0d152181b835", + "contractAddress": null, + "gasUsedForL1": "0x1bd3", + "l1BlockNumber": "0x7f1de5", + "timeboosted": false + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747297717, + "chain": 421614, + "commit": "e4d5e19" +} \ No newline at end of file diff --git a/broadcast/SendEthereumToArbitrum.s.sol/11155111/run-latest.json b/broadcast/SendEthereumToArbitrum.s.sol/11155111/run-latest.json new file mode 100644 index 00000000..b1cd0df4 --- /dev/null +++ b/broadcast/SendEthereumToArbitrum.s.sol/11155111/run-latest.json @@ -0,0 +1,175 @@ +{ + "transactions": [ + { + "hash": "0x89e0bb876f89bd18a0d82723c3cb41643c4ba4cf11915148e24f4a1da117a9a7", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x26a738b6d33ef4d94ff084d3552961b8f00639cd", + "function": "approve(address,uint256)", + "arguments": [ + "0x2F8b13A6882e4c4ea52d6588510fB7DFbD09E4E5", + "5000000000" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x26a738b6d33ef4d94ff084d3552961b8f00639cd", + "gas": "0xf889", + "value": "0x0", + "input": "0x095ea7b30000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5000000000000000000000000000000000000000000000000000000012a05f200", + "nonce": "0x18", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "function": "send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address)", + "arguments": [ + "(40231, 0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc, 5000000000, 4500000000, 0x0003010021010000000000000000000000000000fde800000000000000000000000000000000, 0x, 0x)", + "(31846673131952, 0)", + "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38" + ], + "transaction": { + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "gas": "0x5ab20", + "value": "0x1cf6e1a3a9b0", + "input": "0xc7c7f5b3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000001cf6e1a3a9b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000009d27000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc000000000000000000000000000000000000000000000000000000012a05f200000000000000000000000000000000000000000000000000000000010c388d0000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000260003010021010000000000000000000000000000fde800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x19", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1bf1c48", + "logs": [ + { + "address": "0x26a738b6d33ef4d94ff084d3552961b8f00639cd", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "0x0000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5" + ], + "data": "0x000000000000000000000000000000000000000000000000000000012a05f200", + "blockHash": "0xbe6248c9459dd67e994011a3c4776cc4c4820547e3ea4e9dc36d75aef5d3f436", + "blockNumber": "0x7f1dfa", + "transactionHash": "0x89e0bb876f89bd18a0d82723c3cb41643c4ba4cf11915148e24f4a1da117a9a7", + "transactionIndex": "0x9d", + "logIndex": "0x1ba", + "removed": false + } + ], + "logsBloom": "0x00000000000000000002000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000080020000000000000000000000000200000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000010000000000000000000020000000000000000000200000000000000000000", + "type": "0x2", + "transactionHash": "0x89e0bb876f89bd18a0d82723c3cb41643c4ba4cf11915148e24f4a1da117a9a7", + "transactionIndex": "0x9d", + "blockHash": "0xbe6248c9459dd67e994011a3c4776cc4c4820547e3ea4e9dc36d75aef5d3f436", + "blockNumber": "0x7f1dfa", + "gasUsed": "0xb3f0", + "effectiveGasPrice": "0x247a21ff7", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x26a738b6d33ef4d94ff084d3552961b8f00639cd", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x142500a", + "logs": [ + { + "address": "0x26a738b6d33ef4d94ff084d3552961b8f00639cd", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc", + "0x0000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5" + ], + "data": "0x000000000000000000000000000000000000000000000000000000012a05f200", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "logIndex": "0x1f9", + "removed": false + }, + { + "address": "0xcc1ae8cf5d3904cef3360a9532b477529b177cce", + "topics": [ + "0x61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a" + ], + "data": "0x000000000000000000000000718b92b5cb0a5552039b593faf724d182a881eda00000000000000000000000000000000000000000000000000001070d53e2000", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "logIndex": "0x1fa", + "removed": false + }, + { + "address": "0xcc1ae8cf5d3904cef3360a9532b477529b177cce", + "topics": [ + "0x07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db24644" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008eebf8b423b73bfca51a1db4b7354aa0bfca91930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000c860c6589b0", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "logIndex": "0x1fb", + "removed": false + }, + { + "address": "0x6edce65403992e310a62460808c4b910d972f10f", + "topics": [ + "0x1ab700d4ced0c005b164c0f789fd09fcbb0156d4c2041b8a3bfbcd961cd1567f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000cc1ae8cf5d3904cef3360a9532b477529b177cce000000000000000000000000000000000000000000000000000000000000009901000000000000000100009ce10000000000000000000000002f8b13a6882e4c4ea52d6588510fb7dfbd09e4e500009d27000000000000000000000000126e7f4ff12869b9171c60bcfeac5b6e698b0fcc2d88266c98c169815e21d995ebab379e1832749c87a8f7fbe1c51502e4ca0351000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc00000000004c4b400000000000000000000000000000000000000000000000000000000000000000000000000000260003010021010000000000000000000000000000fde8000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "logIndex": "0x1fc", + "removed": false + }, + { + "address": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "topics": [ + "0x85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a", + "0x2d88266c98c169815e21d995ebab379e1832749c87a8f7fbe1c51502e4ca0351", + "0x000000000000000000000000316a389d7f0ac46b19fcbe7076f125566f09cebc" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000009d27000000000000000000000000000000000000000000000000000000012a05f200000000000000000000000000000000000000000000000000000000012a05f200", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "logIndex": "0x1fd", + "removed": false + } + ], + "logsBloom": "0x00000000000000000002000000100000000000000000000000000000000100000000000000000000200000000000000040000000000000000000000000001000000002000000000000000008000000000000000002000000000000000000000000020000000000008200000001000000000000000080020000000010000000000000000200000020000000080000000000000000000000000000000000000000000000008000000000100000000000002000000000400000000440000000000000000802000000000000000080000000010000080000000000000000000000000000040000000000000000020000002000000000008200000000000000000020", + "type": "0x2", + "transactionHash": "0xa800c83a369385ee4dee650d1f4dd050190102882fe272b078604541709e0ed7", + "transactionIndex": "0x89", + "blockHash": "0x75b043ade8a137b6616a180a9a2b35636b211eb441d98a41501022a6eac53f54", + "blockNumber": "0x7f1dff", + "gasUsed": "0x3e039", + "effectiveGasPrice": "0x283438f9d", + "from": "0x316a389d7f0ac46b19fcbe7076f125566f09cebc", + "to": "0x2f8b13a6882e4c4ea52d6588510fb7dfbd09e4e5", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747298018, + "chain": 11155111, + "commit": "e4d5e19" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 25b918f9..37bf8d29 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,5 +2,27 @@ src = "src" out = "out" libs = ["lib"] +fs_permissions = [{ access = "read-write", path = "./" }] +optimizer = true +optimizer_runs = 200 +via_ir = true + +## Needed by openzepplin upgrade plugin +ffi = true +ast = true +build_info = true +extra_output = ["storageLayout"] + +remappings = [ + '@layerzerolabs/oft-evm-upgradeable/=lib/devtools/packages/oft-evm-upgradeable/', + '@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/', + '@layerzerolabs/oapp-evm-upgradeable/=lib/devtools/packages/oapp-evm-upgradeable/', + '@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/', + '@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol', + '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/', + '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/', + '@openzeppelin-foundry/contracts/=lib/openzeppelin-foundry-upgrades/src/', +] + # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/lib/devtools b/lib/devtools new file mode 160000 index 00000000..fbb37ae1 --- /dev/null +++ b/lib/devtools @@ -0,0 +1 @@ +Subproject commit fbb37ae13677973f97045702af24301c7e8443aa diff --git a/lib/layerzero-v2 b/lib/layerzero-v2 new file mode 160000 index 00000000..88428755 --- /dev/null +++ b/lib/layerzero-v2 @@ -0,0 +1 @@ +Subproject commit 88428755be6caa71cb1d2926141d73c8989296b5 diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 00000000..e4f70216 --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit e4f70216d759d8e6a64144a9e1f7bbeed78e7079 diff --git a/lib/openzeppelin-contracts-upgradeable b/lib/openzeppelin-contracts-upgradeable new file mode 160000 index 00000000..60b305a8 --- /dev/null +++ b/lib/openzeppelin-contracts-upgradeable @@ -0,0 +1 @@ +Subproject commit 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 diff --git a/lib/openzeppelin-foundry-upgrades b/lib/openzeppelin-foundry-upgrades new file mode 160000 index 00000000..cbce1e00 --- /dev/null +++ b/lib/openzeppelin-foundry-upgrades @@ -0,0 +1 @@ +Subproject commit cbce1e00305e943aa1661d43f41e5ac72c662b07 diff --git a/lib/rlc-faucet-contract b/lib/rlc-faucet-contract new file mode 160000 index 00000000..8f3847d9 --- /dev/null +++ b/lib/rlc-faucet-contract @@ -0,0 +1 @@ +Subproject commit 8f3847d906cdce50666f59504e3321dcbd6d4fc7 diff --git a/script/Counter.s.sol b/script/Counter.s.sol deleted file mode 100644 index cdc1fe9a..00000000 --- a/script/Counter.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console} from "forge-std/Script.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterScript is Script { - Counter public counter; - - function setUp() public {} - - function run() public { - vm.startBroadcast(); - - counter = new Counter(); - - vm.stopBroadcast(); - } -} diff --git a/script/RLCAdapter.s.sol b/script/RLCAdapter.s.sol new file mode 100644 index 00000000..2baa7d38 --- /dev/null +++ b/script/RLCAdapter.s.sol @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {Script, console} from "forge-std/Script.sol"; +import {Upgrades, Options} from "@openzeppelin-foundry/contracts/Upgrades.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {RLCAdapter} from "../src/RLCAdapter.sol"; +import {EnvUtils} from "./UpdateEnvUtils.sol"; + +contract Deploy is Script { + function run() external { + vm.startBroadcast(); + + address rlcToken = vm.envAddress("RLC_SEPOLIA_ADDRESS"); // RLC token address on sepolia testnet + address lzEndpoint = vm.envAddress("LAYER_ZERO_SEPOLIA_ENDPOINT_ADDRESS"); // LayerZero sepolia endpoint + address ownerAddress = vm.envAddress("OWNER_ADDRESS"); // Your actual wallet address + + // Deploy the RLCAdapter contract + RLCAdapter rlcAdapterImplementation = new RLCAdapter(rlcToken, lzEndpoint); + console.log("RLCAdapter implementation deployed at:", address(rlcAdapterImplementation)); + + // Deploy the proxy contract + ERC1967Proxy rlcAdapterProxy = new ERC1967Proxy( + address(rlcAdapterImplementation), + abi.encodeWithSelector(rlcAdapterImplementation.initialize.selector, ownerAddress) + ); + console.log("RLCAdapter proxy deployed at:", address(rlcAdapterProxy)); + + vm.stopBroadcast(); + + EnvUtils.updateEnvVariable("RLC_SEPOLIA_ADAPTER_ADDRESS", address(rlcAdapterProxy)); + } +} + +contract Configure is Script { + function run() external { + vm.startBroadcast(); + + // RLCAdapter on Ethereum Sepolia + address adapterAddress = vm.envAddress("RLC_SEPOLIA_ADAPTER_ADDRESS"); // Read this variable from .env file + RLCAdapter adapter = RLCAdapter(adapterAddress); + + // RLCOFT on Arbitrum Sepolia + address oftAddress = vm.envAddress("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS"); + uint16 arbitrumSepoliaChainId = uint16(vm.envUint("LAYER_ZERO_ARBITRUM_SEPOLIA_CHAIN_ID")); //TODO: remove or make it chain agnostic + // Set trusted remote + adapter.setPeer(arbitrumSepoliaChainId, bytes32(uint256(uint160(oftAddress)))); + + vm.stopBroadcast(); + } +} diff --git a/script/RLCOFT.s.sol b/script/RLCOFT.s.sol new file mode 100644 index 00000000..b8f832f6 --- /dev/null +++ b/script/RLCOFT.s.sol @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {Script, console} from "forge-std/Script.sol"; +import {Upgrades, Options} from "openzeppelin-foundry-upgrades/Upgrades.sol"; +import {RLCOFT} from "../src/RLCOFT.sol"; +import {EnvUtils} from "./UpdateEnvUtils.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract Deploy is Script { + function run() external { + vm.startBroadcast(); + + string memory name = vm.envString("RLC_OFT_TOKEN_NAME"); + string memory symbol = vm.envString("RLC_TOKEN_SYMBOL"); + address lzEndpoint = vm.envAddress("LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS"); + address owner = vm.envAddress("OWNER_ADDRESS"); + + RLCOFT rlcOFTImplementation = new RLCOFT(lzEndpoint); + console.log("RLCOFT implementation deployed at:", address(rlcOFTImplementation)); + + // Deploy the proxy contract + ERC1967Proxy rlcOFTProxy = new ERC1967Proxy( + address(rlcOFTImplementation), + abi.encodeWithSelector(rlcOFTImplementation.initialize.selector, name, symbol, owner) + ); + console.log("RLCOFT proxy deployed at:", address(rlcOFTProxy)); + + vm.stopBroadcast(); + + EnvUtils.updateEnvVariable("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS", address(rlcOFTProxy)); + } +} + +contract Configure is Script { + function run() external { + vm.startBroadcast(); + + // RLCOFT on Arbitrum Sepolia + address oftAddress = vm.envAddress("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS"); + RLCOFT oft = RLCOFT(oftAddress); + + // RLCAdapter on Ethereum Sepolia + address adapterAddress = vm.envAddress("RLC_SEPOLIA_ADAPTER_ADDRESS"); // Read this variable from .env file + uint16 ethereumSepoliaChainId = uint16(vm.envUint("LAYER_ZERO_SEPOLIA_CHAIN_ID")); // LayerZero chain ID for Ethereum Sepolia - TODO: remove or make it chain agnostic + + // Set trusted remote + oft.setPeer(ethereumSepoliaChainId, bytes32(uint256(uint160(adapterAddress)))); + + vm.stopBroadcast(); + } +} diff --git a/script/SendArbitrumToEthereum.s.sol b/script/SendArbitrumToEthereum.s.sol new file mode 100644 index 00000000..5ea21f4b --- /dev/null +++ b/script/SendArbitrumToEthereum.s.sol @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {Script, console} from "forge-std/Script.sol"; +import {RLCOFT} from "../src/RLCOFT.sol"; +import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; +import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; + +contract SendTokensToSepolia is Script { + /** + * @dev Converts an address to bytes32. + * @param _addr The address to convert. + * @return The bytes32 representation of the address. + */ + function addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + function run() external { + vm.startBroadcast(); + + // Contract addresses + address oftAddress = vm.envAddress("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS"); // Your RLCOFT address on Arbitrum Sepolia + + // Transfer parameters + uint16 destinationChainId = uint16(vm.envUint("LAYER_ZERO_SEPOLIA_CHAIN_ID")); // LayerZero chain ID for Ethereum Sepolia + address recipientAddress = vm.envAddress("OWNER_ADDRESS"); // Recipient on Ethereum Sepolia + console.log("Recipient: %s", recipientAddress); + + uint256 amount = 5 * 10 ** 18; // RLC tokens (adjust the amount as needed) + + // Send tokens cross-chain + RLCOFT oft = RLCOFT(oftAddress); + console.log("Sending %s RLC to Ethereum Sepolia", amount / 10 ** 9); + + // Estimate gas for the OFT endpoint + // TODO extract in function and document + bytes memory _extraOptions = + abi.encodePacked(uint16(3), uint8(1), uint16(33), uint8(1), uint128(65000), uint128(0)); + + SendParam memory sendParam = SendParam( + destinationChainId, + addressToBytes32(recipientAddress), + amount, + amount * 9 / 10, // minAmount (allowing 10% slippage) + _extraOptions, + "", + "" + ); + + // Get the fee for the transfer + MessagingFee memory fee = oft.quoteSend(sendParam, false); + console.log("Fee amount: ", fee.nativeFee); + + // Execute the cross-chain transfer + oft.send{value: fee.nativeFee}(sendParam, fee, msg.sender); + + console.log("Cross-chain transfer from Arbitrum to Ethereum initiated!"); + vm.stopBroadcast(); + } +} diff --git a/script/SendEthereumToArbitrum.s.sol b/script/SendEthereumToArbitrum.s.sol new file mode 100644 index 00000000..d5868cd7 --- /dev/null +++ b/script/SendEthereumToArbitrum.s.sol @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {Script, console} from "forge-std/Script.sol"; +import {RLCAdapter} from "../src/RLCAdapter.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; +// import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; +import {MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; + +contract SendTokensToArbitrumSepolia is Script { + /** + * @dev Converts an address to bytes32. + * @param _addr The address to convert. + * @return The bytes32 representation of the address. + */ + function addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + function run() external { + vm.startBroadcast(); + + // Contract addresses + address adapterAddress = vm.envAddress("RLC_SEPOLIA_ADAPTER_ADDRESS"); // Your RLCAdapter address + address rlcTokenAddress = vm.envAddress("RLC_SEPOLIA_ADDRESS"); // RLC token address on sepolia testnet + + // Transfer parameters + uint16 destinationChainId = uint16(vm.envUint("LAYER_ZERO_ARBITRUM_SEPOLIA_CHAIN_ID")); // LayerZero chain ID for Arbitrum Sepolia + address recipientAddress = vm.envAddress("OWNER_ADDRESS"); // Recipient on Arbitrum (your address) + uint256 amount = 5 * 10 ** 9; // RLC tokens (adjust the amount as needed) + + // First, approve the adapter to spend your tokens + IERC20 rlcToken = IERC20(rlcTokenAddress); + console.log("Approving RLCAdapter to spend %s RLC", amount / 10 ** 9); + rlcToken.approve(adapterAddress, amount); + + // Then, send tokens cross-chain + RLCAdapter adapter = RLCAdapter(adapterAddress); + console.log("Sending %s RLC to Arbitrum Sepolia", amount / 10 ** 9); + console.log("Recipient: %s", recipientAddress); + + // bytes memory _extraOptions = OptionsBuilder.newOptions().addExecutorLzReceiveOption(65000, 0); + bytes memory _extraOptions = + abi.encodePacked(uint16(3), uint8(1), uint16(33), uint8(1), uint128(65000), uint128(0)); + SendParam memory sendParam = SendParam( + destinationChainId, // You can also make this dynamic if needed + addressToBytes32(recipientAddress), + amount, + amount * 9 / 10, + _extraOptions, + "", + "" + ); + + MessagingFee memory fee = adapter.quoteSend(sendParam, false); + + console.log("Fee amount: ", fee.nativeFee); + + adapter.send{value: fee.nativeFee}(sendParam, fee, msg.sender); + + console.log("Cross-chain transfer initiated!"); + vm.stopBroadcast(); + } +} diff --git a/script/UpdateEnvUtils.sol b/script/UpdateEnvUtils.sol new file mode 100644 index 00000000..f634a619 --- /dev/null +++ b/script/UpdateEnvUtils.sol @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {console} from "forge-std/console.sol"; +import {Vm} from "forge-std/Vm.sol"; + +library EnvUtils { + Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function updateEnvVariable(string memory variableName, address value) internal { + string memory envPath = ".env"; + string memory addressString = vm.toString(value); + string memory targetVar = string.concat(variableName, "="); + + // Check if file exists + if (!vm.exists(envPath)) { + console.log(".env file not found"); + revert("File not found"); + } + + // Read the entire file + string memory content = vm.readFile(envPath); + string[] memory lines = splitLines(content); + + // Process lines and make updates + string memory newContent = ""; + bool found = false; + + for (uint256 i = 0; i < lines.length; i++) { + string memory currentLine = lines[i]; + + // Check if this is the line we want to replace + if (startsWith(currentLine, targetVar)) { + currentLine = string.concat(targetVar, addressString); + found = true; + } + + // Add line to new content + if (i > 0) { + newContent = string.concat(newContent, "\n"); + } + newContent = string.concat(newContent, currentLine); + } + + // If not found, append it + if (!found) { + newContent = string.concat(newContent, "\n", targetVar, addressString); + } + + // Write back to file + vm.writeFile(envPath, newContent); + console.log("Updated .env file with new", variableName, ":", addressString); + } + + // Helper function to split a string by newlines + function splitLines(string memory _content) internal pure returns (string[] memory) { + bytes memory content = bytes(_content); + + // Count the number of lines + uint256 lineCount = 1; + for (uint256 i = 0; i < content.length; i++) { + if (content[i] == bytes1("\n")) { + lineCount++; + } + } + + // Split the content + string[] memory lines = new string[](lineCount); + uint256 lineStart = 0; + uint256 currentLine = 0; + + for (uint256 i = 0; i < content.length; i++) { + if (content[i] == bytes1("\n") || i == content.length - 1) { + uint256 lineEnd = i; + if (i == content.length - 1 && content[i] != bytes1("\n")) { + lineEnd = i + 1; + } + + // Extract line + bytes memory line = new bytes(lineEnd - lineStart); + for (uint256 j = lineStart; j < lineEnd; j++) { + line[j - lineStart] = content[j]; + } + + lines[currentLine] = string(line); + currentLine++; + lineStart = i + 1; + } + } + + return lines; + } + + // Helper function to check if a string starts with a prefix + function startsWith(string memory _str, string memory _prefix) internal pure returns (bool) { + bytes memory str = bytes(_str); + bytes memory prefix = bytes(_prefix); + + if (str.length < prefix.length) { + return false; + } + + for (uint256 i = 0; i < prefix.length; i++) { + if (str[i] != prefix[i]) { + return false; + } + } + + return true; + } +} diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded7997..00000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/src/ITokenSpender.sol b/src/ITokenSpender.sol new file mode 100644 index 00000000..0c9eb719 --- /dev/null +++ b/src/ITokenSpender.sol @@ -0,0 +1,7 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +interface ITokenSpender { + function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) external; +} diff --git a/src/RLCAdapter.sol b/src/RLCAdapter.sol new file mode 100644 index 00000000..df3bcc32 --- /dev/null +++ b/src/RLCAdapter.sol @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.22; + +import {OFTAdapterUpgradeable} from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterUpgradeable.sol"; +import {AccessControlDefaultAdminRulesUpgradeable} from + "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +/// @notice OFTAdapter uses a deployed ERC-20 token and safeERC20 to interact with the OFTCore contract. +// There can only be one OFT Adapter deployed per chain. Multiple OFT Adapters break omnichain unified +// liquidity by effectively creating token pools. +contract RLCAdapter is OFTAdapterUpgradeable, UUPSUpgradeable, AccessControlDefaultAdminRulesUpgradeable { + // Upgrader Role RLCAdapter contracts. + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + // Bridge Minter Role required for minting RLC Token + bytes32 public constant BRIDGE_ROLE = keccak256("BRIDGE_ROLE"); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor(address _token, address _lzEndpoint) OFTAdapterUpgradeable(_token, _lzEndpoint) { + _disableInitializers(); + } + + /// @notice Initializes the contract + /// @param _owner Address of the contract owner + function initialize(address _owner) public initializer { + __Ownable_init(_owner); + __OFTAdapter_init(_owner); + __UUPSUpgradeable_init(); + __AccessControlDefaultAdminRules_init(0, _owner); + _grantRole(UPGRADER_ROLE, _owner); + } + + function owner() + public + view + override(OwnableUpgradeable, AccessControlDefaultAdminRulesUpgradeable) + returns (address) + { + return OwnableUpgradeable.owner(); + } + + function _authorizeUpgrade(address newImplementation) internal virtual override {} +} diff --git a/src/RLCOFT.sol b/src/RLCOFT.sol new file mode 100644 index 00000000..37c899ad --- /dev/null +++ b/src/RLCOFT.sol @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {OFTUpgradeable} from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {AccessControlDefaultAdminRulesUpgradeable} from + "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol"; +import {ITokenSpender} from "src/ITokenSpender.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +/// @notice OFT is an ERC-20 token that extends the OFTCore contract. +contract RLCOFT is OFTUpgradeable, UUPSUpgradeable, AccessControlDefaultAdminRulesUpgradeable { + // Upgrader Role RLCAdapter contracts. + bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); + // Bridge Minter Role required for minting RLC Token + bytes32 public constant BRIDGE_ROLE = keccak256("BRIDGE_ROLE"); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor(address _lzEndpoint) OFTUpgradeable(_lzEndpoint) { + _disableInitializers(); + } + + /// @notice Initializes the contract + /// @param _name Name of the token + /// @param _symbol Symbol of the token + /// @param _owner Address of the contract owner + function initialize(string memory _name, string memory _symbol, address _owner) public initializer { + __Ownable_init(_owner); + __OFT_init(_name, _symbol, _owner); + __UUPSUpgradeable_init(); + __AccessControlDefaultAdminRules_init(0, _owner); + _grantRole(UPGRADER_ROLE, _owner); + } + + /// @notice Authorizes an upgrade to a new implementation + /// @dev Can only be called by the owner + /// @param newImplementation Address of the new implementation + function _authorizeUpgrade(address newImplementation) internal override onlyRole(UPGRADER_ROLE) {} + + /** + * @dev Override the decimals function to return 9 instead of the default 18 + * @return The number of decimals used in the token + */ + function decimals() public pure override returns (uint8) { + return 9; + } + + function burn(uint256 _value) external returns (bool) { + _burn(msg.sender, _value); + return true; + } + + function owner() + public + view + override(OwnableUpgradeable, AccessControlDefaultAdminRulesUpgradeable) + returns (address) + { + return OwnableUpgradeable.owner(); + } + + /** + * Approve and then call the approved contract in a single tx + */ + function approveAndCall(address _spender, uint256 _value, bytes calldata _extraData) public returns (bool) { + ITokenSpender spender = ITokenSpender(_spender); + if (approve(_spender, _value)) { + spender.receiveApproval(msg.sender, _value, address(this), _extraData); + return true; + } + return false; + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 54b724f7..00000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -}