diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml index e54ef0a944..62d5ffa286 100644 --- a/.github/workflows/integration-tests-publish.yml +++ b/.github/workflows/integration-tests-publish.yml @@ -5,6 +5,7 @@ on: push: branches: - ccip-develop + workflow_dispatch: env: ECR_TAG: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests:develop diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 3a6ca7237f..e562984805 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -142,102 +142,102 @@ jobs: QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} - compare-tests: - needs: [changes] - runs-on: ubuntu-latest - name: Compare/Build Automation Test List - outputs: - matrix: ${{ env.MATRIX_JSON }} - steps: - - name: Check for Skip Tests Label - if: contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') - run: | - echo "## \`skip-smoke-tests\` label is active, skipping E2E smoke tests" >>$GITHUB_STEP_SUMMARY - exit 0 - - name: Checkout the repo - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - - name: Compare Test Lists - run: | - cd ./integration-tests - ./scripts/compareTestList.sh ./smoke/automation_test.go - ./scripts/compareTestList.sh ./smoke/keeper_test.go - - name: Build Test Matrix Lists - id: build-test-matrix-list - run: | - cd ./integration-tests - MATRIX_JSON_AUTOMATION=$(./scripts/buildTestMatrixList.sh ./smoke/automation_test.go automation ubuntu20.04-8cores-32GB 1) - MATRIX_JSON_KEEPER=$(./scripts/buildTestMatrixList.sh ./smoke/keeper_test.go keeper ubuntu20.04-8cores-32GB 1) - COMBINED_ARRAY=$(jq -c -n "$MATRIX_JSON_AUTOMATION + $MATRIX_JSON_KEEPER") - echo "MATRIX_JSON=${COMBINED_ARRAY}" >> $GITHUB_ENV +# compare-tests: +# needs: [changes] +# runs-on: ubuntu-latest +# name: Compare/Build Automation Test List +# outputs: +# matrix: ${{ env.MATRIX_JSON }} +# steps: +# - name: Check for Skip Tests Label +# if: contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') +# run: | +# echo "## \`skip-smoke-tests\` label is active, skipping E2E smoke tests" >>$GITHUB_STEP_SUMMARY +# exit 0 +# - name: Checkout the repo +# uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 +# - name: Compare Test Lists +# run: | +# cd ./integration-tests +# ./scripts/compareTestList.sh ./smoke/automation_test.go +# ./scripts/compareTestList.sh ./smoke/keeper_test.go +# - name: Build Test Matrix Lists +# id: build-test-matrix-list +# run: | +# cd ./integration-tests +# MATRIX_JSON_AUTOMATION=$(./scripts/buildTestMatrixList.sh ./smoke/automation_test.go automation ubuntu20.04-8cores-32GB 1) +# MATRIX_JSON_KEEPER=$(./scripts/buildTestMatrixList.sh ./smoke/keeper_test.go keeper ubuntu20.04-8cores-32GB 1) +# COMBINED_ARRAY=$(jq -c -n "$MATRIX_JSON_AUTOMATION + $MATRIX_JSON_KEEPER") +# echo "MATRIX_JSON=${COMBINED_ARRAY}" >> $GITHUB_ENV - eth-smoke-tests-matrix-automation: - if: ${{ !contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') }} - environment: integration - permissions: - checks: write - pull-requests: write - id-token: write - contents: read - needs: [build-chainlink, changes, compare-tests] - env: - SELECTED_NETWORKS: SIMULATED,SIMULATED_1,SIMULATED_2 - CHAINLINK_COMMIT_SHA: ${{ github.sha }} - CHAINLINK_ENV_USER: ${{ github.actor }} - TEST_LOG_LEVEL: debug - DATABASE_URL: postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable - strategy: - fail-fast: false - matrix: - product: ${{fromJson(needs.compare-tests.outputs.matrix)}} - runs-on: ${{ matrix.product.os }} - name: ETH Smoke Tests ${{ matrix.product.name }} - steps: - - name: Checkout the repo - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - with: - ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} - - name: Build Go Test Command - id: build-go-test-command - run: | - # if the matrix.product.run is set, use it for a different command - if [ "${{ matrix.product.run }}" != "" ]; then - echo "run_command=${{ matrix.product.run }} ./smoke/${{ matrix.product.file }}_test.go" >> "$GITHUB_OUTPUT" - else - echo "run_command=./smoke/${{ matrix.product.name }}_test.go" >> "$GITHUB_OUTPUT" - fi - ## Run this step when changes that require tests to be run are made - - name: Run Tests - if: needs.changes.outputs.src == 'true' - uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@eccde1970eca69f079d3efb3409938a72ade8497 # v2.2.13 - env: - PYROSCOPE_SERVER: ${{ matrix.product.pyroscope_env == '' && '' || !startsWith(github.ref, 'refs/tags/') && '' || secrets.QA_PYROSCOPE_INSTANCE }} # Avoid sending blank envs https://github.com/orgs/community/discussions/25725 - PYROSCOPE_ENVIRONMENT: ${{ matrix.product.pyroscope_env }} - PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }} - with: - test_command_to_run: make test_need_operator_assets && cd ./integration-tests && go test -timeout 30m -count=1 -json -test.parallel=${{ matrix.product.nodes }} ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt - test_download_vendor_packages_command: cd ./integration-tests && go mod download - cl_repo: ${{ env.CHAINLINK_IMAGE }} - cl_image_tag: ${{ github.sha }} - aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} - artifacts_location: ./integration-tests/smoke/logs/ - publish_check_name: ${{ matrix.product.name }} - token: ${{ secrets.GITHUB_TOKEN }} - go_mod_path: ./integration-tests/go.mod - cache_key_id: core-e2e-${{ env.MOD_CACHE_VERSION }} - cache_restore_only: "true" - QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} - QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} - QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }} - - name: Collect Metrics - if: always() - id: collect-gha-metrics - uses: smartcontractkit/push-gha-metrics-action@d2c2b7bdc9012651230b2608a1bcb0c48538b6ec - with: - basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }} - hostname: ${{ secrets.GRAFANA_CLOUD_HOST }} - this-job-name: ETH Smoke Tests ${{ matrix.product.name }} - test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' - continue-on-error: true +# eth-smoke-tests-matrix-automation: +# if: ${{ !contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') }} +# environment: integration +# permissions: +# checks: write +# pull-requests: write +# id-token: write +# contents: read +# needs: [build-chainlink, changes, compare-tests] +# env: +# SELECTED_NETWORKS: SIMULATED,SIMULATED_1,SIMULATED_2 +# CHAINLINK_COMMIT_SHA: ${{ github.sha }} +# CHAINLINK_ENV_USER: ${{ github.actor }} +# TEST_LOG_LEVEL: debug +# DATABASE_URL: postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable +# strategy: +# fail-fast: false +# matrix: +# product: ${{fromJson(needs.compare-tests.outputs.matrix)}} +# runs-on: ${{ matrix.product.os }} +# name: ETH Smoke Tests ${{ matrix.product.name }} +# steps: +# - name: Checkout the repo +# uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 +# with: +# ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} +# - name: Build Go Test Command +# id: build-go-test-command +# run: | +# # if the matrix.product.run is set, use it for a different command +# if [ "${{ matrix.product.run }}" != "" ]; then +# echo "run_command=${{ matrix.product.run }} ./smoke/${{ matrix.product.file }}_test.go" >> "$GITHUB_OUTPUT" +# else +# echo "run_command=./smoke/${{ matrix.product.name }}_test.go" >> "$GITHUB_OUTPUT" +# fi +# ## Run this step when changes that require tests to be run are made +# - name: Run Tests +# if: needs.changes.outputs.src == 'true' +# uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@eccde1970eca69f079d3efb3409938a72ade8497 # v2.2.13 +# env: +# PYROSCOPE_SERVER: ${{ matrix.product.pyroscope_env == '' && '' || !startsWith(github.ref, 'refs/tags/') && '' || secrets.QA_PYROSCOPE_INSTANCE }} # Avoid sending blank envs https://github.com/orgs/community/discussions/25725 +# PYROSCOPE_ENVIRONMENT: ${{ matrix.product.pyroscope_env }} +# PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }} +# with: +# test_command_to_run: make test_need_operator_assets && cd ./integration-tests && go test -timeout 30m -count=1 -json -test.parallel=${{ matrix.product.nodes }} ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt +# test_download_vendor_packages_command: cd ./integration-tests && go mod download +# cl_repo: ${{ env.CHAINLINK_IMAGE }} +# cl_image_tag: ${{ github.sha }} +# aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} +# artifacts_location: ./integration-tests/smoke/logs/ +# publish_check_name: ${{ matrix.product.name }} +# token: ${{ secrets.GITHUB_TOKEN }} +# go_mod_path: ./integration-tests/go.mod +# cache_key_id: core-e2e-${{ env.MOD_CACHE_VERSION }} +# cache_restore_only: "true" +# QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} +# QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} +# QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }} +# - name: Collect Metrics +# if: always() +# id: collect-gha-metrics +# uses: smartcontractkit/push-gha-metrics-action@d2c2b7bdc9012651230b2608a1bcb0c48538b6ec +# with: +# basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }} +# hostname: ${{ secrets.GRAFANA_CLOUD_HOST }} +# this-job-name: ETH Smoke Tests ${{ matrix.product.name }} +# test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' +# continue-on-error: true eth-smoke-tests-matrix: if: ${{ !contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') }} @@ -385,10 +385,10 @@ jobs: if: always() runs-on: ubuntu-latest name: ETH Smoke Tests - needs: [eth-smoke-tests-matrix, eth-smoke-tests-matrix-automation] + needs: [eth-smoke-tests-matrix] steps: - name: Check smoke test matrix status - if: needs.eth-smoke-tests-matrix.result != 'success' || needs.eth-smoke-tests-matrix-automation.result != 'success' + if: needs.eth-smoke-tests-matrix.result != 'success' run: exit 1 - name: Collect Metrics if: always() diff --git a/VERSION b/VERSION index 2a67855334..9fd00cdd0b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.5.0-ccip1.0.0 +v2.5.0-ccip1.2.0 diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile index 6b4cb573ed..e82aab1d9f 100644 --- a/contracts/GNUmakefile +++ b/contracts/GNUmakefile @@ -18,6 +18,11 @@ ALL_FOUNDRY_PRODUCTS = llo-feeds functions shared ccip snapshot: ## Make a snapshot for a specific product. export FOUNDRY_PROFILE=$(FOUNDRY_PROFILE) && forge snapshot --nmt "testFuzz_\w{1,}?" --snap gas-snapshots/$(FOUNDRY_PROFILE).gas-snapshot +.PHONY: snapshot-diff +snapshot-diff: ## Make a snapshot for a specific product. + export FOUNDRY_PROFILE=$(FOUNDRY_PROFILE) && forge snapshot --nmt "testFuzz_\w{1,}?" --diff gas-snapshots/$(FOUNDRY_PROFILE).gas-snapshot + + .PHONY: snapshot-all snapshot-all: ## Make a snapshot for all products. for foundry_profile in $(ALL_FOUNDRY_PRODUCTS) ; do \ diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index e09516b1d0..8b1caf2c28 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -56,7 +56,7 @@ BurnMintERC677_burn:testPoolBurnRevertNotHealthyReverts() (gas: 58150) BurnMintERC677_burn:testPoolBurnSuccess() (gas: 197641) BurnMintERC677_mint:testPoolMintNotHealthyReverts() (gas: 55384) BurnMintERC677_mint:testPoolMintSuccess() (gas: 93675) -CCIPClientExample_sanity:testExamples() (gas: 2220761) +CCIPClientExample_sanity:testExamples() (gas: 2213780) CommitStore_constructor:testConstructorSuccess() (gas: 3307574) CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71312) CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26019) @@ -86,73 +86,73 @@ CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 174828) DefensiveExampleTest:testRecovery() (gas: 399728) -E2E:testE2E_3MessagesSuccess_gas() (gas: 870710) +E2E:testE2E_3MessagesSuccess_gas() (gas: 863423) EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 428056) EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 100322) EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18159) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 139008) -EVM2EVMOffRamp__report:testReportSuccess() (gas: 129025) -EVM2EVMOffRamp__trialExecute:testRateLimitErrorReverts() (gas: 151693) -EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 181117) -EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 229193) +EVM2EVMOffRamp__report:testReportSuccess() (gas: 126666) +EVM2EVMOffRamp__trialExecute:testRateLimitErrorReverts() (gas: 150522) +EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 179946) +EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 228022) EVM2EVMOffRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 2548304) EVM2EVMOffRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 17359) EVM2EVMOffRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 16000) EVM2EVMOffRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 5153053) EVM2EVMOffRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 2512963) EVM2EVMOffRamp_applyPoolUpdates:testTokenPoolMismatchReverts() (gas: 5155382) -EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 18247) -EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 169286) -EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 6021934) -EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145652) -EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2651936) -EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 139986) -EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 18992) -EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 36234) -EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 52576) -EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 46248) -EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 153620) -EVM2EVMOffRamp_execute:testPausedReverts() (gas: 79161) -EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 166396) -EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 41124) -EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 416120) -EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 176803) -EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 249382) -EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 115229) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 320721) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 55129) -EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 133621) -EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 51821) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 436040) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 392008) -EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 34068) -EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 413627) -EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 64495) -EVM2EVMOffRamp_execute:testUnsupportedTokenReverts() (gas: 136561) -EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 21647) -EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 48821) -EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 21195) -EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 198093) -EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 138058) -EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 227809) -EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 49344) -EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 235267) -EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 284786) -EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 267420) -EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 231165) -EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 133015) +EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 17094) +EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 169257) +EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 6004286) +EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145623) +EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2651907) +EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 136534) +EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 18990) +EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 33939) +EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49122) +EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 43953) +EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 149928) +EVM2EVMOffRamp_execute:testPausedReverts() (gas: 74549) +EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 162924) +EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 38829) +EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 412650) +EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 172174) +EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 245912) +EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114026) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 314921) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51676) +EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 130151) +EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49524) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 430223) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 389520) +EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 32929) +EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 406629) +EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61032) +EVM2EVMOffRamp_execute:testUnsupportedTokenReverts() (gas: 129586) +EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20494) +EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 47668) +EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20042) +EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 196939) +EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 136903) +EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 225488) +EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48191) +EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 230624) +EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 277815) +EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 259301) +EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 223057) +EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 130696) EVM2EVMOffRamp_getDestinationToken:testGetDestinationTokenSuccess() (gas: 32662) EVM2EVMOffRamp_getDestinationToken:testUnsupportedTokenReverts() (gas: 13728) EVM2EVMOffRamp_getDestinationTokens:testGetDestinationTokensSuccess() (gas: 26043) EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3047472) EVM2EVMOffRamp_getExecutionState:test_GetExecutionStateSuccess() (gas: 76287) -EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 500322) -EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 27057) -EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 44562) -EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 27095) -EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 193001) -EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 193581) -EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1895103) +EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 495679) +EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 25902) +EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43405) +EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 25940) +EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 188359) +EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 188939) +EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1890571) EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 6074) EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 44264) EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38118) @@ -165,32 +165,33 @@ EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23154) EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351576) EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277882) EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 616024) -EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5767696) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 131989) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 132301) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 142721) +EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5774116) +EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31534) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126628) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 126940) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137359) EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressEncodePackedReverts() (gas: 23964) EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24263) -EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23242) -EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 76555) -EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 34884) -EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26896) -EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105433) -EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20187) -EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49590) -EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26792) -EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34382) -EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 180487) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 108580) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 127810) -EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28108) -EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42943) -EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 108788) -EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 154470) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 151462) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 197712) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 121267) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 97564) +EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23265) +EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 77006) +EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32218) +EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26907) +EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105488) +EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20165) +EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49568) +EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26836) +EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34938) +EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 168385) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104372) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123580) +EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28119) +EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42966) +EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 108831) +EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 154448) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 141893) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 184775) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 112643) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 92203) EVM2EVMOnRamp_getDataAvailabilityCostUSD:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15075) EVM2EVMOnRamp_getDataAvailabilityCostUSD:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15388) EVM2EVMOnRamp_getExpectedNextSequenceNumber:testGetExpectedNextSequenceNumberSuccess() (gas: 7860) @@ -224,7 +225,7 @@ EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131481) EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136500) EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149589) EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144225) -EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 303562) +EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299354) EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19467) EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37031) EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25795) @@ -233,10 +234,10 @@ EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17 EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20586) EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13950) EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65220) -EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 438918) +EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434710) EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57250) EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18777) -EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 89943) +EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85735) EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63408) EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170843) EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190362) @@ -245,9 +246,9 @@ EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20647) EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigSuccess() (gas: 50282) EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15094) -EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 88446) +EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84238) EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19453) -EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 247963) +EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244596) EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50104) EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12913) LockReleaseTokenPool_addLiquidity:testLiquidityNotAcceptedReverts() (gas: 2509153) @@ -288,10 +289,10 @@ OCR2Base_transmit:testTransmit2SignersSuccess_gas() (gas: 51741) OCR2Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 23441) OCR2Base_transmit:testUnauthorizedSignerReverts() (gas: 43661) OCR2Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 20507) -OnRampTokenPoolReentrancy:testSuccess() (gas: 336945) -PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 150304) +OnRampTokenPoolReentrancy:testSuccess() (gas: 332065) +PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146097) PingPong_plumbing:testPausingSuccess() (gas: 14471) -PingPong_startPingPong:testStartPingPongSuccess() (gas: 176530) +PingPong_startPingPong:testStartPingPongSuccess() (gas: 171175) PriceRegistry_applyFeeTokensUpdates:testApplyFeeTokensUpdatesSuccess() (gas: 77674) PriceRegistry_applyFeeTokensUpdates:testOnlyCallableByOwnerReverts() (gas: 16598) PriceRegistry_applyPriceUpdatersUpdates:testApplyPriceUpdaterUpdatesSuccess() (gas: 80774) @@ -331,21 +332,21 @@ Router_applyRampUpdates:testOffRampDisable() (gas: 192139) Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 108518) Router_applyRampUpdates:testOnRampDisable() (gas: 52147) Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12224) -Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114446) -Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 189599) -Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126497) -Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 201651) +Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110238) +Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188316) +Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122289) +Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200368) Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61367) Router_ccipSend:testInvalidMsgValue() (gas: 31860) Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 64237) -Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 166131) -Router_ccipSend:testNativeFeeTokenSuccess() (gas: 165472) +Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 161923) +Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161264) Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51217) -Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 237673) +Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 233465) Router_ccipSend:testUnsupportedDestinationChainReverts() (gas: 24624) Router_ccipSend:testWhenNotHealthyReverts() (gas: 44650) -Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 167571) -Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 233408) +Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 163363) +Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 229200) Router_constructor:testConstructorSuccess() (gas: 9929) Router_getFee:testGetFeeSupportedChainSuccess() (gas: 38866) Router_getFee:testUnsupportedDestinationChainReverts() (gas: 17079) @@ -380,9 +381,9 @@ TokenPool_setOnRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17999) TokenProxy_ccipSend:testCcipSendGasShouldBeZeroReverts() (gas: 17053) TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127348) TokenProxy_ccipSend:testCcipSendInvalidTokenReverts() (gas: 15839) -TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 230610) +TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229327) TokenProxy_ccipSend:testCcipSendNoDataAllowedReverts() (gas: 16167) -TokenProxy_ccipSend:testCcipSendSuccess() (gas: 250257) +TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249231) TokenProxy_constructor:testConstructor() (gas: 10651) TokenProxy_getFee:testGetFeeGasShouldBeZeroReverts() (gas: 16734) TokenProxy_getFee:testGetFeeInvalidTokenReverts() (gas: 12616) diff --git a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol index 7d22df5282..fef7a64f15 100644 --- a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol +++ b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol @@ -16,6 +16,7 @@ contract AggregateRateLimiter is OwnerIsCreator { using USDPriceWith18Decimals for uint224; error PriceNotFoundForToken(address token); + event AdminSet(address newAdmin); // The address of the token limit admin that has the same permissions as the owner. @@ -67,7 +68,7 @@ contract AggregateRateLimiter is OwnerIsCreator { } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Gets the token limit admin address. diff --git a/contracts/src/v0.8/ccip/CommitStore.sol b/contracts/src/v0.8/ccip/CommitStore.sol index 9f1cc77196..bff308f2bf 100644 --- a/contracts/src/v0.8/ccip/CommitStore.sol +++ b/contracts/src/v0.8/ccip/CommitStore.sol @@ -27,8 +27,8 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { /// @notice Static commit store config struct StaticConfig { - uint64 chainSelector; // -------┐ Destination chainSelector - uint64 sourceChainSelector; // -┘ Source chainSelector + uint64 chainSelector; // ───────╮ Destination chainSelector + uint64 sourceChainSelector; // ─╯ Source chainSelector address onRamp; // OnRamp address on the source chain address armProxy; // ARM proxy address } @@ -40,8 +40,8 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { /// @notice a sequenceNumber interval struct Interval { - uint64 min; // ---┐ Minimum sequence number, inclusive - uint64 max; // ---┘ Maximum sequence number, inclusive + uint64 min; // ───╮ Minimum sequence number, inclusive + uint64 max; // ───╯ Maximum sequence number, inclusive } /// @notice Report that is committed by the observing DON at the committing phase @@ -98,7 +98,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Verification | + // │ Verification │ // ================================================================ /// @notice Returns the next expected sequence number. @@ -218,7 +218,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static commit store config. @@ -264,7 +264,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @notice Single function to check the status of the commitStore. diff --git a/contracts/src/v0.8/ccip/PriceRegistry.sol b/contracts/src/v0.8/ccip/PriceRegistry.sol index 755141caca..ec7089fc0d 100644 --- a/contracts/src/v0.8/ccip/PriceRegistry.sol +++ b/contracts/src/v0.8/ccip/PriceRegistry.sol @@ -66,7 +66,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Price calculations | + // │ Price calculations │ // ================================================================ // @inheritdoc IPriceRegistry @@ -147,7 +147,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Fee tokens | + // │ Fee tokens │ // ================================================================ /// @notice Get the list of fee tokens. @@ -185,7 +185,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Price updates | + // │ Price updates │ // ================================================================ // @inheritdoc IPriceRegistry @@ -211,7 +211,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Get the list of price updaters. diff --git a/contracts/src/v0.8/ccip/Router.sol b/contracts/src/v0.8/ccip/Router.sol index 6b15e521c5..3cdb5f8d15 100644 --- a/contracts/src/v0.8/ccip/Router.sol +++ b/contracts/src/v0.8/ccip/Router.sol @@ -71,7 +71,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Message sending | + // │ Message sending │ // ================================================================ /// @inheritdoc IRouterClient @@ -145,7 +145,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Message execution | + // │ Message execution │ // ================================================================ /// @inheritdoc IRouter @@ -218,7 +218,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Gets the wrapped representation of the native fee coin. @@ -316,7 +316,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice only lets permissioned offRamps execute diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol index 0e6120035e..903069ac75 100644 --- a/contracts/src/v0.8/ccip/libraries/Internal.sol +++ b/contracts/src/v0.8/ccip/libraries/Internal.sol @@ -81,28 +81,31 @@ library Internal { }); } - bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256("EVM2EVMMessageEvent"); + bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256("EVM2EVMMessageHashV2"); function _hash(EVM2EVMMessage memory original, bytes32 metadataHash) internal pure returns (bytes32) { - /// @dev Fields split into 2 abi.encode calls due to number of parameters triggering stack too deep. - /// If a dynamic type, e.g. an array is to be added, make sure it is placed in the last abi.encode call. + // Fixed-size message fields are included in nested hash to reduce stack pressure. + // This hashing scheme is also used by RMN. If changing it, please notify RMN. return keccak256( - bytes.concat( - abi.encode( - MerkleMultiProof.LEAF_DOMAIN_SEPARATOR, - metadataHash, - original.sequenceNumber, - original.nonce, - original.sender, - original.receiver, - keccak256(original.data), - keccak256(abi.encode(original.tokenAmounts)), - keccak256(abi.encode(original.sourceTokenData)), - original.gasLimit, - original.strict + abi.encode( + MerkleMultiProof.LEAF_DOMAIN_SEPARATOR, + metadataHash, + keccak256( + abi.encode( + original.sender, + original.receiver, + original.sequenceNumber, + original.gasLimit, + original.strict, + original.nonce, + original.feeToken, + original.feeTokenAmount + ) ), - abi.encode(original.feeToken, original.feeTokenAmount) + keccak256(original.data), + keccak256(abi.encode(original.tokenAmounts)), + keccak256(abi.encode(original.sourceTokenData)) ) ); } diff --git a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol index 578fb60830..81b6999d1c 100644 --- a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol +++ b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol @@ -20,17 +20,17 @@ library RateLimiter { event ConfigChanged(Config config); struct TokenBucket { - uint128 tokens; // ------┐ Current number of tokens that are in the bucket. - uint32 lastUpdated; // | Timestamp in seconds of the last token refill, good for 100+ years. - bool isEnabled; // ------┘ Indication whether the rate limiting is enabled or not - uint128 capacity; // ----┐ Maximum number of tokens that can be in the bucket. - uint128 rate; // --------┘ Number of tokens per second that the bucket is refilled. + uint128 tokens; // ──────╮ Current number of tokens that are in the bucket. + uint32 lastUpdated; // │ Timestamp in seconds of the last token refill, good for 100+ years. + bool isEnabled; // ──────╯ Indication whether the rate limiting is enabled or not + uint128 capacity; // ────╮ Maximum number of tokens that can be in the bucket. + uint128 rate; // ────────╯ Number of tokens per second that the bucket is refilled. } struct Config { bool isEnabled; // Indication whether the rate limiting should be enabled - uint128 capacity; // ----┐ Specifies the capacity of the rate limiter - uint128 rate; // -------┘ Specifies the rate of the rate limiter + uint128 capacity; // ────╮ Specifies the capacity of the rate limiter + uint128 rate; // ───────╯ Specifies the rate of the rate limiter } /// @notice _consume removes the given tokens from the pool, lowering the diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index 6adfe76aa7..b1c5cd2482 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -76,10 +76,10 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion /// @notice Static offRamp config struct StaticConfig { - address commitStore; // --------┐ CommitStore address on the destination chain - uint64 chainSelector; // -------┘ Destination chainSelector - uint64 sourceChainSelector; // -┐ Source chainSelector - address onRamp; // -------------┘ OnRamp address on the source chain + address commitStore; // ────────╮ CommitStore address on the destination chain + uint64 chainSelector; // ───────╯ Destination chainSelector + uint64 sourceChainSelector; // ─╮ Source chainSelector + address onRamp; // ─────────────╯ OnRamp address on the source chain address prevOffRamp; // Address of previous-version OffRamp address armProxy; // ARM proxy address } @@ -87,11 +87,11 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion /// @notice Dynamic offRamp config /// @dev since OffRampConfig is part of OffRampConfigChanged event, if changing it, we should update the ABI on Atlas struct DynamicConfig { - uint32 permissionLessExecutionThresholdSeconds; // -┐ Waiting time before manual execution is enabled - address router; // ---------------------------------┘ Router address - address priceRegistry; // -----┐ Price registry address - uint16 maxTokensLength; // | Maximum number of ERC20 token transfers that can be included per message - uint32 maxDataSize; // --------┘ Maximum payload data size + uint32 permissionLessExecutionThresholdSeconds; // ─╮ Waiting time before manual execution is enabled + address router; // ─────────────────────────────────╯ Router address + address priceRegistry; // ─────╮ Price registry address + uint16 maxTokensLength; // │ Maximum number of ERC20 token transfers that can be included per message + uint32 maxDataSize; // ────────╯ Maximum payload data size } // STATIC CONFIG @@ -168,7 +168,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Messaging | + // │ Messaging │ // ================================================================ // The size of the execution state in bits @@ -431,7 +431,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static config. @@ -476,7 +476,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Tokens and pools | + // │ Tokens and pools │ // ================================================================ /// @notice Get all supported source tokens @@ -616,7 +616,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @notice Reverts as this contract should not access CCIP messages diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index d61a005996..619f6da79b 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -20,7 +20,7 @@ import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/utils/structs/EnumerableMap.sol"; /// @notice The onRamp is a contract that handles lane-specific fee logic, NOP payments and -/// bridegable token support. +/// bridgeable token support. /// @dev The EVM2EVMOnRamp, CommitStore and EVM2EVMOffRamp form an xchain upgradeable unit. Any change to one of them /// results an onchain upgrade of all 3. contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, TypeAndVersionInterface { @@ -54,6 +54,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, error LinkBalanceNotSettled(); error InvalidNopAddress(address nop); error NotAFeeToken(address token); + error CannotSendZeroTokens(); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); event NopPaid(address indexed nop, uint256 amount); @@ -66,71 +67,71 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, /// @dev Struct that contains the static configuration struct StaticConfig { - address linkToken; // --------┐ Link token address - uint64 chainSelector; // -----┘ Source chainSelector - uint64 destChainSelector; // -┐ Destination chainSelector - uint64 defaultTxGasLimit; // | Default gas limit for a tx - uint96 maxNopFeesJuels; // ---┘ Max nop fee balance onramp can have + address linkToken; // ────────╮ Link token address + uint64 chainSelector; // ─────╯ Source chainSelector + uint64 destChainSelector; // ─╮ Destination chainSelector + uint64 defaultTxGasLimit; // │ Default gas limit for a tx + uint96 maxNopFeesJuels; // ───╯ Max nop fee balance onramp can have address prevOnRamp; // Address of previous-version OnRamp address armProxy; // Address of ARM proxy } /// @dev Struct to contains the dynamic configuration struct DynamicConfig { - address router; // -------------------------┐ Router address - uint16 maxTokensLength; // | Maximum number of ERC20 token transfers per message - uint32 destGasOverhead; // | Extra gas charged on top of the gasLimit - uint16 destGasPerPayloadByte; // | Destination chain gas charged for passing each byte of `data` payload to receiver - uint32 destDataAvailabilityOverheadGas; // | Extra data availability gas charged on top of the message, e.g. for OCR - uint16 destGasPerDataAvailabilityByte; // --┘ Amount of gas to charge per byte of message data that needs availability - uint16 destDataAvailabilityMultiplier; // --┐ Multiplier for data availability gas, multples of 1e-4, or 0.0001 - address priceRegistry; // | Price registry address - uint32 maxDataSize; // | Maximum payload data size, max 4GB - uint32 maxGasLimit; // ---------------------┘ Maximum gas limit for messages targeting EVMs, max 4 Billion gas + address router; // ─────────────────────────╮ Router address + uint16 maxTokensLength; // │ Maximum number of ERC20 token transfers per message + uint32 destGasOverhead; // │ Extra gas charged on top of the gasLimit + uint16 destGasPerPayloadByte; // │ Destination chain gas charged for passing each byte of `data` payload to receiver + uint32 destDataAvailabilityOverheadGas; // │ Extra data availability gas charged on top of the message, e.g. for OCR + uint16 destGasPerDataAvailabilityByte; // ──╯ Amount of gas to charge per byte of message data that needs availability + uint16 destDataAvailabilityMultiplier; // ──╮ Multiplier for data availability gas, multiples of 1e-4, or 0.0001 + address priceRegistry; // │ Price registry address + uint32 maxDataSize; // │ Maximum payload data size, max 4GB + uint32 maxGasLimit; // ─────────────────────╯ Maximum gas limit for messages targeting EVMs, max 4 Billion gas } /// @dev Struct to hold the execution fee configuration for a fee token struct FeeTokenConfig { - uint32 networkFeeUSD; // -----------┐ Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // | Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; // | Maximum fee to charge for token transfers, multiples of 0.01 USD - uint64 gasMultiplier; // | Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost. - uint64 premiumMultiplier; // | Multiplier for fee-token-specific premiums - bool enabled; // -------------------┘ Whether this fee token is enabled + uint32 networkFeeUSD; // ───────────╮ Flat network fee to charge for messages, multiples of 0.01 USD + uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD + uint32 maxTokenTransferFeeUSD; // │ Maximum fee to charge for token transfers, multiples of 0.01 USD + uint64 gasMultiplier; // │ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost. + uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums + bool enabled; // ───────────────────╯ Whether this fee token is enabled } /// @dev Struct to hold the fee configuration for a fee token, same as the FeeTokenConfig but with /// token included so that an array of these can be passed in to setFeeTokenConfig to set the mapping struct FeeTokenConfigArgs { - address token; // ------------------┐ Token address - uint32 networkFeeUSD; // | Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // | Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; //---┘ Maximum fee to charge for token transfers, multiples of 0.01 USD - uint64 gasMultiplier; // ---┐ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost - uint64 premiumMultiplier; // | Multiplier for fee-token-specific premiums - bool enabled; // -------------------┘ Whether this fee token is enabled + address token; // ──────────────────╮ Token address + uint32 networkFeeUSD; // │ Flat network fee to charge for messages, multiples of 0.01 USD + uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD + uint32 maxTokenTransferFeeUSD; //───╯ Maximum fee to charge for token transfers, multiples of 0.01 USD + uint64 gasMultiplier; // ───╮ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost + uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums + bool enabled; // ───────────────────╯ Whether this fee token is enabled } /// @dev Struct to hold the transfer fee configuration for token transfers struct TokenTransferFeeConfig { - uint16 ratio; // -------------------┐ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 - uint32 destGasOverhead; // | Gas charged to execute the token transfer on the destination chain - uint32 destBytesOverhead; // -------┘ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data + uint16 ratio; // ───────────────────╮ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data } /// @dev Same as TokenTransferFeeConfig /// token included so that an array of these can be passed in to setTokenTransferFeeConfig struct TokenTransferFeeConfigArgs { - address token; // ------------------┐ Token address - uint16 ratio; // | Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 - uint32 destGasOverhead; // | Gas charged to execute the token transfer on the destination chain - uint32 destBytesOverhead; // -------┘ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data + address token; // ──────────────────╮ Token address + uint16 ratio; // │ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data } /// @dev Nop address and weight, used to set the nops and their weights struct NopAndWeight { - address nop; // -----┐ Address of the node operator - uint16 weight; // ---┘ Weight for nop rewards + address nop; // ────╮ Address of the node operator + uint16 weight; // ──╯ Weight for nop rewards } // STATIC CONFIG @@ -231,7 +232,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Messaging | + // │ Messaging │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -270,10 +271,18 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, uint256 gasLimit = _fromBytes(message.extraArgs).gasLimit; // Validate the message with various checks - _validateMessage(message.data.length, gasLimit, message.tokenAmounts.length); - // Rate limit on aggregated token value - _rateLimitValue(message.tokenAmounts, IPriceRegistry(s_dynamicConfig.priceRegistry)); + uint256 numberOfTokens = message.tokenAmounts.length; + _validateMessage(message.data.length, gasLimit, numberOfTokens); + + // Only check token value if there are tokens + if (numberOfTokens > 0) { + for (uint256 i = 0; i < numberOfTokens; ++i) { + if (message.tokenAmounts[i].amount == 0) revert CannotSendZeroTokens(); + } + // Rate limit on aggregated token value + _rateLimitValue(message.tokenAmounts, IPriceRegistry(s_dynamicConfig.priceRegistry)); + } // Convert feeToken to link if not already in link if (message.feeToken == i_linkToken) { @@ -306,13 +315,13 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, feeTokenAmount: feeTokenAmount, data: message.data, tokenAmounts: message.tokenAmounts, - sourceTokenData: new bytes[](message.tokenAmounts.length), // will be filled in later + sourceTokenData: new bytes[](numberOfTokens), // will be filled in later messageId: "" }); // Lock the tokens as last step. TokenPools may not always be trusted. // There should be no state changes after external call to TokenPools. - for (uint256 i = 0; i < message.tokenAmounts.length; ++i) { + for (uint256 i = 0; i < numberOfTokens; ++i) { Client.EVMTokenAmount memory tokenAndAmount = message.tokenAmounts[i]; newMessage.sourceTokenData[i] = getPoolBySourceToken(IERC20(tokenAndAmount.token)).lockOrBurn( originalSender, @@ -359,7 +368,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static onRamp config. @@ -411,7 +420,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Tokens and pools | + // │ Tokens and pools │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -467,7 +476,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Fees | + // │ Fees │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -687,7 +696,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | NOP payments | + // │ NOP payments │ // ================================================================ /// @notice Get the total amount of fees to be paid to the Nops (in LINK) @@ -797,7 +806,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Link monitoring | + // │ Link monitoring │ // ================================================================ /// @notice Calculate remaining LINK balance after paying nops @@ -813,7 +822,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @dev Require that the sender is the owner or the fee admin or a nop diff --git a/contracts/src/v0.8/ccip/pools/TokenPool.sol b/contracts/src/v0.8/ccip/pools/TokenPool.sol index ccb13b5589..5163749661 100644 --- a/contracts/src/v0.8/ccip/pools/TokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/TokenPool.sol @@ -99,7 +99,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Ramp permissions | + // │ Ramp permissions │ // ================================================================ /// @notice Checks whether something is a permissioned onRamp on this contract. @@ -189,7 +189,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Rate limiting | + // │ Rate limiting │ // ================================================================ /// @notice Consumes outbound rate limiting capacity in this pool @@ -231,7 +231,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Checks whether the msg.sender is a permissioned onRamp on this contract @@ -249,7 +249,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Allowlist | + // │ Allowlist │ // ================================================================ modifier checkAllowList(address sender) { diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol index 832e7f2f50..01e8207e38 100644 --- a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol @@ -33,15 +33,15 @@ contract USDCTokenPool is TokenPool { // A domain is a USDC representation of a chain. struct DomainUpdate { bytes32 allowedCaller; // Address allowed to mint on the domain - uint32 domainIdentifier; // --┐ Unique domain ID - uint64 destChainSelector; // | The destination chain for this domain - bool enabled; // -------------┘ Whether the domain is enabled + uint32 domainIdentifier; // ──╮ Unique domain ID + uint64 destChainSelector; // │ The destination chain for this domain + bool enabled; // ─────────────╯ Whether the domain is enabled } // Contains the contracts for sending and receiving USDC tokens struct USDCConfig { - uint32 version; // ----------┐ CCTP internal version - address tokenMessenger; // --┘ Contract to burn tokens + uint32 version; // ──────────╮ CCTP internal version + address tokenMessenger; // ──╯ Contract to burn tokens address messageTransmitter; // Contract to mint tokens } @@ -62,8 +62,8 @@ contract USDCTokenPool is TokenPool { // A domain is a USDC representation of a chain. struct Domain { bytes32 allowedCaller; // Address allowed to mint on the domain - uint32 domainIdentifier; // -┐ Unique domain ID - bool enabled; // ------------┘ Whether the domain is enabled + uint32 domainIdentifier; // ─╮ Unique domain ID + bool enabled; // ────────────╯ Whether the domain is enabled } // A mapping of CCIP chain identifiers to destination domains @@ -203,7 +203,7 @@ contract USDCTokenPool is TokenPool { } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Gets the current config diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol index 3d20d44b38..b7e8c34ab0 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol @@ -432,6 +432,15 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { s_onRamp.forwardFromRouter(message, 0, STRANGER); } + function testCannotSendZeroTokensReverts() public { + Client.EVM2AnyMessage memory message = _generateEmptyMessage(); + message.tokenAmounts = new Client.EVMTokenAmount[](1); + message.tokenAmounts[0].amount = 0; + message.tokenAmounts[0].token = s_sourceTokens[0]; + vm.expectRevert(EVM2EVMOnRamp.CannotSendZeroTokens.selector); + s_onRamp.forwardFromRouter(message, 0, STRANGER); + } + function testUnsupportedTokenReverts() public { address wrongToken = address(1); @@ -479,6 +488,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { address fakeToken = address(1); message.tokenAmounts = new Client.EVMTokenAmount[](1); message.tokenAmounts[0].token = fakeToken; + message.tokenAmounts[0].amount = 1; vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, fakeToken)); diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index 656dc00a2a..d3c376ed23 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -104,7 +104,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenRateLimitError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162006b0338038062006b03833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a62000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615ffb62000b0860003960008181610309015281816120fd015261239b0152600081816102cd01528181611622015281816116a4015281816120d30152818161291101526129980152600061255401526000818161029101526120ac015260008181610231015261205a015260008181610261015281816120840152818161312401526138360152600081816101f50152818161202c015261264901526000818161136b015281816113b70152818161176501526117b10152615ffb6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106a7578063d7e2bb50146106af578063f2fde38b146106c2578063f52121a5146106d557600080fd5b8063b1dc65a41461066e578063b4069b3114610681578063c92b28321461069457600080fd5b8063856c8247116100c8578063856c8247146106045780638da5cb5b14610630578063afcb95d71461064e57600080fd5b806379ba5097146105be57806381ff7048146105c657806385572ffb146105f657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161035391906146d7565b60405180910390f35b61036f61036a36600461476e565b6106e8565b60405161035391906147f5565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103539190614871565b6103d86103d3366004614adf565b610763565b005b6103d86103e8366004614bf1565b610c22565b6103f5611032565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614c5d565b6110e7565b6104ab611150565b6040516103539190614ccb565b6104c06111bf565b6040516103539190614cde565b6103d86104db366004614c5d565b611278565b6103d86104ee366004615177565b611368565b6105b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103539190615232565b6103d86114ea565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae366004615295565b610617610612366004614c5d565b6115e7565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d861067c366004615315565b61170f565b61046b61068f366004614c5d565b6119a0565b6103d86106a236600461541a565b611a79565b6104c0611afe565b61046b6106bd366004614c5d565b611bb3565b6103d86106d0366004614c5d565b611bc2565b6103d86106e3366004615488565b611bd3565b60006106f66001600461551b565b600261070360808561555d565b67ffffffffffffffff166107179190615584565b6013600061072660808761559b565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561075d5761075d61478b565b92915050565b84518460ff16601f8211156107d9576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610843576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107d0565b61084b611e2d565b61085485611eb0565b60095460005b818110156108e0576008600060098381548110610879576108796155c2565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556108d9816155f1565b905061085a565b50875160005b81811015610adc5760008a8281518110610902576109026155c2565b602002602001015190506000600281111561091f5761091f61478b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561095e5761095e61478b565b146109c5576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107d0565b73ffffffffffffffffffffffffffffffffffffffff8116610a12576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610ac257610ac261478b565b02179055509050505080610ad5906155f1565b90506108e6565b508851610af09060099060208c0190614641565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610b76914691309190600090610b489063ffffffff16615629565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61215d565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c0d9998979695949392919061564c565b60405180910390a15050505050505050505050565b610c2a611e2d565b60005b83811015610e29576000858583818110610c4957610c496155c2565b610c5f9260206040909202019081019150614c5d565b90506000868684818110610c7557610c756155c2565b9050604002016020016020810190610c8d9190614c5d565b9050610c9a600c83612208565b610cd0576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cf2600c8461222a565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a600c8361224c565b50610dc58173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd91906156e2565b600f9061224c565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e22906155f1565b9050610c2d565b5060005b8181101561102b576000838383818110610e4957610e496155c2565b610e5f9260206040909202019081019150614c5d565b90506000848484818110610e7557610e756155c2565b9050604002016020016020810190610e8d9190614c5d565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ec6575073ffffffffffffffffffffffffffffffffffffffff8116155b15610efd576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f08600c83612208565b15610f3f576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4b600c838361226e565b50610fc78173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906156e2565b600f908361226e565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611024906155f1565b9050610e2d565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff1615159383019390935260045480841660608401520490911660808201526110e290612291565b905090565b600080806110f6600c85612343565b9150915081611149576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111b557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161118a575b5050505050905090565b60606111cb600f612372565b67ffffffffffffffff8111156111e3576111e3614884565b60405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b8151811015611274576000611228600f8361237d565b5090508083838151811061123e5761123e6155c2565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061126d816155f1565b9050611212565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112b8575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156112ef576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146113f3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107d0565b81515181518114611430576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156114da57600083828151811061144f5761144f6155c2565b602002602001015190508060001415801561148857508451805183908110611479576114796155c2565b60200260200101516080015181105b156114c9576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107d0565b506114d3816155f1565b9050611433565b506114e58383612399565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107d0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561165a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561075d576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114991906156ff565b6117198787612d49565b600554883590808214611762576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107d0565b467f0000000000000000000000000000000000000000000000000000000000000000146117e3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107d0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561186b5761186b61478b565b600281111561187c5761187c61478b565b90525090506002816020015160028111156118995761189961478b565b1480156118e057506009816000015160ff16815481106118bb576118bb6155c2565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611916576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611924856020615584565b61192f886020615584565b61193b8b61014461571c565b611945919061571c565b61194f919061571c565b9050368114611993576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107d0565b5050505050505050505050565b600080806119af600c85612343565b9150915081611a02576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906156e2565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ab9575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611af0576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb600382612d70565b50565b6060611b0a600c612372565b67ffffffffffffffff811115611b2257611b22614884565b604051908082528060200260200182016040528015611b4b578160200160208202803683370190505b50905060005b8151811015611274576000611b67600c8361237d565b50905080838381518110611b7d57611b7d6155c2565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611bac816155f1565b9050611b51565b600080806110f6600f85612343565b611bca611e2d565b611afb81612f55565b333014611c0c576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c49565b6040805180820190915260008082526020820152815260200190600190039081611c225790505b506101408401515190915015611cb657611cb38361014001518460200151604051602001611c93919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661304a565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611d2057506040830151611d1e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb0000000000000000000000000000000000000000000000000000000061352d565b155b15611d2a57505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d5f8786613549565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d8b9493929190615780565b6000604051808303816000875af1158015611daa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611df09190810190615852565b915091508161102b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107d09190614871565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107d0565b565b600081806020019051810190611ec691906158f3565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611f1a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda9161215191849061598e565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161218199989796959493929190615a5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111498373ffffffffffffffffffffffffffffffffffffffff84166135f9565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613605565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613611565b6000611a718473ffffffffffffffffffffffffffffffffffffffff85168461361d565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261231f82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612303919061551b565b85608001516fffffffffffffffffffffffffffffffff16613640565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806123668473ffffffffffffffffffffffffffffffffffffffff851661365f565b915091505b9250929050565b600061075d8261366e565b600080808061238c8686613679565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124289190615af2565b1561245f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151600081900361249c576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146124da576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156124f5576124f5614884565b60405190808252806020026020018201604052801561251e578160200160208202803683370190505b50905060005b828110156125fe57600085600001518281518110612544576125446155c2565b60200260200101519050612578817f0000000000000000000000000000000000000000000000000000000000000000613688565b83838151811061258a5761258a6155c2565b6020026020010181815250508061018001518383815181106125ae576125ae6155c2565b6020026020010151146125ed576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506125f7816155f1565b9050612524565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263320488759261267f92879291600401615b3f565b602060405180830381865afa15801561269c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c09190615b75565b9050806000036126fc576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d4057600087600001518281518110612723576127236155c2565b60200260200101519050600061273c82606001516106e8565b905060008160038111156127525761275261478b565b148061276f5750600381600381111561276d5761276d61478b565b145b6127b75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b831561287457600a5460009063ffffffff166127d3874261551b565b11905080806127f3575060038260038111156127f1576127f161478b565b145b612829576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061283b5761283b6155c2565b602002602001015160001461286e5788848151811061285c5761285c6155c2565b60200260200101518360800181815250505b506128d1565b60008160038111156128885761288861478b565b146128d15760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561294957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612aec5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156129e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0591906156ff565b60c084015190915067ffffffffffffffff16612a22826001615b8e565b67ffffffffffffffff1614612a8f57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d30565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b0057612b0061478b565b03612b8c5760c083015167ffffffffffffffff16612b1f826001615b8e565b67ffffffffffffffff1614612b8c57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d30565b60008a602001518581518110612ba457612ba46155c2565b60200260200101519050612bb9848251613834565b612bc884606001516001613a0a565b600080612bd58684613ab4565b91509150612be7866060015183613a0a565b6003826003811115612bfb57612bfb61478b565b14158015612c1b57506002826003811115612c1857612c1861478b565b14155b15612c5a578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107d0929190615baf565b6000856003811115612c6e57612c6e61478b565b03612cdb5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cb383615bcd565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d21929190615bea565b60405180910390a35050505050505b612d39816155f1565b9050612703565b50505050505050565b612d6c612d5882840184615c0a565b604080516000815260208101909152612399565b5050565b8154600090612d9990700100000000000000000000000000000000900463ffffffff164261551b565b90508015612e3b5760018301548354612de1916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613640565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e61916fffffffffffffffffffffffffffffffff9081169116613c57565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f489084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff81111561306857613068614884565b6040519080825280602002602001820160405280156130ad57816020015b60408051808201909152600080825260208201528152602001906001900390816130865790505b50905060005b87518110156134fc5760006130e48983815181106130d3576130d36155c2565b6020026020010151600001516110e7565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c8681518110613116576131166155c2565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b8881518110613155576131556155c2565b60200260200101518b898151811061316f5761316f6155c2565b6020026020010151604051602001613188929190615c3f565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016131b7959493929190615c64565b600060405180830381600087803b1580156131d157600080fd5b505af19250505080156131e2575060015b613405573d808015613210576040519150601f19603f3d011682016040523d82523d6000602084013e613215565b606091505b50600061322182615cc7565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614806132b457507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061330057507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061334c57507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061339857507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b156133d157816040517f30dabb590000000000000000000000000000000000000000000000000000000081526004016107d09190614871565b816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107d09190614871565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347491906156e2565b838381518110613486576134866155c2565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff909116905288518990839081106134bf576134bf6155c2565b6020026020010151602001518383815181106134dd576134dd6155c2565b6020908102919091018101510152506134f5816155f1565b90506130b3565b50600b5461352190829073ffffffffffffffffffffffffffffffffffffffff16613c6d565b90505b95945050505050565b600061353883613e55565b801561114957506111498383613eb9565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016135ce919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111498383613f88565b60006111498383613f94565b6000611149838361401e565b6000611a71848473ffffffffffffffffffffffffffffffffffffffff851661403b565b6000613524856136508486615584565b61365a908761571c565b613c57565b600080808061238c8686614058565b600061075d82614092565b600080808061238c868661409d565b60008060001b8284606001518560c0015186602001518760400151886101200151805190602001208961014001516040516020016136c69190615d17565b604051602081830303815290604052805190602001208a61016001516040516020016136f29190615d7f565b604051602081830303815290604052805190602001208b608001518c60a0015160405160200161379d9b9a999897969594939291909a8b5260208b019990995267ffffffffffffffff97881660408b015295909616606089015273ffffffffffffffffffffffffffffffffffffffff93841660808901529190921660a087015260c086019190915260e085015261010084019190915261012083015215156101408201526101600190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825260e086015161010087015173ffffffffffffffffffffffffffffffffffffffff9091166020850152838301528151808403830181526060840190925261381692909190608001615d92565b60405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff16146138b45781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff1610156139255760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b8082610140015151146139765760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015612d6c57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff16600483015260248201526044016107d0565b60006002613a1960808561555d565b67ffffffffffffffff16613a2d9190615584565b90506000601381613a3f60808761559b565b67ffffffffffffffff168152602081019190915260400160002054905081613a696001600461551b565b901b191681836003811115613a8057613a8061478b565b901b178060136000613a9360808861559b565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613af89087908790600401615dc1565b600060405180830381600087803b158015613b1257600080fd5b505af1925050508015613b23575060015b613c3c573d808015613b51576040519150601f19603f3d011682016040523d82523d6000602084013e613b56565b606091505b50613b6081615cc7565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613bf85750613bb381615cc7565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613c085760039250905061236b565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107d09190614871565b50506040805160208101909152600081526002909250929050565b6000818310613c665781611149565b5090919050565b81516000805b82811015613e415760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613cab57613cab6155c2565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d439190615f4b565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613dd557858281518110613d7e57613d7e6155c2565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107d0565b613e23868381518110613dea57613dea6155c2565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140c890919063ffffffff16565b613e2d908461571c565b92505080613e3a906155f1565b9050613c73565b50613e4f6003826000614105565b50505050565b6000613e81827f01ffc9a700000000000000000000000000000000000000000000000000000000613eb9565b801561075d5750613eb2827fffffffff00000000000000000000000000000000000000000000000000000000613eb9565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613f71575060208210155b8015613f7d5750600081115b979650505050505050565b60006111498383614488565b600081815260028301602052604081205480151580613fb85750613fb88484613f88565b611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107d0565b6000818152600283016020526040812081905561114983836144a0565b60008281526002840160205260408120829055611a7184846144ac565b60008181526002830160205260408120548190806140875761407a8585613f88565b92506000915061236b9050565b60019250905061236b565b600061075d826144b8565b600080806140ab85856144c2565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006140fb837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615584565b6111499190615fab565b825474010000000000000000000000000000000000000000900460ff16158061412c575081155b1561413657505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061417c90700100000000000000000000000000000000900463ffffffff164261551b565b9050801561423c57818311156141be576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141f89083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613640565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142f35773ffffffffffffffffffffffffffffffffffffffff841661429b576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107d0565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107d0565b848310156144065760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290614337908261551b565b614341878a61551b565b61434b919061571c565b6143559190615fab565b905073ffffffffffffffffffffffffffffffffffffffff86166143ae576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d0565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107d0565b614410858461551b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611149565b600061114983836144ce565b600061114983836145c8565b600061075d825490565b60006111498383614617565b600081815260018301602052604081205480156145b75760006144f260018361551b565b85549091506000906145069060019061551b565b905081811461456b576000866000018281548110614526576145266155c2565b9060005260206000200154905080876000018481548110614549576145496155c2565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061457c5761457c615fbf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061075d565b600091505061075d565b5092915050565b600081815260018301602052604081205461460f5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561075d565b50600061075d565b600082600001828154811061462e5761462e6155c2565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156146bb579160200282015b828111156146bb57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614661565b506112749291505b8082111561127457600081556001016146c3565b60c0810161075d828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611afb57600080fd5b803561476981614748565b919050565b60006020828403121561478057600080fd5b813561114981614748565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106147f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075d82846147ba565b60005b8381101561481e578181015183820152602001614806565b50506000910152565b6000815180845261483f816020860160208601614803565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111496020830184614827565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156148d6576148d6614884565b60405290565b6040516101a0810167ffffffffffffffff811182821017156148d6576148d6614884565b6040516080810167ffffffffffffffff811182821017156148d6576148d6614884565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561496a5761496a614884565b604052919050565b600067ffffffffffffffff82111561498c5761498c614884565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611afb57600080fd5b803561476981614996565b600082601f8301126149d457600080fd5b813560206149e96149e483614972565b614923565b82815260059290921b84018101918181019086841115614a0857600080fd5b8286015b84811015614a2c578035614a1f81614996565b8352918301918301614a0c565b509695505050505050565b803560ff8116811461476957600080fd5b600067ffffffffffffffff821115614a6257614a62614884565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614a9f57600080fd5b8135614aad6149e482614a48565b818152846020838601011115614ac257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614af857600080fd5b863567ffffffffffffffff80821115614b1057600080fd5b614b1c8a838b016149c3565b97506020890135915080821115614b3257600080fd5b614b3e8a838b016149c3565b9650614b4c60408a01614a37565b95506060890135915080821115614b6257600080fd5b614b6e8a838b01614a8e565b9450614b7c60808a0161475e565b935060a0890135915080821115614b9257600080fd5b50614b9f89828a01614a8e565b9150509295509295509295565b60008083601f840112614bbe57600080fd5b50813567ffffffffffffffff811115614bd657600080fd5b6020830191508360208260061b850101111561236b57600080fd5b60008060008060408587031215614c0757600080fd5b843567ffffffffffffffff80821115614c1f57600080fd5b614c2b88838901614bac565b90965094506020870135915080821115614c4457600080fd5b50614c5187828801614bac565b95989497509550505050565b600060208284031215614c6f57600080fd5b813561114981614996565b600081518084526020808501945080840160005b83811015614cc057815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614c8e565b509495945050505050565b6020815260006111496020830184614c7a565b6020808252825182820181905260009190848201906040850190845b81811015614d2c57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614cfa565b50909695505050505050565b8015158114611afb57600080fd5b803561476981614d38565b600082601f830112614d6257600080fd5b81356020614d726149e483614972565b82815260069290921b84018101918181019086841115614d9157600080fd5b8286015b84811015614a2c5760408189031215614dae5760008081fd5b614db66148b3565b8135614dc181614996565b81528185013585820152835291830191604001614d95565b600082601f830112614dea57600080fd5b81356020614dfa6149e483614972565b82815260059290921b84018101918181019086841115614e1957600080fd5b8286015b84811015614a2c57803567ffffffffffffffff811115614e3d5760008081fd5b614e4b8986838b0101614a8e565b845250918301918301614e1d565b60006101a08284031215614e6c57600080fd5b614e746148dc565b9050614e7f8261475e565b8152614e8d602083016149b8565b6020820152614e9e604083016149b8565b6040820152614eaf6060830161475e565b606082015260808201356080820152614eca60a08301614d46565b60a0820152614edb60c0830161475e565b60c0820152614eec60e083016149b8565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614f1957600080fd5b614f2586838701614a8e565b83850152610140925082850135915080821115614f4157600080fd5b614f4d86838701614d51565b83850152610160925082850135915080821115614f6957600080fd5b50614f7685828601614dd9565b82840152505061018080830135818301525092915050565b600082601f830112614f9f57600080fd5b81356020614faf6149e483614972565b82815260059290921b84018101918181019086841115614fce57600080fd5b8286015b84811015614a2c57803567ffffffffffffffff811115614ff25760008081fd5b6150008986838b0101614dd9565b845250918301918301614fd2565b600082601f83011261501f57600080fd5b8135602061502f6149e483614972565b82815260059290921b8401810191818101908684111561504e57600080fd5b8286015b84811015614a2c5780358352918301918301615052565b60006080828403121561507b57600080fd5b615083614900565b9050813567ffffffffffffffff8082111561509d57600080fd5b818401915084601f8301126150b157600080fd5b813560206150c16149e483614972565b82815260059290921b840181019181810190888411156150e057600080fd5b8286015b84811015615118578035868111156150fc5760008081fd5b61510a8b86838b0101614e59565b8452509183019183016150e4565b508652508581013593508284111561512f57600080fd5b61513b87858801614f8e565b9085015250604084013591508082111561515457600080fd5b506151618482850161500e565b6040830152506060820135606082015292915050565b6000806040838503121561518a57600080fd5b823567ffffffffffffffff808211156151a257600080fd5b6151ae86838701615069565b93506020915081850135818111156151c557600080fd5b85019050601f810186136151d857600080fd5b80356151e66149e482614972565b81815260059190911b8201830190838101908883111561520557600080fd5b928401925b828410156152235783358252928401929084019061520a565b80955050505050509250929050565b60a0810161075d828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156152a757600080fd5b813567ffffffffffffffff8111156152be57600080fd5b820160a0818503121561114957600080fd5b60008083601f8401126152e257600080fd5b50813567ffffffffffffffff8111156152fa57600080fd5b6020830191508360208260051b850101111561236b57600080fd5b60008060008060008060008060e0898b03121561533157600080fd5b606089018a81111561534257600080fd5b8998503567ffffffffffffffff8082111561535c57600080fd5b818b0191508b601f83011261537057600080fd5b81358181111561537f57600080fd5b8c602082850101111561539157600080fd5b6020830199508098505060808b01359150808211156153af57600080fd5b6153bb8c838d016152d0565b909750955060a08b01359150808211156153d457600080fd5b506153e18b828c016152d0565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461476957600080fd5b60006060828403121561542c57600080fd5b6040516060810181811067ffffffffffffffff8211171561544f5761544f614884565b604052823561545d81614d38565b815261546b602084016153fa565b602082015261547c604084016153fa565b60408201529392505050565b6000806040838503121561549b57600080fd5b823567ffffffffffffffff808211156154b357600080fd5b6154bf86838701614e59565b935060208501359150808211156154d557600080fd5b506154e285828601614dd9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561075d5761075d6154ec565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806155785761557861552e565b92169190910692915050565b808202811582820484141761075d5761075d6154ec565b600067ffffffffffffffff808416806155b6576155b661552e565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615622576156226154ec565b5060010190565b600063ffffffff808316818103615642576156426154ec565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261567c8184018a614c7a565b905082810360808401526156908189614c7a565b905060ff871660a084015282810360c08401526156ad8187614827565b905067ffffffffffffffff851660e08401528281036101008401526156d28185614827565b9c9b505050505050505050505050565b6000602082840312156156f457600080fd5b815161114981614996565b60006020828403121561571157600080fd5b815161114981614748565b8082018082111561075d5761075d6154ec565b600081518084526020808501945080840160005b83811015614cc0578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615743565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c08401526157bb610120840182614827565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526157f78383614827565b925060808901519150808584030161010086015250615816828261572f565b9250505061582a602083018661ffff169052565b836040830152613524606083018473ffffffffffffffffffffffffffffffffffffffff169052565b6000806040838503121561586557600080fd5b825161587081614d38565b602084015190925067ffffffffffffffff81111561588d57600080fd5b8301601f8101851361589e57600080fd5b80516158ac6149e482614a48565b8181528660208385010111156158c157600080fd5b6158d2826020830160208601614803565b8093505050509250929050565b805163ffffffff8116811461476957600080fd5b600060a0828403121561590557600080fd5b60405160a0810181811067ffffffffffffffff8211171561592857615928614884565b604052615934836158df565b8152602083015161594481614996565b6020820152604083015161595781614996565b6040820152606083015161ffff8116811461597157600080fd5b6060820152615982608084016158df565b60808201529392505050565b6101608101615a00828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152611149565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615aa48285018b614c7a565b91508382036080850152615ab8828a614c7a565b915060ff881660a085015283820360c0850152615ad58288614827565b90861660e085015283810361010085015290506156d28185614827565b600060208284031215615b0457600080fd5b815161114981614d38565b600081518084526020808501945080840160005b83811015614cc057815187529582019590820190600101615b23565b606081526000615b526060830186615b0f565b8281036020840152615b648186615b0f565b915050826040830152949350505050565b600060208284031215615b8757600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156145c1576145c16154ec565b67ffffffffffffffff831681526040810161114960208301846147ba565b600067ffffffffffffffff808316818103615642576156426154ec565b615bf481846147ba565b604060208201526000611a716040830184614827565b600060208284031215615c1c57600080fd5b813567ffffffffffffffff811115615c3357600080fd5b611a7184828501615069565b604081526000615c526040830185614827565b82810360208401526135248185614827565b60a081526000615c7760a0830188614827565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615cbb8185614827565b98975050505050505050565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615d0f5780818460040360031b1b83161693505b505050919050565b602081526000611149602083018461572f565b600081518084526020808501808196508360051b8101915082860160005b85811015615d72578284038952615d60848351614827565b98850198935090840190600101615d48565b5091979650505050505050565b6020815260006111496020830184615d2a565b60008351615da4818460208801614803565b835190830190615db8818360208801614803565b01949350505050565b60408152615ddc60408201845167ffffffffffffffff169052565b60006020840151615e05606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615e738185018367ffffffffffffffff169052565b60e08601519150610120615e9e8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615ece6101e0870185614827565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615f0d868661572f565b9550828a01519450818887030184890152615f288686615d2a565b9550808a01516101c0890152505050505082810360208401526135248185615d2a565b600060408284031215615f5d57600080fd5b615f656148b3565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f9157600080fd5b8152615f9f602084016158df565b60208201529392505050565b600082615fba57615fba61552e565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040523480156200001257600080fd5b5060405162006aae38038062006aae833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615fa662000b0860003960008181610309015281816120fd015261239b0152600081816102cd01528181611622015281816116a4015281816120d30152818161291101526129980152600061255401526000818161029101526120ac015260008181610231015261205a015260008181610261015281816120840152818161312401526138100152600081816101f50152818161202c015261264901526000818161136b015281816113b70152818161176501526117b10152615fa66000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106a7578063d7e2bb50146106af578063f2fde38b146106c2578063f52121a5146106d557600080fd5b8063b1dc65a41461066e578063b4069b3114610681578063c92b28321461069457600080fd5b8063856c8247116100c8578063856c8247146106045780638da5cb5b14610630578063afcb95d71461064e57600080fd5b806379ba5097146105be57806381ff7048146105c657806385572ffb146105f657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161035391906146b1565b60405180910390f35b61036f61036a366004614748565b6106e8565b60405161035391906147cf565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b604051610353919061484b565b6103d86103d3366004614ab9565b610763565b005b6103d86103e8366004614bcb565b610c22565b6103f5611032565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614c37565b6110e7565b6104ab611150565b6040516103539190614ca5565b6104c06111bf565b6040516103539190614cb8565b6103d86104db366004614c37565b611278565b6103d86104ee366004615151565b611368565b6105b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b604051610353919061520c565b6103d86114ea565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae36600461526f565b610617610612366004614c37565b6115e7565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d861067c3660046152ef565b61170f565b61046b61068f366004614c37565b6119a0565b6103d86106a23660046153f4565b611a79565b6104c0611afe565b61046b6106bd366004614c37565b611bb3565b6103d86106d0366004614c37565b611bc2565b6103d86106e3366004615462565b611bd3565b60006106f6600160046154f5565b6002610703608085615537565b67ffffffffffffffff16610717919061555e565b60136000610726608087615575565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561075d5761075d614765565b92915050565b84518460ff16601f8211156107d9576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610843576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107d0565b61084b611e2d565b61085485611eb0565b60095460005b818110156108e05760086000600983815481106108795761087961559c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556108d9816155cb565b905061085a565b50875160005b81811015610adc5760008a82815181106109025761090261559c565b602002602001015190506000600281111561091f5761091f614765565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561095e5761095e614765565b146109c5576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107d0565b73ffffffffffffffffffffffffffffffffffffffff8116610a12576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610ac257610ac2614765565b02179055509050505080610ad5906155cb565b90506108e6565b508851610af09060099060208c019061461b565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610b76914691309190600090610b489063ffffffff16615603565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61215d565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c0d99989796959493929190615626565b60405180910390a15050505050505050505050565b610c2a611e2d565b60005b83811015610e29576000858583818110610c4957610c4961559c565b610c5f9260206040909202019081019150614c37565b90506000868684818110610c7557610c7561559c565b9050604002016020016020810190610c8d9190614c37565b9050610c9a600c83612208565b610cd0576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cf2600c8461222a565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a600c8361224c565b50610dc58173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd91906156bc565b600f9061224c565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e22906155cb565b9050610c2d565b5060005b8181101561102b576000838383818110610e4957610e4961559c565b610e5f9260206040909202019081019150614c37565b90506000848484818110610e7557610e7561559c565b9050604002016020016020810190610e8d9190614c37565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ec6575073ffffffffffffffffffffffffffffffffffffffff8116155b15610efd576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f08600c83612208565b15610f3f576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4b600c838361226e565b50610fc78173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906156bc565b600f908361226e565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611024906155cb565b9050610e2d565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff1615159383019390935260045480841660608401520490911660808201526110e290612291565b905090565b600080806110f6600c85612343565b9150915081611149576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111b557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161118a575b5050505050905090565b60606111cb600f612372565b67ffffffffffffffff8111156111e3576111e361485e565b60405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b8151811015611274576000611228600f8361237d565b5090508083838151811061123e5761123e61559c565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061126d816155cb565b9050611212565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112b8575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156112ef576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146113f3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107d0565b81515181518114611430576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156114da57600083828151811061144f5761144f61559c565b6020026020010151905080600014158015611488575084518051839081106114795761147961559c565b60200260200101516080015181105b156114c9576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107d0565b506114d3816155cb565b9050611433565b506114e58383612399565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107d0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561165a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561075d576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114991906156d9565b6117198787612d49565b600554883590808214611762576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107d0565b467f0000000000000000000000000000000000000000000000000000000000000000146117e3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107d0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561186b5761186b614765565b600281111561187c5761187c614765565b905250905060028160200151600281111561189957611899614765565b1480156118e057506009816000015160ff16815481106118bb576118bb61559c565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611916576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061192485602061555e565b61192f88602061555e565b61193b8b6101446156f6565b61194591906156f6565b61194f91906156f6565b9050368114611993576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107d0565b5050505050505050505050565b600080806119af600c85612343565b9150915081611a02576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906156bc565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ab9575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611af0576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb600382612d70565b50565b6060611b0a600c612372565b67ffffffffffffffff811115611b2257611b2261485e565b604051908082528060200260200182016040528015611b4b578160200160208202803683370190505b50905060005b8151811015611274576000611b67600c8361237d565b50905080838381518110611b7d57611b7d61559c565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611bac816155cb565b9050611b51565b600080806110f6600f85612343565b611bca611e2d565b611afb81612f55565b333014611c0c576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c49565b6040805180820190915260008082526020820152815260200190600190039081611c225790505b506101408401515190915015611cb657611cb38361014001518460200151604051602001611c93919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661304a565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611d2057506040830151611d1e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb0000000000000000000000000000000000000000000000000000000061352d565b155b15611d2a57505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d5f8786613549565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d8b949392919061575a565b6000604051808303816000875af1158015611daa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611df0919081019061582c565b915091508161102b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107d0565b565b600081806020019051810190611ec691906158cd565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611f1a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda91612151918490615968565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161218199989796959493929190615a37565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111498373ffffffffffffffffffffffffffffffffffffffff84166135f9565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613605565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613611565b6000611a718473ffffffffffffffffffffffffffffffffffffffff85168461361d565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261231f82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261230391906154f5565b85608001516fffffffffffffffffffffffffffffffff16613640565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806123668473ffffffffffffffffffffffffffffffffffffffff851661365f565b915091505b9250929050565b600061075d8261366e565b600080808061238c8686613679565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124289190615acc565b1561245f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151600081900361249c576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146124da576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156124f5576124f561485e565b60405190808252806020026020018201604052801561251e578160200160208202803683370190505b50905060005b828110156125fe576000856000015182815181106125445761254461559c565b60200260200101519050612578817f0000000000000000000000000000000000000000000000000000000000000000613688565b83838151811061258a5761258a61559c565b6020026020010181815250508061018001518383815181106125ae576125ae61559c565b6020026020010151146125ed576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506125f7816155cb565b9050612524565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263320488759261267f92879291600401615b19565b602060405180830381865afa15801561269c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c09190615b4f565b9050806000036126fc576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d40576000876000015182815181106127235761272361559c565b60200260200101519050600061273c82606001516106e8565b9050600081600381111561275257612752614765565b148061276f5750600381600381111561276d5761276d614765565b145b6127b75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b831561287457600a5460009063ffffffff166127d387426154f5565b11905080806127f3575060038260038111156127f1576127f1614765565b145b612829576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061283b5761283b61559c565b602002602001015160001461286e5788848151811061285c5761285c61559c565b60200260200101518360800181815250505b506128d1565b600081600381111561288857612888614765565b146128d15760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561294957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612aec5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156129e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0591906156d9565b60c084015190915067ffffffffffffffff16612a22826001615b68565b67ffffffffffffffff1614612a8f57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d30565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b0057612b00614765565b03612b8c5760c083015167ffffffffffffffff16612b1f826001615b68565b67ffffffffffffffff1614612b8c57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d30565b60008a602001518581518110612ba457612ba461559c565b60200260200101519050612bb984825161380e565b612bc8846060015160016139e4565b600080612bd58684613a8e565b91509150612be78660600151836139e4565b6003826003811115612bfb57612bfb614765565b14158015612c1b57506002826003811115612c1857612c18614765565b14155b15612c5a578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107d0929190615b89565b6000856003811115612c6e57612c6e614765565b03612cdb5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cb383615ba7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d21929190615bc4565b60405180910390a35050505050505b612d39816155cb565b9050612703565b50505050505050565b612d6c612d5882840184615be4565b604080516000815260208101909152612399565b5050565b8154600090612d9990700100000000000000000000000000000000900463ffffffff16426154f5565b90508015612e3b5760018301548354612de1916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613640565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e61916fffffffffffffffffffffffffffffffff9081169116613c31565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f489084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff8111156130685761306861485e565b6040519080825280602002602001820160405280156130ad57816020015b60408051808201909152600080825260208201528152602001906001900390816130865790505b50905060005b87518110156134fc5760006130e48983815181106130d3576130d361559c565b6020026020010151600001516110e7565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106131165761311661559c565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b88815181106131555761315561559c565b60200260200101518b898151811061316f5761316f61559c565b6020026020010151604051602001613188929190615c19565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016131b7959493929190615c3e565b600060405180830381600087803b1580156131d157600080fd5b505af19250505080156131e2575060015b613405573d808015613210576040519150601f19603f3d011682016040523d82523d6000602084013e613215565b606091505b50600061322182615ca1565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614806132b457507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061330057507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061334c57507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061339857507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b156133d157816040517f30dabb590000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347491906156bc565b8383815181106134865761348661559c565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff909116905288518990839081106134bf576134bf61559c565b6020026020010151602001518383815181106134dd576134dd61559c565b6020908102919091018101510152506134f5816155cb565b90506130b3565b50600b5461352190829073ffffffffffffffffffffffffffffffffffffffff16613c47565b90505b95945050505050565b600061353883613e2f565b801561114957506111498383613e93565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016135ce919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111498383613f62565b60006111498383613f6e565b60006111498383613ff8565b6000611a71848473ffffffffffffffffffffffffffffffffffffffff8516614015565b600061352485613650848661555e565b61365a90876156f6565b613c31565b600080808061238c8686614032565b600061075d8261406c565b600080808061238c8686614077565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161372b98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016137649190615cf1565b604051602081830303815290604052805190602001208761016001516040516020016137909190615d59565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff161461388e5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff1610156138ff5760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b8082610140015151146139505760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015612d6c57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff16600483015260248201526044016107d0565b600060026139f3608085615537565b67ffffffffffffffff16613a07919061555e565b90506000601381613a19608087615575565b67ffffffffffffffff168152602081019190915260400160002054905081613a43600160046154f5565b901b191681836003811115613a5a57613a5a614765565b901b178060136000613a6d608088615575565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613ad29087908790600401615d6c565b600060405180830381600087803b158015613aec57600080fd5b505af1925050508015613afd575060015b613c16573d808015613b2b576040519150601f19603f3d011682016040523d82523d6000602084013e613b30565b606091505b50613b3a81615ca1565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613bd25750613b8d81615ca1565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613be25760039250905061236b565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b50506040805160208101909152600081526002909250929050565b6000818310613c405781611149565b5090919050565b81516000805b82811015613e1b5760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613c8557613c8561559c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1d9190615ef6565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613daf57858281518110613d5857613d5861559c565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107d0565b613dfd868381518110613dc457613dc461559c565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140a290919063ffffffff16565b613e0790846156f6565b92505080613e14906155cb565b9050613c4d565b50613e2960038260006140df565b50505050565b6000613e5b827f01ffc9a700000000000000000000000000000000000000000000000000000000613e93565b801561075d5750613e8c827fffffffff00000000000000000000000000000000000000000000000000000000613e93565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613f4b575060208210155b8015613f575750600081115b979650505050505050565b60006111498383614462565b600081815260028301602052604081205480151580613f925750613f928484613f62565b611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107d0565b60008181526002830160205260408120819055611149838361447a565b60008281526002840160205260408120829055611a718484614486565b6000818152600283016020526040812054819080614061576140548585613f62565b92506000915061236b9050565b60019250905061236b565b600061075d82614492565b60008080614085858561449c565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006140d5837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661555e565b6111499190615f56565b825474010000000000000000000000000000000000000000900460ff161580614106575081155b1561411057505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061415690700100000000000000000000000000000000900463ffffffff16426154f5565b905080156142165781831115614198576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141d29083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613640565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142cd5773ffffffffffffffffffffffffffffffffffffffff8416614275576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107d0565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107d0565b848310156143e05760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061431190826154f5565b61431b878a6154f5565b61432591906156f6565b61432f9190615f56565b905073ffffffffffffffffffffffffffffffffffffffff8616614388576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d0565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107d0565b6143ea85846154f5565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611149565b600061114983836144a8565b600061114983836145a2565b600061075d825490565b600061114983836145f1565b600081815260018301602052604081205480156145915760006144cc6001836154f5565b85549091506000906144e0906001906154f5565b90508181146145455760008660000182815481106145005761450061559c565b90600052602060002001549050808760000184815481106145235761452361559c565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061455657614556615f6a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061075d565b600091505061075d565b5092915050565b60008181526001830160205260408120546145e95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561075d565b50600061075d565b60008260000182815481106146085761460861559c565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614695579160200282015b8281111561469557825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061463b565b506112749291505b80821115611274576000815560010161469d565b60c0810161075d828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611afb57600080fd5b803561474381614722565b919050565b60006020828403121561475a57600080fd5b813561114981614722565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106147cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075d8284614794565b60005b838110156147f85781810151838201526020016147e0565b50506000910152565b600081518084526148198160208601602086016147dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111496020830184614801565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156148b0576148b061485e565b60405290565b6040516101a0810167ffffffffffffffff811182821017156148b0576148b061485e565b6040516080810167ffffffffffffffff811182821017156148b0576148b061485e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156149445761494461485e565b604052919050565b600067ffffffffffffffff8211156149665761496661485e565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611afb57600080fd5b803561474381614970565b600082601f8301126149ae57600080fd5b813560206149c36149be8361494c565b6148fd565b82815260059290921b840181019181810190868411156149e257600080fd5b8286015b84811015614a065780356149f981614970565b83529183019183016149e6565b509695505050505050565b803560ff8116811461474357600080fd5b600067ffffffffffffffff821115614a3c57614a3c61485e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614a7957600080fd5b8135614a876149be82614a22565b818152846020838601011115614a9c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614ad257600080fd5b863567ffffffffffffffff80821115614aea57600080fd5b614af68a838b0161499d565b97506020890135915080821115614b0c57600080fd5b614b188a838b0161499d565b9650614b2660408a01614a11565b95506060890135915080821115614b3c57600080fd5b614b488a838b01614a68565b9450614b5660808a01614738565b935060a0890135915080821115614b6c57600080fd5b50614b7989828a01614a68565b9150509295509295509295565b60008083601f840112614b9857600080fd5b50813567ffffffffffffffff811115614bb057600080fd5b6020830191508360208260061b850101111561236b57600080fd5b60008060008060408587031215614be157600080fd5b843567ffffffffffffffff80821115614bf957600080fd5b614c0588838901614b86565b90965094506020870135915080821115614c1e57600080fd5b50614c2b87828801614b86565b95989497509550505050565b600060208284031215614c4957600080fd5b813561114981614970565b600081518084526020808501945080840160005b83811015614c9a57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614c68565b509495945050505050565b6020815260006111496020830184614c54565b6020808252825182820181905260009190848201906040850190845b81811015614d0657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614cd4565b50909695505050505050565b8015158114611afb57600080fd5b803561474381614d12565b600082601f830112614d3c57600080fd5b81356020614d4c6149be8361494c565b82815260069290921b84018101918181019086841115614d6b57600080fd5b8286015b84811015614a065760408189031215614d885760008081fd5b614d9061488d565b8135614d9b81614970565b81528185013585820152835291830191604001614d6f565b600082601f830112614dc457600080fd5b81356020614dd46149be8361494c565b82815260059290921b84018101918181019086841115614df357600080fd5b8286015b84811015614a0657803567ffffffffffffffff811115614e175760008081fd5b614e258986838b0101614a68565b845250918301918301614df7565b60006101a08284031215614e4657600080fd5b614e4e6148b6565b9050614e5982614738565b8152614e6760208301614992565b6020820152614e7860408301614992565b6040820152614e8960608301614738565b606082015260808201356080820152614ea460a08301614d20565b60a0820152614eb560c08301614738565b60c0820152614ec660e08301614992565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614ef357600080fd5b614eff86838701614a68565b83850152610140925082850135915080821115614f1b57600080fd5b614f2786838701614d2b565b83850152610160925082850135915080821115614f4357600080fd5b50614f5085828601614db3565b82840152505061018080830135818301525092915050565b600082601f830112614f7957600080fd5b81356020614f896149be8361494c565b82815260059290921b84018101918181019086841115614fa857600080fd5b8286015b84811015614a0657803567ffffffffffffffff811115614fcc5760008081fd5b614fda8986838b0101614db3565b845250918301918301614fac565b600082601f830112614ff957600080fd5b813560206150096149be8361494c565b82815260059290921b8401810191818101908684111561502857600080fd5b8286015b84811015614a06578035835291830191830161502c565b60006080828403121561505557600080fd5b61505d6148da565b9050813567ffffffffffffffff8082111561507757600080fd5b818401915084601f83011261508b57600080fd5b8135602061509b6149be8361494c565b82815260059290921b840181019181810190888411156150ba57600080fd5b8286015b848110156150f2578035868111156150d65760008081fd5b6150e48b86838b0101614e33565b8452509183019183016150be565b508652508581013593508284111561510957600080fd5b61511587858801614f68565b9085015250604084013591508082111561512e57600080fd5b5061513b84828501614fe8565b6040830152506060820135606082015292915050565b6000806040838503121561516457600080fd5b823567ffffffffffffffff8082111561517c57600080fd5b61518886838701615043565b935060209150818501358181111561519f57600080fd5b85019050601f810186136151b257600080fd5b80356151c06149be8261494c565b81815260059190911b820183019083810190888311156151df57600080fd5b928401925b828410156151fd578335825292840192908401906151e4565b80955050505050509250929050565b60a0810161075d828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b60006020828403121561528157600080fd5b813567ffffffffffffffff81111561529857600080fd5b820160a0818503121561114957600080fd5b60008083601f8401126152bc57600080fd5b50813567ffffffffffffffff8111156152d457600080fd5b6020830191508360208260051b850101111561236b57600080fd5b60008060008060008060008060e0898b03121561530b57600080fd5b606089018a81111561531c57600080fd5b8998503567ffffffffffffffff8082111561533657600080fd5b818b0191508b601f83011261534a57600080fd5b81358181111561535957600080fd5b8c602082850101111561536b57600080fd5b6020830199508098505060808b013591508082111561538957600080fd5b6153958c838d016152aa565b909750955060a08b01359150808211156153ae57600080fd5b506153bb8b828c016152aa565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461474357600080fd5b60006060828403121561540657600080fd5b6040516060810181811067ffffffffffffffff821117156154295761542961485e565b604052823561543781614d12565b8152615445602084016153d4565b6020820152615456604084016153d4565b60408201529392505050565b6000806040838503121561547557600080fd5b823567ffffffffffffffff8082111561548d57600080fd5b61549986838701614e33565b935060208501359150808211156154af57600080fd5b506154bc85828601614db3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561075d5761075d6154c6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061555257615552615508565b92169190910692915050565b808202811582820484141761075d5761075d6154c6565b600067ffffffffffffffff8084168061559057615590615508565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155fc576155fc6154c6565b5060010190565b600063ffffffff80831681810361561c5761561c6154c6565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526156568184018a614c54565b9050828103608084015261566a8189614c54565b905060ff871660a084015282810360c08401526156878187614801565b905067ffffffffffffffff851660e08401528281036101008401526156ac8185614801565b9c9b505050505050505050505050565b6000602082840312156156ce57600080fd5b815161114981614970565b6000602082840312156156eb57600080fd5b815161114981614722565b8082018082111561075d5761075d6154c6565b600081518084526020808501945080840160005b83811015614c9a578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161571d565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615795610120840182614801565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526157d18383614801565b9250608089015191508085840301610100860152506157f08282615709565b92505050615804602083018661ffff169052565b836040830152613524606083018473ffffffffffffffffffffffffffffffffffffffff169052565b6000806040838503121561583f57600080fd5b825161584a81614d12565b602084015190925067ffffffffffffffff81111561586757600080fd5b8301601f8101851361587857600080fd5b80516158866149be82614a22565b81815286602083850101111561589b57600080fd5b6158ac8260208301602086016147dd565b8093505050509250929050565b805163ffffffff8116811461474357600080fd5b600060a082840312156158df57600080fd5b60405160a0810181811067ffffffffffffffff821117156159025761590261485e565b60405261590e836158b9565b8152602083015161591e81614970565b6020820152604083015161593181614970565b6040820152606083015161ffff8116811461594b57600080fd5b606082015261595c608084016158b9565b60808201529392505050565b61016081016159da828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152611149565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615a7e8285018b614c54565b91508382036080850152615a92828a614c54565b915060ff881660a085015283820360c0850152615aaf8288614801565b90861660e085015283810361010085015290506156ac8185614801565b600060208284031215615ade57600080fd5b815161114981614d12565b600081518084526020808501945080840160005b83811015614c9a57815187529582019590820190600101615afd565b606081526000615b2c6060830186615ae9565b8281036020840152615b3e8186615ae9565b915050826040830152949350505050565b600060208284031215615b6157600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561459b5761459b6154c6565b67ffffffffffffffff83168152604081016111496020830184614794565b600067ffffffffffffffff80831681810361561c5761561c6154c6565b615bce8184614794565b604060208201526000611a716040830184614801565b600060208284031215615bf657600080fd5b813567ffffffffffffffff811115615c0d57600080fd5b611a7184828501615043565b604081526000615c2c6040830185614801565b82810360208401526135248185614801565b60a081526000615c5160a0830188614801565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615c958185614801565b98975050505050505050565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615ce95780818460040360031b1b83161693505b505050919050565b6020815260006111496020830184615709565b600081518084526020808501808196508360051b8101915082860160005b85811015615d4c578284038952615d3a848351614801565b98850198935090840190600101615d22565b5091979650505050505050565b6020815260006111496020830184615d04565b60408152615d8760408201845167ffffffffffffffff169052565b60006020840151615db0606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615e1e8185018367ffffffffffffffff169052565b60e08601519150610120615e498186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615e796101e0870185614801565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615eb88686615709565b9550828a01519450818887030184890152615ed38686615d04565b9550808a01516101c0890152505050505082810360208401526135248185615d04565b600060408284031215615f0857600080fd5b615f1061488d565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f3c57600080fd5b8152615f4a602084016158b9565b60208201529392505050565b600082615f6557615f65615508565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go index 55d8598a41..384c8d34b0 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go @@ -104,7 +104,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampHelperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenRateLimitError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_SCRIPT\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"rep\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"manualExecGasLimits\",\"type\":\"uint256[]\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"bitmapIndex\",\"type\":\"uint64\"}],\"name\":\"getExecutionStateBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"releaseOrMintTokens\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"executableMessages\",\"type\":\"bytes\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"}],\"name\":\"setExecutionStateHelper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"trialExecute\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006f8d38038062006f8d8339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a62000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161645b62000b3260003960008181610381015281816123190152612cdb015260008181610345015281816118090152818161188b015281816122ef0152818161325101526132d801526000612e94015260008181610309015281816122c801526136f30152600081816102a90152818161227601526136d20152600081816102d9015281816122a0015281816128d0015281816136b10152613f4401526000818161026d015281816122480152612f890152600081816115520152818161159e0152818161194c0152611998015261645b6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b146107f4578063f52121a514610807578063f8ccbf471461081a57600080fd5b8063d3c7c2c7146107d9578063d7e2bb50146107e157600080fd5b8063b4069b3114610798578063b5767166146107ab578063c5a1d7f0146107be578063c92b2832146107c657600080fd5b8063856c8247116100f9578063856c82471461071b5780638da5cb5b14610747578063afcb95d714610765578063b1dc65a41461078557600080fd5b80637437ff9f1461060a57806379ba5097146106d557806381ff7048146106dd57806385572ffb1461070d57600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb91906149b0565b60405180910390f35b6103e76103e2366004614a47565b610837565b6040516103cb9190614ace565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614b4a565b61045061044b366004614db8565b6108b2565b005b610450610460366004614e85565b610d71565b610450610473366004614f07565b610d7f565b61048b6104863660046151dd565b61118f565b6040516103cb929190615241565b6104c36104a7366004614a47565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111a9565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f610582366004615261565b61125e565b61058f6112c7565b6040516103cb91906152cf565b6105a4611336565b6040516103cb91906152e2565b6105c46105bf3660046153c3565b6113ef565b6040516103cb91906154e7565b6104506105df3660046156e3565b611455565b6104506105f2366004615261565b61145f565b6104506106053660046156e3565b61154f565b6106c86040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103cb919061579e565b6104506116d1565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b610450610226366004615801565b61072e610729366004615261565b6117ce565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b61045061079336600461583c565b6118f6565b61054f6107a6366004615261565b611b87565b6104506107b93660046158f3565b611c60565b6104c3611c6a565b6104506107d4366004615955565b611c95565b6105a4611d1a565b61054f6107ef366004615261565b611dcf565b610450610802366004615261565b611dde565b6104506108153660046151dd565b611def565b6014546108279060ff1681565b60405190151581526020016103cb565b6000610845600160046159f2565b6002610852608085615a34565b67ffffffffffffffff166108669190615a5b565b60136000610875608087615a72565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108ac576108ac614a64565b92915050565b84518460ff16601f821115610928576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610992576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161091f565b61099a612049565b6109a3856120cc565b60095460005b81811015610a2f5760086000600983815481106109c8576109c8615a99565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a2881615ac8565b90506109a9565b50875160005b81811015610c2b5760008a8281518110610a5157610a51615a99565b6020026020010151905060006002811115610a6e57610a6e614a64565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610aad57610aad614a64565b14610b14576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116610b61576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c1157610c11614a64565b02179055509050505080610c2490615ac8565b9050610a35565b508851610c3f9060099060208c019061491a565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cc5914691309190600090610c979063ffffffff16615b00565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d612379565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d5c99989796959493929190615b23565b60405180910390a15050505050505050505050565b610d7b8282612424565b5050565b610d87612049565b60005b83811015610f86576000858583818110610da657610da6615a99565b610dbc9260206040909202019081019150615261565b90506000868684818110610dd257610dd2615a99565b9050604002016020016020810190610dea9190615261565b9050610df7600c836124ce565b610e2d576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e4f600c846124f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea7600c83612512565b50610f228173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a9190615bb9565b600f90612512565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610f7f90615ac8565b9050610d8a565b5060005b81811015611188576000838383818110610fa657610fa6615a99565b610fbc9260206040909202019081019150615261565b90506000848484818110610fd257610fd2615a99565b9050604002016020016020810190610fea9190615261565b905073ffffffffffffffffffffffffffffffffffffffff82161580611023575073ffffffffffffffffffffffffffffffffffffffff8116155b1561105a576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611065600c836124ce565b1561109c576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a8600c8383612534565b506111248173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190615bb9565b600f9083612534565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a150508061118190615ac8565b9050610f8a565b5050505050565b6000606061119d8484612557565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152611259906126fa565b905090565b6000808061126d600c856127ac565b91509150816112c0576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561132c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611301575b5050505050905090565b6060611342600f6127cf565b67ffffffffffffffff81111561135a5761135a614b5d565b604051908082528060200260200182016040528015611383578160200160208202803683370190505b50905060005b81518110156113eb57600061139f600f836127da565b509050808383815181106113b5576113b5615a99565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152506113e481615ac8565b9050611389565b5090565b60606114488989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061143991508990508a615bd6565b6114438789615bd6565b6127f6565b9998505050505050505050565b610d7b8282612cd9565b60005473ffffffffffffffffffffffffffffffffffffffff16331480159061149f575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156114d6576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146115da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161091f565b81515181518114611617576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116c157600083828151811061163657611636615a99565b602002602001015190508060001415801561166f5750845180518390811061166057611660615a99565b60200260200101516080015181105b156116b0576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161091f565b506116ba81615ac8565b905061161a565b506116cc8383612cd9565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161091f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561184157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108ac576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190615be3565b6119008787613689565b600554883590808214611949576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161091f565b467f0000000000000000000000000000000000000000000000000000000000000000146119ca576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161091f565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a5257611a52614a64565b6002811115611a6357611a63614a64565b9052509050600281602001516002811115611a8057611a80614a64565b148015611ac757506009816000015160ff1681548110611aa257611aa2615a99565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611afd576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b0b856020615a5b565b611b16886020615a5b565b611b228b610144615c00565b611b2c9190615c00565b611b369190615c00565b9050368114611b7a576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161091f565b5050505050505050505050565b60008080611b96600c856127ac565b9150915081611be9576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c589190615bb9565b949350505050565b610d7b8282613689565b60006112597fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a6136ac565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611cd5575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611d0c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d17600382613779565b50565b6060611d26600c6127cf565b67ffffffffffffffff811115611d3e57611d3e614b5d565b604051908082528060200260200182016040528015611d67578160200160208202803683370190505b50905060005b81518110156113eb576000611d83600c836127da565b50905080838381518110611d9957611d99615a99565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611dc881615ac8565b9050611d6d565b6000808061126d600f856127ac565b611de6612049565b611d178161395e565b333014611e28576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e65565b6040805180820190915260008082526020820152815260200190600190039081611e3e5790505b506101408401515190915015611ed257611ecf8361014001518460200151604051602001611eaf919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528560400151866101600151866127f6565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f3c57506040830151611f3a9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613a53565b155b15611f4657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f7b8786613a6f565b611388886080015189604001516040518563ffffffff1660e01b8152600401611fa79493929190615c13565b6000604051808303816000875af1158015611fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261200c9190810190615ce5565b915091508161118857806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161091f9190614b4a565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161091f565b565b6000818060200190518101906120e29190615d86565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612136576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda9161236d918490615e21565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161239d99989796959493929190615ef0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006002612433608085615a34565b67ffffffffffffffff166124479190615a5b565b90506000601381612459608087615a72565b67ffffffffffffffff168152602081019190915260400160002054905081612483600160046159f2565b901b19168183600381111561249a5761249a614a64565b901b1780601360006124ad608088615a72565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b1f565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b2b565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b37565b6000611c588473ffffffffffffffffffffffffffffffffffffffff851684613b43565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061259b9087908790600401615fda565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b6126df573d8080156125f4576040519150601f19603f3d011682016040523d82523d6000602084013e6125f9565b606091505b5061260381616164565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061269b575061265681616164565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126ab576003925090506111a2565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161091f9190614b4a565b50506040805160208101909152600081526002909250929050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261278882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261276c91906159f2565b85608001516fffffffffffffffffffffffffffffffff16613b66565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061119d8473ffffffffffffffffffffffffffffffffffffffff8516613b85565b60006108ac82613b94565b60008080806127e98686613b9f565b9097909650945050505050565b60606000865167ffffffffffffffff81111561281457612814614b5d565b60405190808252806020026020018201604052801561285957816020015b60408051808201909152600080825260208201528152602001906001900390816128325790505b50905060005b8751811015612ca857600061289089838151811061287f5761287f615a99565b60200260200101516000015161125e565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106128c2576128c2615a99565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b888151811061290157612901615a99565b60200260200101518b898151811061291b5761291b615a99565b60200260200101516040516020016129349291906161b4565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016129639594939291906161d9565b600060405180830381600087803b15801561297d57600080fd5b505af192505050801561298e575060015b612bb1573d8080156129bc576040519150601f19603f3d011682016040523d82523d6000602084013e6129c1565b606091505b5060006129cd82616164565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480612a6057507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612aac57507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612af857507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612b4457507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15612b7d57816040517f30dabb5900000000000000000000000000000000000000000000000000000000815260040161091f9190614b4a565b816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161091f9190614b4a565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c209190615bb9565b838381518110612c3257612c32615a99565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690528851899083908110612c6b57612c6b615a99565b602002602001015160200151838381518110612c8957612c89615a99565b602090810291909101810151015250612ca181615ac8565b905061285f565b50600b54612ccd90829073ffffffffffffffffffffffffffffffffffffffff16613bae565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d68919061623c565b15612d9f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612ddc576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612e1a576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612e3557612e35614b5d565b604051908082528060200260200182016040528015612e5e578160200160208202803683370190505b50905060005b82811015612f3e57600085600001518281518110612e8457612e84615a99565b60200260200101519050612eb8817f0000000000000000000000000000000000000000000000000000000000000000613d96565b838381518110612eca57612eca615a99565b602002602001018181525050806101800151838381518110612eee57612eee615a99565b602002602001015114612f2d576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612f3781615ac8565b9050612e64565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612fbf92879291600401616289565b602060405180830381865afa158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300091906162bf565b90508060000361303c576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156136805760008760000151828151811061306357613063615a99565b60200260200101519050600061307c8260600151610837565b9050600081600381111561309257613092614a64565b14806130af575060038160038111156130ad576130ad614a64565b145b6130f75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b83156131b457600a5460009063ffffffff1661311387426159f2565b11905080806131335750600382600381111561313157613131614a64565b145b613169576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061317b5761317b615a99565b60200260200101516000146131ae5788848151811061319c5761319c615a99565b60200260200101518360800181815250505b50613211565b60008160038111156131c8576131c8614a64565b146132115760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561328957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561342c5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615be3565b60c084015190915067ffffffffffffffff166133628260016162d8565b67ffffffffffffffff16146133cf57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613670565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561344057613440614a64565b036134cc5760c083015167ffffffffffffffff1661345f8260016162d8565b67ffffffffffffffff16146134cc57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613670565b60008a6020015185815181106134e4576134e4615a99565b602002602001015190506134f9848251613f42565b61350884606001516001612424565b6000806135158684612557565b91509150613527866060015183612424565b600382600381111561353b5761353b614a64565b1415801561355b5750600282600381111561355857613558614a64565b14155b1561359a578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161091f9291906162f9565b60008560038111156135ae576135ae614a64565b0361361b5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff16916135f383616317565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051613661929190615241565b60405180910390a35050505050505b61367981615ac8565b9050613043565b50505050505050565b610d7b61369882840184616334565b604080516000815260208101909152612cd9565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060405160200161375c949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b81546000906137a290700100000000000000000000000000000000900463ffffffff16426159f2565b9050801561384457600183015483546137ea916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613b66565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461386a916fffffffffffffffffffffffffffffffff9081169116614118565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906139519084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036139dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161091f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613a5e8361412e565b80156112c057506112c08383614192565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001613af4919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112c08383614261565b60006112c0838361426d565b60006112c083836142f7565b6000611c58848473ffffffffffffffffffffffffffffffffffffffff8516614314565b6000612cd085613b768486615a5b565b613b809087615c00565b614118565b60008080806127e98686614331565b60006108ac8261436b565b60008080806127e98686614376565b81516000805b82811015613d825760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613bec57613bec615a99565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c849190616369565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d1657858281518110613cbf57613cbf615a99565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161091f565b613d64868381518110613d2b57613d2b615a99565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166143a190919063ffffffff16565b613d6e9084615c00565b92505080613d7b90615ac8565b9050613bb4565b50613d9060038260006143de565b50505050565b60008060001b8284606001518560c001518660200151876040015188610120015180519060200120896101400151604051602001613dd491906154e7565b604051602081830303815290604052805190602001208a6101600151604051602001613e0091906163c9565b604051602081830303815290604052805190602001208b608001518c60a00151604051602001613eab9b9a999897969594939291909a8b5260208b019990995267ffffffffffffffff97881660408b015295909616606089015273ffffffffffffffffffffffffffffffffffffffff93841660808901529190921660a087015260c086019190915260e085015261010084019190915261012083015215156101408201526101600190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825260e086015161010087015173ffffffffffffffffffffffffffffffffffffffff90911660208501528383015281518084038301815260608401909252613f24929091906080016163dc565b60405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff1614613fc25781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff1610156140335760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b8082610140015151146140845760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015610d7b57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff166004830152602482015260440161091f565b600081831061412757816112c0565b5090919050565b600061415a827f01ffc9a700000000000000000000000000000000000000000000000000000000614192565b80156108ac575061418b827fffffffff00000000000000000000000000000000000000000000000000000000614192565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561424a575060208210155b80156142565750600081115b979650505050505050565b60006112c08383614761565b60008181526002830160205260408120548015158061429157506142918484614261565b6112c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161091f565b600081815260028301602052604081208190556112c08383614779565b60008281526002840160205260408120829055611c588484614785565b6000818152600283016020526040812054819080614360576143538585614261565b9250600091506111a29050565b6001925090506111a2565b60006108ac82614791565b60008080614384858561479b565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006143d4837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a5b565b6112c0919061640b565b825474010000000000000000000000000000000000000000900460ff161580614405575081155b1561440f57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061445590700100000000000000000000000000000000900463ffffffff16426159f2565b905080156145155781831115614497576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546144d19083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613b66565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156145cc5773ffffffffffffffffffffffffffffffffffffffff8416614574576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161091f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161091f565b848310156146df5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061461090826159f2565b61461a878a6159f2565b6146249190615c00565b61462e919061640b565b905073ffffffffffffffffffffffffffffffffffffffff8616614687576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161091f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161091f565b6146e985846159f2565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112c0565b60006112c083836147a7565b60006112c083836148a1565b60006108ac825490565b60006112c083836148f0565b600081815260018301602052604081205480156148905760006147cb6001836159f2565b85549091506000906147df906001906159f2565b90508181146148445760008660000182815481106147ff576147ff615a99565b906000526020600020015490508087600001848154811061482257614822615a99565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806148555761485561641f565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108ac565b60009150506108ac565b5092915050565b60008181526001830160205260408120546148e8575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108ac565b5060006108ac565b600082600001828154811061490757614907615a99565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614994579160200282015b8281111561499457825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061493a565b506113eb9291505b808211156113eb576000815560010161499c565b60c081016108ac828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611d1757600080fd5b8035614a4281614a21565b919050565b600060208284031215614a5957600080fd5b81356112c081614a21565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614aca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108ac8284614a93565b60005b83811015614af7578181015183820152602001614adf565b50506000910152565b60008151808452614b18816020860160208601614adc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112c06020830184614b00565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614baf57614baf614b5d565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614baf57614baf614b5d565b6040516080810167ffffffffffffffff81118282101715614baf57614baf614b5d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c4357614c43614b5d565b604052919050565b600067ffffffffffffffff821115614c6557614c65614b5d565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611d1757600080fd5b8035614a4281614c6f565b600082601f830112614cad57600080fd5b81356020614cc2614cbd83614c4b565b614bfc565b82815260059290921b84018101918181019086841115614ce157600080fd5b8286015b84811015614d05578035614cf881614c6f565b8352918301918301614ce5565b509695505050505050565b803560ff81168114614a4257600080fd5b600067ffffffffffffffff821115614d3b57614d3b614b5d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614d7857600080fd5b8135614d86614cbd82614d21565b818152846020838601011115614d9b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614dd157600080fd5b863567ffffffffffffffff80821115614de957600080fd5b614df58a838b01614c9c565b97506020890135915080821115614e0b57600080fd5b614e178a838b01614c9c565b9650614e2560408a01614d10565b95506060890135915080821115614e3b57600080fd5b614e478a838b01614d67565b9450614e5560808a01614a37565b935060a0890135915080821115614e6b57600080fd5b50614e7889828a01614d67565b9150509295509295509295565b60008060408385031215614e9857600080fd5b8235614ea381614a21565b9150602083013560048110614eb757600080fd5b809150509250929050565b60008083601f840112614ed457600080fd5b50813567ffffffffffffffff811115614eec57600080fd5b6020830191508360208260061b85010111156111a257600080fd5b60008060008060408587031215614f1d57600080fd5b843567ffffffffffffffff80821115614f3557600080fd5b614f4188838901614ec2565b90965094506020870135915080821115614f5a57600080fd5b50614f6787828801614ec2565b95989497509550505050565b8015158114611d1757600080fd5b8035614a4281614f73565b600082601f830112614f9d57600080fd5b81356020614fad614cbd83614c4b565b82815260069290921b84018101918181019086841115614fcc57600080fd5b8286015b84811015614d055760408189031215614fe95760008081fd5b614ff1614b8c565b8135614ffc81614c6f565b81528185013585820152835291830191604001614fd0565b6000615022614cbd84614c4b565b8381529050602080820190600585901b84018681111561504157600080fd5b845b8181101561507d57803567ffffffffffffffff8111156150635760008081fd5b61506f89828901614d67565b855250928201928201615043565b505050509392505050565b600082601f83011261509957600080fd5b6112c083833560208501615014565b60006101a082840312156150bb57600080fd5b6150c3614bb5565b90506150ce82614a37565b81526150dc60208301614c91565b60208201526150ed60408301614c91565b60408201526150fe60608301614a37565b60608201526080820135608082015261511960a08301614f81565b60a082015261512a60c08301614a37565b60c082015261513b60e08301614c91565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561516857600080fd5b61517486838701614d67565b8385015261014092508285013591508082111561519057600080fd5b61519c86838701614f8c565b838501526101609250828501359150808211156151b857600080fd5b506151c585828601615088565b82840152505061018080830135818301525092915050565b600080604083850312156151f057600080fd5b823567ffffffffffffffff8082111561520857600080fd5b615214868387016150a8565b9350602085013591508082111561522a57600080fd5b5061523785828601615088565b9150509250929050565b61524b8184614a93565b604060208201526000611c586040830184614b00565b60006020828403121561527357600080fd5b81356112c081614c6f565b600081518084526020808501945080840160005b838110156152c457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615292565b509495945050505050565b6020815260006112c0602083018461527e565b6020808252825182820181905260009190848201906040850190845b8181101561533057835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152fe565b50909695505050505050565b60008083601f84011261534e57600080fd5b50813567ffffffffffffffff81111561536657600080fd5b6020830191508360208285010111156111a257600080fd5b60008083601f84011261539057600080fd5b50813567ffffffffffffffff8111156153a857600080fd5b6020830191508360208260051b85010111156111a257600080fd5b60008060008060008060008060a0898b0312156153df57600080fd5b883567ffffffffffffffff808211156153f757600080fd5b6154038c838d01614f8c565b995060208b013591508082111561541957600080fd5b6154258c838d0161533c565b909950975060408b0135915061543a82614c6f565b90955060608a0135908082111561545057600080fd5b61545c8c838d0161537e565b909650945060808b013591508082111561547557600080fd5b506154828b828c0161537e565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b838110156152c4578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016154aa565b6020815260006112c06020830184615496565b600082601f83011261550b57600080fd5b8135602061551b614cbd83614c4b565b82815260059290921b8401810191818101908684111561553a57600080fd5b8286015b84811015614d0557803567ffffffffffffffff81111561555e5760008081fd5b61556c8986838b0101615088565b84525091830191830161553e565b600082601f83011261558b57600080fd5b8135602061559b614cbd83614c4b565b82815260059290921b840181019181810190868411156155ba57600080fd5b8286015b84811015614d0557803583529183019183016155be565b6000608082840312156155e757600080fd5b6155ef614bd9565b9050813567ffffffffffffffff8082111561560957600080fd5b818401915084601f83011261561d57600080fd5b8135602061562d614cbd83614c4b565b82815260059290921b8401810191818101908884111561564c57600080fd5b8286015b84811015615684578035868111156156685760008081fd5b6156768b86838b01016150a8565b845250918301918301615650565b508652508581013593508284111561569b57600080fd5b6156a7878588016154fa565b908501525060408401359150808211156156c057600080fd5b506156cd8482850161557a565b6040830152506060820135606082015292915050565b600080604083850312156156f657600080fd5b823567ffffffffffffffff8082111561570e57600080fd5b61571a868387016155d5565b935060209150818501358181111561573157600080fd5b85019050601f8101861361574457600080fd5b8035615752614cbd82614c4b565b81815260059190911b8201830190838101908883111561577157600080fd5b928401925b8284101561578f57833582529284019290840190615776565b80955050505050509250929050565b60a081016108ac828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b60006020828403121561581357600080fd5b813567ffffffffffffffff81111561582a57600080fd5b820160a081850312156112c057600080fd5b60008060008060008060008060e0898b03121561585857600080fd5b606089018a81111561586957600080fd5b8998503567ffffffffffffffff8082111561588357600080fd5b61588f8c838d0161533c565b909950975060808b01359150808211156158a857600080fd5b6158b48c838d0161537e565b909750955060a08b01359150808211156158cd57600080fd5b506158da8b828c0161537e565b999c989b50969995989497949560c00135949350505050565b6000806020838503121561590657600080fd5b823567ffffffffffffffff81111561591d57600080fd5b6159298582860161533c565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff81168114614a4257600080fd5b60006060828403121561596757600080fd5b6040516060810181811067ffffffffffffffff8211171561598a5761598a614b5d565b604052823561599881614f73565b81526159a660208401615935565b60208201526159b760408401615935565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108ac576108ac6159c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615a4f57615a4f615a05565b92169190910692915050565b80820281158282048414176108ac576108ac6159c3565b600067ffffffffffffffff80841680615a8d57615a8d615a05565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615af957615af96159c3565b5060010190565b600063ffffffff808316818103615b1957615b196159c3565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152615b538184018a61527e565b90508281036080840152615b67818961527e565b905060ff871660a084015282810360c0840152615b848187614b00565b905067ffffffffffffffff851660e0840152828103610100840152615ba98185614b00565b9c9b505050505050505050505050565b600060208284031215615bcb57600080fd5b81516112c081614c6f565b60006112c0368484615014565b600060208284031215615bf557600080fd5b81516112c081614a21565b808201808211156108ac576108ac6159c3565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615c4e610120840182614b00565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615c8a8383614b00565b925060808901519150808584030161010086015250615ca98282615496565b92505050615cbd602083018661ffff169052565b836040830152612cd0606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060408385031215615cf857600080fd5b8251615d0381614f73565b602084015190925067ffffffffffffffff811115615d2057600080fd5b8301601f81018513615d3157600080fd5b8051615d3f614cbd82614d21565b818152866020838501011115615d5457600080fd5b615d65826020830160208601614adc565b8093505050509250929050565b805163ffffffff81168114614a4257600080fd5b600060a08284031215615d9857600080fd5b60405160a0810181811067ffffffffffffffff82111715615dbb57615dbb614b5d565b604052615dc783615d72565b81526020830151615dd781614c6f565b60208201526040830151615dea81614c6f565b6040820152606083015161ffff81168114615e0457600080fd5b6060820152615e1560808401615d72565b60808201529392505050565b6101608101615e93828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151166101408301526112c0565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615f378285018b61527e565b91508382036080850152615f4b828a61527e565b915060ff881660a085015283820360c0850152615f688288614b00565b90861660e08501528381036101008501529050615ba98185614b00565b600081518084526020808501808196508360051b8101915082860160005b85811015615fcd578284038952615fbb848351614b00565b98850198935090840190600101615fa3565b5091979650505050505050565b60408152615ff560408201845167ffffffffffffffff169052565b6000602084015161601e606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061608c8185018367ffffffffffffffff169052565b60e086015191506101206160b78186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526160e76101e0870185614b00565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526161268686615496565b9550828a015194508188870301848901526161418686615f85565b9550808a01516101c089015250505050508281036020840152612cd08185615f85565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156161ac5780818460040360031b1b83161693505b505050919050565b6040815260006161c76040830185614b00565b8281036020840152612cd08185614b00565b60a0815260006161ec60a0830188614b00565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff8516606084015282810360808401526162308185614b00565b98975050505050505050565b60006020828403121561624e57600080fd5b81516112c081614f73565b600081518084526020808501945080840160005b838110156152c45781518752958201959082019060010161626d565b60608152600061629c6060830186616259565b82810360208401526162ae8186616259565b915050826040830152949350505050565b6000602082840312156162d157600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561489a5761489a6159c3565b67ffffffffffffffff83168152604081016112c06020830184614a93565b600067ffffffffffffffff808316818103615b1957615b196159c3565b60006020828403121561634657600080fd5b813567ffffffffffffffff81111561635d57600080fd5b611c58848285016155d5565b60006040828403121561637b57600080fd5b616383614b8c565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146163af57600080fd5b81526163bd60208401615d72565b60208201529392505050565b6020815260006112c06020830184615f85565b600083516163ee818460208801614adc565b835190830190616402818360208801614adc565b01949350505050565b60008261641a5761641a615a05565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006f3538038062006f358339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161640362000b3260003960008181610381015281816123190152612cdb015260008181610345015281816118090152818161188b015281816122ef0152818161325101526132d801526000612e94015260008181610309015281816122c801526136f30152600081816102a90152818161227601526136d20152600081816102d9015281816122a0015281816128d0015281816136b10152613f1e01526000818161026d015281816122480152612f890152600081816115520152818161159e0152818161194c015261199801526164036000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b146107f4578063f52121a514610807578063f8ccbf471461081a57600080fd5b8063d3c7c2c7146107d9578063d7e2bb50146107e157600080fd5b8063b4069b3114610798578063b5767166146107ab578063c5a1d7f0146107be578063c92b2832146107c657600080fd5b8063856c8247116100f9578063856c82471461071b5780638da5cb5b14610747578063afcb95d714610765578063b1dc65a41461078557600080fd5b80637437ff9f1461060a57806379ba5097146106d557806381ff7048146106dd57806385572ffb1461070d57600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb919061498a565b60405180910390f35b6103e76103e2366004614a21565b610837565b6040516103cb9190614aa8565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614b24565b61045061044b366004614d92565b6108b2565b005b610450610460366004614e5f565b610d71565b610450610473366004614ee1565b610d7f565b61048b6104863660046151b7565b61118f565b6040516103cb92919061521b565b6104c36104a7366004614a21565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111a9565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f61058236600461523b565b61125e565b61058f6112c7565b6040516103cb91906152a9565b6105a4611336565b6040516103cb91906152bc565b6105c46105bf36600461539d565b6113ef565b6040516103cb91906154c1565b6104506105df3660046156bd565b611455565b6104506105f236600461523b565b61145f565b6104506106053660046156bd565b61154f565b6106c86040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103cb9190615778565b6104506116d1565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b6104506102263660046157db565b61072e61072936600461523b565b6117ce565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b610450610793366004615816565b6118f6565b61054f6107a636600461523b565b611b87565b6104506107b93660046158cd565b611c60565b6104c3611c6a565b6104506107d436600461592f565b611c95565b6105a4611d1a565b61054f6107ef36600461523b565b611dcf565b61045061080236600461523b565b611dde565b6104506108153660046151b7565b611def565b6014546108279060ff1681565b60405190151581526020016103cb565b6000610845600160046159cc565b6002610852608085615a0e565b67ffffffffffffffff166108669190615a35565b60136000610875608087615a4c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108ac576108ac614a3e565b92915050565b84518460ff16601f821115610928576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610992576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161091f565b61099a612049565b6109a3856120cc565b60095460005b81811015610a2f5760086000600983815481106109c8576109c8615a73565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a2881615aa2565b90506109a9565b50875160005b81811015610c2b5760008a8281518110610a5157610a51615a73565b6020026020010151905060006002811115610a6e57610a6e614a3e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610aad57610aad614a3e565b14610b14576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116610b61576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c1157610c11614a3e565b02179055509050505080610c2490615aa2565b9050610a35565b508851610c3f9060099060208c01906148f4565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cc5914691309190600090610c979063ffffffff16615ada565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d612379565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d5c99989796959493929190615afd565b60405180910390a15050505050505050505050565b610d7b8282612424565b5050565b610d87612049565b60005b83811015610f86576000858583818110610da657610da6615a73565b610dbc926020604090920201908101915061523b565b90506000868684818110610dd257610dd2615a73565b9050604002016020016020810190610dea919061523b565b9050610df7600c836124ce565b610e2d576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e4f600c846124f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea7600c83612512565b50610f228173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a9190615b93565b600f90612512565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610f7f90615aa2565b9050610d8a565b5060005b81811015611188576000838383818110610fa657610fa6615a73565b610fbc926020604090920201908101915061523b565b90506000848484818110610fd257610fd2615a73565b9050604002016020016020810190610fea919061523b565b905073ffffffffffffffffffffffffffffffffffffffff82161580611023575073ffffffffffffffffffffffffffffffffffffffff8116155b1561105a576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611065600c836124ce565b1561109c576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a8600c8383612534565b506111248173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190615b93565b600f9083612534565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a150508061118190615aa2565b9050610f8a565b5050505050565b6000606061119d8484612557565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152611259906126fa565b905090565b6000808061126d600c856127ac565b91509150816112c0576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561132c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611301575b5050505050905090565b6060611342600f6127cf565b67ffffffffffffffff81111561135a5761135a614b37565b604051908082528060200260200182016040528015611383578160200160208202803683370190505b50905060005b81518110156113eb57600061139f600f836127da565b509050808383815181106113b5576113b5615a73565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152506113e481615aa2565b9050611389565b5090565b60606114488989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061143991508990508a615bb0565b6114438789615bb0565b6127f6565b9998505050505050505050565b610d7b8282612cd9565b60005473ffffffffffffffffffffffffffffffffffffffff16331480159061149f575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156114d6576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146115da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161091f565b81515181518114611617576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116c157600083828151811061163657611636615a73565b602002602001015190508060001415801561166f5750845180518390811061166057611660615a73565b60200260200101516080015181105b156116b0576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161091f565b506116ba81615aa2565b905061161a565b506116cc8383612cd9565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161091f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561184157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108ac576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190615bbd565b6119008787613689565b600554883590808214611949576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161091f565b467f0000000000000000000000000000000000000000000000000000000000000000146119ca576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161091f565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a5257611a52614a3e565b6002811115611a6357611a63614a3e565b9052509050600281602001516002811115611a8057611a80614a3e565b148015611ac757506009816000015160ff1681548110611aa257611aa2615a73565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611afd576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b0b856020615a35565b611b16886020615a35565b611b228b610144615bda565b611b2c9190615bda565b611b369190615bda565b9050368114611b7a576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161091f565b5050505050505050505050565b60008080611b96600c856127ac565b9150915081611be9576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c589190615b93565b949350505050565b610d7b8282613689565b60006112597f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36136ac565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611cd5575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611d0c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d17600382613779565b50565b6060611d26600c6127cf565b67ffffffffffffffff811115611d3e57611d3e614b37565b604051908082528060200260200182016040528015611d67578160200160208202803683370190505b50905060005b81518110156113eb576000611d83600c836127da565b50905080838381518110611d9957611d99615a73565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611dc881615aa2565b9050611d6d565b6000808061126d600f856127ac565b611de6612049565b611d178161395e565b333014611e28576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e65565b6040805180820190915260008082526020820152815260200190600190039081611e3e5790505b506101408401515190915015611ed257611ecf8361014001518460200151604051602001611eaf919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528560400151866101600151866127f6565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f3c57506040830151611f3a9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613a53565b155b15611f4657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f7b8786613a6f565b611388886080015189604001516040518563ffffffff1660e01b8152600401611fa79493929190615bed565b6000604051808303816000875af1158015611fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261200c9190810190615cbf565b915091508161118857806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161091f565b565b6000818060200190518101906120e29190615d60565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612136576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda9161236d918490615dfb565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161239d99989796959493929190615eca565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006002612433608085615a0e565b67ffffffffffffffff166124479190615a35565b90506000601381612459608087615a4c565b67ffffffffffffffff168152602081019190915260400160002054905081612483600160046159cc565b901b19168183600381111561249a5761249a614a3e565b901b1780601360006124ad608088615a4c565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b1f565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b2b565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b37565b6000611c588473ffffffffffffffffffffffffffffffffffffffff851684613b43565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061259b9087908790600401615fb1565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b6126df573d8080156125f4576040519150601f19603f3d011682016040523d82523d6000602084013e6125f9565b606091505b506126038161613b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061269b57506126568161613b565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126ab576003925090506111a2565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b50506040805160208101909152600081526002909250929050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261278882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261276c91906159cc565b85608001516fffffffffffffffffffffffffffffffff16613b66565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061119d8473ffffffffffffffffffffffffffffffffffffffff8516613b85565b60006108ac82613b94565b60008080806127e98686613b9f565b9097909650945050505050565b60606000865167ffffffffffffffff81111561281457612814614b37565b60405190808252806020026020018201604052801561285957816020015b60408051808201909152600080825260208201528152602001906001900390816128325790505b50905060005b8751811015612ca857600061289089838151811061287f5761287f615a73565b60200260200101516000015161125e565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106128c2576128c2615a73565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b888151811061290157612901615a73565b60200260200101518b898151811061291b5761291b615a73565b602002602001015160405160200161293492919061618b565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016129639594939291906161b0565b600060405180830381600087803b15801561297d57600080fd5b505af192505050801561298e575060015b612bb1573d8080156129bc576040519150601f19603f3d011682016040523d82523d6000602084013e6129c1565b606091505b5060006129cd8261613b565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480612a6057507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612aac57507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612af857507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612b4457507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15612b7d57816040517f30dabb5900000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c209190615b93565b838381518110612c3257612c32615a73565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690528851899083908110612c6b57612c6b615a73565b602002602001015160200151838381518110612c8957612c89615a73565b602090810291909101810151015250612ca181615aa2565b905061285f565b50600b54612ccd90829073ffffffffffffffffffffffffffffffffffffffff16613bae565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d689190616213565b15612d9f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612ddc576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612e1a576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612e3557612e35614b37565b604051908082528060200260200182016040528015612e5e578160200160208202803683370190505b50905060005b82811015612f3e57600085600001518281518110612e8457612e84615a73565b60200260200101519050612eb8817f0000000000000000000000000000000000000000000000000000000000000000613d96565b838381518110612eca57612eca615a73565b602002602001018181525050806101800151838381518110612eee57612eee615a73565b602002602001015114612f2d576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612f3781615aa2565b9050612e64565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612fbf92879291600401616260565b602060405180830381865afa158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130009190616296565b90508060000361303c576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156136805760008760000151828151811061306357613063615a73565b60200260200101519050600061307c8260600151610837565b9050600081600381111561309257613092614a3e565b14806130af575060038160038111156130ad576130ad614a3e565b145b6130f75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b83156131b457600a5460009063ffffffff1661311387426159cc565b11905080806131335750600382600381111561313157613131614a3e565b145b613169576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061317b5761317b615a73565b60200260200101516000146131ae5788848151811061319c5761319c615a73565b60200260200101518360800181815250505b50613211565b60008160038111156131c8576131c8614a3e565b146132115760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561328957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561342c5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615bbd565b60c084015190915067ffffffffffffffff166133628260016162af565b67ffffffffffffffff16146133cf57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613670565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561344057613440614a3e565b036134cc5760c083015167ffffffffffffffff1661345f8260016162af565b67ffffffffffffffff16146134cc57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613670565b60008a6020015185815181106134e4576134e4615a73565b602002602001015190506134f9848251613f1c565b61350884606001516001612424565b6000806135158684612557565b91509150613527866060015183612424565b600382600381111561353b5761353b614a3e565b1415801561355b5750600282600381111561355857613558614a3e565b14155b1561359a578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161091f9291906162d0565b60008560038111156135ae576135ae614a3e565b0361361b5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff16916135f3836162ee565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161366192919061521b565b60405180910390a35050505050505b61367981615aa2565b9050613043565b50505050505050565b610d7b6136988284018461630b565b604080516000815260208101909152612cd9565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060405160200161375c949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b81546000906137a290700100000000000000000000000000000000900463ffffffff16426159cc565b9050801561384457600183015483546137ea916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613b66565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461386a916fffffffffffffffffffffffffffffffff90811691166140f2565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906139519084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036139dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161091f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613a5e83614108565b80156112c057506112c0838361416c565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001613af4919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112c0838361423b565b60006112c08383614247565b60006112c083836142d1565b6000611c58848473ffffffffffffffffffffffffffffffffffffffff85166142ee565b6000612cd085613b768486615a35565b613b809087615bda565b6140f2565b60008080806127e9868661430b565b60006108ac82614345565b60008080806127e98686614350565b81516000805b82811015613d825760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613bec57613bec615a73565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c849190616340565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d1657858281518110613cbf57613cbf615a73565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161091f565b613d64868381518110613d2b57613d2b615a73565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661437b90919063ffffffff16565b613d6e9084615bda565b92505080613d7b90615aa2565b9050613bb4565b50613d9060038260006143b8565b50505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613e3998979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613e7291906154c1565b60405160208183030381529060405280519060200120876101600151604051602001613e9e91906163a0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff1614613f9c5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff16101561400d5760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b80826101400151511461405e5760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015610d7b57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff166004830152602482015260440161091f565b600081831061410157816112c0565b5090919050565b6000614134827f01ffc9a70000000000000000000000000000000000000000000000000000000061416c565b80156108ac5750614165827fffffffff0000000000000000000000000000000000000000000000000000000061416c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614224575060208210155b80156142305750600081115b979650505050505050565b60006112c0838361473b565b60008181526002830160205260408120548015158061426b575061426b848461423b565b6112c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161091f565b600081815260028301602052604081208190556112c08383614753565b60008281526002840160205260408120829055611c58848461475f565b600081815260028301602052604081205481908061433a5761432d858561423b565b9250600091506111a29050565b6001925090506111a2565b60006108ac8261476b565b6000808061435e8585614775565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006143ae837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a35565b6112c091906163b3565b825474010000000000000000000000000000000000000000900460ff1615806143df575081155b156143e957505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061442f90700100000000000000000000000000000000900463ffffffff16426159cc565b905080156144ef5781831115614471576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546144ab9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613b66565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156145a65773ffffffffffffffffffffffffffffffffffffffff841661454e576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161091f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161091f565b848310156146b95760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906145ea90826159cc565b6145f4878a6159cc565b6145fe9190615bda565b61460891906163b3565b905073ffffffffffffffffffffffffffffffffffffffff8616614661576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161091f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161091f565b6146c385846159cc565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112c0565b60006112c08383614781565b60006112c0838361487b565b60006108ac825490565b60006112c083836148ca565b6000818152600183016020526040812054801561486a5760006147a56001836159cc565b85549091506000906147b9906001906159cc565b905081811461481e5760008660000182815481106147d9576147d9615a73565b90600052602060002001549050808760000184815481106147fc576147fc615a73565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061482f5761482f6163c7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108ac565b60009150506108ac565b5092915050565b60008181526001830160205260408120546148c2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108ac565b5060006108ac565b60008260000182815481106148e1576148e1615a73565b9060005260206000200154905092915050565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614914565b506113eb9291505b808211156113eb5760008155600101614976565b60c081016108ac828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611d1757600080fd5b8035614a1c816149fb565b919050565b600060208284031215614a3357600080fd5b81356112c0816149fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614aa4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108ac8284614a6d565b60005b83811015614ad1578181015183820152602001614ab9565b50506000910152565b60008151808452614af2816020860160208601614ab6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112c06020830184614ada565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614b8957614b89614b37565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614b8957614b89614b37565b6040516080810167ffffffffffffffff81118282101715614b8957614b89614b37565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c1d57614c1d614b37565b604052919050565b600067ffffffffffffffff821115614c3f57614c3f614b37565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611d1757600080fd5b8035614a1c81614c49565b600082601f830112614c8757600080fd5b81356020614c9c614c9783614c25565b614bd6565b82815260059290921b84018101918181019086841115614cbb57600080fd5b8286015b84811015614cdf578035614cd281614c49565b8352918301918301614cbf565b509695505050505050565b803560ff81168114614a1c57600080fd5b600067ffffffffffffffff821115614d1557614d15614b37565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614d5257600080fd5b8135614d60614c9782614cfb565b818152846020838601011115614d7557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614dab57600080fd5b863567ffffffffffffffff80821115614dc357600080fd5b614dcf8a838b01614c76565b97506020890135915080821115614de557600080fd5b614df18a838b01614c76565b9650614dff60408a01614cea565b95506060890135915080821115614e1557600080fd5b614e218a838b01614d41565b9450614e2f60808a01614a11565b935060a0890135915080821115614e4557600080fd5b50614e5289828a01614d41565b9150509295509295509295565b60008060408385031215614e7257600080fd5b8235614e7d816149fb565b9150602083013560048110614e9157600080fd5b809150509250929050565b60008083601f840112614eae57600080fd5b50813567ffffffffffffffff811115614ec657600080fd5b6020830191508360208260061b85010111156111a257600080fd5b60008060008060408587031215614ef757600080fd5b843567ffffffffffffffff80821115614f0f57600080fd5b614f1b88838901614e9c565b90965094506020870135915080821115614f3457600080fd5b50614f4187828801614e9c565b95989497509550505050565b8015158114611d1757600080fd5b8035614a1c81614f4d565b600082601f830112614f7757600080fd5b81356020614f87614c9783614c25565b82815260069290921b84018101918181019086841115614fa657600080fd5b8286015b84811015614cdf5760408189031215614fc35760008081fd5b614fcb614b66565b8135614fd681614c49565b81528185013585820152835291830191604001614faa565b6000614ffc614c9784614c25565b8381529050602080820190600585901b84018681111561501b57600080fd5b845b8181101561505757803567ffffffffffffffff81111561503d5760008081fd5b61504989828901614d41565b85525092820192820161501d565b505050509392505050565b600082601f83011261507357600080fd5b6112c083833560208501614fee565b60006101a0828403121561509557600080fd5b61509d614b8f565b90506150a882614a11565b81526150b660208301614c6b565b60208201526150c760408301614c6b565b60408201526150d860608301614a11565b6060820152608082013560808201526150f360a08301614f5b565b60a082015261510460c08301614a11565b60c082015261511560e08301614c6b565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561514257600080fd5b61514e86838701614d41565b8385015261014092508285013591508082111561516a57600080fd5b61517686838701614f66565b8385015261016092508285013591508082111561519257600080fd5b5061519f85828601615062565b82840152505061018080830135818301525092915050565b600080604083850312156151ca57600080fd5b823567ffffffffffffffff808211156151e257600080fd5b6151ee86838701615082565b9350602085013591508082111561520457600080fd5b5061521185828601615062565b9150509250929050565b6152258184614a6d565b604060208201526000611c586040830184614ada565b60006020828403121561524d57600080fd5b81356112c081614c49565b600081518084526020808501945080840160005b8381101561529e57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161526c565b509495945050505050565b6020815260006112c06020830184615258565b6020808252825182820181905260009190848201906040850190845b8181101561530a57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152d8565b50909695505050505050565b60008083601f84011261532857600080fd5b50813567ffffffffffffffff81111561534057600080fd5b6020830191508360208285010111156111a257600080fd5b60008083601f84011261536a57600080fd5b50813567ffffffffffffffff81111561538257600080fd5b6020830191508360208260051b85010111156111a257600080fd5b60008060008060008060008060a0898b0312156153b957600080fd5b883567ffffffffffffffff808211156153d157600080fd5b6153dd8c838d01614f66565b995060208b01359150808211156153f357600080fd5b6153ff8c838d01615316565b909950975060408b0135915061541482614c49565b90955060608a0135908082111561542a57600080fd5b6154368c838d01615358565b909650945060808b013591508082111561544f57600080fd5b5061545c8b828c01615358565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b8381101561529e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615484565b6020815260006112c06020830184615470565b600082601f8301126154e557600080fd5b813560206154f5614c9783614c25565b82815260059290921b8401810191818101908684111561551457600080fd5b8286015b84811015614cdf57803567ffffffffffffffff8111156155385760008081fd5b6155468986838b0101615062565b845250918301918301615518565b600082601f83011261556557600080fd5b81356020615575614c9783614c25565b82815260059290921b8401810191818101908684111561559457600080fd5b8286015b84811015614cdf5780358352918301918301615598565b6000608082840312156155c157600080fd5b6155c9614bb3565b9050813567ffffffffffffffff808211156155e357600080fd5b818401915084601f8301126155f757600080fd5b81356020615607614c9783614c25565b82815260059290921b8401810191818101908884111561562657600080fd5b8286015b8481101561565e578035868111156156425760008081fd5b6156508b86838b0101615082565b84525091830191830161562a565b508652508581013593508284111561567557600080fd5b615681878588016154d4565b9085015250604084013591508082111561569a57600080fd5b506156a784828501615554565b6040830152506060820135606082015292915050565b600080604083850312156156d057600080fd5b823567ffffffffffffffff808211156156e857600080fd5b6156f4868387016155af565b935060209150818501358181111561570b57600080fd5b85019050601f8101861361571e57600080fd5b803561572c614c9782614c25565b81815260059190911b8201830190838101908883111561574b57600080fd5b928401925b8284101561576957833582529284019290840190615750565b80955050505050509250929050565b60a081016108ac828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156157ed57600080fd5b813567ffffffffffffffff81111561580457600080fd5b820160a081850312156112c057600080fd5b60008060008060008060008060e0898b03121561583257600080fd5b606089018a81111561584357600080fd5b8998503567ffffffffffffffff8082111561585d57600080fd5b6158698c838d01615316565b909950975060808b013591508082111561588257600080fd5b61588e8c838d01615358565b909750955060a08b01359150808211156158a757600080fd5b506158b48b828c01615358565b999c989b50969995989497949560c00135949350505050565b600080602083850312156158e057600080fd5b823567ffffffffffffffff8111156158f757600080fd5b61590385828601615316565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff81168114614a1c57600080fd5b60006060828403121561594157600080fd5b6040516060810181811067ffffffffffffffff8211171561596457615964614b37565b604052823561597281614f4d565b81526159806020840161590f565b60208201526159916040840161590f565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108ac576108ac61599d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615a2957615a296159df565b92169190910692915050565b80820281158282048414176108ac576108ac61599d565b600067ffffffffffffffff80841680615a6757615a676159df565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615ad357615ad361599d565b5060010190565b600063ffffffff808316818103615af357615af361599d565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152615b2d8184018a615258565b90508281036080840152615b418189615258565b905060ff871660a084015282810360c0840152615b5e8187614ada565b905067ffffffffffffffff851660e0840152828103610100840152615b838185614ada565b9c9b505050505050505050505050565b600060208284031215615ba557600080fd5b81516112c081614c49565b60006112c0368484614fee565b600060208284031215615bcf57600080fd5b81516112c0816149fb565b808201808211156108ac576108ac61599d565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615c28610120840182614ada565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615c648383614ada565b925060808901519150808584030161010086015250615c838282615470565b92505050615c97602083018661ffff169052565b836040830152612cd0606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060408385031215615cd257600080fd5b8251615cdd81614f4d565b602084015190925067ffffffffffffffff811115615cfa57600080fd5b8301601f81018513615d0b57600080fd5b8051615d19614c9782614cfb565b818152866020838501011115615d2e57600080fd5b615d3f826020830160208601614ab6565b8093505050509250929050565b805163ffffffff81168114614a1c57600080fd5b600060a08284031215615d7257600080fd5b60405160a0810181811067ffffffffffffffff82111715615d9557615d95614b37565b604052615da183615d4c565b81526020830151615db181614c49565b60208201526040830151615dc481614c49565b6040820152606083015161ffff81168114615dde57600080fd5b6060820152615def60808401615d4c565b60808201529392505050565b6101608101615e6d828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151166101408301526112c0565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615f118285018b615258565b91508382036080850152615f25828a615258565b915060ff881660a085015283820360c0850152615f428288614ada565b90861660e08501528381036101008501529050615b838185614ada565b6000815180845260208085019450848260051b860182860160005b85811015615fa4578383038952615f92838351614ada565b98850198925090840190600101615f7a565b5090979650505050505050565b60408152615fcc60408201845167ffffffffffffffff169052565b60006020840151615ff5606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006160638185018367ffffffffffffffff169052565b60e0860151915061012061608e8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526160be6101e0870185614ada565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526160fd8686615470565b9550828a015194508188870301848901526161188686615f5f565b9550808a01516101c089015250505050508281036020840152612cd08185615f5f565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156161835780818460040360031b1b83161693505b505050919050565b60408152600061619e6040830185614ada565b8281036020840152612cd08185614ada565b60a0815260006161c360a0830188614ada565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff8516606084015282810360808401526162078185614ada565b98975050505050505050565b60006020828403121561622557600080fd5b81516112c081614f4d565b600081518084526020808501945080840160005b8381101561529e57815187529582019590820190600101616244565b6060815260006162736060830186616230565b82810360208401526162858186616230565b915050826040830152949350505050565b6000602082840312156162a857600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156148745761487461599d565b67ffffffffffffffff83168152604081016112c06020830184614a6d565b600067ffffffffffffffff808316818103615af357615af361599d565b60006020828403121561631d57600080fd5b813567ffffffffffffffff81111561633457600080fd5b611c58848285016155af565b60006040828403121561635257600080fd5b61635a614b66565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461638657600080fd5b815261639460208401615d4c565b60208201529392505050565b6020815260006112c06020830184615f5f565b6000826163c2576163c26159df565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampHelperABI = EVM2EVMOffRampHelperMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go index 197276affe..7ebccb47d4 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go @@ -139,8 +139,8 @@ type RateLimiterTokenBucket struct { } var EVM2EVMOnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b506040516200839438038062008394833981016040819052620000359162001e1d565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c082620007e0565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b5050505050505062002408565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062001ff2565b60405180910390a150565b60005b8151811015620007ae57600082828151811062000669576200066962002072565b6020908102919091018101516040805160c080820183528385015163ffffffff908116835283850151811683870190815260608087015183168587019081526080808901516001600160401b0390811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a529690982094518554925198519151965194511515600160e01b0260ff60e01b19958916600160a01b0295909516600160a01b600160e81b0319979098166c0100000000000000000000000002600160601b600160a01b0319928516680100000000000000000292909216600160401b600160a01b0319998516640100000000026001600160401b0319909416919094161791909117969096161794909417919091169190911791909117905550620007a6816200209e565b905062000648565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516200063a9190620020ba565b60005b8151811015620008b357600082828151811062000804576200080462002072565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e909752939095209151825491519451841666010000000000000263ffffffff60301b1995909416620100000265ffffffffffff19909216951694909417939093179190911617905550620008ab816200209e565b9050620007e3565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516200063a919062002172565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021e1565b60079062001025565b509050620009a860078262001043565b505080620009b690620021f7565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002072565b6020026020010151600001519050600085838151811062000a085762000a0862002072565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002211565b935050508062000a9e906200209e565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002231565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002072565b6020026020010151600001519050600084838151811062000b585762000b5862002072565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c43906200209e565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002072565b6020026020010151600001519050600083838151811062000c955762000c9562002072565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f91906200229e565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e05906200209e565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022be565b62000f5b9190620022d8565b905062000f698187620022fb565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe4906200209e565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117291906200231e565b6200117e919062002338565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200235b565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002072565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021e1565b8554909150600090620014b290600190620021e1565b90508181146200151e576000866000018281548110620014d657620014d662002072565b9060005260206000200154905080876000018481548110620014fc57620014fc62002072565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001532576200153262002379565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023b5565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023d3565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b604051608081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200183957620018396200175d565b604052919050565b6001600160a01b03811681146200185757600080fd5b50565b8051620018678162001841565b919050565b80516001600160401b03811681146200186757600080fd5b600060e082840312156200189757600080fd5b620018a162001773565b90508151620018b08162001841565b8152620018c0602083016200186c565b6020820152620018d3604083016200186c565b6040820152620018e6606083016200186c565b606082015260808201516001600160601b03811681146200190657600080fd5b60808201526200191960a083016200185a565b60a08201526200192c60c083016200185a565b60c082015292915050565b805161ffff811681146200186757600080fd5b805163ffffffff811681146200186757600080fd5b600061014082840312156200197357600080fd5b6200197d6200179e565b90506200198a826200185a565b81526200199a6020830162001937565b6020820152620019ad604083016200194a565b6040820152620019c06060830162001937565b6060820152620019d3608083016200194a565b6080820152620019e660a0830162001937565b60a0820152620019f960c0830162001937565b60c082015262001a0c60e083016200185a565b60e082015261010062001a218184016200194a565b9082015261012062001a358382016200194a565b9082015292915050565b60006001600160401b0382111562001a5b5762001a5b6200175d565b5060051b60200190565b600082601f83011262001a7757600080fd5b8151602062001a9062001a8a8362001a3f565b6200180e565b82815260069290921b8401810191818101908684111562001ab057600080fd5b8286015b8481101562001b0a576040818903121562001acf5760008081fd5b62001ad9620017c4565b815162001ae68162001841565b81528185015162001af78162001841565b8186015283529183019160400162001ab4565b509695505050505050565b805180151581146200186757600080fd5b80516001600160801b03811681146200186757600080fd5b60006060828403121562001b5157600080fd5b604051606081016001600160401b038111828210171562001b765762001b766200175d565b60405290508062001b878362001b15565b815262001b976020840162001b26565b602082015262001baa6040840162001b26565b60408201525092915050565b600082601f83011262001bc857600080fd5b8151602062001bdb62001a8a8362001a3f565b82815260e0928302850182019282820191908785111562001bfb57600080fd5b8387015b8581101562001cb05781818a03121562001c195760008081fd5b62001c2362001773565b815162001c308162001841565b815262001c3f8287016200194a565b86820152604062001c528184016200194a565b90820152606062001c658382016200194a565b90820152608062001c788382016200186c565b9082015260a062001c8b8382016200186c565b9082015260c062001c9e83820162001b15565b90820152845292840192810162001bff565b5090979650505050505050565b600082601f83011262001ccf57600080fd5b8151602062001ce262001a8a8362001a3f565b82815260079290921b8401810191818101908684111562001d0257600080fd5b8286015b8481101562001b0a576080818903121562001d215760008081fd5b62001d2b620017e9565b815162001d388162001841565b815262001d4782860162001937565b85820152604062001d5a8184016200194a565b90820152606062001d6d8382016200194a565b9082015283529183019160800162001d06565b600082601f83011262001d9257600080fd5b8151602062001da562001a8a8362001a3f565b82815260069290921b8401810191818101908684111562001dc557600080fd5b8286015b8481101562001b0a576040818903121562001de45760008081fd5b62001dee620017c4565b815162001dfb8162001841565b815262001e0a82860162001937565b8186015283529183019160400162001dc9565b6000806000806000806000610300888a03121562001e3a57600080fd5b62001e46898962001884565b965062001e578960e08a016200195f565b6102208901519096506001600160401b038082111562001e7657600080fd5b62001e848b838c0162001a65565b965062001e968b6102408c0162001b3e565b95506102a08a015191508082111562001eae57600080fd5b62001ebc8b838c0162001bb6565b94506102c08a015191508082111562001ed457600080fd5b62001ee28b838c0162001cbd565b93506102e08a015191508082111562001efa57600080fd5b5062001f098a828b0162001d80565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f3b602084018261ffff169052565b50604081015162001f54604084018263ffffffff169052565b50606081015162001f6b606084018261ffff169052565b50608081015162001f84608084018263ffffffff169052565b5060a081015162001f9b60a084018261ffff169052565b5060c081015162001fb260c084018261ffff169052565b5060e081015162001fce60e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f18565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020b357620020b362002088565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015163ffffffff9081168887015286820151811687870152606080830151909116908601526080808201516001600160401b03169086015260a08082015162002144878301826001600160401b03169052565b505060c09081015115159085015260e09093019290850190600101620020d7565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff908116878701526060918201511690850152608090930192908501906001016200218f565b818103818111156200101f576200101f62002088565b60008162002209576200220962002088565b506000190190565b63ffffffff81811683821601908082111562001579576200157962002088565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200229057845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200225c565b509098975050505050505050565b600060208284031215620022b157600080fd5b81516200105a8162001841565b80820281158282048414176200101f576200101f62002088565b600082620022f657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001579576200157962002088565b6000602082840312156200233157600080fd5b5051919050565b818103600083128015838313168383128216171562001579576200157962002088565b6000602082840312156200236e57600080fd5b6200105a8262001b15565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023ac57818101518382015260200162002392565b50506000910152565b60008251620023c98184602087016200238f565b9190910192915050565b6020815260008251806020840152620023f48160408501602087016200238f565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615e856200250f600039600081816103340152818161151d0152613e1a0152600081816103050152818161143f015281816114a7015281816119f801528181611a600152613deb01526000818161027101528181610bc201528181611e120152613d5701526000818161024101528181611b2b0152613d2701526000818161021201528181610f91015281816117a3015281816118a401528181612342015281816130cd0152818161345a0152613cf80152600081816102d1015281816119700152613db70152600081816102a1015281816126890152613d8701526000611eda0152615e856000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806375294130116100f9578063b06d41bc11610097578063d3c7c2c711610071578063d3c7c2c71461092c578063e687b40a14610941578063eff7cc4814610954578063f2fde38b1461095c57600080fd5b8063b06d41bc146108fb578063c92b283214610911578063d09dc3391461092457600080fd5b8063856c8247116100d3578063856c8247146107575780638da5cb5b1461076a5780639a113c361461077b578063a7d3e02f146108e857600080fd5b8063752941301461072957806376f6ae761461073c57806379ba50971461074f57600080fd5b8063546719cd11610166578063599f643111610140578063599f64311461056f5780635d86f14114610594578063704b6c02146105a75780637437ff9f146105ba57600080fd5b8063546719cd146104d8578063549e946f1461053c57806354b714681461054f57600080fd5b8063352e4bc8116101a2578063352e4bc81461046e57806338724a95146104835780633a87ac53146104a45780634120fccd146104b757600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a7714610425575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103719190614943565b60405180910390f35b6103f16103883660046149e4565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600e825292829020825193840183525461ffff8116845263ffffffff62010000820481169285019290925266010000000000009004169082015290565b60408051825161ffff16815260208084015163ffffffff908116918301919091529282015190921690820152606001610371565b6104616040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614a6f565b61048161047c366004614c0e565b61096f565b005b610496610491366004614d44565b6109d8565b604051908152602001610371565b6104816104b2366004614e15565b610e38565b6104bf610e4e565b60405167ffffffffffffffff9091168152602001610371565b6104e0610e82565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61048161054a366004614e79565b610f32565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b61057c6105a23660046149e4565b6110e7565b6104816105b53660046149e4565b611146565b61071c6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614f8d565b610481610737366004614fae565b611210565b61048161074a36600461509b565b611276565b61048161132e565b6104bf6107653660046149e4565b611411565b6000546001600160a01b031661057c565b61087e6107893660046149e4565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b03166000908152600d6020908152604091829020825160c081018452905463ffffffff808216835264010000000082048116938301939093526801000000000000000081049092169281019290925267ffffffffffffffff6c0100000000000000000000000082048116606084015274010000000000000000000000000000000000000000820416608083015260ff7c010000000000000000000000000000000000000000000000000000000090910416151560a082015290565b6040516103719190600060c08201905063ffffffff80845116835280602085015116602084015280604085015116604084015250606083015167ffffffffffffffff8082166060850152806080860151166080850152505060a0830151151560a083015292915050565b6104966108f6366004615110565b611519565b610903611f4b565b6040516103719291906151be565b61048161091f366004615200565b61204f565b6104966120b7565b6109346120c1565b604051610371919061526e565b61048161094f3660046152bb565b612172565b610481612183565b61048161096a3660046149e4565b61241a565b6000546001600160a01b0316331480159061099557506002546001600160a01b03163314155b156109cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d58161242b565b50565b6000806109f06109eb6080850185615383565b61265a565b9050610a1b610a026020850185615383565b8351909150610a1460408701876153e8565b905061274e565b6000600d81610a3060808701606088016149e4565b6001600160a01b031681526020808201929092526040908101600020815160c081018352905463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316918101919091526c01000000000000000000000000820467ffffffffffffffff90811660608301527401000000000000000000000000000000000000000083041660808201527c010000000000000000000000000000000000000000000000000000000090910460ff16151560a08201819052909150610b4d57610b0a60808501606086016149e4565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610b7b6080890160608a016149e4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a919061547c565b9092509050806000808080610c4260408c018c6153e8565b90501115610c7d57610c71610c5d60808c0160608d016149e4565b87610c6b60408e018e6153e8565b8b612877565b91945092509050610c99565b8651610c969063ffffffff16662386f26fc100006154de565b92505b6080870151610cb29067ffffffffffffffff16846154de565b606088015160055491945060009167ffffffffffffffff9091169063ffffffff8516907a010000000000000000000000000000000000000000000000000000900461ffff16610d0460208f018f615383565b610d0f9291506154de565b6005548c51610d3e91760100000000000000000000000000000000000000000000900463ffffffff16906154f5565b610d4891906154f5565b610d5291906154f5565b610d5c91906154de565b610d76906dffffffffffffffffffffffffffff87166154de565b60065490915060009062010000900461ffff1615610dea576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610de6818e8060200190610dcc9190615383565b90508f8060400190610dde91906153e8565b905087612b30565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610e1484886154f5565b610e1e91906154f5565b610e289190615508565b9c9b505050505050505050505050565b610e40612c02565b610e4a8282612c78565b5050565b601054600090610e7d90700100000000000000000000000000000000900467ffffffffffffffff166001615543565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e7d90612fd8565b6000546001600160a01b03163314801590610f5857506002546001600160a01b03163314155b15610f8f576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd657506001600160a01b038116155b1561100d576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061101761308a565b121561104f576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e4a9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d69190615564565b6001600160a01b038516919061314a565b60006110f4600a836131ca565b611135576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b611140600a836131df565b92915050565b6000546001600160a01b0316331480159061116c57506002546001600160a01b03163314155b156111a3576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061123657506002546001600160a01b03163314155b1561126d576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d5816131f4565b6000546001600160a01b0316331480159061129c57506002546001600160a01b03163314155b156112d3576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4a8282808060200260200160405190810160405280939291908181526020016000905b82821015611324576113156040830286013681900381019061557d565b815260200190600101906112f8565b5050505050613321565b6001546001600160a01b031633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b44565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561146a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611140576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906155bc565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d91906155d9565b156115d4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611614576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314611658576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116628480615383565b90506020146116a9576116758480615383565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610b4492919061563f565b60006116b58580615383565b8101906116c29190615653565b90506001600160a01b038111806116d95750600a81105b156116e8576116758580615383565b60006116fa6109eb6080880188615383565b51905061171d61170d6020880188615383565b905082610a1460408a018a6153e8565b61179961172d60408801886153e8565b808060200260200160405190810160405280939291908181526020016000905b828210156117795761176a6040830286013681900381019061566c565b8152602001906001019061174d565b505060065464010000000090046001600160a01b03169250613594915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166117d360808801606089016149e4565b6001600160a01b03160361183757601080548691906000906118049084906bffffffffffffffffffffffff166156a6565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061195e565b60065464010000000090046001600160a01b03166241e5be61185f6080890160608a016149e4565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156118eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190f9190615564565b6010805460009061192f9084906bffffffffffffffffffffffff166156a6565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156119cb576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600f602052604090205467ffffffffffffffff16158015611a2357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611b1b576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb91906155bc565b6001600160a01b0385166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001866001600160a01b03168152602001846001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611b98906156cb565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301869052600060408085018290526001600160a01b038b168252600f90925290812080546060909401939092611bf791166156cb565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611c2c60808a0160608b016149e4565b6001600160a01b03168152602001878152602001888060200190611c509190615383565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611c9760408a018a6153e8565b808060200260200160405190810160405280939291908181526020016000905b82821015611ce357611cd46040830286013681900381019061566c565b81526020019060010190611cb7565b5050509183525050602001611cfb60408a018a6153e8565b905067ffffffffffffffff811115611d1557611d15614a82565b604051908082528060200260200182016040528015611d4857816020015b6060815260200190600190039081611d335790505b508152600060209091018190529091505b611d6660408901896153e8565b9050811015611ed3576000611d7e60408a018a6153e8565b83818110611d8e57611d8e6156f2565b905060400201803603810190611da4919061566c565b9050611db381600001516110e7565b6001600160a01b0316639687544588611dcc8c80615383565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611e3a959493927f000000000000000000000000000000000000000000000000000000000000000091600401615721565b6000604051808303816000875af1158015611e59573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e9f9190810190615779565b8361016001518381518110611eb657611eb66156f2565b60200260200101819052505080611ecc9061582b565b9050611d59565b50611efe817f000000000000000000000000000000000000000000000000000000000000000061374f565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611f349083906158fc565b60405180910390a161018001519695505050505050565b6060600080611f5a60076138e1565b90508067ffffffffffffffff811115611f7557611f75614a82565b604051908082528060200260200182016040528015611fba57816020015b6040805180820190915260008082526020820152815260200190600190039081611f935790505b50925060005b8181101561202c57600080611fd66007846138ec565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061200e5761200e6156f2565b60200260200101819052505050806120259061582b565b9050611fc0565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b0316331480159061207557506002546001600160a01b03163314155b156120ac576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d560038261390a565b6000610e7d61308a565b606060006120cf600a613ae2565b67ffffffffffffffff8111156120e7576120e7614a82565b604051908082528060200260200182016040528015612110578160200160208202803683370190505b50905060005b815181101561216c5761212a600a82613aed565b5082828151811061213d5761213d6156f2565b60200260200101816001600160a01b03166001600160a01b031681525050806121659061582b565b9050612116565b50919050565b61217a612c02565b6109d581613afc565b6000546001600160a01b031633148015906121a957506002546001600160a01b03163314155b80156121bd57506121bb600733613e54565b155b156121f4576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff166000819003612248576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612293576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061229d61308a565b12156122d5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006122e260076138e1565b905060005b818110156123d7576000806122fd6007846138ec565b909250905060008761231d836bffffffffffffffffffffffff8a166154de565b6123279190615508565b90506123338187615a4f565b95506123776001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff841661314a565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806123d09061582b565b90506122e7565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612422612c02565b6109d581613e69565b60005b815181101561262a57600082828151811061244b5761244b6156f2565b6020908102919091018101516040805160c080820183528385015163ffffffff9081168352838501518116838701908152606080870151831685870190815260808089015167ffffffffffffffff90811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a5296909820945185549251985191519651945115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9589167401000000000000000000000000000000000000000002959095167fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff979098166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff9285166801000000000000000002929092167fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff998516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009094169190941617919091179690961617949094179190911691909117919091179055506126238161582b565b905061242e565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516112059190615a74565b60408051602081019091526000815260008290036126b05750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152611140565b7f97a657c9000000000000000000000000000000000000000000000000000000006126db8385615b1e565b7fffffffff000000000000000000000000000000000000000000000000000000001614612734576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127418260048186615b66565b8101906115129190615b90565b6006547801000000000000000000000000000000000000000000000000900463ffffffff16808411156127b7576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b44565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16831115612819576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff16821115612871576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808084815b81811015612abb57600088888381811061289a5761289a6156f2565b9050604002018036038101906128b0919061566c565b80516001600160a01b03166000908152600e60209081526040918290208251606081018452905461ffff8116825263ffffffff620100008204811693830193909352660100000000000090048216928101929092528251929350909161291a91600a91906131ca16565b61295e5781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b805160009061ffff1615612a775760008d6001600160a01b031684600001516001600160a01b031614612a225760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa1580156129f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1b9190615bd2565b9050612a25565b508b5b82516020850151620186a09161ffff1690612a5f907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851690613f44565b612a6991906154de565b612a739190615508565b9150505b612a8181896154f5565b9750816020015187612a939190615bed565b9650816040015186612aa59190615bed565b955050505080612ab49061582b565b905061287e565b506000856020015163ffffffff16662386f26fc10000612adb91906154de565b905080851015612aee579350612b259050565b6000866040015163ffffffff16662386f26fc10000612b0d91906154de565b905080861115612b21579450612b25915050565b5050505b955095509592505050565b60008063ffffffff8316612b456080866154de565b612b51876102206154f5565b612b5b91906154f5565b612b6591906154f5565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612ba79061ffff16846154de565b612bb191906154f5565b60065490915062010000900461ffff16612bdb6dffffffffffffffffffffffffffff8916836154de565b612be591906154de565b612bf590655af3107a40006154de565b925050505b949350505050565b6000546001600160a01b03163314612c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b44565b565b60005b8251811015612dd9576000838281518110612c9857612c986156f2565b60200260200101516000015190506000848381518110612cba57612cba6156f2565b6020026020010151602001519050612cdc82600a6131ca90919063ffffffff16565b612d1d576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6001600160a01b038116612d32600a846131df565b6001600160a01b031614612d72576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d7d600a83613f81565b15612dc657604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612dd29061582b565b9050612c7b565b5060005b8151811015612fd3576000828281518110612dfa57612dfa6156f2565b60200260200101516000015190506000838381518110612e1c57612e1c6156f2565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612e5257506001600160a01b038116155b15612e89576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eeb9190615c0a565b6001600160a01b0316826001600160a01b031614612f35576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f41600a8383613f96565b15612f8e57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1612fc0565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612fcc9061582b565b9050612ddd565b505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261306682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261304a9190615c27565b85608001516fffffffffffffffffffffffffffffffff16613fac565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561311c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131409190615564565b610e7d9190615c3a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612fd3908490613fd4565b6000611512836001600160a01b0384166140d3565b6000611512836001600160a01b0384166140df565b60005b81518110156132f1576000828281518110613214576132146156f2565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e90975293909520915182549151945184166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff9590941662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092169516949094179390931791909116179055506132ea8161582b565b90506131f7565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516112059190615c5a565b8051604081111561335e576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16158015906133ac575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b156133b9576133b9612183565b60006133c560076138e1565b90505b80156134075760006133e66133de600184615c27565b6007906138ec565b5090506133f46007826140eb565b50508061340090615cc7565b90506133c8565b506000805b82811015613515576000848281518110613428576134286156f2565b6020026020010151600001519050600085838151811061344a5761344a6156f2565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061349f57506001600160a01b038216155b156134e1576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6134f160078361ffff8416614100565b5061350061ffff821685615bed565b935050508061350e9061582b565b905061340c565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906135879083908690615cfc565b60405180910390a1505050565b81516000805b82811015613741576000846001600160a01b031663d02641a08784815181106135c5576135c56156f2565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561362c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136509190615d1b565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036136d55785828151811061368b5761368b6156f2565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b6137238683815181106136ea576136ea6156f2565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613f4490919063ffffffff16565b61372d90846154f5565b9250508061373a9061582b565b905061359a565b506128716003826000614116565b60008060001b8284606001518560c00151866020015187604001518861012001518051906020012089610140015160405160200161378d9190615d4e565b604051602081830303815290604052805190602001208a61016001516040516020016137b99190615d61565b604051602081830303815290604052805190602001208b608001518c60a001516040516020016138579b9a999897969594939291909a8b5260208b019990995267ffffffffffffffff97881660408b01529590961660608901526001600160a01b0393841660808901529190921660a087015260c086019190915260e085015261010084019190915261012083015215156101408201526101600190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825260e08601516101008701516001600160a01b03909116602085015283830152815180840383018152606084019092526138c392909190608001615d74565b60405160208183030381529060405280519060200120905092915050565b600061114082614465565b60008080806138fb8686614470565b909450925050505b9250929050565b815460009061393390700100000000000000000000000000000000900463ffffffff1642615c27565b905080156139d5576001830154835461397b916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613fac565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546139fb916fffffffffffffffffffffffffffffffff908116911661449b565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906135879084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6000611140826138e1565b60008080806138fb86866138ec565b60e08101516001600160a01b0316613b40576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525082604051611205929190615da3565b6000611512836001600160a01b0384166144b1565b336001600160a01b03821603613edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b44565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613f77837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166154de565b6115129190615508565b6000611512836001600160a01b0384166144bd565b6000612bfa846001600160a01b038516846144c9565b6000613fcb85613fbc84866154de565b613fc690876154f5565b61449b565b95945050505050565b6000614029826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166144df9092919063ffffffff16565b805190915015612fd3578080602001905181019061404791906155d9565b612fd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b44565b600061151283836144b1565b600061151283836144ee565b6000611512836001600160a01b038416614578565b6000612bfa846001600160a01b03851684614595565b825474010000000000000000000000000000000000000000900460ff16158061413d575081155b1561414757505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061418d90700100000000000000000000000000000000900463ffffffff1642615c27565b9050801561424d57818311156141cf576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142099083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613fac565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142ea576001600160a01b03841661429f576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610b44565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610b44565b848310156143e35760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061432e9082615c27565b614338878a615c27565b61434291906154f5565b61434c9190615508565b90506001600160a01b038616614398576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610b44565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610b44565b6143ed8584615c27565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000611140826145b2565b6000808061447e85856145bc565b600081815260029690960160205260409095205494959350505050565b60008183106144aa5781611512565b5090919050565b600061151283836145c8565b60006115128383614578565b6000612bfa84846001600160a01b038516614595565b6060612bfa84846000856145e0565b600081815260028301602052604081205480151580614512575061451284846144b1565b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b44565b6000818152600283016020526040812081905561151283836146e1565b60008281526002840160205260408120829055612bfa84846146ed565b6000611140825490565b600061151283836146f9565b60008181526001830160205260408120541515611512565b606082471015614672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b44565b600080866001600160a01b0316858760405161468e9190615e2d565b60006040518083038185875af1925050503d80600081146146cb576040519150601f19603f3d011682016040523d82523d6000602084013e6146d0565b606091505b5091509150612bf587838387614723565b600061151283836147b6565b600061151283836148b0565b6000826000018281548110614710576147106156f2565b9060005260206000200154905092915050565b606083156147ac5782516000036147a5576001600160a01b0385163b6147a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b44565b5081612bfa565b612bfa83836148ff565b6000818152600183016020526040812054801561489f5760006147da600183615c27565b85549091506000906147ee90600190615c27565b905081811461485357600086600001828154811061480e5761480e6156f2565b9060005260206000200154905080876000018481548110614831576148316156f2565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061486457614864615e49565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611140565b6000915050611140565b5092915050565b60008181526001830160205260408120546148f757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611140565b506000611140565b81511561490f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449190614a6f565b60e0810161114082846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146109d557600080fd5b80356149df816149bf565b919050565b6000602082840312156149f657600080fd5b8135611512816149bf565b60005b83811015614a1c578181015183820152602001614a04565b50506000910152565b60008151808452614a3d816020860160208601614a01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115126020830184614a25565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614ad457614ad4614a82565b60405290565b6040805190810167ffffffffffffffff81118282101715614ad457614ad4614a82565b6040516080810167ffffffffffffffff81118282101715614ad457614ad4614a82565b604051610140810167ffffffffffffffff81118282101715614ad457614ad4614a82565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b8b57614b8b614a82565b604052919050565b600067ffffffffffffffff821115614bad57614bad614a82565b5060051b60200190565b63ffffffff811681146109d557600080fd5b80356149df81614bb7565b67ffffffffffffffff811681146109d557600080fd5b80356149df81614bd4565b80151581146109d557600080fd5b80356149df81614bf5565b60006020808385031215614c2157600080fd5b823567ffffffffffffffff811115614c3857600080fd5b8301601f81018513614c4957600080fd5b8035614c5c614c5782614b93565b614b44565b81815260e09182028301840191848201919088841115614c7b57600080fd5b938501935b83851015614d265780858a031215614c985760008081fd5b614ca0614ab1565b8535614cab816149bf565b815285870135614cba81614bb7565b81880152604086810135614ccd81614bb7565b90820152606086810135614ce081614bb7565b908201526080614cf1878201614bea565b9082015260a0614d02878201614bea565b9082015260c0614d13878201614c03565b9082015283529384019391850191614c80565b50979650505050505050565b600060a0828403121561216c57600080fd5b600060208284031215614d5657600080fd5b813567ffffffffffffffff811115614d6d57600080fd5b612bfa84828501614d32565b600082601f830112614d8a57600080fd5b81356020614d9a614c5783614b93565b82815260069290921b84018101918181019086841115614db957600080fd5b8286015b84811015614e0a5760408189031215614dd65760008081fd5b614dde614ada565b8135614de9816149bf565b815281850135614df8816149bf565b81860152835291830191604001614dbd565b509695505050505050565b60008060408385031215614e2857600080fd5b823567ffffffffffffffff80821115614e4057600080fd5b614e4c86838701614d79565b93506020850135915080821115614e6257600080fd5b50614e6f85828601614d79565b9150509250929050565b60008060408385031215614e8c57600080fd5b8235614e97816149bf565b91506020830135614ea7816149bf565b809150509250929050565b80516001600160a01b031682526020810151614ed4602084018261ffff169052565b506040810151614eec604084018263ffffffff169052565b506060810151614f02606084018261ffff169052565b506080810151614f1a608084018263ffffffff169052565b5060a0810151614f3060a084018261ffff169052565b5060c0810151614f4660c084018261ffff169052565b5060e0810151614f6160e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff811684830152612871565b61014081016111408284614eb2565b803561ffff811681146149df57600080fd5b60006020808385031215614fc157600080fd5b823567ffffffffffffffff811115614fd857600080fd5b8301601f81018513614fe957600080fd5b8035614ff7614c5782614b93565b81815260079190911b8201830190838101908783111561501657600080fd5b928401925b8284101561509057608084890312156150345760008081fd5b61503c614afd565b8435615047816149bf565b8152615054858701614f9c565b8682015260408086013561506781614bb7565b9082015260608581013561507a81614bb7565b908201528252608093909301929084019061501b565b979650505050505050565b600080602083850312156150ae57600080fd5b823567ffffffffffffffff808211156150c657600080fd5b818501915085601f8301126150da57600080fd5b8135818111156150e957600080fd5b8660208260061b85010111156150fe57600080fd5b60209290920196919550909350505050565b60008060006060848603121561512557600080fd5b833567ffffffffffffffff81111561513c57600080fd5b61514886828701614d32565b935050602084013591506040840135615160816149bf565b809150509250925092565b600081518084526020808501945080840160005b838110156151b357815180516001600160a01b0316885283015161ffff16838801526040909601959082019060010161517f565b509495945050505050565b6040815260006151d1604083018561516b565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff811681146149df57600080fd5b60006060828403121561521257600080fd5b6040516060810181811067ffffffffffffffff8211171561523557615235614a82565b604052823561524381614bf5565b8152615251602084016151e0565b6020820152615262604084016151e0565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156152af5783516001600160a01b03168352928401929184019160010161528a565b50909695505050505050565b600061014082840312156152ce57600080fd5b6152d6614b20565b6152df836149d4565b81526152ed60208401614f9c565b60208201526152fe60408401614bc9565b604082015261530f60608401614f9c565b606082015261532060808401614bc9565b608082015261533160a08401614f9c565b60a082015261534260c08401614f9c565b60c082015261535360e084016149d4565b60e0820152610100615366818501614bc9565b90820152610120615378848201614bc9565b908201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153b857600080fd5b83018035915067ffffffffffffffff8211156153d357600080fd5b60200191503681900382131561390357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261541d57600080fd5b83018035915067ffffffffffffffff82111561543857600080fd5b6020019150600681901b360382131561390357600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146149df57600080fd5b6000806040838503121561548f57600080fd5b61549883615450565b91506154a660208401615450565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611140576111406154af565b80820180821115611140576111406154af565b60008261553e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff8181168382160190808211156148a9576148a96154af565b60006020828403121561557657600080fd5b5051919050565b60006040828403121561558f57600080fd5b615597614ada565b82356155a2816149bf565b81526155b060208401614f9c565b60208201529392505050565b6000602082840312156155ce57600080fd5b815161151281614bd4565b6000602082840312156155eb57600080fd5b815161151281614bf5565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612bfa6020830184866155f6565b60006020828403121561566557600080fd5b5035919050565b60006040828403121561567e57600080fd5b615686614ada565b8235615691816149bf565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff8181168382160190808211156148a9576148a96154af565b600067ffffffffffffffff8083168181036156e8576156e86154af565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b038716815260a06020820152600061574460a0830187896155f6565b85604084015267ffffffffffffffff85166060840152828103608084015261576c8185614a25565b9998505050505050505050565b60006020828403121561578b57600080fd5b815167ffffffffffffffff808211156157a357600080fd5b818401915084601f8301126157b757600080fd5b8151818111156157c9576157c9614a82565b6157fa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b44565b915080825285602082850101111561581157600080fd5b615822816020840160208601614a01565b50949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361585c5761585c6154af565b5060010190565b600081518084526020808501945080840160005b838110156151b357815180516001600160a01b031688528301518388015260409096019590820190600101615877565b600081518084526020808501808196508360051b8101915082860160005b858110156158ef5782840389526158dd848351614a25565b988501989350908401906001016158c5565b5091979650505050505050565b6020815261591760208201835167ffffffffffffffff169052565b6000602083015161593360408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a083015161597c60c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e08301516101006159af818501836001600160a01b03169052565b840151610120848101919091528401516101a0610140808601829052919250906159dd6101c0860184614a25565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a1c8584615863565b945080880151925050610180818786030181880152615a3b85846158a7565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff8281168282160390808211156148a9576148a96154af565b602080825282518282018190526000919060409081850190868401855b828110156158ef57815180516001600160a01b031685528681015163ffffffff90811688870152868201518116878701526060808301519091169086015260808082015167ffffffffffffffff169086015260a080820151615afe8288018267ffffffffffffffff169052565b505060c09081015115159085015260e09093019290850190600101615a91565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615b5e5780818660040360031b1b83161692505b505092915050565b60008085851115615b7657600080fd5b83861115615b8357600080fd5b5050820193919092039150565b600060208284031215615ba257600080fd5b6040516020810181811067ffffffffffffffff82111715615bc557615bc5614a82565b6040529135825250919050565b600060208284031215615be457600080fd5b61151282615450565b63ffffffff8181168382160190808211156148a9576148a96154af565b600060208284031215615c1c57600080fd5b8151611512816149bf565b81810381811115611140576111406154af565b81810360008312801583831316838312821617156148a9576148a96154af565b602080825282518282018190526000919060409081850190868401855b828110156158ef57815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff90811687870152606091820151169085015260809093019290850190600101615c77565b600081615cd657615cd66154af565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612bfa604083018461516b565b600060408284031215615d2d57600080fd5b615d35614ada565b615d3e83615450565b815260208301516155b081614bb7565b6020815260006115126020830184615863565b60208152600061151260208301846158a7565b60008351615d86818460208801614a01565b835190830190615d9a818360208801614a01565b01949350505050565b6102208101615e2082856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61151260e0830184614eb2565b60008251615e3f818460208701614a01565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101806040523480156200001257600080fd5b50604051620083be380380620083be833981016040819052620000359162001e1d565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c082620007e0565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b5050505050505062002408565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062001ff2565b60405180910390a150565b60005b8151811015620007ae57600082828151811062000669576200066962002072565b6020908102919091018101516040805160c080820183528385015163ffffffff908116835283850151811683870190815260608087015183168587019081526080808901516001600160401b0390811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a529690982094518554925198519151965194511515600160e01b0260ff60e01b19958916600160a01b0295909516600160a01b600160e81b0319979098166c0100000000000000000000000002600160601b600160a01b0319928516680100000000000000000292909216600160401b600160a01b0319998516640100000000026001600160401b0319909416919094161791909117969096161794909417919091169190911791909117905550620007a6816200209e565b905062000648565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516200063a9190620020ba565b60005b8151811015620008b357600082828151811062000804576200080462002072565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e909752939095209151825491519451841666010000000000000263ffffffff60301b1995909416620100000265ffffffffffff19909216951694909417939093179190911617905550620008ab816200209e565b9050620007e3565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516200063a919062002172565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021e1565b60079062001025565b509050620009a860078262001043565b505080620009b690620021f7565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002072565b6020026020010151600001519050600085838151811062000a085762000a0862002072565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002211565b935050508062000a9e906200209e565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002231565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002072565b6020026020010151600001519050600084838151811062000b585762000b5862002072565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c43906200209e565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002072565b6020026020010151600001519050600083838151811062000c955762000c9562002072565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f91906200229e565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e05906200209e565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022be565b62000f5b9190620022d8565b905062000f698187620022fb565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe4906200209e565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117291906200231e565b6200117e919062002338565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200235b565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002072565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021e1565b8554909150600090620014b290600190620021e1565b90508181146200151e576000866000018281548110620014d657620014d662002072565b9060005260206000200154905080876000018481548110620014fc57620014fc62002072565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001532576200153262002379565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023b5565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023d3565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b604051608081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200183957620018396200175d565b604052919050565b6001600160a01b03811681146200185757600080fd5b50565b8051620018678162001841565b919050565b80516001600160401b03811681146200186757600080fd5b600060e082840312156200189757600080fd5b620018a162001773565b90508151620018b08162001841565b8152620018c0602083016200186c565b6020820152620018d3604083016200186c565b6040820152620018e6606083016200186c565b606082015260808201516001600160601b03811681146200190657600080fd5b60808201526200191960a083016200185a565b60a08201526200192c60c083016200185a565b60c082015292915050565b805161ffff811681146200186757600080fd5b805163ffffffff811681146200186757600080fd5b600061014082840312156200197357600080fd5b6200197d6200179e565b90506200198a826200185a565b81526200199a6020830162001937565b6020820152620019ad604083016200194a565b6040820152620019c06060830162001937565b6060820152620019d3608083016200194a565b6080820152620019e660a0830162001937565b60a0820152620019f960c0830162001937565b60c082015262001a0c60e083016200185a565b60e082015261010062001a218184016200194a565b9082015261012062001a358382016200194a565b9082015292915050565b60006001600160401b0382111562001a5b5762001a5b6200175d565b5060051b60200190565b600082601f83011262001a7757600080fd5b8151602062001a9062001a8a8362001a3f565b6200180e565b82815260069290921b8401810191818101908684111562001ab057600080fd5b8286015b8481101562001b0a576040818903121562001acf5760008081fd5b62001ad9620017c4565b815162001ae68162001841565b81528185015162001af78162001841565b8186015283529183019160400162001ab4565b509695505050505050565b805180151581146200186757600080fd5b80516001600160801b03811681146200186757600080fd5b60006060828403121562001b5157600080fd5b604051606081016001600160401b038111828210171562001b765762001b766200175d565b60405290508062001b878362001b15565b815262001b976020840162001b26565b602082015262001baa6040840162001b26565b60408201525092915050565b600082601f83011262001bc857600080fd5b8151602062001bdb62001a8a8362001a3f565b82815260e0928302850182019282820191908785111562001bfb57600080fd5b8387015b8581101562001cb05781818a03121562001c195760008081fd5b62001c2362001773565b815162001c308162001841565b815262001c3f8287016200194a565b86820152604062001c528184016200194a565b90820152606062001c658382016200194a565b90820152608062001c788382016200186c565b9082015260a062001c8b8382016200186c565b9082015260c062001c9e83820162001b15565b90820152845292840192810162001bff565b5090979650505050505050565b600082601f83011262001ccf57600080fd5b8151602062001ce262001a8a8362001a3f565b82815260079290921b8401810191818101908684111562001d0257600080fd5b8286015b8481101562001b0a576080818903121562001d215760008081fd5b62001d2b620017e9565b815162001d388162001841565b815262001d4782860162001937565b85820152604062001d5a8184016200194a565b90820152606062001d6d8382016200194a565b9082015283529183019160800162001d06565b600082601f83011262001d9257600080fd5b8151602062001da562001a8a8362001a3f565b82815260069290921b8401810191818101908684111562001dc557600080fd5b8286015b8481101562001b0a576040818903121562001de45760008081fd5b62001dee620017c4565b815162001dfb8162001841565b815262001e0a82860162001937565b8186015283529183019160400162001dc9565b6000806000806000806000610300888a03121562001e3a57600080fd5b62001e46898962001884565b965062001e578960e08a016200195f565b6102208901519096506001600160401b038082111562001e7657600080fd5b62001e848b838c0162001a65565b965062001e968b6102408c0162001b3e565b95506102a08a015191508082111562001eae57600080fd5b62001ebc8b838c0162001bb6565b94506102c08a015191508082111562001ed457600080fd5b62001ee28b838c0162001cbd565b93506102e08a015191508082111562001efa57600080fd5b5062001f098a828b0162001d80565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f3b602084018261ffff169052565b50604081015162001f54604084018263ffffffff169052565b50606081015162001f6b606084018261ffff169052565b50608081015162001f84608084018263ffffffff169052565b5060a081015162001f9b60a084018261ffff169052565b5060c081015162001fb260c084018261ffff169052565b5060e081015162001fce60e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f18565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020b357620020b362002088565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015163ffffffff9081168887015286820151811687870152606080830151909116908601526080808201516001600160401b03169086015260a08082015162002144878301826001600160401b03169052565b505060c09081015115159085015260e09093019290850190600101620020d7565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff908116878701526060918201511690850152608090930192908501906001016200218f565b818103818111156200101f576200101f62002088565b60008162002209576200220962002088565b506000190190565b63ffffffff81811683821601908082111562001579576200157962002088565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200229057845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200225c565b509098975050505050505050565b600060208284031215620022b157600080fd5b81516200105a8162001841565b80820281158282048414176200101f576200101f62002088565b600082620022f657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001579576200157962002088565b6000602082840312156200233157600080fd5b5051919050565b818103600083128015838313168383128216171562001579576200157962002088565b6000602082840312156200236e57600080fd5b6200105a8262001b15565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023ac57818101518382015260200162002392565b50506000910152565b60008251620023c98184602087016200238f565b9190910192915050565b6020815260008251806020840152620023f48160408501602087016200238f565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615eaf6200250f600039600081816103340152818161151d0152613e730152600081816103050152818161143f015281816114a701528181611a8601528181611aee0152613e4401526000818161027101528181610bc201528181611e830152613db001526000818161024101528181611bb90152613d8001526000818161021201528181610f910152818161183101528181611932015281816123b40152818161313f015281816134cc0152613d510152600081816102d1015281816119fe0152613e100152600081816102a1015281816126fb0152613de001526000611f4b0152615eaf6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806375294130116100f9578063b06d41bc11610097578063d3c7c2c711610071578063d3c7c2c71461092c578063e687b40a14610941578063eff7cc4814610954578063f2fde38b1461095c57600080fd5b8063b06d41bc146108fb578063c92b283214610911578063d09dc3391461092457600080fd5b8063856c8247116100d3578063856c8247146107575780638da5cb5b1461076a5780639a113c361461077b578063a7d3e02f146108e857600080fd5b8063752941301461072957806376f6ae761461073c57806379ba50971461074f57600080fd5b8063546719cd11610166578063599f643111610140578063599f64311461056f5780635d86f14114610594578063704b6c02146105a75780637437ff9f146105ba57600080fd5b8063546719cd146104d8578063549e946f1461053c57806354b714681461054f57600080fd5b8063352e4bc8116101a2578063352e4bc81461046e57806338724a95146104835780633a87ac53146104a45780634120fccd146104b757600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a7714610425575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b604051610371919061499c565b60405180910390f35b6103f1610388366004614a3d565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600e825292829020825193840183525461ffff8116845263ffffffff62010000820481169285019290925266010000000000009004169082015290565b60408051825161ffff16815260208084015163ffffffff908116918301919091529282015190921690820152606001610371565b6104616040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614ac8565b61048161047c366004614c67565b61096f565b005b610496610491366004614d9d565b6109d8565b604051908152602001610371565b6104816104b2366004614e6e565b610e38565b6104bf610e4e565b60405167ffffffffffffffff9091168152602001610371565b6104e0610e82565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61048161054a366004614ed2565b610f32565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b61057c6105a2366004614a3d565b6110e7565b6104816105b5366004614a3d565b611146565b61071c6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614fe6565b610481610737366004615007565b611210565b61048161074a3660046150f4565b611276565b61048161132e565b6104bf610765366004614a3d565b611411565b6000546001600160a01b031661057c565b61087e610789366004614a3d565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b03166000908152600d6020908152604091829020825160c081018452905463ffffffff808216835264010000000082048116938301939093526801000000000000000081049092169281019290925267ffffffffffffffff6c0100000000000000000000000082048116606084015274010000000000000000000000000000000000000000820416608083015260ff7c010000000000000000000000000000000000000000000000000000000090910416151560a082015290565b6040516103719190600060c08201905063ffffffff80845116835280602085015116602084015280604085015116604084015250606083015167ffffffffffffffff8082166060850152806080860151166080850152505060a0830151151560a083015292915050565b6104966108f6366004615169565b611519565b610903611fbd565b604051610371929190615217565b61048161091f366004615259565b6120c1565b610496612129565b610934612133565b60405161037191906152c7565b61048161094f366004615314565b6121e4565b6104816121f5565b61048161096a366004614a3d565b61248c565b6000546001600160a01b0316331480159061099557506002546001600160a01b03163314155b156109cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d58161249d565b50565b6000806109f06109eb60808501856153dc565b6126cc565b9050610a1b610a0260208501856153dc565b8351909150610a146040870187615441565b90506127c0565b6000600d81610a306080870160608801614a3d565b6001600160a01b031681526020808201929092526040908101600020815160c081018352905463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316918101919091526c01000000000000000000000000820467ffffffffffffffff90811660608301527401000000000000000000000000000000000000000083041660808201527c010000000000000000000000000000000000000000000000000000000090910460ff16151560a08201819052909150610b4d57610b0a6080850160608601614a3d565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610b7b6080890160608a01614a3d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a91906154d5565b9092509050806000808080610c4260408c018c615441565b90501115610c7d57610c71610c5d60808c0160608d01614a3d565b87610c6b60408e018e615441565b8b6128e9565b91945092509050610c99565b8651610c969063ffffffff16662386f26fc10000615537565b92505b6080870151610cb29067ffffffffffffffff1684615537565b606088015160055491945060009167ffffffffffffffff9091169063ffffffff8516907a010000000000000000000000000000000000000000000000000000900461ffff16610d0460208f018f6153dc565b610d0f929150615537565b6005548c51610d3e91760100000000000000000000000000000000000000000000900463ffffffff169061554e565b610d48919061554e565b610d52919061554e565b610d5c9190615537565b610d76906dffffffffffffffffffffffffffff8716615537565b60065490915060009062010000900461ffff1615610dea576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610de6818e8060200190610dcc91906153dc565b90508f8060400190610dde9190615441565b905087612ba2565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610e14848861554e565b610e1e919061554e565b610e289190615561565b9c9b505050505050505050505050565b610e40612c74565b610e4a8282612cea565b5050565b601054600090610e7d90700100000000000000000000000000000000900467ffffffffffffffff16600161559c565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e7d9061304a565b6000546001600160a01b03163314801590610f5857506002546001600160a01b03163314155b15610f8f576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd657506001600160a01b038116155b1561100d576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110176130fc565b121561104f576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e4a9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d691906155bd565b6001600160a01b03851691906131bc565b60006110f4600a8361323c565b611135576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b611140600a83613251565b92915050565b6000546001600160a01b0316331480159061116c57506002546001600160a01b03163314155b156111a3576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061123657506002546001600160a01b03163314155b1561126d576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d581613266565b6000546001600160a01b0316331480159061129c57506002546001600160a01b03163314155b156112d3576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4a8282808060200260200160405190810160405280939291908181526020016000905b8282101561132457611315604083028601368190038101906155d6565b815260200190600101906112f8565b5050505050613393565b6001546001600160a01b031633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b44565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561146a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611140576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190615615565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190615632565b156115d4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611614576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314611658576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166284806153dc565b90506020146116a95761167584806153dc565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610b44929190615698565b60006116b585806153dc565b8101906116c291906156ac565b90506001600160a01b038111806116d95750600a81105b156116e85761167585806153dc565b60006116fa6109eb60808801886153dc565b519050600061170c6040880188615441565b9150611729905061172060208901896153dc565b905083836127c0565b80156118275760005b818110156117aa576117476040890189615441565b82818110611757576117576156c5565b9050604002016020013560000361179a576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117a3816156f4565b9050611732565b506118276117bb6040890189615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611807576117f86040830286013681900381019061572c565b815260200190600101906117db565b505060065464010000000090046001600160a01b03169250613606915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166118616080890160608a01614a3d565b6001600160a01b0316036118c557601080548791906000906118929084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506119ec565b60065464010000000090046001600160a01b03166241e5be6118ed60808a0160608b01614a3d565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d91906155bd565b601080546000906119bd9084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611a59576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611ab157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611ba9576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b599190615615565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611c269061578b565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611c85911661578b565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611cba60808b0160608c01614a3d565b6001600160a01b03168152602001888152602001898060200190611cde91906153dc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611d2560408b018b615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611d7157611d626040830286013681900381019061572c565b81526020019060010190611d45565b505050505081526020018367ffffffffffffffff811115611d9457611d94614adb565b604051908082528060200260200182016040528015611dc757816020015b6060815260200190600190039081611db25790505b508152600060209091018190529091505b82811015611f44576000611def60408b018b615441565b83818110611dff57611dff6156c5565b905060400201803603810190611e15919061572c565b9050611e2481600001516110e7565b6001600160a01b0316639687544589611e3d8d806153dc565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611eab959493927f0000000000000000000000000000000000000000000000000000000000000000916004016157b2565b6000604051808303816000875af1158015611eca573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f10919081019061580a565b8361016001518381518110611f2757611f276156c5565b60200260200101819052505080611f3d906156f4565b9050611dd8565b50611f6f817f00000000000000000000000000000000000000000000000000000000000000006137c1565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611fa5908390615955565b60405180910390a16101800151979650505050505050565b6060600080611fcc600761393a565b90508067ffffffffffffffff811115611fe757611fe7614adb565b60405190808252806020026020018201604052801561202c57816020015b60408051808201909152600080825260208201528152602001906001900390816120055790505b50925060005b8181101561209e57600080612048600784613945565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110612080576120806156c5565b6020026020010181905250505080612097906156f4565b9050612032565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906120e757506002546001600160a01b03163314155b1561211e576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d5600382613963565b6000610e7d6130fc565b60606000612141600a613b3b565b67ffffffffffffffff81111561215957612159614adb565b604051908082528060200260200182016040528015612182578160200160208202803683370190505b50905060005b81518110156121de5761219c600a82613b46565b508282815181106121af576121af6156c5565b60200260200101816001600160a01b03166001600160a01b031681525050806121d7906156f4565b9050612188565b50919050565b6121ec612c74565b6109d581613b55565b6000546001600160a01b0316331480159061221b57506002546001600160a01b03163314155b801561222f575061222d600733613ead565b155b15612266576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1660008190036122ba576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612305576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061230f6130fc565b1215612347576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000612354600761393a565b905060005b818110156124495760008061236f600784613945565b909250905060008761238f836bffffffffffffffffffffffff8a16615537565b6123999190615561565b90506123a58187615aa8565b95506123e96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff84166131bc565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080612442906156f4565b9050612359565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612494612c74565b6109d581613ec2565b60005b815181101561269c5760008282815181106124bd576124bd6156c5565b6020908102919091018101516040805160c080820183528385015163ffffffff9081168352838501518116838701908152606080870151831685870190815260808089015167ffffffffffffffff90811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a5296909820945185549251985191519651945115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9589167401000000000000000000000000000000000000000002959095167fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff979098166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff9285166801000000000000000002929092167fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff998516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909416919094161791909117969096161794909417919091169190911791909117905550612695816156f4565b90506124a0565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516112059190615acd565b60408051602081019091526000815260008290036127225750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152611140565b7f97a657c90000000000000000000000000000000000000000000000000000000061274d8385615b77565b7fffffffff0000000000000000000000000000000000000000000000000000000016146127a6576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b38260048186615bbf565b8101906115129190615be9565b6006547801000000000000000000000000000000000000000000000000900463ffffffff1680841115612829576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b44565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683111561288b576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff168211156128e3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808084815b81811015612b2d57600088888381811061290c5761290c6156c5565b905060400201803603810190612922919061572c565b80516001600160a01b03166000908152600e60209081526040918290208251606081018452905461ffff8116825263ffffffff620100008204811693830193909352660100000000000090048216928101929092528251929350909161298c91600a919061323c16565b6129d05781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b805160009061ffff1615612ae95760008d6001600160a01b031684600001516001600160a01b031614612a945760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8d9190615c2b565b9050612a97565b508b5b82516020850151620186a09161ffff1690612ad1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851690613f9d565b612adb9190615537565b612ae59190615561565b9150505b612af3818961554e565b9750816020015187612b059190615c46565b9650816040015186612b179190615c46565b955050505080612b26906156f4565b90506128f0565b506000856020015163ffffffff16662386f26fc10000612b4d9190615537565b905080851015612b60579350612b979050565b6000866040015163ffffffff16662386f26fc10000612b7f9190615537565b905080861115612b93579450612b97915050565b5050505b955095509592505050565b60008063ffffffff8316612bb7608086615537565b612bc38761022061554e565b612bcd919061554e565b612bd7919061554e565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612c199061ffff1684615537565b612c23919061554e565b60065490915062010000900461ffff16612c4d6dffffffffffffffffffffffffffff891683615537565b612c579190615537565b612c6790655af3107a4000615537565b925050505b949350505050565b6000546001600160a01b03163314612ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b44565b565b60005b8251811015612e4b576000838281518110612d0a57612d0a6156c5565b60200260200101516000015190506000848381518110612d2c57612d2c6156c5565b6020026020010151602001519050612d4e82600a61323c90919063ffffffff16565b612d8f576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6001600160a01b038116612da4600a84613251565b6001600160a01b031614612de4576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612def600a83613fda565b15612e3857604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612e44906156f4565b9050612ced565b5060005b8151811015613045576000828281518110612e6c57612e6c6156c5565b60200260200101516000015190506000838381518110612e8e57612e8e6156c5565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612ec457506001600160a01b038116155b15612efb576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5d9190615c63565b6001600160a01b0316826001600160a01b031614612fa7576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fb3600a8383613fef565b1561300057604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1613032565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508061303e906156f4565b9050612e4f565b505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526130d882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426130bc9190615c80565b85608001516fffffffffffffffffffffffffffffffff16614005565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561318e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b291906155bd565b610e7d9190615c93565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261304590849061402d565b6000611512836001600160a01b03841661412c565b6000611512836001600160a01b038416614138565b60005b8151811015613363576000828281518110613286576132866156c5565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e90975293909520915182549151945184166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff9590941662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921695169490941793909317919091161790555061335c816156f4565b9050613269565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516112059190615cb3565b805160408111156133d0576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159061341e575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b1561342b5761342b6121f5565b6000613437600761393a565b90505b8015613479576000613458613450600184615c80565b600790613945565b509050613466600782614144565b50508061347290615d20565b905061343a565b506000805b8281101561358757600084828151811061349a5761349a6156c5565b602002602001015160000151905060008583815181106134bc576134bc6156c5565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061351157506001600160a01b038216155b15613553576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b61356360078361ffff8416614159565b5061357261ffff821685615c46565b9350505080613580906156f4565b905061347e565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906135f99083908690615d55565b60405180910390a1505050565b81516000805b828110156137b3576000846001600160a01b031663d02641a0878481518110613637576136376156c5565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190615d74565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613747578582815181106136fd576136fd6156c5565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b61379586838151811061375c5761375c6156c5565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613f9d90919063ffffffff16565b61379f908461554e565b925050806137ac906156f4565b905061360c565b506128e3600382600061416f565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016138579897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016138909190615da7565b604051602081830303815290604052805190602001208761016001516040516020016138bc9190615dba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b6000611140826144be565b600080808061395486866144c9565b909450925050505b9250929050565b815460009061398c90700100000000000000000000000000000000900463ffffffff1642615c80565b90508015613a2e57600183015483546139d4916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416614005565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613a54916fffffffffffffffffffffffffffffffff90811691166144f4565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906135f99084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60006111408261393a565b60008080806139548686613945565b60e08101516001600160a01b0316613b99576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525082604051611205929190615dcd565b6000611512836001600160a01b03841661450a565b336001600160a01b03821603613f34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b44565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613fd0837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615537565b6115129190615561565b6000611512836001600160a01b038416614516565b6000612c6c846001600160a01b03851684614522565b6000614024856140158486615537565b61401f908761554e565b6144f4565b95945050505050565b6000614082826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145389092919063ffffffff16565b80519091501561304557808060200190518101906140a09190615632565b613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b44565b6000611512838361450a565b60006115128383614547565b6000611512836001600160a01b0384166145d1565b6000612c6c846001600160a01b038516846145ee565b825474010000000000000000000000000000000000000000900460ff161580614196575081155b156141a057505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906141e690700100000000000000000000000000000000900463ffffffff1642615c80565b905080156142a65781831115614228576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142629083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16614005565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015614343576001600160a01b0384166142f8576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610b44565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610b44565b8483101561443c5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906143879082615c80565b614391878a615c80565b61439b919061554e565b6143a59190615561565b90506001600160a01b0386166143f1576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610b44565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610b44565b6144468584615c80565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60006111408261460b565b600080806144d78585614615565b600081815260029690960160205260409095205494959350505050565b60008183106145035781611512565b5090919050565b60006115128383614621565b600061151283836145d1565b6000612c6c84846001600160a01b0385166145ee565b6060612c6c8484600085614639565b60008181526002830160205260408120548015158061456b575061456b848461450a565b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b44565b60008181526002830160205260408120819055611512838361473a565b60008281526002840160205260408120829055612c6c8484614746565b6000611140825490565b60006115128383614752565b60008181526001830160205260408120541515611512565b6060824710156146cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b44565b600080866001600160a01b031685876040516146e79190615e57565b60006040518083038185875af1925050503d8060008114614724576040519150601f19603f3d011682016040523d82523d6000602084013e614729565b606091505b5091509150612c678783838761477c565b6000611512838361480f565b60006115128383614909565b6000826000018281548110614769576147696156c5565b9060005260206000200154905092915050565b606083156148055782516000036147fe576001600160a01b0385163b6147fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b44565b5081612c6c565b612c6c8383614958565b600081815260018301602052604081205480156148f8576000614833600183615c80565b855490915060009061484790600190615c80565b90508181146148ac576000866000018281548110614867576148676156c5565b906000526020600020015490508087600001848154811061488a5761488a6156c5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806148bd576148bd615e73565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611140565b6000915050611140565b5092915050565b600081815260018301602052604081205461495057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611140565b506000611140565b8151156149685781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449190614ac8565b60e0810161114082846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146109d557600080fd5b8035614a3881614a18565b919050565b600060208284031215614a4f57600080fd5b813561151281614a18565b60005b83811015614a75578181015183820152602001614a5d565b50506000910152565b60008151808452614a96816020860160208601614a5a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115126020830184614a7e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b60405290565b6040805190810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b6040516080810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051610140810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614be457614be4614adb565b604052919050565b600067ffffffffffffffff821115614c0657614c06614adb565b5060051b60200190565b63ffffffff811681146109d557600080fd5b8035614a3881614c10565b67ffffffffffffffff811681146109d557600080fd5b8035614a3881614c2d565b80151581146109d557600080fd5b8035614a3881614c4e565b60006020808385031215614c7a57600080fd5b823567ffffffffffffffff811115614c9157600080fd5b8301601f81018513614ca257600080fd5b8035614cb5614cb082614bec565b614b9d565b81815260e09182028301840191848201919088841115614cd457600080fd5b938501935b83851015614d7f5780858a031215614cf15760008081fd5b614cf9614b0a565b8535614d0481614a18565b815285870135614d1381614c10565b81880152604086810135614d2681614c10565b90820152606086810135614d3981614c10565b908201526080614d4a878201614c43565b9082015260a0614d5b878201614c43565b9082015260c0614d6c878201614c5c565b9082015283529384019391850191614cd9565b50979650505050505050565b600060a082840312156121de57600080fd5b600060208284031215614daf57600080fd5b813567ffffffffffffffff811115614dc657600080fd5b612c6c84828501614d8b565b600082601f830112614de357600080fd5b81356020614df3614cb083614bec565b82815260069290921b84018101918181019086841115614e1257600080fd5b8286015b84811015614e635760408189031215614e2f5760008081fd5b614e37614b33565b8135614e4281614a18565b815281850135614e5181614a18565b81860152835291830191604001614e16565b509695505050505050565b60008060408385031215614e8157600080fd5b823567ffffffffffffffff80821115614e9957600080fd5b614ea586838701614dd2565b93506020850135915080821115614ebb57600080fd5b50614ec885828601614dd2565b9150509250929050565b60008060408385031215614ee557600080fd5b8235614ef081614a18565b91506020830135614f0081614a18565b809150509250929050565b80516001600160a01b031682526020810151614f2d602084018261ffff169052565b506040810151614f45604084018263ffffffff169052565b506060810151614f5b606084018261ffff169052565b506080810151614f73608084018263ffffffff169052565b5060a0810151614f8960a084018261ffff169052565b5060c0810151614f9f60c084018261ffff169052565b5060e0810151614fba60e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff8116848301526128e3565b61014081016111408284614f0b565b803561ffff81168114614a3857600080fd5b6000602080838503121561501a57600080fd5b823567ffffffffffffffff81111561503157600080fd5b8301601f8101851361504257600080fd5b8035615050614cb082614bec565b81815260079190911b8201830190838101908783111561506f57600080fd5b928401925b828410156150e9576080848903121561508d5760008081fd5b615095614b56565b84356150a081614a18565b81526150ad858701614ff5565b868201526040808601356150c081614c10565b908201526060858101356150d381614c10565b9082015282526080939093019290840190615074565b979650505050505050565b6000806020838503121561510757600080fd5b823567ffffffffffffffff8082111561511f57600080fd5b818501915085601f83011261513357600080fd5b81358181111561514257600080fd5b8660208260061b850101111561515757600080fd5b60209290920196919550909350505050565b60008060006060848603121561517e57600080fd5b833567ffffffffffffffff81111561519557600080fd5b6151a186828701614d8b565b9350506020840135915060408401356151b981614a18565b809150509250925092565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015161ffff1683880152604090960195908201906001016151d8565b509495945050505050565b60408152600061522a60408301856151c4565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614a3857600080fd5b60006060828403121561526b57600080fd5b6040516060810181811067ffffffffffffffff8211171561528e5761528e614adb565b604052823561529c81614c4e565b81526152aa60208401615239565b60208201526152bb60408401615239565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156153085783516001600160a01b0316835292840192918401916001016152e3565b50909695505050505050565b6000610140828403121561532757600080fd5b61532f614b79565b61533883614a2d565b815261534660208401614ff5565b602082015261535760408401614c22565b604082015261536860608401614ff5565b606082015261537960808401614c22565b608082015261538a60a08401614ff5565b60a082015261539b60c08401614ff5565b60c08201526153ac60e08401614a2d565b60e08201526101006153bf818501614c22565b908201526101206153d1848201614c22565b908201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261541157600080fd5b83018035915067ffffffffffffffff82111561542c57600080fd5b60200191503681900382131561395c57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261547657600080fd5b83018035915067ffffffffffffffff82111561549157600080fd5b6020019150600681901b360382131561395c57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614a3857600080fd5b600080604083850312156154e857600080fd5b6154f1836154a9565b91506154ff602084016154a9565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761114057611140615508565b8082018082111561114057611140615508565b600082615597577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561490257614902615508565b6000602082840312156155cf57600080fd5b5051919050565b6000604082840312156155e857600080fd5b6155f0614b33565b82356155fb81614a18565b815261560960208401614ff5565b60208201529392505050565b60006020828403121561562757600080fd5b815161151281614c2d565b60006020828403121561564457600080fd5b815161151281614c4e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612c6c60208301848661564f565b6000602082840312156156be57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361572557615725615508565b5060010190565b60006040828403121561573e57600080fd5b615746614b33565b823561575181614a18565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561490257614902615508565b600067ffffffffffffffff8083168181036157a8576157a8615508565b6001019392505050565b6001600160a01b038716815260a0602082015260006157d560a08301878961564f565b85604084015267ffffffffffffffff8516606084015282810360808401526157fd8185614a7e565b9998505050505050505050565b60006020828403121561581c57600080fd5b815167ffffffffffffffff8082111561583457600080fd5b818401915084601f83011261584857600080fd5b81518181111561585a5761585a614adb565b61588b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b9d565b91508082528560208285010111156158a257600080fd5b6158b3816020840160208601614a5a565b50949350505050565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015183880152604090960195908201906001016158d0565b600081518084526020808501808196508360051b8101915082860160005b85811015615948578284038952615936848351614a7e565b9885019893509084019060010161591e565b5091979650505050505050565b6020815261597060208201835167ffffffffffffffff169052565b6000602083015161598c60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a08301516159d560c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615a08818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615a366101c0860184614a7e565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a7585846158bc565b945080880151925050610180818786030181880152615a948584615900565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015163ffffffff90811688870152868201518116878701526060808301519091169086015260808082015167ffffffffffffffff169086015260a080820151615b578288018267ffffffffffffffff169052565b505060c09081015115159085015260e09093019290850190600101615aea565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615bb75780818660040360031b1b83161692505b505092915050565b60008085851115615bcf57600080fd5b83861115615bdc57600080fd5b5050820193919092039150565b600060208284031215615bfb57600080fd5b6040516020810181811067ffffffffffffffff82111715615c1e57615c1e614adb565b6040529135825250919050565b600060208284031215615c3d57600080fd5b611512826154a9565b63ffffffff81811683821601908082111561490257614902615508565b600060208284031215615c7557600080fd5b815161151281614a18565b8181038181111561114057611140615508565b818103600083128015838313168383128216171561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff90811687870152606091820151169085015260809093019290850190600101615cd0565b600081615d2f57615d2f615508565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612c6c60408301846151c4565b600060408284031215615d8657600080fd5b615d8e614b33565b615d97836154a9565b8152602083015161560981614c10565b60208152600061151260208301846158bc565b6020815260006115126020830184615900565b6102208101615e4a82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61151260e0830184614f0b565b60008251615e69818460208701614a5a565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOnRampABI = EVM2EVMOnRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index eb4c73fe92..3397089b9e 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -5,9 +5,9 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.19/BurnMintTokenPool.abi ../. commit_store: ../../../contracts/solc/v0.8.19/CommitStore.abi ../../../contracts/solc/v0.8.19/CommitStore.bin 7d80f085f8249ef15e0850bf03698806c972125156f3476a1dafca54598f7f4d commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../../../contracts/solc/v0.8.19/CommitStoreHelper.bin 0891a1662bda54db424d12e80a56533cfd9859f7d94a3be147ad3caa46cad072 custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f -evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin 961730100a969932fc978daef9e2671b83097296fb8c6e6bea72eb02a772ea09 -evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin f1c84550cfad0faf5c92109a105a4d75260f994d21b5d681a69de681fba0d822 -evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin ef9d29e8ee6a380d64396f69e4612f1c0e1a5f5a1fc6abb5f9b7a545d254eab5 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin 8a0bd8a428ae8d071d326a2d4e1f7a2d35da08fef7307b6e1f15e108eb23770e +evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin 9e06fb409bcc9b1728c1a327d404640796c2834e7798728224b8ad4e5745c4a7 +evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 1c21fbc9b49521a9a783c40b0674297bfcb18a64100dae10173682e38ea199fc lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 7f7a28f55f9fb63669cd8038a7f99e31431acd6d15ddeeb6a77188eb0bf85d58 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 mock_arm_contract: ../../../contracts/solc/v0.8.19/MockARM.abi ../../../contracts/solc/v0.8.19/MockARM.bin efcf4cb260a2b6a6e189639f62bb50ab650a135715c1fcd42c92dfa9d04aa0e3 diff --git a/core/scripts/ccip/manual-execution/helpers/contractmodels.go b/core/scripts/ccip/manual-execution/helpers/contractmodels.go index 136845a470..4d7419e224 100644 --- a/core/scripts/ccip/manual-execution/helpers/contractmodels.go +++ b/core/scripts/ccip/manual-execution/helpers/contractmodels.go @@ -36,16 +36,17 @@ type ICommitStoreInterval struct { type InternalEVM2EVMMessage struct { SourceChainSelector uint64 - SequenceNumber uint64 - FeeTokenAmount *big.Int Sender common.Address - Nonce uint64 + Receiver common.Address + SequenceNumber uint64 GasLimit *big.Int Strict bool - Receiver common.Address + Nonce uint64 + FeeToken common.Address + FeeTokenAmount *big.Int Data []byte TokenAmounts []ClientEVMTokenAmount - FeeToken common.Address + SourceTokenData [][]byte MessageId [32]byte } diff --git a/core/scripts/ccip/manual-execution/helpers/execReport.go b/core/scripts/ccip/manual-execution/helpers/execReport.go index 3289d5be1c..b0cfd81cf8 100644 --- a/core/scripts/ccip/manual-execution/helpers/execReport.go +++ b/core/scripts/ccip/manual-execution/helpers/execReport.go @@ -83,37 +83,60 @@ func (t *LeafHasher) HashLeaf(log types.Log) ([32]byte, error) { return [32]byte{}, err } - packedValues, err := ABIEncode( + bytesArray, err := abi.NewType("bytes[]", "bytes[]", nil) + if err != nil { + return [32]byte{}, err + } + + encodedSourceTokenData, err := abi.Arguments{abi.Argument{Type: bytesArray}}.PackValues([]interface{}{event.Message.SourceTokenData}) + if err != nil { + return [32]byte{}, err + } + + packedFixedSizeValues, err := ABIEncode( `[ -{"name": "leafDomainSeparator","type":"bytes1"}, -{"name": "metadataHash", "type":"bytes32"}, -{"name": "sequenceNumber", "type":"uint64"}, -{"name": "nonce", "type":"uint64"}, {"name": "sender", "type":"address"}, {"name": "receiver", "type":"address"}, -{"name": "dataHash", "type":"bytes32"}, -{"name": "tokenAmountsHash", "type":"bytes32"}, +{"name": "sequenceNumber", "type":"uint64"}, {"name": "gasLimit", "type":"uint256"}, {"name": "strict", "type":"bool"}, +{"name": "nonce", "type":"uint64"}, {"name": "feeToken","type": "address"}, {"name": "feeTokenAmount","type": "uint256"} ]`, - LeafDomainSeparator, - t.metaDataHash, - event.Message.SequenceNumber, - event.Message.Nonce, event.Message.Sender, event.Message.Receiver, - t.ctx.Hash(event.Message.Data), - t.ctx.Hash(encodedTokens), + event.Message.SequenceNumber, event.Message.GasLimit, event.Message.Strict, + event.Message.Nonce, event.Message.FeeToken, event.Message.FeeTokenAmount, ) if err != nil { return [32]byte{}, err } + fixedSizeValuesHash := t.ctx.Hash(packedFixedSizeValues) + + packedValues, err := ABIEncode( + `[ +{"name": "leafDomainSeparator","type":"bytes1"}, +{"name": "metadataHash", "type":"bytes32"}, +{"name": "fixedSizeValuesHash", "type":"bytes32"}, +{"name": "dataHash", "type":"bytes32"}, +{"name": "tokenAmountsHash", "type":"bytes32"}, +{"name": "sourceTokenDataHash", "type":"bytes32"} +]`, + LeafDomainSeparator, + t.metaDataHash, + fixedSizeValuesHash, + t.ctx.Hash(event.Message.Data), + t.ctx.Hash(encodedTokens), + t.ctx.Hash(encodedSourceTokenData), + ) + if err != nil { + return [32]byte{}, err + } return t.ctx.Hash(packedValues), nil } @@ -127,7 +150,7 @@ func NewLeafHasher(sourceChainId uint64, destChainId uint64, onRampId common.Add geABI, _ := abi.JSON(strings.NewReader(OnRampABI)) return &LeafHasher{ geABI: geABI, - metaDataHash: getMetaDataHash(ctx, ctx.Hash([]byte("EVM2EVMMessageEvent")), sourceChainId, onRampId, destChainId), + metaDataHash: getMetaDataHash(ctx, ctx.Hash([]byte("EVM2EVMMessageHashV2")), sourceChainId, onRampId, destChainId), ctx: ctx, } } diff --git a/core/services/ocr2/plugins/ccip/commit_reporting_plugin.go b/core/services/ocr2/plugins/ccip/commit_reporting_plugin.go index a975ea1b07..4095658956 100644 --- a/core/services/ocr2/plugins/ccip/commit_reporting_plugin.go +++ b/core/services/ocr2/plugins/ccip/commit_reporting_plugin.go @@ -3,6 +3,7 @@ package ccip import ( "bytes" "context" + "encoding/hex" "fmt" "math/big" "sort" @@ -518,7 +519,7 @@ func (r *CommitReportingPlugin) Report(ctx context.Context, epochAndRound types. return false, nil, err } lggr.Infow("Report", - "merkleRoot", report.MerkleRoot, + "merkleRoot", hex.EncodeToString(report.MerkleRoot[:]), "minSeqNr", report.Interval.Min, "maxSeqNr", report.Interval.Max, "tokenPriceUpdates", report.PriceUpdates.TokenPriceUpdates, diff --git a/core/services/ocr2/plugins/ccip/execution_plugin.go b/core/services/ocr2/plugins/ccip/execution_plugin.go index e6010460b6..2bf971a463 100644 --- a/core/services/ocr2/plugins/ccip/execution_plugin.go +++ b/core/services/ocr2/plugins/ccip/execution_plugin.go @@ -198,6 +198,7 @@ func getTokenDataProviders(lggr logger.Logger, pluginConfig ccipconfig.Execution tokenDataProviders[pluginConfig.USDCConfig.SourceTokenAddress] = tokendata.NewCachedReader( usdc.NewUSDCTokenDataReader( + lggr, sourceChainEventClient, pluginConfig.USDCConfig.SourceTokenAddress, pluginConfig.USDCConfig.SourceMessageTransmitterAddress, diff --git a/core/services/ocr2/plugins/ccip/execution_reporting_plugin.go b/core/services/ocr2/plugins/ccip/execution_reporting_plugin.go index 15ee386d1d..1752a0ebb7 100644 --- a/core/services/ocr2/plugins/ccip/execution_reporting_plugin.go +++ b/core/services/ocr2/plugins/ccip/execution_reporting_plugin.go @@ -652,12 +652,13 @@ func getTokenData(ctx context.Context, lggr logger.Logger, msg internal.EVM2EVMO tknData, err2 := offchainTokenDataProvider.ReadTokenData(ctx, msg) if err2 != nil { if errors.Is(err2, tokendata.ErrNotReady) { - lggr.Infof("Token data not ready yet for token %s", token.Token.Hex()) + lggr.Infow("Token data not ready yet", "token", token.Token.Hex()) return [][]byte{}, false, nil } return [][]byte{}, false, err2 } + lggr.Infow("Token data retrieved", "token", token.Token.Hex()) tokenData = append(tokenData, tknData) } return tokenData, true, nil diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller.go index 8a14dc450f..e7d16c7d8a 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller.go @@ -8,6 +8,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" "github.com/pkg/errors" @@ -230,6 +231,7 @@ func (c *LogPollerReader) GetLastUSDCMessagePriorToLogIndexInTx(ctx context.Cont for i := range logs { current := logs[len(logs)-i-1] if current.LogIndex < logIndex { + c.lggr.Infow("Found USDC message", "logIndex", current.LogIndex, "txHash", current.TxHash.Hex(), "data", hexutil.Encode(current.Data)) return current.Data, nil } } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller_test.go index 56f5ff1db2..48e10c87e1 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/logpoller_test.go @@ -153,7 +153,7 @@ func TestLogPollerClient_GetLastUSDCMessagePriorToLogIndexInTx(t *testing.T) { {LogIndex: ccipLogIndex + 1, Data: []byte("1")}, }, nil) - c := &LogPollerReader{lp: lp} + c := &LogPollerReader{lp: lp, lggr: logger.TestLogger(t)} usdcMessageData, err := c.GetLastUSDCMessagePriorToLogIndexInTx(context.Background(), ccipLogIndex, txHash) assert.NoError(t, err) assert.Equal(t, expectedData, usdcMessageData) diff --git a/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher.go b/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher.go index 3bcd9e9c85..ac875d7965 100644 --- a/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher.go +++ b/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher.go @@ -30,7 +30,7 @@ type LeafHasher struct { func NewLeafHasher(sourceChainSelector uint64, destChainSelector uint64, onRampId common.Address, ctx Ctx[[32]byte]) *LeafHasher { return &LeafHasher{ - metaDataHash: GetMetaDataHash(ctx, ctx.Hash([]byte("EVM2EVMMessageEvent")), sourceChainSelector, onRampId, destChainSelector), + metaDataHash: GetMetaDataHash(ctx, ctx.Hash([]byte("EVM2EVMMessageHashV2")), sourceChainSelector, onRampId, destChainSelector), ctx: ctx, } } @@ -58,38 +58,49 @@ func (t *LeafHasher) HashLeaf(log types.Log) ([32]byte, error) { return [32]byte{}, err } - packedValues, err := utils.ABIEncode( + packedFixedSizeValues, err := utils.ABIEncode( `[ -{"name": "leafDomainSeparator","type":"bytes1"}, -{"name": "metadataHash", "type":"bytes32"}, -{"name": "sequenceNumber", "type":"uint64"}, -{"name": "nonce", "type":"uint64"}, {"name": "sender", "type":"address"}, {"name": "receiver", "type":"address"}, -{"name": "dataHash", "type":"bytes32"}, -{"name": "tokenAmountsHash", "type":"bytes32"}, -{"name": "sourceTokenDataHash", "type":"bytes32"}, +{"name": "sequenceNumber", "type":"uint64"}, {"name": "gasLimit", "type":"uint256"}, {"name": "strict", "type":"bool"}, +{"name": "nonce", "type":"uint64"}, {"name": "feeToken","type": "address"}, {"name": "feeTokenAmount","type": "uint256"} ]`, - LeafDomainSeparator, - t.metaDataHash, - message.SequenceNumber, - message.Nonce, message.Sender, message.Receiver, - t.ctx.Hash(message.Data), - t.ctx.Hash(encodedTokens), - t.ctx.Hash(encodedSourceTokenData), + message.SequenceNumber, message.GasLimit, message.Strict, + message.Nonce, message.FeeToken, message.FeeTokenAmount, ) if err != nil { return [32]byte{}, err } + fixedSizeValuesHash := t.ctx.Hash(packedFixedSizeValues) + + packedValues, err := utils.ABIEncode( + `[ +{"name": "leafDomainSeparator","type":"bytes1"}, +{"name": "metadataHash", "type":"bytes32"}, +{"name": "fixedSizeValuesHash", "type":"bytes32"}, +{"name": "dataHash", "type":"bytes32"}, +{"name": "tokenAmountsHash", "type":"bytes32"}, +{"name": "sourceTokenDataHash", "type":"bytes32"} +]`, + LeafDomainSeparator, + t.metaDataHash, + fixedSizeValuesHash, + t.ctx.Hash(message.Data), + t.ctx.Hash(encodedTokens), + t.ctx.Hash(encodedSourceTokenData), + ) + if err != nil { + return [32]byte{}, err + } return t.ctx.Hash(packedValues), nil } diff --git a/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher_test.go b/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher_test.go index fd35c14bfc..e2e0978f74 100644 --- a/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher_test.go +++ b/core/services/ocr2/plugins/ccip/internal/hashlib/leaf_hasher_test.go @@ -43,7 +43,7 @@ func TestHasher(t *testing.T) { require.NoError(t, err) // NOTE: Must match spec - require.Equal(t, "e0f22328cc83d50c2861629eaabcad5b39e8d30ba163228ff3574a0a229f5c9f", hex.EncodeToString(hash[:])) + require.Equal(t, "46ad031bfb052db2e4a2514fed8dc480b98e5ce4acb55d5640d91407e0d8a3e9", hex.EncodeToString(hash[:])) message = evm_2_evm_onramp.InternalEVM2EVMMessage{ SourceChainSelector: sourceChainSelector, @@ -70,7 +70,7 @@ func TestHasher(t *testing.T) { require.NoError(t, err) // NOTE: Must match spec - require.Equal(t, "7de96e00e1cf9753877faf459a68e9ee4fd901e50c2a3cd524586bf0cb3accf5", hex.EncodeToString(hash[:])) + require.Equal(t, "4362a13a42e52ff5ce4324e7184dc7aa41704c3146bc842d35d95b94b32a78b6", hex.EncodeToString(hash[:])) } func TestMetaDataHash(t *testing.T) { diff --git a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc.go b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc.go index 3b1f1b6177..18e2479ca0 100644 --- a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc.go +++ b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc.go @@ -8,12 +8,15 @@ import ( "io" "net/http" "net/url" + "strings" "sync" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/pkg/errors" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" @@ -21,7 +24,63 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/utils" ) +const ( + apiVersion = "v1" + attestationPath = "attestations" + MESSAGE_SENT_FILTER_NAME = "USDC message sent" +) + +type attestationStatus string + +const ( + attestationStatusSuccess attestationStatus = "complete" + attestationStatusPending attestationStatus = "pending_confirmations" +) + +// usdcPayload has to match the onchain event emitted by the USDC message transmitter +type usdcPayload []byte + +func (d usdcPayload) AbiString() string { + return `[{"type": "bytes"}]` +} + +func (d usdcPayload) Validate() error { + if len(d) == 0 { + return errors.New("must be non-empty") + } + return nil +} + +// messageAndAttestation has to match the onchain struct `MessageAndAttestation` in the +// USDC token pool. +type messageAndAttestation struct { + Message []byte + Attestation []byte +} + +func (m messageAndAttestation) AbiString() string { + return ` + [{ + "components": [ + {"name": "message", "type": "bytes"}, + {"name": "attestation", "type": "bytes"} + ], + "type": "tuple" + }]` +} + +func (m messageAndAttestation) Validate() error { + if len(m.Message) == 0 { + return errors.New("message must be non-empty") + } + if len(m.Attestation) == 0 { + return errors.New("attestation must be non-empty") + } + return nil +} + type TokenDataReader struct { + lggr logger.Logger sourceChainEvents ccipdata.Reader attestationApi *url.URL messageTransmitter common.Address @@ -29,7 +88,7 @@ type TokenDataReader struct { onRampAddress common.Address // Cache of sequence number -> usdc message body - usdcMessageHashCache map[uint64][32]byte + usdcMessageHashCache map[uint64][]byte usdcMessageHashCacheMutex sync.Mutex } @@ -38,63 +97,62 @@ type attestationResponse struct { Attestation string `json:"attestation"` } -const ( - version = "v1" - attestationPath = "attestations" - MESSAGE_SENT_FILTER_NAME = "USDC message sent" -) - -type attestationStatus string - -const ( - attestationStatusSuccess attestationStatus = "complete" - attestationStatusPending attestationStatus = "pending_confirmations" -) - var _ tokendata.Reader = &TokenDataReader{} -func NewUSDCTokenDataReader(sourceChainEvents ccipdata.Reader, usdcTokenAddress, usdcMessageTransmitterAddress, onRampAddress common.Address, usdcAttestationApi *url.URL) *TokenDataReader { +func NewUSDCTokenDataReader(lggr logger.Logger, sourceChainEvents ccipdata.Reader, usdcTokenAddress, usdcMessageTransmitterAddress, onRampAddress common.Address, usdcAttestationApi *url.URL) *TokenDataReader { return &TokenDataReader{ + lggr: lggr.With("tokenDataProvider", "usdc"), sourceChainEvents: sourceChainEvents, attestationApi: usdcAttestationApi, messageTransmitter: usdcMessageTransmitterAddress, onRampAddress: onRampAddress, sourceToken: usdcTokenAddress, - usdcMessageHashCache: make(map[uint64][32]byte), + usdcMessageHashCache: make(map[uint64][]byte), } } -func (s *TokenDataReader) ReadTokenData(ctx context.Context, msg internal.EVM2EVMOnRampCCIPSendRequestedWithMeta) (attestation []byte, err error) { - response, err := s.getUpdatedAttestation(ctx, msg) +func (s *TokenDataReader) ReadTokenData(ctx context.Context, msg internal.EVM2EVMOnRampCCIPSendRequestedWithMeta) (messageAndAttestation []byte, err error) { + messageBody, err := s.getUSDCMessageBody(ctx, msg) if err != nil { - return []byte{}, err + return []byte{}, errors.Wrap(err, "failed getting the USDC message body") } - if response.Status == attestationStatusSuccess { - attestationBytes, err := hex.DecodeString(response.Attestation) - if err != nil { - return nil, fmt.Errorf("decode response attestation: %w", err) - } - return attestationBytes, nil + s.lggr.Infow("Calling attestation API", "messageBodyHash", hexutil.Encode(messageBody[:]), "messageID", hexutil.Encode(msg.MessageId[:])) + + // The attestation API expects the hash of the message body + attestationResp, err := s.callAttestationApi(ctx, utils.Keccak256Fixed(messageBody)) + if err != nil { + return []byte{}, errors.Wrap(err, "failed calling usdc attestation API ") } - return []byte{}, tokendata.ErrNotReady -} -func (s *TokenDataReader) getUpdatedAttestation(ctx context.Context, msg internal.EVM2EVMOnRampCCIPSendRequestedWithMeta) (attestationResponse, error) { - messageBody, err := s.getUSDCMessageBody(ctx, msg) + if attestationResp.Status != attestationStatusSuccess { + return []byte{}, tokendata.ErrNotReady + } + + // The USDC pool needs a combination of the message body and the attestation + messageAndAttestation, err = encodeMessageAndAttestation(messageBody, attestationResp.Attestation) if err != nil { - return attestationResponse{}, errors.Wrap(err, "failed getting the USDC message body") + return nil, fmt.Errorf("failed to encode messageAndAttestation : %w", err) } - response, err := s.callAttestationApi(ctx, messageBody) + return messageAndAttestation, nil +} + +// encodeMessageAndAttestation encodes the message body and attestation into a single byte array +// that is readable onchain. +func encodeMessageAndAttestation(messageBody []byte, attestation string) ([]byte, error) { + attestationBytes, err := hex.DecodeString(strings.TrimPrefix(attestation, "0x")) if err != nil { - return attestationResponse{}, errors.Wrap(err, "failed calling usdc attestation API ") + return nil, fmt.Errorf("failed to decode response attestation: %w", err) } - return response, nil + return abihelpers.EncodeAbiStruct[messageAndAttestation](messageAndAttestation{ + Message: messageBody, + Attestation: attestationBytes, + }) } -func (s *TokenDataReader) getUSDCMessageBody(ctx context.Context, msg internal.EVM2EVMOnRampCCIPSendRequestedWithMeta) ([32]byte, error) { +func (s *TokenDataReader) getUSDCMessageBody(ctx context.Context, msg internal.EVM2EVMOnRampCCIPSendRequestedWithMeta) ([]byte, error) { s.usdcMessageHashCacheMutex.Lock() defer s.usdcMessageHashCacheMutex.Unlock() @@ -104,18 +162,31 @@ func (s *TokenDataReader) getUSDCMessageBody(ctx context.Context, msg internal.E usdcMessageBody, err := s.sourceChainEvents.GetLastUSDCMessagePriorToLogIndexInTx(ctx, int64(msg.LogIndex), msg.TxHash) if err != nil { - return [32]byte{}, err + return []byte{}, err + } + + parsedMsgBody, err := decodeUSDCMessageSent(usdcMessageBody) + if err != nil { + return []byte{}, errors.Wrap(err, "failed parsing solidity struct") } - msgBodyHash := utils.Keccak256Fixed(usdcMessageBody) + s.lggr.Infow("Got USDC message body", "messageBody", hexutil.Encode(parsedMsgBody), "messageID", hexutil.Encode(msg.MessageId[:])) // Save the attempt in the cache in case the external call fails - s.usdcMessageHashCache[msg.SequenceNumber] = msgBodyHash - return msgBodyHash, nil + s.usdcMessageHashCache[msg.SequenceNumber] = parsedMsgBody + return parsedMsgBody, nil +} + +func decodeUSDCMessageSent(logData []byte) ([]byte, error) { + decodeAbiStruct, err := abihelpers.DecodeAbiStruct[usdcPayload](logData) + if err != nil { + return nil, err + } + return decodeAbiStruct, nil } func (s *TokenDataReader) callAttestationApi(ctx context.Context, usdcMessageHash [32]byte) (attestationResponse, error) { - fullAttestationUrl := fmt.Sprintf("%s/%s/%s/0x%x", s.attestationApi, version, attestationPath, usdcMessageHash) + fullAttestationUrl := fmt.Sprintf("%s/%s/%s/0x%x", s.attestationApi, apiVersion, attestationPath, usdcMessageHash) req, err := http.NewRequestWithContext(ctx, "GET", fullAttestationUrl, nil) if err != nil { return attestationResponse{}, err @@ -136,6 +207,11 @@ func (s *TokenDataReader) callAttestationApi(ctx context.Context, usdcMessageHas if err != nil { return attestationResponse{}, err } + + if response.Status == "" { + return attestationResponse{}, fmt.Errorf("invalid attestation response: %s", string(body)) + } + return response, nil } diff --git a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_blackbox_test.go b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_blackbox_test.go index 6e61be5ed3..26ba789cf1 100644 --- a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_blackbox_test.go +++ b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_blackbox_test.go @@ -7,15 +7,19 @@ import ( "net/http" "net/http/httptest" "net/url" + "strings" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata/usdc" @@ -33,21 +37,56 @@ type attestationResponse struct { Attestation string `json:"attestation"` } +type messageAndAttestation struct { + Message []byte + Attestation []byte +} + +func (m messageAndAttestation) AbiString() string { + return ` + [{ + "components": [ + {"name": "message", "type": "bytes"}, + {"name": "attestation", "type": "bytes"} + ], + "type": "tuple" + }]` +} + +func (m messageAndAttestation) Validate() error { + return nil +} + +type usdcPayload []byte + +func (d usdcPayload) AbiString() string { + return `[{"type": "bytes"}]` +} + +func (d usdcPayload) Validate() error { + return nil +} + func TestUSDCReader_ReadTokenData(t *testing.T) { response := attestationResponse{ Status: "complete", - Attestation: "720502893578a89a8a87982982ef781c18b193", + Attestation: "0x9049623e91719ef2aa63c55f357be2529b0e7122ae552c18aff8db58b4633c4d3920ff03d3a6d1ddf11f06bf64d7fd60d45447ac81f527ba628877dc5ca759651b08ffae25a6d3b1411749765244f0a1c131cbfe04430d687a2e12fd9d2e6dc08e118ad95d94ad832332cf3c4f7a4f3da0baa803b7be024b02db81951c0f0714de1b", } - - attestationBytes, err := hex.DecodeString(response.Attestation) + abiEncodedMessageBody, err := hexutil.Decode("0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f80000000000000001000000020000000000048d71000000000000000000000000eb08f243e5d3fcff26a9e38ae5520a669f4019d000000000000000000000000023a04d5935ed8bc8e3eb78db3541f0abfb001c6e0000000000000000000000006cb3ed9b441eb674b58495c8b3324b59faff5243000000000000000000000000000000005425890298aed601595a70ab815c96711a31bc65000000000000000000000000ab4f961939bfe6a93567cc57c59eed7084ce2131000000000000000000000000000000000000000000000000000000000000271000000000000000000000000035e08285cfed1ef159236728f843286c55fc08610000000000000000") require.NoError(t, err) - - responseBytes, err := json.Marshal(response) + rawMessageBody, err := abihelpers.DecodeAbiStruct[usdcPayload](abiEncodedMessageBody) require.NoError(t, err) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, err = w.Write(responseBytes) - require.NoError(t, err) + messageHash := utils.Keccak256Fixed(rawMessageBody) + expectedUrl := "/v1/attestations/0x" + hex.EncodeToString(messageHash[:]) + require.Equal(t, expectedUrl, r.URL.Path) + + responseBytes, err2 := json.Marshal(response) + require.NoError(t, err2) + + _, err2 = w.Write(responseBytes) + require.NoError(t, err2) })) defer ts.Close() @@ -78,12 +117,12 @@ func TestUSDCReader_ReadTokenData(t *testing.T) { mock.Anything, logIndex, common.Hash(txHash), - ).Return(attestationBytes, nil) + ).Return(abiEncodedMessageBody, nil) attestationURI, err := url.ParseRequestURI(ts.URL) require.NoError(t, err) - usdcService := usdc.NewUSDCTokenDataReader(&eventsClient, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) - attestation, err := usdcService.ReadTokenData(context.Background(), internal.EVM2EVMOnRampCCIPSendRequestedWithMeta{ + usdcService := usdc.NewUSDCTokenDataReader(logger.TestLogger(t), &eventsClient, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) + msgAndAttestation, err := usdcService.ReadTokenData(context.Background(), internal.EVM2EVMOnRampCCIPSendRequestedWithMeta{ InternalEVM2EVMMessage: evm_2_evm_offramp.InternalEVM2EVMMessage{ SequenceNumber: seqNum, }, @@ -92,5 +131,14 @@ func TestUSDCReader_ReadTokenData(t *testing.T) { }) require.NoError(t, err) - require.Equal(t, attestationBytes, attestation) + attestationBytes, err := hex.DecodeString(strings.TrimPrefix(response.Attestation, "0x")) + require.NoError(t, err) + + encodeAbiStruct, err := abihelpers.EncodeAbiStruct[messageAndAttestation](messageAndAttestation{ + Message: rawMessageBody, + Attestation: attestationBytes, + }) + require.NoError(t, err) + + require.Equal(t, encodeAbiStruct, msgAndAttestation) } diff --git a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_test.go b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_test.go index d61ef530d5..b383b5e228 100644 --- a/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_test.go +++ b/core/services/ocr2/plugins/ccip/tokendata/usdc/usdc_test.go @@ -9,10 +9,12 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" "github.com/smartcontractkit/chainlink/v2/core/utils" @@ -29,7 +31,7 @@ func TestUSDCReader_callAttestationApi(t *testing.T) { usdcMessageHash := "912f22a13e9ccb979b621500f6952b2afd6e75be7eadaed93fc2625fe11c52a2" attestationURI, err := url.ParseRequestURI("https://iris-api-sandbox.circle.com") require.NoError(t, err) - usdcService := NewUSDCTokenDataReader(nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) + usdcService := NewUSDCTokenDataReader(logger.TestLogger(t), nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) attestation, err := usdcService.callAttestationApi(context.Background(), [32]byte(common.FromHex(usdcMessageHash))) require.NoError(t, err) @@ -49,7 +51,7 @@ func TestUSDCReader_callAttestationApiMock(t *testing.T) { attestationURI, err := url.ParseRequestURI(ts.URL) require.NoError(t, err) - usdcService := NewUSDCTokenDataReader(nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) + usdcService := NewUSDCTokenDataReader(logger.TestLogger(t), nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) attestation, err := usdcService.callAttestationApi(context.Background(), utils.RandomBytes32()) require.NoError(t, err) @@ -65,7 +67,7 @@ func TestUSDCReader_callAttestationApiMockError(t *testing.T) { attestationURI, err := url.ParseRequestURI(ts.URL) require.NoError(t, err) - usdcService := NewUSDCTokenDataReader(nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) + usdcService := NewUSDCTokenDataReader(logger.TestLogger(t), nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, attestationURI) _, err = usdcService.callAttestationApi(context.Background(), utils.RandomBytes32()) require.Error(t, err) } @@ -82,7 +84,7 @@ func getMockUSDCEndpoint(t *testing.T, response attestationResponse) *httptest.S // Asserts the hard coded event signature matches Keccak256("MessageSent(bytes)") func TestGetUSDCReaderSourceLPFilters(t *testing.T) { - usdcService := NewUSDCTokenDataReader(nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, nil) + usdcService := NewUSDCTokenDataReader(logger.TestLogger(t), nil, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, nil) filters := usdcService.GetSourceLogPollerFilters() @@ -96,24 +98,31 @@ func TestGetUSDCReaderSourceLPFilters(t *testing.T) { } func TestGetUSDCMessageBody(t *testing.T) { - expectedBody := []byte("TestGetUSDCMessageBody") - expectedBodyHash := utils.Keccak256Fixed(expectedBody) + expectedBody, err := hexutil.Decode("0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f80000000000000001000000020000000000048d71000000000000000000000000eb08f243e5d3fcff26a9e38ae5520a669f4019d000000000000000000000000023a04d5935ed8bc8e3eb78db3541f0abfb001c6e0000000000000000000000006cb3ed9b441eb674b58495c8b3324b59faff5243000000000000000000000000000000005425890298aed601595a70ab815c96711a31bc65000000000000000000000000ab4f961939bfe6a93567cc57c59eed7084ce2131000000000000000000000000000000000000000000000000000000000000271000000000000000000000000035e08285cfed1ef159236728f843286c55fc08610000000000000000") + require.NoError(t, err) + + parsedBody, err := decodeUSDCMessageSent(expectedBody) + require.NoError(t, err) + + expectedPostParse := "0x0000000000000001000000020000000000048d71000000000000000000000000eb08f243e5d3fcff26a9e38ae5520a669f4019d000000000000000000000000023a04d5935ed8bc8e3eb78db3541f0abfb001c6e0000000000000000000000006cb3ed9b441eb674b58495c8b3324b59faff5243000000000000000000000000000000005425890298aed601595a70ab815c96711a31bc65000000000000000000000000ab4f961939bfe6a93567cc57c59eed7084ce2131000000000000000000000000000000000000000000000000000000000000271000000000000000000000000035e08285cfed1ef159236728f843286c55fc0861" + + require.Equal(t, expectedPostParse, hexutil.Encode(parsedBody)) sourceChainEventsMock := ccipdata.MockReader{} sourceChainEventsMock.On("GetLastUSDCMessagePriorToLogIndexInTx", mock.Anything, mock.Anything, mock.Anything).Return(expectedBody, nil) - usdcService := NewUSDCTokenDataReader(&sourceChainEventsMock, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, nil) + usdcService := NewUSDCTokenDataReader(logger.TestLogger(t), &sourceChainEventsMock, mockUSDCTokenAddress, mockMsgTransmitter, mockOnRampAddress, nil) // Make the first call and assert the underlying function is called body, err := usdcService.getUSDCMessageBody(context.Background(), internal.EVM2EVMOnRampCCIPSendRequestedWithMeta{}) require.NoError(t, err) - require.Equal(t, body, expectedBodyHash) + require.Equal(t, body, parsedBody) sourceChainEventsMock.AssertNumberOfCalls(t, "GetLastUSDCMessagePriorToLogIndexInTx", 1) // Make another call and assert that the cache is used body, err = usdcService.getUSDCMessageBody(context.Background(), internal.EVM2EVMOnRampCCIPSendRequestedWithMeta{}) require.NoError(t, err) - require.Equal(t, body, expectedBodyHash) + require.Equal(t, body, parsedBody) sourceChainEventsMock.AssertNumberOfCalls(t, "GetLastUSDCMessagePriorToLogIndexInTx", 1) } diff --git a/integration-tests/ccip-tests/Makefile b/integration-tests/ccip-tests/Makefile index fa7070ba40..05f5ca95e1 100644 --- a/integration-tests/ccip-tests/Makefile +++ b/integration-tests/ccip-tests/Makefile @@ -1,17 +1,19 @@ -# example usage: make test_smoke_ccip_simulated_local image=chainlink tag=latest +# example usage: make test_smoke_ccip_simulated_local image=chainlink-ccip tag=latest testname=TestSmokeCCIPForBidirectionalLane .PHONY: test_smoke_ccip_simulated_local test_smoke_ccip_simulated_local: DATABASE_URL="postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable" \ SELECTED_NETWORKS="SIMULATED,SIMULATED_1,SIMULATED_2" \ CCIP_DEPLOY_ON_LOCAL=True \ + CCIP_NETWORK_PAIRS="" \ CCIP_NO_OF_NETWORKS=2 \ + CCIP_NO_OF_LANES_PER_PAIR=1 \ CCIP_MSG_TYPE=WithToken \ CHAINLINK_IMAGE=$(image) \ CHAINLINK_VERSION=$(tag) \ CCIP_TESTS_ON_EXISTING_DEPLOYMENT=False \ ENV_JOB_IMAGE="" \ - go test -timeout 24h -count=1 -v -run ^TestSmokeCCIPForBidirectionalLane$$ ./smoke + go test -timeout 24h -count=1 -v -run ^$(testname)$$ ./smoke # example usage: make test_smoke_ccip_simulated_local_besu image=chainlink tag=latest .PHONY: test_smoke_ccip_simulated_local_besu diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go index 04cd61b55b..d4816a9e68 100644 --- a/integration-tests/ccip-tests/actions/ccip_helpers.go +++ b/integration-tests/ccip-tests/actions/ccip_helpers.go @@ -11,7 +11,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" @@ -89,65 +88,102 @@ var ( ) type CCIPCommon struct { - ChainClient blockchain.EVMClient - Deployer *contracts.CCIPContractsDeployer - FeeToken *contracts.LinkToken - BridgeTokens []*contracts.ERC20Token // as of now considering the bridge token is same as link token - TokenPrices []*big.Int - BridgeTokenPools []*contracts.LockReleaseTokenPool - RateLimiterConfig contracts.RateLimiterConfig - ARMContract *common.Address - ARM *contracts.ARM // populate only if the ARM contracts is not a mock and can be used to verify various ARM events - Router *contracts.Router - PriceRegistry *contracts.PriceRegistry - PriceUpdatesToWatchFrom uint64 - WrappedNative common.Address - ExistingDeployment bool - poolFunds *big.Int - gasUpdateWatcherMu *sync.Mutex - gasUpdateWatcher map[uint64]*big.Int // key - destchain id; value - timestamp of update - priceUpdateWatcherMu *sync.Mutex - priceUpdateWatcher map[string]*big.Int // key - token address; value - timestamp of update + ChainClient blockchain.EVMClient + Deployer *contracts.CCIPContractsDeployer + FeeToken *contracts.LinkToken + BridgeTokens []*contracts.ERC20Token // as of now considering the bridge token is same as link token + TokenPrices []*big.Int + BridgeTokenPools []*contracts.LockReleaseTokenPool + RateLimiterConfig contracts.RateLimiterConfig + ARMContract *common.Address + ARM *contracts.ARM // populate only if the ARM contracts is not a mock and can be used to verify various ARM events + Router *contracts.Router + PriceRegistry *contracts.PriceRegistry + WrappedNative common.Address + ExistingDeployment bool + poolFunds *big.Int + gasUpdateWatcherMu *sync.Mutex + gasUpdateWatcher map[uint64]*big.Int // key - destchain id; value - timestamp of update + priceUpdateSubs []event.Subscription + connectionIssues *atomic.Bool + connectionRestored *atomic.Bool +} + +func (ccipModule *CCIPCommon) ConnectionRestored() { + for { + select { + case <-ccipModule.ChainClient.ConnectionRestored(): + ccipModule.connectionRestored.Store(true) + ccipModule.connectionIssues.Store(false) + case <-ccipModule.ChainClient.ConnectionIssue(): + ccipModule.connectionIssues.Store(true) + ccipModule.connectionRestored.Store(false) + } + } } -func (ccipModule *CCIPCommon) Copy(chainClient blockchain.EVMClient, logger zerolog.Logger) (*CCIPCommon, error) { - newCD, err := contracts.NewCCIPContractsDeployer(chainClient, logger) +func (ccipModule *CCIPCommon) StopWatchingPriceUpdates() { + for _, sub := range ccipModule.priceUpdateSubs { + sub.Unsubscribe() + } +} + +func (ccipModule *CCIPCommon) Copy(logger zerolog.Logger, chainClient blockchain.EVMClient) (*CCIPCommon, error) { + newCD, err := contracts.NewCCIPContractsDeployer(logger, chainClient) if err != nil { return nil, err } var arm *contracts.ARM if ccipModule.ARM != nil { - arm = ccipModule.ARM.Copy(chainClient) + arm, err = newCD.NewARMContract(*ccipModule.ARMContract) + if err != nil { + return nil, err + } } var pools []*contracts.LockReleaseTokenPool for i := range ccipModule.BridgeTokenPools { - pools = append(pools, ccipModule.BridgeTokenPools[i].Copy(chainClient)) + pool, err := newCD.NewLockReleaseTokenPoolContract(common.HexToAddress(ccipModule.BridgeTokenPools[i].Address())) + if err != nil { + return nil, err + } + pools = append(pools, pool) } var tokens []*contracts.ERC20Token for i := range ccipModule.BridgeTokens { - tokens = append(tokens, ccipModule.BridgeTokens[i].Copy(chainClient)) + token, err := newCD.NewERC20TokenContract(common.HexToAddress(ccipModule.BridgeTokens[i].Address())) + if err != nil { + return nil, err + } + tokens = append(tokens, token) + } + newCommon := &CCIPCommon{ + ChainClient: chainClient, + Deployer: newCD, + BridgeTokens: tokens, + TokenPrices: ccipModule.TokenPrices, + BridgeTokenPools: pools, + RateLimiterConfig: ccipModule.RateLimiterConfig, + ARMContract: ccipModule.ARMContract, + ARM: arm, + WrappedNative: ccipModule.WrappedNative, + ExistingDeployment: ccipModule.ExistingDeployment, + poolFunds: ccipModule.poolFunds, + gasUpdateWatcherMu: &sync.Mutex{}, + gasUpdateWatcher: make(map[uint64]*big.Int), + } + newCommon.FeeToken, err = newCommon.Deployer.NewLinkTokenContract(common.HexToAddress(ccipModule.FeeToken.Address())) + if err != nil { + return nil, err } - return &CCIPCommon{ - ChainClient: chainClient, - Deployer: newCD, - FeeToken: ccipModule.FeeToken.Copy(chainClient), - BridgeTokens: tokens, - TokenPrices: ccipModule.TokenPrices, - BridgeTokenPools: pools, - RateLimiterConfig: ccipModule.RateLimiterConfig, - ARMContract: ccipModule.ARMContract, - ARM: arm, - Router: ccipModule.Router.Copy(chainClient), - PriceRegistry: ccipModule.PriceRegistry.Copy(chainClient), - PriceUpdatesToWatchFrom: ccipModule.PriceUpdatesToWatchFrom, - WrappedNative: ccipModule.WrappedNative, - ExistingDeployment: ccipModule.ExistingDeployment, - poolFunds: ccipModule.poolFunds, - gasUpdateWatcherMu: &sync.Mutex{}, - gasUpdateWatcher: make(map[uint64]*big.Int), - priceUpdateWatcherMu: &sync.Mutex{}, - priceUpdateWatcher: make(map[string]*big.Int), - }, nil + newCommon.PriceRegistry, err = newCommon.Deployer.NewPriceRegistry(common.HexToAddress(ccipModule.PriceRegistry.Address())) + if err != nil { + return nil, err + } + newCommon.Router, err = newCommon.Deployer.NewRouter(common.HexToAddress(ccipModule.Router.Address())) + if err != nil { + return nil, err + } + return newCommon, nil } func (ccipModule *CCIPCommon) LoadContractAddresses(conf *laneconfig.LaneConfig) { @@ -182,9 +218,6 @@ func (ccipModule *CCIPCommon) LoadContractAddresses(conf *laneconfig.LaneConfig) EthAddress: common.HexToAddress(conf.PriceRegistry), } } - if conf.PriceUpdatesToWatchFrom > 0 { - ccipModule.PriceUpdatesToWatchFrom = conf.PriceUpdatesToWatchFrom - } if common.IsHexAddress(conf.WrappedNative) { ccipModule.WrappedNative = common.HexToAddress(conf.WrappedNative) } @@ -239,10 +272,7 @@ func (ccipModule *CCIPCommon) ApproveTokens() error { } } } - err := ccipModule.ChainClient.WaitForEvents() - if err != nil { - return errors.WithStack(err) - } + return nil } @@ -274,80 +304,81 @@ func (ccipModule *CCIPCommon) WaitForPriceUpdates( timeout time.Duration, destChainId uint64, ) error { - lggr.Info().Msgf("Waiting for PriceUpdates for dest chain %d", destChainId) + destChainSelector, err := chainselectors.SelectorFromChainId(destChainId) + if err != nil { + return err + } + // check if price is already updated + price, err := ccipModule.PriceRegistry.Instance.GetDestinationChainGasPrice(nil, destChainSelector) + if err != nil { + return err + } + if price.Timestamp > 0 && price.Value.Cmp(big.NewInt(0)) > 0 { + lggr.Info(). + Str("Price Registry", ccipModule.PriceRegistry.Address()). + Uint64("dest chain", destChainId). + Str("source chain", ccipModule.ChainClient.GetNetworkName()). + Msg("Price already updated") + return nil + } + // if not, wait for price update + lggr.Info().Msgf("Waiting for UsdPerUnitGas for dest chain %d Price Registry %s", destChainId, ccipModule.PriceRegistry.Address()) ticker := time.NewTicker(time.Second) defer ticker.Stop() ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - tokens := []string{ccipModule.WrappedNative.Hex(), ccipModule.FeeToken.Address()} for { select { case <-ticker.C: ccipModule.gasUpdateWatcherMu.Lock() timestampOfUpdate, ok := ccipModule.gasUpdateWatcher[destChainId] ccipModule.gasUpdateWatcherMu.Unlock() - ccipModule.priceUpdateWatcherMu.Lock() - priceUpdates := ccipModule.priceUpdateWatcher - ccipModule.priceUpdateWatcherMu.Unlock() - receivedAllUpdates := true - for _, token := range tokens { - if _, ok := priceUpdates[token]; !ok { - receivedAllUpdates = false - break - } - } - if ok && timestampOfUpdate.Cmp(big.NewInt(0)) == 1 && receivedAllUpdates { + if ok && timestampOfUpdate.Cmp(big.NewInt(0)) == 1 { + lggr.Info(). + Str("Price Registry", ccipModule.PriceRegistry.Address()). + Uint64("dest chain", destChainId). + Str("source chain", ccipModule.ChainClient.GetNetworkName()). + Msg("Price updated") return nil } case <-ctx.Done(): - return fmt.Errorf("price update is not found for chain %d", destChainId) + return fmt.Errorf("UsdPerUnitGasUpdated is not found for chain %d", destChainId) } } } -func (ccipModule *CCIPCommon) WatchForPriceUpdates(lggr zerolog.Logger) ([]event.Subscription, error) { +func (ccipModule *CCIPCommon) WatchForPriceUpdates() error { gasUpdateEvent := make(chan *price_registry.PriceRegistryUsdPerUnitGasUpdated) - blockNum := ccipModule.PriceUpdatesToWatchFrom - var opts *bind.WatchOpts - if blockNum > 0 { - opts = &bind.WatchOpts{Start: &blockNum} - } - var subs []event.Subscription - sub, err := ccipModule.PriceRegistry.Instance.WatchUsdPerUnitGasUpdated(opts, gasUpdateEvent, nil) + sub, err := ccipModule.PriceRegistry.Instance.WatchUsdPerUnitGasUpdated(nil, gasUpdateEvent, nil) if err != nil { - return nil, err + return err } - subs = append(subs, sub) + go func() { for { - e := <-gasUpdateEvent - destChain, err := chainselectors.ChainIdFromSelector(e.DestChain) - if err != nil { - continue + select { + case e := <-gasUpdateEvent: + destChain, err := chainselectors.ChainIdFromSelector(e.DestChain) + if err != nil { + continue + } + ccipModule.gasUpdateWatcherMu.Lock() + ccipModule.gasUpdateWatcher[destChain] = e.Timestamp + ccipModule.gasUpdateWatcherMu.Unlock() + log.Info(). + Str("source_chain", ccipModule.ChainClient.GetNetworkName()). + Uint64("dest_chain", destChain). + Str("price_registry", ccipModule.PriceRegistry.Address()). + Msgf("UsdPerUnitGasUpdated event received for dest chain %d source chain %s", + destChain, ccipModule.ChainClient.GetNetworkName()) + case <-sub.Err(): + return } - lggr.Info().Msgf("priceUpdateEvent event received for dest chain %d", destChain) - ccipModule.gasUpdateWatcherMu.Lock() - ccipModule.gasUpdateWatcher[destChain] = e.Timestamp - ccipModule.gasUpdateWatcherMu.Unlock() } }() + ccipModule.priceUpdateSubs = append(ccipModule.priceUpdateSubs, sub) - priceUpdateEvent := make(chan *price_registry.PriceRegistryUsdPerTokenUpdated) - sub, err = ccipModule.PriceRegistry.Instance.WatchUsdPerTokenUpdated(opts, priceUpdateEvent, nil) - if err != nil { - return nil, err - } - subs = append(subs, sub) - go func() { - for { - e := <-priceUpdateEvent - lggr.Info().Msgf("priceUpdateEvent event received for token %s", e.Token.Hex()) - ccipModule.priceUpdateWatcherMu.Lock() - ccipModule.priceUpdateWatcher[e.Token.Hex()] = e.Timestamp - ccipModule.priceUpdateWatcherMu.Unlock() - } - }() - return subs, nil + return nil } // DeployContracts deploys the contracts which are necessary in both source and dest chain @@ -369,6 +400,13 @@ func (ccipModule *CCIPCommon) DeployContracts(noOfTokens int, // deploy a mock ARM contract if ccipModule.ARMContract == nil { ccipModule.ARMContract, err = cd.DeployMockARMContract() + if err != nil { + return fmt.Errorf("deploying mock ARM contract shouldn't fail %+v", err) + } + err = ccipModule.ChainClient.WaitForEvents() + if err != nil { + return fmt.Errorf("error in waiting for mock ARM deployment %+v", err) + } } } if ccipModule.FeeToken == nil { @@ -501,11 +539,6 @@ func (ccipModule *CCIPCommon) DeployContracts(noOfTokens int, if err != nil { return fmt.Errorf("error in waiting for PriceRegistry deployment %+v", err) } - latest, err := ccipModule.ChainClient.LatestBlockNumber(context.Background()) - if err != nil { - return fmt.Errorf("error in getting latest block number %+v", err) - } - ccipModule.PriceUpdatesToWatchFrom = latest } else { ccipModule.PriceRegistry, err = cd.NewPriceRegistry(ccipModule.PriceRegistry.EthAddress) if err != nil { @@ -517,8 +550,8 @@ func (ccipModule *CCIPCommon) DeployContracts(noOfTokens int, return nil } -func DefaultCCIPModule(chainClient blockchain.EVMClient, existingDeployment bool, logger zerolog.Logger) (*CCIPCommon, error) { - cd, err := contracts.NewCCIPContractsDeployer(chainClient, logger) +func DefaultCCIPModule(logger zerolog.Logger, chainClient blockchain.EVMClient, existingDeployment bool) (*CCIPCommon, error) { + cd, err := contracts.NewCCIPContractsDeployer(logger, chainClient) if err != nil { return nil, err } @@ -529,12 +562,10 @@ func DefaultCCIPModule(chainClient blockchain.EVMClient, existingDeployment bool Rate: contracts.HundredCoins, Capacity: contracts.HundredCoins, }, - ExistingDeployment: existingDeployment, - poolFunds: testhelpers.Link(1000), - gasUpdateWatcherMu: &sync.Mutex{}, - gasUpdateWatcher: make(map[uint64]*big.Int), - priceUpdateWatcherMu: &sync.Mutex{}, - priceUpdateWatcher: make(map[string]*big.Int), + ExistingDeployment: existingDeployment, + poolFunds: testhelpers.Link(1000), + gasUpdateWatcherMu: &sync.Mutex{}, + gasUpdateWatcher: make(map[uint64]*big.Int), }, nil } @@ -543,6 +574,7 @@ type SourceCCIPModule struct { Sender common.Address TransferAmount []*big.Int DestinationChainId uint64 + DestNetworkName string OnRamp *contracts.OnRamp SrcStartBlock uint64 CCIPSendRequestedWatcherMu *sync.Mutex @@ -553,7 +585,7 @@ type SourceCCIPModule struct { func (sourceCCIP *SourceCCIPModule) LoadContracts(conf *laneconfig.LaneConfig) { if conf != nil { - cfg, ok := conf.SrcContracts[sourceCCIP.DestinationChainId] + cfg, ok := conf.SrcContracts[sourceCCIP.DestNetworkName] if ok { if common.IsHexAddress(cfg.OnRamp) { sourceCCIP.OnRamp = &contracts.OnRamp{ @@ -906,19 +938,24 @@ func (sourceCCIP *SourceCCIPModule) SendRequest( } } - log.Info().Str("Send token transaction", sendTx.Hash().String()).Msg("Sending token") + log.Info(). + Str("Network", sourceCCIP.Common.ChainClient.GetNetworkName()). + Str("Send token transaction", sendTx.Hash().String()). + Str("lane", fmt.Sprintf("%s-->%s", sourceCCIP.Common.ChainClient.GetNetworkName(), sourceCCIP.DestNetworkName)). + Msg("Sending token") return sendTx.Hash(), time.Since(timeNow), fee, nil } -func DefaultSourceCCIPModule(chainClient blockchain.EVMClient, destChain uint64, transferAmount []*big.Int, ccipCommon *CCIPCommon, logger zerolog.Logger) (*SourceCCIPModule, error) { - cmn, err := ccipCommon.Copy(chainClient, logger) +func DefaultSourceCCIPModule(logger zerolog.Logger, chainClient blockchain.EVMClient, destChainId uint64, destChain string, transferAmount []*big.Int, ccipCommon *CCIPCommon) (*SourceCCIPModule, error) { + cmn, err := ccipCommon.Copy(logger, chainClient) if err != nil { return nil, err } return &SourceCCIPModule{ Common: cmn, TransferAmount: transferAmount, - DestinationChainId: destChain, + DestinationChainId: destChainId, + DestNetworkName: destChain, Sender: common.HexToAddress(chainClient.GetDefaultWallet().Address()), CCIPSendRequestedWatcher: make(map[string]*evm_2_evm_onramp.EVM2EVMOnRampCCIPSendRequested), CCIPSendRequestedWatcherMu: &sync.Mutex{}, @@ -928,6 +965,7 @@ func DefaultSourceCCIPModule(chainClient blockchain.EVMClient, destChain uint64, type DestCCIPModule struct { Common *CCIPCommon SourceChainId uint64 + SourceNetworkName string CommitStore *contracts.CommitStore ReceiverDapp *contracts.ReceiverDapp OffRamp *contracts.OffRamp @@ -943,7 +981,7 @@ type DestCCIPModule struct { func (destCCIP *DestCCIPModule) LoadContracts(conf *laneconfig.LaneConfig) { if conf != nil { - cfg, ok := conf.DestContracts[destCCIP.SourceChainId] + cfg, ok := conf.DestContracts[destCCIP.SourceNetworkName] if ok { if common.IsHexAddress(cfg.OffRamp) { destCCIP.OffRamp = &contracts.OffRamp{ @@ -1348,14 +1386,15 @@ func (destCCIP *DestCCIPModule) AssertSeqNumberExecuted( } } -func DefaultDestinationCCIPModule(chainClient blockchain.EVMClient, sourceChain uint64, ccipCommon *CCIPCommon, logger zerolog.Logger) (*DestCCIPModule, error) { - cmn, err := ccipCommon.Copy(chainClient, logger) +func DefaultDestinationCCIPModule(logger zerolog.Logger, chainClient blockchain.EVMClient, sourceChainId uint64, sourceChain string, ccipCommon *CCIPCommon) (*DestCCIPModule, error) { + cmn, err := ccipCommon.Copy(logger, chainClient) if err != nil { return nil, err } return &DestCCIPModule{ Common: cmn, - SourceChainId: sourceChain, + SourceChainId: sourceChainId, + SourceNetworkName: sourceChain, ReportAcceptedWatcherMu: &sync.Mutex{}, ReportAcceptedWatcher: make(map[uint64]*commit_store.CommitStoreReportAccepted), ExecStateChangedMu: &sync.Mutex{}, @@ -1422,32 +1461,25 @@ func (lane *CCIPLane) UpdateLaneConfig() { btpAddresses = append(btpAddresses, lane.Source.Common.BridgeTokenPools[i].Address()) } lane.SrcNetworkLaneCfg.CommonContracts = laneconfig.CommonContracts{ - FeeToken: lane.Source.Common.FeeToken.Address(), - BridgeTokens: btAddresses, - BridgeTokenPools: btpAddresses, - ARM: lane.Source.Common.ARMContract.Hex(), - Router: lane.Source.Common.Router.Address(), - PriceRegistry: lane.Source.Common.PriceRegistry.Address(), - WrappedNative: lane.Source.Common.WrappedNative.Hex(), - PriceUpdatesToWatchFrom: lane.Source.Common.PriceUpdatesToWatchFrom, + FeeToken: lane.Source.Common.FeeToken.Address(), + BridgeTokens: btAddresses, + BridgeTokenPools: btpAddresses, + ARM: lane.Source.Common.ARMContract.Hex(), + Router: lane.Source.Common.Router.Address(), + PriceRegistry: lane.Source.Common.PriceRegistry.Address(), + WrappedNative: lane.Source.Common.WrappedNative.Hex(), } if lane.Source.Common.ARM == nil { lane.SrcNetworkLaneCfg.CommonContracts.IsMockARM = true } - if lane.SrcNetworkLaneCfg.SrcContracts == nil { - lane.SrcNetworkLaneCfg.SrcContracts = map[uint64]laneconfig.SourceContracts{ - lane.Source.DestinationChainId: { - OnRamp: lane.Source.OnRamp.Address(), - DepolyedAt: lane.Source.SrcStartBlock, - }, - } - } else { - lane.SrcNetworkLaneCfg.SrcContracts[lane.Source.DestinationChainId] = laneconfig.SourceContracts{ - OnRamp: lane.Source.OnRamp.Address(), - DepolyedAt: lane.Source.SrcStartBlock, - } + lane.SrcNetworkLaneCfg.SrcContractsMu.Lock() + lane.SrcNetworkLaneCfg.SrcContracts[lane.Source.DestNetworkName] = laneconfig.SourceContracts{ + OnRamp: lane.Source.OnRamp.Address(), + DepolyedAt: lane.Source.SrcStartBlock, } + lane.SrcNetworkLaneCfg.SrcContractsMu.Unlock() btAddresses, btpAddresses = []string{}, []string{} + for i, bt := range lane.Dest.Common.BridgeTokens { btAddresses = append(btAddresses, bt.Address()) btpAddresses = append(btpAddresses, lane.Dest.Common.BridgeTokenPools[i].Address()) @@ -1464,21 +1496,13 @@ func (lane *CCIPLane) UpdateLaneConfig() { if lane.Dest.Common.ARM == nil { lane.DstNetworkLaneCfg.CommonContracts.IsMockARM = true } - if lane.DstNetworkLaneCfg.DestContracts == nil { - lane.DstNetworkLaneCfg.DestContracts = map[uint64]laneconfig.DestContracts{ - lane.Dest.SourceChainId: { - OffRamp: lane.Dest.OffRamp.Address(), - CommitStore: lane.Dest.CommitStore.Address(), - ReceiverDapp: lane.Dest.ReceiverDapp.Address(), - }, - } - } else { - lane.DstNetworkLaneCfg.DestContracts[lane.Dest.SourceChainId] = laneconfig.DestContracts{ - OffRamp: lane.Dest.OffRamp.Address(), - CommitStore: lane.Dest.CommitStore.Address(), - ReceiverDapp: lane.Dest.ReceiverDapp.Address(), - } + lane.DstNetworkLaneCfg.DestContractsMu.Lock() + lane.DstNetworkLaneCfg.DestContracts[lane.Dest.SourceNetworkName] = laneconfig.DestContracts{ + OffRamp: lane.Dest.OffRamp.Address(), + CommitStore: lane.Dest.CommitStore.Address(), + ReceiverDapp: lane.Dest.ReceiverDapp.Address(), } + lane.DstNetworkLaneCfg.DestContractsMu.Unlock() } func (lane *CCIPLane) RecordStateBeforeTransfer() { @@ -1611,11 +1635,6 @@ func (lane *CCIPLane) StartEventWatchers() error { return err } } - subs, err := lane.Source.Common.WatchForPriceUpdates(lane.Logger) - if err != nil { - return err - } - lane.Subscriptions = append(lane.Subscriptions, subs...) sendReqEvent := make(chan *evm_2_evm_onramp.EVM2EVMOnRampCCIPSendRequested) sub, err := lane.Source.OnRamp.Instance.WatchCCIPSendRequested(nil, sendReqEvent) @@ -1715,27 +1734,34 @@ func (lane *CCIPLane) DeployNewCCIPLane( transferAmounts []*big.Int, bootstrapAdded *atomic.Bool, configureCLNodes bool, -) error { + jobErrGroup *errgroup.Group, +) (*laneconfig.LaneConfig, *laneconfig.LaneConfig, error) { var err error env := lane.TestEnv sourceChainClient := lane.SourceChain destChainClient := lane.DestChain if sourceCommon == nil { - return errors.WithStack(fmt.Errorf("common contracts for source chain %s not found", sourceChainClient.GetChainID().String())) + return nil, nil, errors.WithStack(fmt.Errorf("common contracts for source chain %s not found", sourceChainClient.GetChainID().String())) } if destCommon == nil { - return errors.WithStack(fmt.Errorf("common contracts for destination chain %s not found", destChainClient.GetChainID().String())) + return nil, nil, errors.WithStack(fmt.Errorf("common contracts for destination chain %s not found", destChainClient.GetChainID().String())) } - lane.Source, err = DefaultSourceCCIPModule(sourceChainClient, destChainClient.GetChainID().Uint64(), transferAmounts, sourceCommon, lane.Logger) + lane.Source, err = DefaultSourceCCIPModule( + lane.Logger, + sourceChainClient, destChainClient.GetChainID().Uint64(), + destChainClient.GetNetworkName(), transferAmounts, sourceCommon) if err != nil { - return errors.WithStack(err) + return nil, nil, errors.WithStack(err) } - lane.Dest, err = DefaultDestinationCCIPModule(destChainClient, sourceChainClient.GetChainID().Uint64(), destCommon, lane.Logger) + lane.Dest, err = DefaultDestinationCCIPModule( + lane.Logger, + destChainClient, sourceChainClient.GetChainID().Uint64(), + sourceChainClient.GetNetworkName(), destCommon) if err != nil { - return errors.WithStack(err) + return nil, nil, errors.WithStack(err) } srcConf := lane.SrcNetworkLaneCfg @@ -1745,51 +1771,36 @@ func (lane *CCIPLane) DeployNewCCIPLane( // deploy all source contracts err = lane.Source.DeployContracts(srcConf) if err != nil { - return errors.WithStack(err) + return nil, nil, errors.WithStack(err) } // deploy all destination contracts err = lane.Dest.DeployContracts(*lane.Source, destConf) if err != nil { - return errors.WithStack(err) + return nil, nil, errors.WithStack(err) } lane.UpdateLaneConfig() - // start event watchers - err = lane.StartEventWatchers() - if err != nil { - return errors.WithStack(err) - } // if lane is being set up for already configured CL nodes and contracts // no further action is necessary if !configureCLNodes { - return nil + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, nil } if env == nil { - return errors.WithStack(errors.New("test environment not set")) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(errors.New("test environment not set")) } // wait for the CL nodes to be ready before moving ahead with job creation err = env.CLNodeWithKeyReady.Wait() if err != nil { - return errors.WithStack(err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(err) } clNodesWithKeys := env.CLNodesWithKeys - mockServer := env.MockServer // set up ocr2 jobs - tokenUSDMap := make(map[string]string) - for _, token := range lane.Dest.Common.BridgeTokens { - tokenUSDMap[token.Address()] = LinkToUSD.String() - } clNodes, exists := clNodesWithKeys[lane.Dest.Common.ChainClient.GetChainID().String()] if !exists { - return fmt.Errorf("could not find CL nodes for %s", lane.Dest.Common.ChainClient.GetChainID().String()) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, fmt.Errorf("could not find CL nodes for %s", lane.Dest.Common.ChainClient.GetChainID().String()) } - tokenUSDMap[lane.Dest.Common.FeeToken.Address()] = LinkToUSD.String() - tokenUSDMap[lane.Source.Common.WrappedNative.Hex()] = WrappedNativeToUSD.String() - tokenUSDMap[lane.Dest.Common.WrappedNative.Hex()] = WrappedNativeToUSD.String() - lane.Logger.Info().Interface("tokenUSDMap", tokenUSDMap).Msg("tokenUSDMap") - // first node is the bootstrapper bootstrapCommit := clNodes[0] var bootstrapExec *client.CLNodesWithKeys @@ -1803,7 +1814,7 @@ func (lane *CCIPLane) DeployNewCCIPLane( env.numOfExecNodes = numOfCommitNodes if !commitAndExecOnSameDON { if len(clNodes) < 11 { - return fmt.Errorf("not enough CL nodes for separate commit and execution nodes") + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, fmt.Errorf("not enough CL nodes for separate commit and execution nodes") } bootstrapExec = clNodes[1] // for a set-up of different commit and execution nodes second node is the bootstrapper for execution nodes commitNodes = clNodes[2 : 2+numOfCommitNodes] @@ -1821,25 +1832,36 @@ func (lane *CCIPLane) DeployNewCCIPLane( // Here for simplicity we are just taking the current block number just before the job is created. currentBlockOnDest, err := destChainClient.LatestBlockNumber(context.Background()) if err != nil { - return fmt.Errorf("getting current block should be successful in destination chain %+v", err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, fmt.Errorf("getting current block should be successful in destination chain %+v", err) } + tokenUSDMap := make(map[string]string) + for _, token := range lane.Dest.Common.BridgeTokens { + tokenUSDMap[token.Address()] = LinkToUSD.String() + } + + tokenUSDMap[lane.Dest.Common.FeeToken.Address()] = LinkToUSD.String() + tokenUSDMap[lane.Source.Common.WrappedNative.Hex()] = WrappedNativeToUSD.String() + tokenUSDMap[lane.Dest.Common.WrappedNative.Hex()] = WrappedNativeToUSD.String() + lane.Logger.Info().Interface("tokenUSDMap", tokenUSDMap).Msg("tokenUSDMap") + jobParams := integrationtesthelpers.CCIPJobSpecParams{ - OffRamp: lane.Dest.OffRamp.EthAddress, - CommitStore: lane.Dest.CommitStore.EthAddress, - SourceChainName: sourceChainClient.GetNetworkName(), - DestChainName: destChainClient.GetNetworkName(), - DestEvmChainId: destChainClient.GetChainID().Uint64(), - SourceStartBlock: lane.Source.SrcStartBlock, - DestStartBlock: currentBlockOnDest, - } - addedBootstrap := bootstrapAdded.Load() - if !addedBootstrap { + OffRamp: lane.Dest.OffRamp.EthAddress, + CommitStore: lane.Dest.CommitStore.EthAddress, + SourceChainName: sourceChainClient.GetNetworkName(), + DestChainName: destChainClient.GetNetworkName(), + DestEvmChainId: destChainClient.GetChainID().Uint64(), + SourceStartBlock: lane.Source.SrcStartBlock, + TokenPricesUSDPipeline: StaticTokenFeeForMultipleTokenAddr(tokenUSDMap), + DestStartBlock: currentBlockOnDest, + } + + if !bootstrapAdded.Load() { + bootstrapAdded.Store(true) err := CreateBootstrapJob(jobParams, bootstrapCommit, bootstrapExec) if err != nil { - return errors.WithStack(err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(err) } - bootstrapAdded.Store(true) } bootstrapCommitP2PId := bootstrapCommit.KeysBundle.P2PKeys.Data[0].Attributes.PeerID @@ -1865,28 +1887,26 @@ func (lane *CCIPLane) DeployNewCCIPLane( // set up ocr2 config err = SetOCR2Configs(commitNodes, execNodes, *lane.Dest) if err != nil { - return errors.WithStack(err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(err) } - err = CreateOCR2CCIPCommitJobs( - lane.Context, jobParams, - commitNodes, - tokenUSDMap, mockServer, - ) + err = CreateOCR2CCIPCommitJobs(lane.Logger, jobParams, commitNodes, env.nodeMutexes, jobErrGroup) if err != nil { - return errors.WithStack(err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(err) } if p2pBootstrappersExec != nil { jobParams.P2PV2Bootstrappers = []string{p2pBootstrappersExec.P2PV2Bootstrapper()} } - err = CreateOCR2CCIPExecutionJobs(jobParams, execNodes) + + err = CreateOCR2CCIPExecutionJobs(lane.Logger, jobParams, execNodes, env.nodeMutexes, jobErrGroup) if err != nil { - return errors.WithStack(err) + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, errors.WithStack(err) } + lane.Dest.Common.ChainClient.ParallelTransactions(false) lane.Source.Common.ChainClient.ParallelTransactions(false) - return nil + return lane.SrcNetworkLaneCfg, lane.DstNetworkLaneCfg, nil } // SetOCR2Configs sets the oracle config in ocr2 contracts @@ -1901,11 +1921,11 @@ func SetOCR2Configs(commitNodes, execNodes []*client.CLNodesWithKeys, destCCIP D signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, err := contracts.NewOffChainAggregatorV2Config(commitNodes, ccipConfig.CommitOffchainConfig{ SourceFinalityDepth: 1, DestFinalityDepth: 1, - GasPriceHeartBeat: models.MustMakeDuration(24 * time.Hour), - DAGasPriceDeviationPPB: 5e7, - ExecGasPriceDeviationPPB: 5e7, - TokenPriceHeartBeat: models.MustMakeDuration(24 * time.Hour), - TokenPriceDeviationPPB: 5e7, + GasPriceHeartBeat: models.MustMakeDuration(10 * time.Second), // reduce the heartbeat to 10 sec for faster fee updates + DAGasPriceDeviationPPB: 1e6, + ExecGasPriceDeviationPPB: 1e6, + TokenPriceHeartBeat: models.MustMakeDuration(10 * time.Second), + TokenPriceDeviationPPB: 1e6, MaxGasPrice: 200e9, InflightCacheExpiry: inflightExpiry, }, ccipConfig.CommitOnchainConfig{ @@ -1972,73 +1992,80 @@ func CreateBootstrapJob( } func CreateOCR2CCIPCommitJobs( - ctx context.Context, + lggr zerolog.Logger, jobParams integrationtesthelpers.CCIPJobSpecParams, commitNodes []*client.CLNodesWithKeys, - tokenUSDMap map[string]string, - mockServer *ctfClient.MockserverClient, + mutexes []*sync.Mutex, + group *errgroup.Group, ) error { - tokenFeeConv := make(map[string]interface{}) - var tokenAddr []string - // Collect all dest tokens for price pipeline - for token, value := range tokenUSDMap { - tokenFeeConv[token] = value - tokenAddr = append(tokenAddr, token) - } - - err := SetMockServerWithSameTokenFeeConversionValue(ctx, tokenFeeConv, commitNodes, mockServer) - if err != nil { - return errors.WithStack(err) - } ocr2SpecCommit, err := jobParams.CommitJobSpec() if err != nil { return errors.WithStack(err) } - - for i, node := range commitNodes { - tokenPricesUSDPipeline := TokenFeeForMultipleTokenAddr(node, tokenAddr, mockServer) - + createJob := func(index int, node *client.CLNodesWithKeys, ocr2SpecCommit client.OCR2TaskJobSpec, mu *sync.Mutex) error { + mu.Lock() + defer mu.Unlock() ocr2SpecCommit.OCR2OracleSpec.OCRKeyBundleID.SetValid(node.KeysBundle.OCR2Key.Data.ID) ocr2SpecCommit.OCR2OracleSpec.TransmitterID.SetValid(node.KeysBundle.EthAddress) - ocr2SpecCommit.OCR2OracleSpec.PluginConfig["tokenPricesUSDPipeline"] = fmt.Sprintf(`""" -%s -"""`, tokenPricesUSDPipeline) - - _, err = node.Node.MustCreateJob(ocr2SpecCommit) + lggr.Info().Msgf("Creating CCIP-Commit job on OCR node %d job name %s", index+1, ocr2SpecCommit.Name) + _, err = node.Node.MustCreateJob(&ocr2SpecCommit) if err != nil { - return fmt.Errorf("shouldn't fail creating CCIP-Commit job on OCR node %d job name %s - %+v", i+1, ocr2SpecCommit.Name, err) + return fmt.Errorf("shouldn't fail creating CCIP-Commit job on OCR node %d job name %s - %+v", index+1, ocr2SpecCommit.Name, err) } + return nil + } + for i, node := range commitNodes { + node := node + i := i + group.Go(func() error { + return createJob(i, node, *ocr2SpecCommit, mutexes[i]) + }) } return nil } -func CreateOCR2CCIPExecutionJobs(jobParams integrationtesthelpers.CCIPJobSpecParams, execNodes []*client.CLNodesWithKeys) error { +func CreateOCR2CCIPExecutionJobs( + lggr zerolog.Logger, + jobParams integrationtesthelpers.CCIPJobSpecParams, + execNodes []*client.CLNodesWithKeys, + mutexes []*sync.Mutex, + group *errgroup.Group, +) error { ocr2SpecExec, err := jobParams.ExecutionJobSpec() if err != nil { return errors.WithStack(err) } - + createJob := func(index int, node *client.CLNodesWithKeys, ocr2SpecExec client.OCR2TaskJobSpec, mu *sync.Mutex) error { + mu.Lock() + defer mu.Unlock() + ocr2SpecExec.OCR2OracleSpec.OCRKeyBundleID.SetValid(node.KeysBundle.OCR2Key.Data.ID) + ocr2SpecExec.OCR2OracleSpec.TransmitterID.SetValid(node.KeysBundle.EthAddress) + lggr.Info().Msgf("Creating CCIP-Exec job on OCR node %d job name %s", index+1, ocr2SpecExec.Name) + _, err = node.Node.MustCreateJob(&ocr2SpecExec) + if err != nil { + return fmt.Errorf("shouldn't fail creating CCIP-Exec job on OCR node %d job name %s - %+v", index+1, + ocr2SpecExec.Name, err) + } + return nil + } if ocr2SpecExec != nil { for i, node := range execNodes { - ocr2SpecExec.OCR2OracleSpec.OCRKeyBundleID.SetValid(node.KeysBundle.OCR2Key.Data.ID) - ocr2SpecExec.OCR2OracleSpec.TransmitterID.SetValid(node.KeysBundle.EthAddress) - - _, err = node.Node.MustCreateJob(ocr2SpecExec) - if err != nil { - return fmt.Errorf("shouldn't fail creating CCIP-Exec job on OCR node %d job name %s - %+v", i+1, - ocr2SpecExec.Name, err) - } + node := node + i := i + group.Go(func() error { + return createJob(i, node, *ocr2SpecExec, mutexes[i]) + }) } } return nil } -func TokenFeeForMultipleTokenAddr(node *client.CLNodesWithKeys, linkTokenAddr []string, mockserver *ctfClient.MockserverClient) string { +// TODO : keep it if there is a better mockserver implementation is found +func _(tokenAddr []string, mockserver *ctfClient.MockserverClient) string { source := "" right := "" - for i, addr := range linkTokenAddr { - url := fmt.Sprintf("%s/%s", mockserver.Config.ClusterURL, - nodeContractPair(node.KeysBundle.EthAddress, addr)) + for i, addr := range tokenAddr { + url := fmt.Sprintf("%s/%s", mockserver.Config.ClusterURL, addr) source = source + fmt.Sprintf(` token%d [type=http method=GET url="%s"]; token%d_parse [type=jsonparse path="Data,Result"]; @@ -2052,40 +2079,43 @@ merge [type=merge left="{}" right="{%s}"];`, source, right) return source } +func StaticTokenFeeForMultipleTokenAddr(tokenUSD map[string]string) string { + right := "" + for addr, value := range tokenUSD { + right = right + fmt.Sprintf(`\\"%s\\":\\"%s\\",`, addr, value) + } + right = right[:len(right)-1] + source := fmt.Sprintf(`merge [type=merge left="{}" right="{%s}"];`, right) + + return source +} + // SetMockServerWithSameTokenFeeConversionValue sets the mock responses in mockserver that are read by chainlink nodes // to simulate different price feed value. func SetMockServerWithSameTokenFeeConversionValue( ctx context.Context, tokenValueAddress map[string]interface{}, - chainlinkNodes []*client.CLNodesWithKeys, mockserver *ctfClient.MockserverClient, ) error { valueAdditions, _ := errgroup.WithContext(ctx) for tokenAddr, value := range tokenValueAddress { - for _, n := range chainlinkNodes { - nodeTokenPairID := nodeContractPair(n.KeysBundle.EthAddress, tokenAddr) - path := fmt.Sprintf("/%s", nodeTokenPairID) - tokenValue := value - valueAdditions.Go(func() error { - log.Info().Str("path", path). - Str("value", fmt.Sprintf("%v", tokenValue)). - Msg(fmt.Sprintf("Setting mockserver response")) - return mockserver.SetAnyValuePath(path, tokenValue) - }) - } + path := fmt.Sprintf("/%s", tokenAddr) + tokenValue := value + valueAdditions.Go(func() error { + log.Info().Str("path", path). + Str("value", fmt.Sprintf("%v", tokenValue)). + Msg(fmt.Sprintf("Setting mockserver response")) + return mockserver.SetAnyValuePath(path, tokenValue) + }) } return valueAdditions.Wait() } -func nodeContractPair(nodeAddr, contractAddr string) string { - return fmt.Sprintf("node_%s_contract_%s", nodeAddr[2:12], contractAddr[2:12]) -} - type CCIPTestEnv struct { LocalCluster *test_env.CLClusterTestEnv - MockServer *ctfClient.MockserverClient CLNodesWithKeys map[string][]*client.CLNodesWithKeys // key - network chain-id CLNodes []*client.ChainlinkK8sClient + nodeMutexes []*sync.Mutex execNodeStartIndex int commitNodeStartIndex int numOfAllowedFaultyCommit int @@ -2157,12 +2187,13 @@ func (c *CCIPTestEnv) SetUpNodesAndKeys( logger zerolog.Logger, ) error { chainlinkNodes := make([]*client.ChainlinkClient, 0) - var err error + + //var err error if c.LocalCluster != nil { // for local cluster, fetch the values from the local cluster - c.MockServer = c.LocalCluster.MockServer.Client for _, chainlinkNode := range c.LocalCluster.CLNodes { chainlinkNodes = append(chainlinkNodes, chainlinkNode.API) + c.nodeMutexes = append(c.nodeMutexes, &sync.Mutex{}) } } else { // in case of k8s, we need to connect to the chainlink nodes @@ -2176,68 +2207,63 @@ func (c *CCIPTestEnv) SetUpNodesAndKeys( } for _, chainlinkNode := range chainlinkK8sNodes { + chainlinkNode.ChainlinkClient.SetLogger(logger) + chainlinkNode.ChainlinkClient.AddRetryAttempt(3) chainlinkNodes = append(chainlinkNodes, chainlinkNode.ChainlinkClient) - } - - c.MockServer, err = ctfClient.ConnectMockServer(c.K8Env) - if err != nil { - return fmt.Errorf("creating mockserver clients shouldn't fail %+v", err) + c.nodeMutexes = append(c.nodeMutexes, &sync.Mutex{}) } c.CLNodes = chainlinkK8sNodes } nodesWithKeys := make(map[string][]*client.CLNodesWithKeys) mu := &sync.Mutex{} - grp, _ := errgroup.WithContext(ctx) - populateKeys := func(chain blockchain.EVMClient) { - grp.Go(func() error { - _, clNodes, err := client.CreateNodeKeysBundle(chainlinkNodes, "evm", chain.GetChainID().String()) - if err != nil { - return errors.WithStack(err) - } - if len(clNodes) == 0 { - return fmt.Errorf("no CL node with keys found for chain %s", chain.GetNetworkName()) - } - mu.Lock() - defer mu.Unlock() - nodesWithKeys[chain.GetChainID().String()] = clNodes - return nil - }) + //grp, _ := errgroup.WithContext(ctx) + populateKeys := func(chain blockchain.EVMClient) error { + log.Info().Str("chain id", chain.GetChainID().String()).Msg("creating node keys for chain") + _, clNodes, err := client.CreateNodeKeysBundle(chainlinkNodes, "evm", chain.GetChainID().String()) + if err != nil { + return errors.WithStack(err) + } + if len(clNodes) == 0 { + return fmt.Errorf("no CL node with keys found for chain %s", chain.GetNetworkName()) + } + mu.Lock() + defer mu.Unlock() + nodesWithKeys[chain.GetChainID().String()] = clNodes + return nil } - fund := func(ec blockchain.EVMClient) { - grp.Go(func() error { - cfg := ec.GetNetworkConfig() - if cfg == nil { - return fmt.Errorf("blank network config") - } - c1, err := blockchain.ConcurrentEVMClient(*cfg, c.K8Env, ec, logger) - if err != nil { - return fmt.Errorf("getting concurrent evmclient chain %s %+v", ec.GetNetworkName(), err) - } - defer func() { - if c1 != nil { - c1.Close() - } - }() - err = actions.FundChainlinkNodesAddresses(chainlinkNodes[1:], c1, nodeFund) - if err != nil { - return fmt.Errorf("funding nodes for chain %s %+v", c1.GetNetworkName(), err) + fund := func(ec blockchain.EVMClient) error { + cfg := ec.GetNetworkConfig() + if cfg == nil { + return fmt.Errorf("blank network config") + } + c1, err := blockchain.ConcurrentEVMClient(*cfg, c.K8Env, ec, logger) + if err != nil { + return fmt.Errorf("getting concurrent evmclient chain %s %+v", ec.GetNetworkName(), err) + } + defer func() { + if c1 != nil { + c1.Close() } - return nil - }) + }() + log.Info().Str("chain id", c1.GetChainID().String()).Msg("Funding Chainlink nodes for chain") + err = actions.FundChainlinkNodesAddresses(chainlinkNodes[1:], c1, nodeFund) + if err != nil { + return fmt.Errorf("funding nodes for chain %s %+v", c1.GetNetworkName(), err) + } + return nil } for _, chain := range chains { - log.Info().Msg("creating node keys") - populateKeys(chain) - log.Info().Msg("Funding Chainlink nodes for both the chains") - fund(chain) - } - - err = grp.Wait() - if err != nil { - return errors.WithStack(err) + err := populateKeys(chain) + if err != nil { + return err + } + err = fund(chain) + if err != nil { + return err + } } c.CLNodesWithKeys = nodesWithKeys diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go index 5477673e96..b60372f4ee 100644 --- a/integration-tests/ccip-tests/contracts/contract_deployer.go +++ b/integration-tests/ccip-tests/contracts/contract_deployer.go @@ -44,13 +44,17 @@ type CCIPContractsDeployer struct { } // NewCCIPContractsDeployer returns an instance of a contract deployer for CCIP -func NewCCIPContractsDeployer(bcClient blockchain.EVMClient, logger zerolog.Logger) (*CCIPContractsDeployer, error) { +func NewCCIPContractsDeployer(logger zerolog.Logger, bcClient blockchain.EVMClient) (*CCIPContractsDeployer, error) { return &CCIPContractsDeployer{ evmClient: bcClient, EthDeployer: contracts.NewEthereumContractDeployer(bcClient, logger), }, nil } +func (e *CCIPContractsDeployer) Client() blockchain.EVMClient { + return e.evmClient +} + func (e *CCIPContractsDeployer) DeployLinkTokenContract() (*LinkToken, error) { address, _, instance, err := e.evmClient.DeployContract("Link Token", func( auth *bind.TransactOpts, diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go index 6dfd1b0ecf..02f22c54ab 100644 --- a/integration-tests/ccip-tests/contracts/contract_models.go +++ b/integration-tests/ccip-tests/contracts/contract_models.go @@ -43,15 +43,6 @@ type ERC20Token struct { ContractAddress common.Address } -func (token *ERC20Token) Copy(client blockchain.EVMClient) *ERC20Token { - newIns := token.instance - return &ERC20Token{ - client: client, - instance: newIns, - ContractAddress: token.ContractAddress, - } -} - func (token *ERC20Token) Address() string { return token.ContractAddress.Hex() } @@ -113,15 +104,6 @@ type LinkToken struct { EthAddress common.Address } -func (token *LinkToken) Copy(client blockchain.EVMClient) *LinkToken { - newToken := *token.instance - return &LinkToken{ - client: client, - instance: &newToken, - EthAddress: token.EthAddress, - } -} - func (token *LinkToken) Address() string { return token.EthAddress.Hex() } @@ -184,15 +166,6 @@ type LockReleaseTokenPool struct { EthAddress common.Address } -func (pool *LockReleaseTokenPool) Copy(client blockchain.EVMClient) *LockReleaseTokenPool { - newIns := *pool.Instance - return &LockReleaseTokenPool{ - client: client, - Instance: &newIns, - EthAddress: pool.EthAddress, - } -} - func (pool *LockReleaseTokenPool) Address() string { return pool.EthAddress.Hex() } @@ -357,15 +330,6 @@ type ARM struct { EthAddress common.Address } -func (arm *ARM) Copy(client blockchain.EVMClient) *ARM { - newArm := *arm.Instance - return &ARM{ - client: client, - Instance: &newArm, - EthAddress: arm.EthAddress, - } -} - func (arm *ARM) Address() string { return arm.EthAddress.Hex() } @@ -468,15 +432,6 @@ func (c *PriceRegistry) Address() string { return c.EthAddress.Hex() } -func (c *PriceRegistry) Copy(client blockchain.EVMClient) *PriceRegistry { - newIns := *c.Instance - return &PriceRegistry{ - client: client, - Instance: &newIns, - EthAddress: c.EthAddress, - } -} - func (c *PriceRegistry) AddPriceUpdater(addr common.Address) error { opts, err := c.client.TransactionOpts(c.client.GetDefaultWallet()) if err != nil { @@ -531,15 +486,6 @@ type Router struct { EthAddress common.Address } -func (r *Router) Copy(client blockchain.EVMClient) *Router { - ri := *r.Instance - return &Router{ - client: client, - Instance: &ri, - EthAddress: r.EthAddress, - } -} - func (r *Router) Address() string { return r.EthAddress.Hex() } diff --git a/integration-tests/ccip-tests/contracts/laneconfig/contracts.json b/integration-tests/ccip-tests/contracts/laneconfig/contracts.json index 974f09a871..2de02c302a 100644 --- a/integration-tests/ccip-tests/contracts/laneconfig/contracts.json +++ b/integration-tests/ccip-tests/contracts/laneconfig/contracts.json @@ -1,5 +1,112 @@ { "lane_configs": { + "Arbitrum Mainnet": { + "fee_token": "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4", + "bridge_tokens": [ + "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4" + ], + "bridge_tokens_pools": [ + "" + ], + "arm": "0xe06b0e8c4bd455153e8794ad7Ea8Ff5A14B64E4b", + "router": "0xE92634289A1841A979C11C2f618B33D376e4Ba85", + "price_registry": "0xeBec5Cb8651FCD0Fd86Bd1BBb8562f5028D5102E", + "wrapped_native": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "src_contracts": { + "Ethereum Mainnet": { + "on_ramp": "0x98dd9E9b8AE458225119Ab5B8c947A9d1cd0B648", + "deployed_at": 126471491 + } + }, + "dest_contracts": { + "Ethereum Mainnet": { + "off_ramp": "0x7b1f908ceBf41d5829D0134c7dfD6aa0f163C97d", + "commit_store": "0x8E2adA223f8514C2E6E6Fb0877a19018B67256fF", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + } + } + }, + "Avalanche Mainnet": { + "fee_token": "0x5947BB275c521040051D82396192181b413227A3", + "bridge_tokens": [ + "0x5947BB275c521040051D82396192181b413227A3" + ], + "bridge_tokens_pools": [ + "0x8A3e8D8614189d7ad0CF3f1a0D787Da79eBCEc17" + ], + "arm": "0xdFD6C0dc67666DE3bB36b31eec5c7B1542A82C1E", + "router": "0x27F39D0af3303703750D4001fCc1844c6491563c", + "price_registry": "0x2d3b38E0a4DFFDad2A613f7760bE1683F272eA18", + "wrapped_native": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", + "src_contracts": { + "Ethereum Mainnet": { + "on_ramp": "0x3D3817270db2b89e9F68bA27297fb4672082f942", + "deployed_at": 32263102 + }, + "Polygon Mainnet": { + "on_ramp": "0x2d306510FE83Cdb33Ff1658c71C181e9567F0009", + "deployed_at": 32562460 + } + }, + "dest_contracts": { + "Ethereum Mainnet": { + "off_ramp": "0x2BF2611a07e2cA880b814d53325e9b2ee0BbfD2f", + "commit_store": "0x5eBE880c4d340892dA1b0F32798a7A28e17e6E65", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + }, + "Polygon Mainnet": { + "off_ramp": "0xC65F15b8178c2Fd653183130C6E003d196C39eC2", + "commit_store": "0xa9DC27fAc318fdDCa08E215ca157Fa5C7A832d80", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + } + } + }, + "Base Mainnet": { + "fee_token": "0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196", + "arm": "0x38660c8CC222c0192b635c2ac09687B4F25cCE5F", + "router": "0x673AA85efd75080031d44fcA061575d1dA427A28", + "price_registry": "0x1bA15c57c8b74cD32443D7583E7f6d7c638aCf46", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Ethereum Mainnet": { + "on_ramp": "0xD44371bFDe87f2db3eA6Df242091351A06c2e181", + "deployed_at": 3316617 + } + }, + "dest_contracts": { + "Ethereum Mainnet": { + "off_ramp": "0x391B9B016C3bBA61F02e7ddd345130415908B9c7", + "commit_store": "0x398d2164a3F61353B4619814A31cC74A7741612E", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + } + } + }, + "BSC Mainnet": { + "fee_token": "0x404460C6A5EdE2D891e8297795264fDe62ADBB75", + "bridge_tokens": [ + "0x404460C6A5EdE2D891e8297795264fDe62ADBB75" + ], + "bridge_tokens_pools": [ + "" + ], + "arm": "0x3DB43b96B2625F4232e9Df900d464dd2c64C0021", + "router": "0x536d7E53D0aDeB1F20E7c81fea45d02eC9dBD698", + "price_registry": "0x18C3D917D55Bc1784a3d4729AA3e2C1ecd662fFd", + "wrapped_native": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "src_contracts": { + "Ethereum Mainnet": { + "on_ramp": "0x1f17D464652f5Bd74a03446FeA20590CCfB3332D", + "deployed_at": 31312405 + } + }, + "dest_contracts": { + "Ethereum Mainnet": { + "off_ramp": "0xEcaa7473b57956647C8Cff5a909520e7A0A4a5f6", + "commit_store": "0x9C68a868db2C27E9A7Ce43b73272A5d7ecFB5865", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + } + } + }, "Ethereum Mainnet": { "fee_token": "0x514910771AF9Ca656af840dff83E8264EcF986CA", "bridge_tokens": [ @@ -9,66 +116,65 @@ "0xC2291992A08eBFDfedfE248F2CCD34Da63570DF4" ], "arm": "0x8B63b3DE93431C0f756A493644d128134291fA1b", - "arm_proxy" : "0x411dE17f12D1A34ecC7F45f49844626267c75e81", "router": "0xE561d5E02207fb5eB32cca20a699E0d8919a1476", "price_registry": "0x020082A7a9c2510e1921116001152DEE4da81985", "wrapped_native": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "src_contracts": { - "43114": { - "on_ramp": "0xd0B5Fc9790a6085b048b8Aa1ED26ca2b3b282CF2", - "deployed_at": 17636709 - }, - "10": { - "on_ramp": "0xCC19bC4D43d17eB6859F0d22BA300967C97780b0", - "deployed_at": 17636647 - }, - "137": { - "on_ramp": "0x0f27c8532457b66D6037141DEB0ed479Dad04B3c", - "deployed_at": 17636734 - }, - "42161": { + "Arbitrum Mainnet": { "on_ramp": "0x333f976915195ba9044fD0cd603cEcE936f6264e", "deployed_at": 18029393 }, - "56": { + "Avalanche Mainnet": { + "on_ramp": "0xd0B5Fc9790a6085b048b8Aa1ED26ca2b3b282CF2", + "deployed_at": 17636709 + }, + "BSC Mainnet": { "on_ramp": "0xdF1d7FD22aC3aB5171E275796f123224039f3b24", "deployed_at": 18029385 }, - "8453": { + "Base Mainnet": { "on_ramp": "0xe2Eb229e88F56691e96bb98256707Bc62160FE73", "deployed_at": 18029431 + }, + "Optimism Mainnet": { + "on_ramp": "0xCC19bC4D43d17eB6859F0d22BA300967C97780b0", + "deployed_at": 17636647 + }, + "Polygon Mainnet": { + "on_ramp": "0x0f27c8532457b66D6037141DEB0ed479Dad04B3c", + "deployed_at": 17636734 } }, "dest_contracts": { - "10": { - "off_ramp": "0x41627a90f2c6238f2BADAB72D5aB050B857fdAb5", - "commit_store": "0x8bEFCa744c6f2b567b1863dcF055C593afdC11A0", + "Arbitrum Mainnet": { + "off_ramp": "0x61135E701a2214C170c5F596D0067798FEfbaaE4", + "commit_store": "0x3d3467e1036Ee25F6F4aa15e3Abf77443A23144C", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" }, - "43114" : { + "Avalanche Mainnet": { "off_ramp": "0x1C207dabc46902dF9028b27D6d301c3849b2D12c", "commit_store": "0x40c558575093eC1099CC21B020d9b8D13c74417F", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" }, - "137": { - "off_ramp": "0xBDd822f3bC2EAB6818CfA3053107831D4E93fE72", - "commit_store": "0x20718EfbC25Dba60FD51c2c81362b83f7C411A6D", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" - }, - "42161": { - "off_ramp": "0x61135E701a2214C170c5F596D0067798FEfbaaE4", - "commit_store": "0x3d3467e1036Ee25F6F4aa15e3Abf77443A23144C", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" - }, - "56": { + "BSC Mainnet": { "off_ramp": "0xC7176620daf49A39a17FF9A6C2DE1eAA6033EE94", "commit_store": "0x7986C9892389854cAAbAC785ff18123B0070a5Fd", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" }, - "8453": { + "Base Mainnet": { "off_ramp": "0xfF51C00546AA3d9051a4B96Ae81346E14709CD24", "commit_store": "0x2D1708ff2a15adbE313eA8C6035aA24d0FBA1c77", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + }, + "Optimism Mainnet": { + "off_ramp": "0x41627a90f2c6238f2BADAB72D5aB050B857fdAb5", + "commit_store": "0x8bEFCa744c6f2b567b1863dcF055C593afdC11A0", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + }, + "Polygon Mainnet": { + "off_ramp": "0xBDd822f3bC2EAB6818CfA3053107831D4E93fE72", + "commit_store": "0x20718EfbC25Dba60FD51c2c81362b83f7C411A6D", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" } } }, @@ -81,51 +187,23 @@ "0x841b32B5309ba30cFbf4534667fC3D99EdF05B7A" ], "arm": "0x8C7C2C3362a42308BB5c368677Ad321D11693b81", - "arm_proxy" : "0x55b3FCa23EdDd28b1f5B4a3C7975f63EFd2d06CE", "router": "0x261c05167db67B2b619f9d312e0753f3721ad6E8", "price_registry": "0x9270AAA75F4B9038f4c25fEc665B02a150a90361", "wrapped_native": "0x4200000000000000000000000000000000000006", "src_contracts": { - "1" : { + "Ethereum Mainnet": { "on_ramp": "0xad1b1F2A6DD55627e3893B771A00Cd43F69DcE35", "deployed_at": 106535110 } }, "dest_contracts": { - "1": { + "Ethereum Mainnet": { "off_ramp": "0x032F957BfbB8C535a1b2048f8b4FA27E1F2018Fd", "commit_store": "0xa4D34ca38244F6c8AB640315d7257221408B6596", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" } } }, - "Arbitrum Mainnet": { - "fee_token": "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4", - "bridge_tokens": [ - "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4" - ], - "bridge_tokens_pools": [ - "" - ], - "arm": "0xe06b0e8c4bd455153e8794ad7Ea8Ff5A14B64E4b", - "arm_proxy" : "0xC311a21e6fEf769344EB1515588B9d535662a145", - "router": "0xE92634289A1841A979C11C2f618B33D376e4Ba85", - "price_registry": "0xeBec5Cb8651FCD0Fd86Bd1BBb8562f5028D5102E", - "wrapped_native": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - "src_contracts": { - "1" : { - "on_ramp": "0x98dd9E9b8AE458225119Ab5B8c947A9d1cd0B648", - "deployed_at": 126471491 - } - }, - "dest_contracts": { - "1": { - "off_ramp": "0x7b1f908ceBf41d5829D0134c7dfD6aa0f163C97d", - "commit_store": "0x8E2adA223f8514C2E6E6Fb0877a19018B67256fF", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" - } - } - }, "Polygon Mainnet": { "fee_token": "0xb0897686c545045aFc77CF20eC7A532E3120E0F1", "bridge_tokens": [ @@ -135,120 +213,188 @@ "0x086892015567fb8764d02c6845C85C25C8FcA389" ], "arm": "0xD7AcF65dA1E1f34b663aB199a474F209bF2b0523", - "arm_proxy" : "0xf1ceAa46D8d13Cac9fC38aaEF3d3d14754C5A9c2", "router": "0x3C3D92629A02a8D95D5CB9650fe49C3544f69B43", "price_registry": "0x68590799942eed65f9f1fB2277B9F6584A5957B8", "wrapped_native": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270", "src_contracts": { - "1" : { - "on_ramp": "0xAE0e486Fa6577188d586A8e4c12360FB82E2a386", - "deployed_at": 44762064 - }, - "43114" : { + "Avalanche Mainnet": { "on_ramp": "0x47D945f7bbb814B65775a89c71F5D2229BE96CE9", "deployed_at": 45041759 + }, + "Ethereum Mainnet": { + "on_ramp": "0xAE0e486Fa6577188d586A8e4c12360FB82E2a386", + "deployed_at": 44762064 } }, "dest_contracts": { - "1": { - "off_ramp": "0xa73bf37F78CD1629ff11Fa2B397CED39F49F6efe", - "commit_store": "0x779cA414cAC21c76AbE9213861b1bE9187d495F9", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" - }, - "43114": { + "Avalanche Mainnet": { "off_ramp": "0xd59A3770c3e05479152b8581Ae0839f51b315E6A", "commit_store": "0xC2870bF94E24657f7f5E75cF458e391D23CD84B5", "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + }, + "Ethereum Mainnet": { + "off_ramp": "0xa73bf37F78CD1629ff11Fa2B397CED39F49F6efe", + "commit_store": "0x779cA414cAC21c76AbE9213861b1bE9187d495F9", + "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" } } }, - "Avalanche Mainnet": { - "fee_token": "0x5947BB275c521040051D82396192181b413227A3", + "Polygon Mumbai": { + "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", "bridge_tokens": [ - "0x5947BB275c521040051D82396192181b413227A3" + "0x326C977E6efc84E512bB9C30f76E30c160eD06FB" ], "bridge_tokens_pools": [ - "0x8A3e8D8614189d7ad0CF3f1a0D787Da79eBCEc17" + "0x6fce09b2e74f649a4494a1844219cb0d86cfe8b7" ], - "arm": "0xdFD6C0dc67666DE3bB36b31eec5c7B1542A82C1E", - "arm_proxy" : "0xcBD48A8eB077381c3c4Eb36b402d7283aB2b11Bc", - "router": "0x27F39D0af3303703750D4001fCc1844c6491563c", - "price_registry": "0x2d3b38E0a4DFFDad2A613f7760bE1683F272eA18", - "wrapped_native": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7", + "arm": "0x917a6913f785094f8b06785aa8a884f922a650d8", + "router": "0x70499c328e1e2a3c41108bd3730f6670a44595d1", + "price_registry": "0x9bd312170aa145ef98453940dc9ab894235b063e", + "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", "src_contracts": { - "1" : { - "on_ramp": "0x3D3817270db2b89e9F68bA27297fb4672082f942", - "deployed_at": 32263102 + "Avalanche Fuji": { + "on_ramp": "0x48601a62aa4cb289d006ff4c14023e9d8a7e5a88", + "deployed_at": 36910973 }, - "137" : { - "on_ramp": "0x2d306510FE83Cdb33Ff1658c71C181e9567F0009", - "deployed_at": 32562460 + "BSC Testnet": { + "on_ramp": "0xfffd50b1e72974e225529d0797d12581bccb22b9", + "deployed_at": 40030102 + }, + "Sepolia Testnet": { + "on_ramp": "0xa83f2cecb391779b59022eded6ebba0d7ec01f20", + "deployed_at": 37526794 } }, "dest_contracts": { - "1": { - "off_ramp": "0x2BF2611a07e2cA880b814d53325e9b2ee0BbfD2f", - "commit_store": "0x5eBE880c4d340892dA1b0F32798a7A28e17e6E65", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + "Avalanche Fuji": { + "off_ramp": "0xf11e96f85e1038c429d32a877e2225d37cde10e2", + "commit_store": "0x6b6b328cb1467d906389a1bbe54359c56000422c", + "receiver_dapp": "0xf8B335b847B4DFBB57dd0c0a2F440CD1251FebA3" }, - "137": { - "off_ramp": "0xC65F15b8178c2Fd653183130C6E003d196C39eC2", - "commit_store": "0xa9DC27fAc318fdDCa08E215ca157Fa5C7A832d80", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + "BSC Testnet": { + "off_ramp": "0xa52d36272621dbb9b6c0d51e9f4f57b7eae2ebdb", + "commit_store": "0x502709022c3aab16c9cf72600932806061667333", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + }, + "Sepolia Testnet": { + "off_ramp": "0xbe582db704bd387222c70ca2e5a027e5e2c06fb7", + "commit_store": "0xf06ff5d2084295909119ca541e93635e7d582ffc", + "receiver_dapp": "0x7d829100e7752E3928BCEeddcAAc655536157Fdd" } } }, - "Bsc Mainnet": { - "fee_token": "0x404460C6A5EdE2D891e8297795264fDe62ADBB75", + "Sepolia Testnet": { + "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", "bridge_tokens": [ - "0x404460C6A5EdE2D891e8297795264fDe62ADBB75" + "0x779877A7B0D9E8603169DdbD7836e478b4624789" ], "bridge_tokens_pools": [ - "" + "0x5344b4bf5ae39038a591866d2853b2b1db622911" ], - "arm": "0x3DB43b96B2625F4232e9Df900d464dd2c64C0021", - "arm_proxy" : "0x9e09697842194f77d315E0907F1Bda77922e8f84", - "router": "0x536d7E53D0aDeB1F20E7c81fea45d02eC9dBD698", - "price_registry": "0x18C3D917D55Bc1784a3d4729AA3e2C1ecd662fFd", - "wrapped_native": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "arm": "0xb4d360459f32dd641ef5a6985ffbac5c4e5521aa", + "router": "0xd0daae2231e9cb96b94c8512223533293c3693bf", + "price_registry": "0x8737a1c3d55779d03b7a08188e97af87b4110946", + "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", "src_contracts": { - "1" : { - "on_ramp": "0x1f17D464652f5Bd74a03446FeA20590CCfB3332D", - "deployed_at": 31312405 + "Arbitrum Goerli": { + "on_ramp": "0x2c0b51f491ceaefe8c24c0199fce62d7b040470a", + "deployed_at": 3816651 + }, + "Avalanche Fuji": { + "on_ramp": "0xe42ecce39ce5bd2bbf2443660ba6979eeafd48df", + "deployed_at": 3816446 + }, + "BSC Testnet": { + "on_ramp": "0x06245d9527b37bf6d66edd02bf013fc3e3e34f41", + "deployed_at": 4113317 + }, + "Base Goerli": { + "on_ramp": "0xef7023a045dc652fd44647be5d12434f49dd256c", + "deployed_at": 4113256 + }, + "Optimism Goerli": { + "on_ramp": "0x365408d655a6cdf8bc668fd6cebe1bb16a403ca6", + "deployed_at": 3816777 + }, + "Polygon Mumbai": { + "on_ramp": "0x23438be3256369316e53fd2ef1cd2bdfaf22f6ad", + "deployed_at": 3819110 } }, "dest_contracts": { - "1": { - "off_ramp": "0xEcaa7473b57956647C8Cff5a909520e7A0A4a5f6", - "commit_store": "0x9C68a868db2C27E9A7Ce43b73272A5d7ecFB5865", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" - } - } - }, - "Base Mainnet": { - "fee_token": "0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196", + "Arbitrum Goerli": { + "off_ramp": "0x1d649a11fa14024f9fa2058a6b5b473ea308b688", + "commit_store": "0xc677d898f06cee7b5f6ecbd0f72df5125cebbfc9", + "receiver_dapp": "0xa2428b38A9aa97b663d3B8411Bd3df2675f22714" + }, + "Avalanche Fuji": { + "off_ramp": "0x1f06781450e994b0005ce2922fca78e2c72d4353", + "commit_store": "0xf3855a07bf75c4e0b4ddbeb7784badc9dd2ca274", + "receiver_dapp": "0xBB1Ac68B35D4DE11Ea110Ed14D07054c0F101432" + }, + "BSC Testnet": { + "off_ramp": "0x6e8ab23fb9723e91fceaef309d061ba39a97ce72", + "commit_store": "0xb238559e1c2bc9ec04b27525569aa33be8f6d491", + "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + }, + "Base Goerli": { + "off_ramp": "0xdf911bb979dd3b785b4dc2989334bb39d3628174", + "commit_store": "0x080b960a196ffcd7c94246f7f79c97ed3d078921", + "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + }, + "Optimism Goerli": { + "off_ramp": "0x0d3299ee55d493b8d9aafc834a6fd5dcbc4a409a", + "commit_store": "0x1576d23f986ecb572a4c839ba6758ca05c1eadc2", + "receiver_dapp": "0x59d7ec1883DbCc5510943A0788D5d437f5D1743d" + }, + "Polygon Mumbai": { + "off_ramp": "0x026fb7c16f1d0082809ff2335715f27e1e074ff6", + "commit_store": "0x290789a55e2e26480f9c04c583d1d5c682aba49a", + "receiver_dapp": "0x5529276B5D53496B98CFde5C8FF2F577d88E9aC7" + } + } + }, + "Arbitrum Goerli": { + "fee_token": "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28", "bridge_tokens": [ - "0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196" + "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28" ], "bridge_tokens_pools": [ - "" + "0x044a6b4b561af69d2319a2f4be5ec327a6975d0a" ], - "arm": "0x38660c8CC222c0192b635c2ac09687B4F25cCE5F", - "arm_proxy" : "0xC842c69d54F83170C42C4d556B4F6B2ca53Dd3E8", - "router": "0x673AA85efd75080031d44fcA061575d1dA427A28", - "price_registry": "0x1bA15c57c8b74cD32443D7583E7f6d7c638aCf46", - "wrapped_native": "0x4200000000000000000000000000000000000006", + "arm": "0x8af4204e30565df93352fe8e1de78925f6664da7", + "router": "0x88e492127709447a5abefdab8788a15b4567589e", + "price_registry": "0x114a20a10b43d4115e5aeef7345a1a71d2a60c57", + "wrapped_native": "0x32d5D5978905d9c6c2D4C417F0E06Fe768a4FB5a", "src_contracts": { - "1" : { - "on_ramp": "0xD44371bFDe87f2db3eA6Df242091351A06c2e181", - "deployed_at": 3316617 + "BSC Testnet": { + "on_ramp": "0x17e7963bb9a8265b316375268504c2706fd5c967", + "deployed_at": 40921826 + }, + "Optimism Goerli": { + "on_ramp": "0x782a7ba95215f2f7c3dd4c153cbb2ae3ec2d3215", + "deployed_at": 29167620 + }, + "Sepolia Testnet": { + "on_ramp": "0xc8b93b46bf682c39b3f65aa1c135bc8a95a5e43a", + "deployed_at": 29170089 } }, "dest_contracts": { - "1": { - "off_ramp": "0x391B9B016C3bBA61F02e7ddd345130415908B9c7", - "commit_store": "0x398d2164a3F61353B4619814A31cC74A7741612E", - "receiver_dapp": "0xAFa2c441a83bBCEDc2E8c5c6f66248aFD8b9af3d" + "BSC Testnet": { + "off_ramp": "0x29c5567e38790527ee04fa1a7e0b06c38d436682", + "commit_store": "0x5b19d30862e0872549ee980efa99d0d047624428", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + }, + "Optimism Goerli": { + "off_ramp": "0xff4b0c64c50d2d7b444cb28699df03ed4bbaf44f", + "commit_store": "0xb69923dfb790e622084b774b99bb45f68904d6a4", + "receiver_dapp": "0x68c13fEe38e7a28019a88Bee52477C9402D71104" + }, + "Sepolia Testnet": { + "off_ramp": "0x7a0bb92bc8663abe6296d0162a9b41a2cb2e0358", + "commit_store": "0x7eef73aca8657aaefd509a97ee75aa6740046e75", + "receiver_dapp": "0xEF6a6f52D0fC494Fb59Ee9C1813AF38c7F8d9278" } } }, @@ -261,110 +407,131 @@ "0x658af0d8ecbb13c5fd5b545ac7316e50cc07cf6e" ], "arm": "0x0ea0d7b2b78dd3a926fc76d6875a287f0aeb158f", - "arm_proxy" : "0xac8cfc3762a979628334a0e4c1026244498e821b", "router": "0x554472a2720e5e7d5d3c817529aba05eed5f82d8", "price_registry": "0xe42ecce39ce5bd2bbf2443660ba6979eeafd48df", "wrapped_native": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", "src_contracts": { - "11155111": { - "on_ramp": "0xa799c1855875e79b2e1752412058b485ee51aec4", - "deployed_at": 23753755 - }, - "420" : { + "Optimism Goerli": { "on_ramp": "0x097076fbd8573418c77d2600606ad063c0e3cc7c", "deployed_at": 23755228 }, - "80001" : { + "Polygon Mumbai": { "on_ramp": "0x762aabc808270fadfdd9e4186739920d68106673", "deployed_at": 23754063 + }, + "Sepolia Testnet": { + "on_ramp": "0xa799c1855875e79b2e1752412058b485ee51aec4", + "deployed_at": 23753755 } }, "dest_contracts": { - "11155111": { - "off_ramp": "0x61c67e7b7c90ed1a44dabb26c33900270df7a144", - "commit_store": "0xb4407405465a5dab21fe6e6b748b42a2dccc5e9d", - "receiver_dapp": "0x19910CB895d3F611c4143B80bC194C52ebFaA60A" - }, - "420" : { + "Optimism Goerli": { "off_ramp": "0x0f287140d86335b37ae2ad0707992ecd4202d5b7", "commit_store": "0x5a7fa03e52628a0a6f0ab637f10ba45b68f9ad33", "receiver_dapp": "0x1C23955C7770E4fF85Cd806520A7Ce6A69745E96" }, - "80001": { + "Polygon Mumbai": { "off_ramp": "0x31cf2040d53f178d168997c658d1a7fc5fa7d215", "commit_store": "0xa60821b061116054672d102c0b59290910fb51e2", "receiver_dapp": "0x58100cF5d6432037f391bEb9b2D0f791Da0E4d02" + }, + "Sepolia Testnet": { + "off_ramp": "0x61c67e7b7c90ed1a44dabb26c33900270df7a144", + "commit_store": "0xb4407405465a5dab21fe6e6b748b42a2dccc5e9d", + "receiver_dapp": "0x19910CB895d3F611c4143B80bC194C52ebFaA60A" } } }, - "Sepolia Testnet": { - "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", + "BSC Testnet": { + "fee_token": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06", "bridge_tokens": [ - "0x779877A7B0D9E8603169DdbD7836e478b4624789" + "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06" ], "bridge_tokens_pools": [ - "0x5344b4bf5ae39038a591866d2853b2b1db622911" + "0x8a710bbd77661d168d5a6725bd2e514ba1bff59d" ], - "arm": "0xb4d360459f32dd641ef5a6985ffbac5c4e5521aa", - "arm_proxy" : "0xba3f6251de62ded61ff98590cb2fdf6871fbb991", - "router": "0xd0daae2231e9cb96b94c8512223533293c3693bf", - "price_registry": "0x8737a1c3d55779d03b7a08188e97af87b4110946", - "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", + "arm": "0xf9a21b587111e7e8745fb8b13750014f19db0014", + "router": "0x9527e2d01a3064ef6b50c1da1c0cc523803bcff2", + "price_registry": "0xa8bfa4fc9f97793297793291e7f63da18eccbe05", + "wrapped_native": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", "src_contracts": { - "43113": { - "on_ramp": "0xe42ecce39ce5bd2bbf2443660ba6979eeafd48df", - "deployed_at": 3816446 + "Base Goerli": { + "on_ramp": "0x0648fe506f5ae251979ea0a1c3c2a14e33255cbc", + "deployed_at": 33280072 }, - "420" : { - "on_ramp": "0x365408d655a6cdf8bc668fd6cebe1bb16a403ca6", - "deployed_at": 3816777 + "Polygon Mumbai": { + "on_ramp": "0x03319347bb6db2f3158a8f8c68b4ad562cef8279", + "deployed_at": 33269206 }, - "421613" : { - "on_ramp": "0x2c0b51f491ceaefe8c24c0199fce62d7b040470a", - "deployed_at": 3816651 + "Sepolia Testnet": { + "on_ramp": "0x3df2913ec50702957ce34f1d22ffe98edd9efefc", + "deployed_at": 32557058 + } + }, + "dest_contracts": { + "Base Goerli": { + "off_ramp": "0x8d482ecbe85bd0ef13d8c56e0d83e93ccf0d66c8", + "commit_store": "0x6ea3de96a33617c3620b7c33c22656f860ddc255", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" }, - "80001" : { - "on_ramp": "0x23438be3256369316e53fd2ef1cd2bdfaf22f6ad", - "deployed_at": 3819110 + "Polygon Mumbai": { + "off_ramp": "0xadbc0d83d675c5c381f9f4303b55c56d72a5e947", + "commit_store": "0x35a926bc94654627443e436bb3d197d62821cf05", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" }, - "97" : { - "on_ramp": "0x06245d9527b37bf6d66edd02bf013fc3e3e34f41", - "deployed_at": 4113317 + "Sepolia Testnet": { + "off_ramp": "0x9163dba5d99fa6633995bd1ae60f13d7f755b298", + "commit_store": "0x6ea155fc77566d9dce01b8aa5d7968665dc4f0c5", + "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + } + } + }, + "Base Goerli": { + "fee_token": "0xd886e2286fd1073df82462ea1822119600af80b6", + "is_native_fee_token" : true, + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0xe5bd6bcb6fa8e5236984d5ea127de5047f93b5ff", + "router": "0xa8c0c11bf64af62cdca6f93d3769b88bdd7cb93d", + "price_registry": "0x8a710bbd77661d168d5a6725bd2e514ba1bff59d", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli": { + "on_ramp": "0x2e8fc2ec6f18542cf2185a450c2dc652d7e221b6", + "deployed_at": 9656716 }, - "84531" : { - "on_ramp": "0xef7023a045dc652fd44647be5d12434f49dd256c", - "deployed_at": 4113256 + "BSC Testnet": { + "on_ramp": "0x6b6b328cb1467d906389a1bbe54359c56000422c", + "deployed_at": 9671734 + }, + "Optimism Goerli": { + "on_ramp": "0x0549c3fc7faece40f19f3096f7401f382db1568d", + "deployed_at": 9654923 + }, + "Sepolia Testnet": { + "on_ramp": "0x19b1bac554111517831acadc0fd119d23bb14391", + "deployed_at": 8586697 } }, "dest_contracts": { - "43113": { - "off_ramp": "0x1f06781450e994b0005ce2922fca78e2c72d4353", - "commit_store": "0xf3855a07bf75c4e0b4ddbeb7784badc9dd2ca274", - "receiver_dapp": "0xBB1Ac68B35D4DE11Ea110Ed14D07054c0F101432" - }, - "420" : { - "off_ramp": "0x0d3299ee55d493b8d9aafc834a6fd5dcbc4a409a", - "commit_store": "0x1576d23f986ecb572a4c839ba6758ca05c1eadc2", - "receiver_dapp": "0x59d7ec1883DbCc5510943A0788D5d437f5D1743d" - }, - "421613" : { - "off_ramp": "0x1d649a11fa14024f9fa2058a6b5b473ea308b688", - "commit_store": "0xc677d898f06cee7b5f6ecbd0f72df5125cebbfc9", - "receiver_dapp": "0xa2428b38A9aa97b663d3B8411Bd3df2675f22714" + "Arbitrum Goerli": { + "off_ramp": "0xa5007c13b7df93e7647ffd671b9982cdced4e7ff", + "commit_store": "0x693fdcbbf0c6d4b3b0034021fe64e98f8a081712", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" }, - "80001" : { - "off_ramp": "0x026fb7c16f1d0082809ff2335715f27e1e074ff6", - "commit_store": "0x290789a55e2e26480f9c04c583d1d5c682aba49a", - "receiver_dapp": "0x5529276B5D53496B98CFde5C8FF2F577d88E9aC7" + "BSC Testnet": { + "off_ramp": "0x0a4a2f5517b5546fa3a05b2226f951094c62a9d9", + "commit_store": "0x67fd22597147e88e76fd141ba15abd692fa58261", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" }, - "97" : { - "off_ramp": "0x6e8ab23fb9723e91fceaef309d061ba39a97ce72", - "commit_store": "0xb238559e1c2bc9ec04b27525569aa33be8f6d491", - "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + "Optimism Goerli": { + "off_ramp": "0xd7e2f42d3b7feac0c39d06484de34f1959cdd9ea", + "commit_store": "0x94301e622996ab441fd632fcc8e971116be02b87", + "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" }, - "84531": { - "off_ramp": "0xdf911bb979dd3b785b4dc2989334bb39d3628174", - "commit_store": "0x080b960a196ffcd7c94246f7f79c97ed3d078921", + "Sepolia Testnet": { + "off_ramp": "0x06eb6ebdc74f30c612ccf0fd7560560f5d67ef87", + "commit_store": "0x19cc3ed5cdbd013c48798e0415228799fa7599df", "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" } } @@ -378,233 +545,1509 @@ "0xdecfaf632175915bdf38c00d9d9746e8a90a56c4" ], "arm": "0xeaf6968fab9c54ac31c3679f120705b5019d3546", - "arm_proxy" : "0x4eb4dbdb3c3b56e5e209abf9c424a3834f2087d0", "router": "0xeb52e9ae4a9fb37172978642d4c141ef53876f26", "price_registry": "0x490f3b46fba6af0d7499867a73469a077251c2bb", "wrapped_native": "0x4200000000000000000000000000000000000006", "src_contracts": { - "43113": { - "on_ramp": "0xf33303166911ff86ad1a5ea94d459b4ba0ba8cc9", - "deployed_at": 11482157 - }, - "11155111" : { - "on_ramp": "0x64877f0b53e801adeb8d65f9706f7b134b82971c", - "deployed_at": 11482670 - }, - "421613" : { + "Arbitrum Goerli": { "on_ramp": "0x6bb8d729c35f29df532eb3998ddace336187c84b", "deployed_at": 11481052 }, - "84531" : { + "Avalanche Fuji": { + "on_ramp": "0xf33303166911ff86ad1a5ea94d459b4ba0ba8cc9", + "deployed_at": 11482157 + }, + "Base Goerli": { "on_ramp": "0x1a674645f3eb4147543fca7d40c5719cbd997362", "deployed_at": 14537696 + }, + "Sepolia Testnet": { + "on_ramp": "0x64877f0b53e801adeb8d65f9706f7b134b82971c", + "deployed_at": 11482670 } }, "dest_contracts": { - "43113": { - "off_ramp": "0xee8ce182ea0c0edecf06c2a032a17b2058fc5a04", - "commit_store": "0x2980de4ce178bc8bb6840abd2ef0e2a7c8e7272f", - "receiver_dapp": "0x18992693d445f70dc931e5711b0732c569951397" - }, - "11155111" : { - "off_ramp": "0xdc4606e96c37b877f2c9ddda82104c85a198a82d", - "commit_store": "0xb7019c10bd604768c9cf5b3d086a2e661559a189", - "receiver_dapp": "0x766f4279A17c65452E9f25Aa6d9eC75ca8B1a241" - }, - "421613" : { + "Arbitrum Goerli": { "off_ramp": "0xee55842b1d68224d9eef238d4736e851db613630", "commit_store": "0x4f57b2d4b3b42f09cd7ef48254d2c31b6b525763", "receiver_dapp": "0xF4b300716856e468f584163937E26aEda5741eCB" }, - "84531": { + "Avalanche Fuji": { + "off_ramp": "0xee8ce182ea0c0edecf06c2a032a17b2058fc5a04", + "commit_store": "0x2980de4ce178bc8bb6840abd2ef0e2a7c8e7272f", + "receiver_dapp": "0x18992693d445f70dc931e5711b0732c569951397" + }, + "Base Goerli": { "off_ramp": "0xd0a9f52562f9111a4cd66d6615b8773bf96e6b74", "commit_store": "0x7d8fb097848183cd12420e0fbe813ec697a07198", "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + }, + "Sepolia Testnet": { + "off_ramp": "0xdc4606e96c37b877f2c9ddda82104c85a198a82d", + "commit_store": "0xb7019c10bd604768c9cf5b3d086a2e661559a189", + "receiver_dapp": "0x766f4279A17c65452E9f25Aa6d9eC75ca8B1a241" } } }, - "Arbitrum Goerli" : { + "Arbitrum Goerli-1": { + "is_mock_arm": true, "fee_token": "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28", - "bridge_tokens": [ - "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28" - ], - "bridge_tokens_pools": [ - "0x044a6b4b561af69d2319a2f4be5ec327a6975d0a" - ], - "arm": "0x8af4204e30565df93352fe8e1de78925f6664da7", - "arm_proxy" : "0x3cc9364260d80f09ccac1ee6b07366db598900e6", - "router": "0x88e492127709447a5abefdab8788a15b4567589e", - "price_registry": "0x114a20a10b43d4115e5aeef7345a1a71d2a60c57", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x3C66740724297B50c10CF66a8e15C5EBb43F735D", + "router": "0xD2De582855d3Eec43aD612A3faFBe322C263427C", + "price_registry": "0xCe311C8CFFaD3980c8678dEf78317933161f67dd", "wrapped_native": "0x32d5D5978905d9c6c2D4C417F0E06Fe768a4FB5a", "src_contracts": { - "420": { - "on_ramp": "0x782a7ba95215f2f7c3dd4c153cbb2ae3ec2d3215", - "deployed_at": 29167620 + "Avalanche Fuji-1": { + "on_ramp": "0xfCaBE24E9f81D243e84565bd0ed1F2386Ad3eD2f", + "deployed_at": 43075031 }, - "11155111" : { - "on_ramp": "0xc8b93b46bf682c39b3f65aa1c135bc8a95a5e43a", - "deployed_at": 29170089 + "BSC Testnet-1": { + "on_ramp": "0x2D204A86c42329f40f3b5B4c4a0D67E704E052d0", + "deployed_at": 43074881 }, - "97" : { - "on_ramp": "0x17e7963bb9a8265b316375268504c2706fd5c967", - "deployed_at": 40921826 + "Base Goerli-1": { + "on_ramp": "0x564F5C24c4bBe8498DEc65A1B73c3cd3a38a28eE", + "deployed_at": 43074928 + }, + "Optimism Goerli-1": { + "on_ramp": "0x944F059ca5eEF187daef3D8A8726340D428FDfC6", + "deployed_at": 43074950 + }, + "Sepolia Testnet-1": { + "on_ramp": "0x191390fE017532801f1806595178408a5E51EF25", + "deployed_at": 43074864 } }, "dest_contracts": { - "420": { - "off_ramp": "0xff4b0c64c50d2d7b444cb28699df03ed4bbaf44f", - "commit_store": "0xb69923dfb790e622084b774b99bb45f68904d6a4", - "receiver_dapp": "0x68c13fEe38e7a28019a88Bee52477C9402D71104" + "Avalanche Fuji-1": { + "off_ramp": "0x09c51A6C77a642274586784a6E1765091a7aCc7A", + "commit_store": "0xD29E56dFFC244a6EFddBB7FD68f0256Da4932D90", + "receiver_dapp": "0x28e5e4CF38664997b32Cf3eCfeD3943849D1b724" }, - "11155111" : { - "off_ramp": "0x7a0bb92bc8663abe6296d0162a9b41a2cb2e0358", - "commit_store": "0x7eef73aca8657aaefd509a97ee75aa6740046e75", - "receiver_dapp": "0xEF6a6f52D0fC494Fb59Ee9C1813AF38c7F8d9278" + "BSC Testnet-1": { + "off_ramp": "0xeEE91056b7344534134b2511665590Ec8aA4A8EF", + "commit_store": "0x591F33Eb74C4C7D077f0139B18511B1dE8fB66Ef", + "receiver_dapp": "0x640745D9eb02039f3d7Bd22e494B7ba80454db28" }, - "97" : { - "off_ramp": "0x29c5567e38790527ee04fa1a7e0b06c38d436682", - "commit_store": "0x5b19d30862e0872549ee980efa99d0d047624428", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Base Goerli-1": { + "off_ramp": "0xFD0885391BA4A1Aa8E968f60d556D56D3a61077d", + "commit_store": "0xE736Ed75089e1a3e04bBaCA11893A76fb0A57BB1", + "receiver_dapp": "0xBE29A5B6B5e9F447e5f80A05420Dc0b9d637b942" + }, + "Optimism Goerli-1": { + "off_ramp": "0x1925bca238d975e916AE3f9984Ab2759F2aDd4cF", + "commit_store": "0x93886c20dF9D86502ca2f163B7594f20E22D4027", + "receiver_dapp": "0xCe8A903dE11ddc103D1A6cf2C5c021872e5AaeFB" + }, + "Sepolia Testnet-1": { + "off_ramp": "0x715b27E9d7d8A73684C0951b867465B1591109a4", + "commit_store": "0x9ef068D31f93325623E9cfE9756A58405401a653", + "receiver_dapp": "0x17F7f389b80c79f78A82E6CDA12494fcd5BbCDb9" } } }, - "Polygon Mumbai" : { - "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", - "bridge_tokens": [ - "0x326C977E6efc84E512bB9C30f76E30c160eD06FB" - ], - "bridge_tokens_pools": [ - "0x6fce09b2e74f649a4494a1844219cb0d86cfe8b7" - ], - "arm": "0x917a6913f785094f8b06785aa8a884f922a650d8", - "arm_proxy" : "0x235ce3408845a4767a2eaa2a3d8ef0848d283f1f", - "router": "0x70499c328e1e2a3c41108bd3730f6670a44595d1", - "price_registry": "0x9bd312170aa145ef98453940dc9ab894235b063e", - "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "Arbitrum Goerli-2": { + "is_mock_arm": true, + "fee_token": "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x4b318890a8Dd9E15F1905cEB141044Ce5D9df985", + "router": "0x4F81a04BCB55D271F3d60aA546f4Bf5D8AC14065", + "price_registry": "0x461722E30ABC2532Ec1CF6D94405F1e98f61B370", + "wrapped_native": "0x32d5D5978905d9c6c2D4C417F0E06Fe768a4FB5a", "src_contracts": { - "43113": { - "on_ramp": "0x48601a62aa4cb289d006ff4c14023e9d8a7e5a88", - "deployed_at": 36910973 + "Avalanche Fuji-2": { + "on_ramp": "0xF8694639B5F148C06833a1DF4251D3965DF275af", + "deployed_at": 43075027 }, - "11155111" : { - "on_ramp": "0xa83f2cecb391779b59022eded6ebba0d7ec01f20", - "deployed_at": 37526794 + "BSC Testnet-2": { + "on_ramp": "0x39902524F192C9ACe6B3C1a8b7be66842C4EA92A", + "deployed_at": 43074879 }, - "97" : { - "on_ramp": "0xfffd50b1e72974e225529d0797d12581bccb22b9", - "deployed_at": 40030102 + "Base Goerli-2": { + "on_ramp": "0x73c2Ae126512c2ba2fDaDF3788d9A33054074241", + "deployed_at": 43074940 + }, + "Optimism Goerli-2": { + "on_ramp": "0xBce34b1dba66f9E6aBe260D0Eeb3F501837efab4", + "deployed_at": 43074952 + }, + "Sepolia Testnet-2": { + "on_ramp": "0x7b925849aD41D524a4d62587df7a455f50f2eFEB", + "deployed_at": 43074865 } }, "dest_contracts": { - "43113": { - "off_ramp": "0xf11e96f85e1038c429d32a877e2225d37cde10e2", - "commit_store": "0x6b6b328cb1467d906389a1bbe54359c56000422c", - "receiver_dapp": "0xf8B335b847B4DFBB57dd0c0a2F440CD1251FebA3" + "Avalanche Fuji-2": { + "off_ramp": "0xA62d1522962EC03e362a52a8818Ccb4fB80B28C2", + "commit_store": "0xb7d71eB87412840178571E95b05B1703d99A81ED", + "receiver_dapp": "0xbE015Db186383cd09b2170D169E7dF9694a447F9" }, - "11155111" : { - "off_ramp": "0xbe582db704bd387222c70ca2e5a027e5e2c06fb7", - "commit_store": "0xf06ff5d2084295909119ca541e93635e7d582ffc", - "receiver_dapp": "0x7d829100e7752E3928BCEeddcAAc655536157Fdd" + "BSC Testnet-2": { + "off_ramp": "0x4a090E99773f46238AbAF85E6DC28De54F2F7202", + "commit_store": "0xF2E35f4802F760481BeB0c366673D932618bFEB6", + "receiver_dapp": "0x5d9B554E8Dd3B4899b4841DFbe11EA55fF49cC8A" }, - "97" : { - "off_ramp": "0xa52d36272621dbb9b6c0d51e9f4f57b7eae2ebdb", - "commit_store": "0x502709022c3aab16c9cf72600932806061667333", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Base Goerli-2": { + "off_ramp": "0x42731D8B727744B6AEe2Bf9F0966571DC02A1d1f", + "commit_store": "0x7BF3d1A32D453F379Ff36679FdfDE1072eb3235B", + "receiver_dapp": "0xab3dC17BC8cd7A94682f1B33F2cE1eC4DB58fAB6" + }, + "Optimism Goerli-2": { + "off_ramp": "0x538e1EDD7De66248321713beC94fa3D9D0c15DB2", + "commit_store": "0x29316E9d9A4FBe3910664944958Ac5C336c0F5a9", + "receiver_dapp": "0x588e7eBa8df2155F3895a07E49026AF736BE8A8F" + }, + "Sepolia Testnet-2": { + "off_ramp": "0xe1B7DB4993f6a56a9A3DdCeB845848aE1305E9FF", + "commit_store": "0xfe88eEdEe1e20d239Fcb9851A0c850274E53371F", + "receiver_dapp": "0x942750C32A9B502b4f39fF49a160c7625F38274A" + } + } + }, + "Arbitrum Goerli-3": { + "is_mock_arm": true, + "fee_token": "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x4b318890a8Dd9E15F1905cEB141044Ce5D9df985", + "router": "0x476c5fF09f07361D235c068Ae274A8fC0e6FC437", + "price_registry": "0x461722E30ABC2532Ec1CF6D94405F1e98f61B370", + "wrapped_native": "0x32d5D5978905d9c6c2D4C417F0E06Fe768a4FB5a", + "src_contracts": { + "Avalanche Fuji-3": { + "on_ramp": "0x03A3aC6Cd8BAEcf83062103647337533B645BeBf", + "deployed_at": 43672837 + }, + "BSC Testnet-3": { + "on_ramp": "0x80F8965d9f38FeD2FE01Ee014Dd6458f88824af3", + "deployed_at": 43672865 + }, + "Base Goerli-3": { + "on_ramp": "0x0619dC4e23C7Ea02c0CeD916099F2Ad440001C2B", + "deployed_at": 43672849 + }, + "Optimism Goerli-3": { + "on_ramp": "0x84B8adB571C76D7a814AC2f355652834254F8311", + "deployed_at": 43672825 + }, + "Sepolia Testnet-3": { + "on_ramp": "0x39A5268f1A3392Af8d134E8C90f96470C110A442", + "deployed_at": 43672856 + } + }, + "dest_contracts": { + "Avalanche Fuji-3": { + "off_ramp": "0x7582a0bd9f92cB9fE8d7087Ff4ea67b05a5D9ce7", + "commit_store": "0x43e558cDc938392989c5a3d2D9e3342FC6b723a5", + "receiver_dapp": "0xfd236C90D53369775F3aA4DbdBa8246209cfce25" + }, + "BSC Testnet-3": { + "off_ramp": "0x31a7010B31aBba1c0794011ED19BA7Fa040220c6", + "commit_store": "0xA7CF702ce747361C7699AE38BfC28D41A7328774", + "receiver_dapp": "0xC2Ca79d2474b2Aa1800Cc0d2F7DC755Ff5e28fE3" + }, + "Base Goerli-3": { + "off_ramp": "0x53FC1Ec12084679871A069448699337BaED20578", + "commit_store": "0x1594605e3b980B9C3B2962dca24dec702EDea7D4", + "receiver_dapp": "0xB8f813632B310574cade8E6FBD272f5A31fcE721" + }, + "Optimism Goerli-3": { + "off_ramp": "0xA1fb511a96C71C82069cfB176F9e2c4e61eEE2f7", + "commit_store": "0x922B30Da5CB4CDD803347B0Ae6698ACEC2884cA6", + "receiver_dapp": "0x1b8E488E4d0000A964776912E48335ED6d52E587" + }, + "Sepolia Testnet-3": { + "off_ramp": "0xbF7481206f1A31760C9C0591ACc06D9e8499595e", + "commit_store": "0xB63D0108289b465B2914f20ddC0c1cBe59c4Af9F", + "receiver_dapp": "0xbc9fA9dD54Ff63222479fdA7A9cEB58b08ABD011" } } }, - "BSC Testnet" : { + "Arbitrum Goerli-4": { + "is_mock_arm": true, + "fee_token": "0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x4b318890a8Dd9E15F1905cEB141044Ce5D9df985", + "router": "0xb0df07880d22C1AD01c235249e7EFD9f125a0cb1", + "price_registry": "0x461722E30ABC2532Ec1CF6D94405F1e98f61B370", + "wrapped_native": "0x32d5D5978905d9c6c2D4C417F0E06Fe768a4FB5a", + "src_contracts": { + "Avalanche Fuji-4": { + "on_ramp": "0x3Afc4258DC7392bA44c6CBCE3f0A6bE85831fD5B", + "deployed_at": 43672840 + }, + "BSC Testnet-4": { + "on_ramp": "0xef9199d6cfb3ee415b4bfdF84e0d0C1D9Ce1Ccfb", + "deployed_at": 43672862 + }, + "Base Goerli-4": { + "on_ramp": "0xA1540777feC6a552Ea9c21953d57966ad5a887D6", + "deployed_at": 43672851 + }, + "Optimism Goerli-4": { + "on_ramp": "0x2a014D3EBCC09fb6BB54f5eb41cbA226Fe29eE1E", + "deployed_at": 43672835 + }, + "Sepolia Testnet-4": { + "on_ramp": "0x825E1B8fFD7CF8dD00AE0FD38355E2D20de1797F", + "deployed_at": 43672860 + } + }, + "dest_contracts": { + "Avalanche Fuji-4": { + "off_ramp": "0x89052360F6DDF4Be690C32e1B3aFCaD940b7935C", + "commit_store": "0x4a3E902be8CF22B4Bb5A25F088947E268489A018", + "receiver_dapp": "0x9c8940c940B51ADD89eb1758f9f8a13Ce6345888" + }, + "BSC Testnet-4": { + "off_ramp": "0xd9C7825148eC08aa2721d5D37642C3944cbB9ad9", + "commit_store": "0x7A899A0051B87B1a55014B7c47361a6844349C08", + "receiver_dapp": "0x971e7caDD51Ee26963619D27aba1044a18F5c8A5" + }, + "Base Goerli-4": { + "off_ramp": "0xe6688145b8cb65CF26363B60dAe1B751532AFfc2", + "commit_store": "0x060c3468cc0a049eC62447f8279e8700260Fa840", + "receiver_dapp": "0x119295630AE140d11716351D99D31C303f15538F" + }, + "Optimism Goerli-4": { + "off_ramp": "0x1a8Aa7BAd74e98693aA5E12bd3f8724882d5095c", + "commit_store": "0xa6D2e78e90140D41e2E0B5da0Fd49311606896a9", + "receiver_dapp": "0x4D94BC4c471F96Fb5bA1B6538506aD30Cca020a9" + }, + "Sepolia Testnet-4": { + "off_ramp": "0x7E68D46f791d71aC429D31459c1cC77507AF812d", + "commit_store": "0xCc46356b7C42355c6E264a42Fabd4690134C2Aed", + "receiver_dapp": "0x96Ea2127F0B6BE0Ccf34aF85Dcba49dAB2c1b6c6" + } + } + }, + "BSC Testnet-1": { + "is_mock_arm": true, "fee_token": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06", - "bridge_tokens": [ - "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06" - ], - "bridge_tokens_pools": [ - "0x8a710bbd77661d168d5a6725bd2e514ba1bff59d" - ], - "arm": "0xf9a21b587111e7e8745fb8b13750014f19db0014", - "arm_proxy" : "0xa8c0c11bf64af62cdca6f93d3769b88bdd7cb93d", - "router": "0x9527e2d01a3064ef6b50c1da1c0cc523803bcff2", - "price_registry": "0xa8bfa4fc9f97793297793291e7f63da18eccbe05", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x86b9af794d83DAe5452d48957109227A59E32bc4", + "router": "0x8a082b4e5d46B4bc5fb4AE81Bd012269f27878A5", + "price_registry": "0xd96C62E1D6a3EabB0f04d8900A3Bb3dA9014Fd59", "wrapped_native": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", "src_contracts": { - "11155111" : { - "on_ramp": "0x3df2913ec50702957ce34f1d22ffe98edd9efefc", - "deployed_at": 32557058 + "Arbitrum Goerli-1": { + "on_ramp": "0xA81163e500F3F839467e866dec2F2B97CC15e304", + "deployed_at": 33570760 }, - "80001" : { - "on_ramp": "0x03319347bb6db2f3158a8f8c68b4ad562cef8279", - "deployed_at": 33269206 + "Avalanche Fuji-1": { + "on_ramp": "0x58fD2d9e9f16b900e731701B45b528Fb3d9C3a50", + "deployed_at": 33570769 }, - "84531" : { - "on_ramp": "0x0648fe506f5ae251979ea0a1c3c2a14e33255cbc", - "deployed_at": 33280072 + "Base Goerli-1": { + "on_ramp": "0xC869632eFDf4cc9A7bC37539eDe37718c4498768", + "deployed_at": 33570764 + }, + "Optimism Goerli-1": { + "on_ramp": "0xcEDf9cb2465fC439C19B648e5d11F6253693854D", + "deployed_at": 33570766 + }, + "Sepolia Testnet-1": { + "on_ramp": "0x3048d2d1897B2278A8f9bCbC13AAdd5fd0C945b0", + "deployed_at": 33570756 } }, "dest_contracts": { - "11155111" : { - "off_ramp": "0x9163dba5d99fa6633995bd1ae60f13d7f755b298", - "commit_store": "0x6ea155fc77566d9dce01b8aa5d7968665dc4f0c5", - "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + "Arbitrum Goerli-1": { + "off_ramp": "0xcdAc3deE846f51C034CB606b42fEdE81560cA245", + "commit_store": "0x6a12C3251EcfE1A69c609BCe17F333433366DcbB", + "receiver_dapp": "0xeFf383ea10AD1c52566D3A16CDc6A9DBCf86676D" }, - "80001" : { - "off_ramp": "0xadbc0d83d675c5c381f9f4303b55c56d72a5e947", - "commit_store": "0x35a926bc94654627443e436bb3d197d62821cf05", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Avalanche Fuji-1": { + "off_ramp": "0x5569DCE9e02C8179855f390625B5aB2BD068f5dd", + "commit_store": "0xeaece6f4d182177e9474588b3eb0feecf4489a58", + "receiver_dapp": "0xcE956b42EaD4AbDBA1808991068041a84788Fec4" }, - "84531" : { - "off_ramp": "0x8d482ecbe85bd0ef13d8c56e0d83e93ccf0d66c8", - "commit_store": "0x6ea3de96a33617c3620b7c33c22656f860ddc255", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Base Goerli-1": { + "off_ramp": "0x6589a24739BEeEBc7e7EDB9b8e6acb9D91eD6b38", + "commit_store": "0xdF3e53749A0a8781d052329CECdc93e3b038F4dC", + "receiver_dapp": "0x3d6d340692E08887e35800e7dd105685f87CBe64" + }, + "Optimism Goerli-1": { + "off_ramp": "0x8765f1dfA7e127290afd8BF92084394a8aC73A33", + "commit_store": "0xBa5324cBf19DFdD431349cc7ee88F0edf45A4D88", + "receiver_dapp": "0xdd7b1893F32a1db2f5fbE60708403d70A781c9a1" + }, + "Sepolia Testnet-1": { + "off_ramp": "0x11f9640A1CaBE7C08126fE0b51B3b4b2fae27444", + "commit_store": "0x6932a2F65fd143CF3A8878BF85290E85126418Fb", + "receiver_dapp": "0x7807C5187797208bea89F1967165B54Cc828E762" } } }, - "Base Goerli" : { - "fee_token": "0xd886e2286fd1073df82462ea1822119600af80b6", - "arm": "0xe5bd6bcb6fa8e5236984d5ea127de5047f93b5ff", - "arm_proxy" : "0x4c10d67e4b8e18a67a7606defdce42ccc281d39b", - "router": "0xa8c0c11bf64af62cdca6f93d3769b88bdd7cb93d", - "price_registry": "0x8a710bbd77661d168d5a6725bd2e514ba1bff59d", + "BSC Testnet-2": { + "is_mock_arm": true, + "fee_token": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x78BdF1fa80f43f8dA8cbd85151B8e31e59E1ee13", + "router": "0xF13Cfac3A6350975550f358A6DbEdab84d3a4092", + "price_registry": "0xF89bF3b471EE4d268472E768bF488013864afD0B", + "wrapped_native": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", + "src_contracts": { + "Arbitrum Goerli-2": { + "on_ramp": "0xa86CabB64c75a2489BA719f7afed04Bd7A717137", + "deployed_at": 33570760 + }, + "Avalanche Fuji-2": { + "on_ramp": "0xE0d3d9f0E6181AB4eEc2578839825fEEC2fEFE9c", + "deployed_at": 33570769 + }, + "Base Goerli-2": { + "on_ramp": "0xC24985E626fb1e93E1B750240Cf1B36DB48c5c84", + "deployed_at": 33570764 + }, + "Optimism Goerli-2": { + "on_ramp": "0xfD0cb62e225FB9fa4BD7450EDeDd8A2133fFc2b0", + "deployed_at": 33570764 + }, + "Sepolia Testnet-2": { + "on_ramp": "0x212a73B06343698f4ea8526D3605FA041AC1c714", + "deployed_at": 33570756 + } + }, + "dest_contracts": { + "Arbitrum Goerli-2": { + "off_ramp": "0x568250875D5cfb983372D7551F69444371e497a9", + "commit_store": "0xDB76939E46E08e7afB34A63472032D30d6857245", + "receiver_dapp": "0x5262af1245B612c186eaF27AE602e09a09D4cC98" + }, + "Avalanche Fuji-2": { + "off_ramp": "0x8F0097F37eE35fF07B7289Ef275B1A6AAc497b83", + "commit_store": "0x8F9134cDe4fF6A45C5FF1568bD2e1188f51Ff194", + "receiver_dapp": "0x93b828C608D536EeDed6eD8ed9Ea273337e171D2" + }, + "Base Goerli-2": { + "off_ramp": "0x43825EA6a7ab9D4b3054e631EB9e9F1646c4cd07", + "commit_store": "0xae0700EF9D1aAF703D8C4497817d4D2EB6e0eCA0", + "receiver_dapp": "0x8E5500CF568093896797E3c056EA15bff8AB1Ce3" + }, + "Optimism Goerli-2": { + "off_ramp": "0x8cC0Ca2cc336c03C1600585Ce21926Bc65Ca46eB", + "commit_store": "0x8c429C7709DdED5817e63db075E55eB934b4F5b6", + "receiver_dapp": "0x0178b04baDbb44650bD62808CD327F01071f4109" + }, + "Sepolia Testnet-2": { + "off_ramp": "0xA6d935cbe192543FF8e58e930156ABF1BCFcDc01", + "commit_store": "0x59959D544c81Fcacf8506d8084cBD99376b25712", + "receiver_dapp": "0xe41bA28D2673410228346B117efc903091c3551b" + } + } + }, + "BSC Testnet-3": { + "is_mock_arm": true, + "fee_token": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x78BdF1fa80f43f8dA8cbd85151B8e31e59E1ee13", + "router": "0x67a89f023378b457E01dFfceF3c2a7E3922ac4ef", + "price_registry": "0xF89bF3b471EE4d268472E768bF488013864afD0B", + "wrapped_native": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", + "src_contracts": { + "Arbitrum Goerli-3": { + "on_ramp": "0x28c32c0381bAC68ECd074EFf42e34004078E390f", + "deployed_at": 33664955 + }, + "Avalanche Fuji-3": { + "on_ramp": "0xB3A2f0BED6174eA061b69188E07A3fdFF38B86E1", + "deployed_at": 33664955 + }, + "Base Goerli-3": { + "on_ramp": "0x143B484D1E7F383f76B40Fa07B943DAC4bfB5971", + "deployed_at": 33664955 + }, + "Optimism Goerli-3": { + "on_ramp": "0x057225C609004bf87470f56C3F2Ba1C419CF7a43", + "deployed_at": 33664955 + }, + "Sepolia Testnet-3": { + "on_ramp": "0xaAA75BfB29Ae1FFd69583ae93c59655d54E2F783", + "deployed_at": 33664963 + } + }, + "dest_contracts": { + "Arbitrum Goerli-3": { + "off_ramp": "0x660fde9CdD37509830A5Bd779E3ef64496066C09", + "commit_store": "0x97a09Df388921A2A98e09cCf03f2b9d11d294e07", + "receiver_dapp": "0x3E231Ba6A09b9989B0B090d02b6e84881efCcD8a" + }, + "Avalanche Fuji-3": { + "off_ramp": "0x7373d09D6eCA4e0830CfC91FF8a760935b6BF425", + "commit_store": "0x9C712E5d23A0C20C79A6f84E8C0c41e3DE1A5DEc", + "receiver_dapp": "0x7cA325cfF9ff7ae116CB8A1F0C9a1524ee70CF2d" + }, + "Base Goerli-3": { + "off_ramp": "0x622ccE97d8c88EE48e0fC8BCE4da15c983Ea3472", + "commit_store": "0x53b9E91F03a78b641eBE6eBe4D5CF8afb77f83C0", + "receiver_dapp": "0x4f856Ab0cBf155f0Fe181CcBFD1C66C4018a7e6b" + }, + "Optimism Goerli-3": { + "off_ramp": "0x657415e55d8b09607546AA85F56996a621e5D6F5", + "commit_store": "0x0a7C9cd207B475C16D4Ae026721AF112Ae144f61", + "receiver_dapp": "0xcAB6D796b771CB9d9cbABBc1fB1800f0fAf993C8" + }, + "Sepolia Testnet-3": { + "off_ramp": "0x3Ad0B1554BfBca724Ee7dD98645cd4790073619d", + "commit_store": "0x85E70d4CB9d705D86045Ec353354c19764fB01B2", + "receiver_dapp": "0xA1903b2735735Bf5e0E34363bF866b349291cCbD" + } + } + }, + "BSC Testnet-4": { + "is_mock_arm": true, + "fee_token": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x78BdF1fa80f43f8dA8cbd85151B8e31e59E1ee13", + "router": "0x5C867ea1326f1a98c96752239C098A2195C979d3", + "price_registry": "0xF89bF3b471EE4d268472E768bF488013864afD0B", + "wrapped_native": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", + "src_contracts": { + "Arbitrum Goerli-4": { + "on_ramp": "0x14d209C5c0867e0e779BCBB407986826eC132E50", + "deployed_at": 33664955 + }, + "Avalanche Fuji-4": { + "on_ramp": "0x6978c45Cd210769DdB1c05Fd7F1841C0dE3dc9a6", + "deployed_at": 33664955 + }, + "Base Goerli-4": { + "on_ramp": "0xbAd5194F0af07c7D0e636F84b4ce23BE4146d342", + "deployed_at": 33664955 + }, + "Optimism Goerli-4": { + "on_ramp": "0x6C7163a7383a52044861fFC34cad9e93ee762592", + "deployed_at": 33664955 + }, + "Sepolia Testnet-4": { + "on_ramp": "0x987063C6c18358302C684075e2B9B2f53E274f15", + "deployed_at": 33664963 + } + }, + "dest_contracts": { + "Arbitrum Goerli-4": { + "off_ramp": "0xAf6E8c1E28C9BA4e943b9537ea8862C39dF65ba4", + "commit_store": "0xE6753049E6d9e5720955761a088116413263237a", + "receiver_dapp": "0x25D0cE8c83Aa384706D8a7Fa29d4BE63E4aD8F21" + }, + "Avalanche Fuji-4": { + "off_ramp": "0xF309cb74D08F13c0B5dD07B06c1fDF9f11836f18", + "commit_store": "0x560bD3A58b9e865A9446505D2272fed6AF19d4E0", + "receiver_dapp": "0x55130928Adc10A94158a8f2f39d19c51893D3479" + }, + "Base Goerli-4": { + "off_ramp": "0xb679892C6DF5d5B7C62B1820E259Dd5C806dd742", + "commit_store": "0x04727Cf448ef85abD04c1bd96E0D5Ead1ED28E9F", + "receiver_dapp": "0xf35c8F9bc29511b726C3FFB9Cdf0Cb1be14fd456" + }, + "Optimism Goerli-4": { + "off_ramp": "0x927ff2ECCb39d9C276FeF0c144C0D152F87F2522", + "commit_store": "0x6563d2aAdc3263054088E4d6d9581284cf25d29C", + "receiver_dapp": "0xC60eAF4BfA46D66319993583c5207376ADcafeb6" + }, + "Sepolia Testnet-4": { + "off_ramp": "0xA26Ec1785ea604B28aAC11321b6F7948714393B5", + "commit_store": "0x1865fF5Dc1E7a9027D85A2946e5B0f64cb904371", + "receiver_dapp": "0x296F2f509e636a9FC978160Aa34671BD11a4Ef6a" + } + } + }, + "Base Goerli-1": { + "is_mock_arm": true, + "fee_token": "0xD886E2286Fd1073df82462ea1822119600Af80b6", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x1E5b6ce8EB1071B2B1686ddd241fE6a3c07560DE", + "router": "0x798fc31e7f9df420004e30924e0bB2f70bd81A6B", + "price_registry": "0x3D81363D0b071327870133c7932893189c1A74E1", "wrapped_native": "0x4200000000000000000000000000000000000006", "src_contracts": { - "11155111" : { - "on_ramp": "0x19b1bac554111517831acadc0fd119d23bb14391", - "deployed_at": 8586697 + "Arbitrum Goerli-1": { + "on_ramp": "0x409cBD2ABcb81e9C4955f609d127A1e13681f8DE", + "deployed_at": 10107794 }, - "420" : { - "on_ramp": "0x0549c3fc7faece40f19f3096f7401f382db1568d", - "deployed_at": 9654923 + "Avalanche Fuji-1": { + "on_ramp": "0x704BDdbb7a54FAB8845555511C7386d44cF65716", + "deployed_at": 10107803 }, - "97" : { - "on_ramp": "0x6b6b328cb1467d906389a1bbe54359c56000422c", - "deployed_at": 9671734 + "BSC Testnet-1": { + "on_ramp": "0xEC264F72a32B05dda535D4afEaD0FDB5eFB59ED1", + "deployed_at": 10107790 }, - "421613" : { - "on_ramp": "0x2e8fc2ec6f18542cf2185a450c2dc652d7e221b6", - "deployed_at": 9656716 + "Optimism Goerli-1": { + "on_ramp": "0x64143a99D37De9681439e243DB55bFaEE744f969", + "deployed_at": 10107800 + }, + "Sepolia Testnet-1": { + "on_ramp": "0x8bAD2082cbF0D68bE5e9347a5b91F4d092440942", + "deployed_at": 10107788 } }, "dest_contracts": { - "11155111" : { - "off_ramp": "0x06eb6ebdc74f30c612ccf0fd7560560f5d67ef87", - "commit_store": "0x19cc3ed5cdbd013c48798e0415228799fa7599df", - "receiver_dapp": "0x8d0ed9FdA2CFB0A07225e28C09196BC059866558" + "Arbitrum Goerli-1": { + "off_ramp": "0xA317059893c4Cf4746939361324d5b4FFef32ef6", + "commit_store": "0x5414059785A1fDc13B0515bd27437cCa1e9bb35A", + "receiver_dapp": "0x0FB27151FAb7F4c9804e201013e9cEB4160b8F4E" }, - "420" : { - "off_ramp": "0xd7e2f42d3b7feac0c39d06484de34f1959cdd9ea", - "commit_store": "0x94301e622996ab441fd632fcc8e971116be02b87", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Avalanche Fuji-1": { + "off_ramp": "0xcF9278Ad7D9528784174e4D6fd30C5bD5ED0f8C3", + "commit_store": "0xa3ea4eb9Df43B8c281A91CeA9F9a66A4F542e25A", + "receiver_dapp": "0x0172C9cFb36A51C28B9E499722cd561b143f7b92" }, - "97" : { - "off_ramp": "0x0a4a2f5517b5546fa3a05b2226f951094c62a9d9", - "commit_store": "0x67fd22597147e88e76fd141ba15abd692fa58261", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "BSC Testnet-1": { + "off_ramp": "0xf6c000bF7803326465824c3016BF06523C81a983", + "commit_store": "0xcd055C60fc9FbB19B0A7a401ac7E166e859fB5cF", + "receiver_dapp": "0x3c2484b44566bD10aD03a1c212166D6B3625D024" }, - "421613" : { - "off_ramp": "0xa5007c13b7df93e7647ffd671b9982cdced4e7ff", - "commit_store": "0x693fdcbbf0c6d4b3b0034021fe64e98f8a081712", - "receiver_dapp": "0xda9e8e71bB750a996Af33ebB8aBb18cd9EB9DC75" + "Optimism Goerli-1": { + "off_ramp": "0xA02EB0b271E741015CF9A89C1dd6324617D95dc1", + "commit_store": "0x8e3fC15954915D6C9b9ABf0C747CE1c43e050Cbd", + "receiver_dapp": "0x552f6C63894c00D0979e614FF9B0300B4B974E45" + }, + "Sepolia Testnet-1": { + "off_ramp": "0xFb48042b433cc190524e2cF82347D0415d6600A8", + "commit_store": "0x54846bFAc88C74575a90e54817279b614255e80c", + "receiver_dapp": "0x53e82715596baa2470E57D20AeaFBEaDDa3Bd8e4" } } + }, + "Base Goerli-2": { + "is_mock_arm": true, + "fee_token": "0xD886E2286Fd1073df82462ea1822119600Af80b6", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0xE42597d226Eab595893f1ad1B0d7F58d7F1Cc375", + "router": "0x405411ECF0F3863f77631C6A50787027FFC4ab78", + "price_registry": "0x8d426F4A530618414c3C93eD39AD1e2368214C6e", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-2": { + "on_ramp": "0x6Ee577bb575590127f54703FCe50026e9D8627D4", + "deployed_at": 10107795 + }, + "Avalanche Fuji-2": { + "on_ramp": "0x118982B77e37af4B4240b5ed828aBfB35088D61e", + "deployed_at": 10107801 + }, + "BSC Testnet-2": { + "on_ramp": "0x003CE3196F8bA0c082D94CdA36500fDa529E67Dc", + "deployed_at": 10107789 + }, + "Optimism Goerli-2": { + "on_ramp": "0x0c1B5a823ee5dfDea8c26d999394C9c4E43479bD", + "deployed_at": 10107802 + }, + "Sepolia Testnet-2": { + "on_ramp": "0xF27aA4Dc5A15DF188F89f7745AfFa1105FA4a5bF", + "deployed_at": 10107785 + } + }, + "dest_contracts": { + "Arbitrum Goerli-2": { + "off_ramp": "0xd6568f014004Fb726AAC149A3e4dB9A6001C605c", + "commit_store": "0x946D2ea85689eDA05De9b4e24d579D0dCf040eD1", + "receiver_dapp": "0x2bf7263FC70D855E0a79E22449b27114b871aD09" + }, + "Avalanche Fuji-2": { + "off_ramp": "0x0DbB6CdF8B2D0e9A24110138A21e23c6ECB85A91", + "commit_store": "0x6dDf27754dD14c7f7291873dc34c6D4b0335b5ed", + "receiver_dapp": "0xf806cC406aCfC9deedfeb7b071F4CB77017aE3f9" + }, + "BSC Testnet-2": { + "off_ramp": "0x95c712fC91DAC73C225a034F5FB547A22b0F4D86", + "commit_store": "0xEe46548b5bb32ba954255f80a2A39BB42651a999", + "receiver_dapp": "0x92334BAC40e00ec8ED6Dc4571E3Cf9E2554D93FA" + }, + "Optimism Goerli-2": { + "off_ramp": "0x9c2c1b8364CC0244584a3d042E169Ae35A49c348", + "commit_store": "0x6579C136a5FB099CD1B7261A2517C19849Bc870F", + "receiver_dapp": "0x3Ad2bb7704FDf4de50fE676317005605Ba21D15f" + }, + "Sepolia Testnet-2": { + "off_ramp": "0xb0A1fbdd6521979b7D15aF5939f920d012CB6be6", + "commit_store": "0x7Cfb072E634b3A96DC67890d3C07d7eE5Ded3412", + "receiver_dapp": "0x3c7AD47dC6633005039d1DAc20b7d2e6cBe2E24d" + } + } + }, + "Base Goerli-3": { + "is_mock_arm": true, + "fee_token": "0xD886E2286Fd1073df82462ea1822119600Af80b6", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0xE42597d226Eab595893f1ad1B0d7F58d7F1Cc375", + "router": "0x119295630AE140d11716351D99D31C303f15538F", + "price_registry": "0x8d426F4A530618414c3C93eD39AD1e2368214C6e", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-3": { + "on_ramp": "0xBbe775C0B4b0977c1182f8e7a12CDa5C7271Fd1D", + "deployed_at": 10249083 + }, + "Avalanche Fuji-3": { + "on_ramp": "0x819136C2C9681d22351F906D1f103f5b8B386315", + "deployed_at": 10249093 + }, + "BSC Testnet-3": { + "on_ramp": "0x2df7D687d02cF6Cc610E9E888Cb84db2490e26D3", + "deployed_at": 10249085 + }, + "Optimism Goerli-3": { + "on_ramp": "0x059Cd76e5f748c6A79b378C87c4Bad43CA314C27", + "deployed_at": 10249081 + }, + "Sepolia Testnet-3": { + "on_ramp": "0x03BcB459B152f356E0b5F47b5c17599EC0d6CD04", + "deployed_at": 10249084 + } + }, + "dest_contracts": { + "Arbitrum Goerli-3": { + "off_ramp": "0xE0eba23f2cC06027e909efDecED8E2De476EA97D", + "commit_store": "0xAe3408aC4C8a4a1270234C6Ca9D1051aEb4b0711", + "receiver_dapp": "0x386aD221EB041290e5927d3d2d980d4A36111D19" + }, + "Avalanche Fuji-3": { + "off_ramp": "0x4a0fE04874e4Cf3a374C0C33cbfc5106069bAAd6", + "commit_store": "0x97D9693E8b2EF2A46b3E30bE2FD4d378107C02b9", + "receiver_dapp": "0xb7deDF359A5bCdD109E8Fa822D7D7E318FEC241f" + }, + "BSC Testnet-3": { + "off_ramp": "0x7b6f0a5FC3c32DbA5a796d4E7cc774A6e177e537", + "commit_store": "0x16C8ed56c10a0CC7CCfCf96de7d7A4091C6A4ce9", + "receiver_dapp": "0x5B095cDD702accd8Faa2130c2b6f533A28F363c3" + }, + "Optimism Goerli-3": { + "off_ramp": "0x946BDEa21453b53E46CEeC0e0925D44Cd6E8C304", + "commit_store": "0xB7B4d6F6b96c541417838C76F759286fcc9337c2", + "receiver_dapp": "0x0920292d713b7acf373D6Af0C494bE9B6B98B941" + }, + "Sepolia Testnet-3": { + "off_ramp": "0xfDe58673975FCcA65A70ea1B048655d28C19E0Ba", + "commit_store": "0xCf0082aaA5428Ff2E5213D483D522Ff5aa644Dab", + "receiver_dapp": "0xF19a94D55FfbCb40bCA5df788A3101BCfF03b3cD" + } + } + }, + "Base Goerli-4": { + "is_mock_arm": true, + "fee_token": "0xD886E2286Fd1073df82462ea1822119600Af80b6", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0xE42597d226Eab595893f1ad1B0d7F58d7F1Cc375", + "router": "0x619ECD15082E7090B189cF70Ebd96346d812a3d8", + "price_registry": "0x8d426F4A530618414c3C93eD39AD1e2368214C6e", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-4": { + "on_ramp": "0x16F248290E48AAe3725D74F8260A0418bd789323", + "deployed_at": 10249083 + }, + "Avalanche Fuji-4": { + "on_ramp": "0xD0b163872bc332B25782cDBd0279f8d92496759f", + "deployed_at": 10249082 + }, + "BSC Testnet-4": { + "on_ramp": "0x7B3363AD3b1711376179A38efA45e3E043C40cB5", + "deployed_at": 10249086 + }, + "Optimism Goerli-4": { + "on_ramp": "0x54DFeca9e1c2090033C379492c24CeAb80D09817", + "deployed_at": 10249082 + }, + "Sepolia Testnet-4": { + "on_ramp": "0xc908846e83521CD0a37b89413Ca36d618eaD7a67", + "deployed_at": 10249084 + } + }, + "dest_contracts": { + "Arbitrum Goerli-4": { + "off_ramp": "0xE4322B07010081875F6f827b4AcF42B74cFAd0b3", + "commit_store": "0xe9Cf8E15F10C55F607fE98ee194855933E3F56f7", + "receiver_dapp": "0x3A01B945a12a368182a62F850D025af21a7DdE30" + }, + "Avalanche Fuji-4": { + "off_ramp": "0x17478F43dA12C925719Ea344592Eed1bBE0A1787", + "commit_store": "0x096Ad364c84746F23686154AE97BcAe520a84CDF", + "receiver_dapp": "0x81077C865C299ec402282622acc8Db002ecae2CA" + }, + "BSC Testnet-4": { + "off_ramp": "0xcAa1E252C8890B930cA4a167c7Ce7D57507Ca545", + "commit_store": "0x511Af6Dbf6cecf05e8DcF03Bc3D974B75f505D86", + "receiver_dapp": "0x8DD2E7060a419E96A68E77dF003e43bb943ea6Ac" + }, + "Optimism Goerli-4": { + "off_ramp": "0xa8Fa3E931ec2add3eb6b46956A602320dD149Ae9", + "commit_store": "0x72c986D0869eE271050350cA203680652901C671", + "receiver_dapp": "0x2e1463eBa48354fD908A3b939b8121677CDC00eC" + }, + "Sepolia Testnet-4": { + "off_ramp": "0x8A2A44a29711E7Ed4C0a6BEd710FB7Af00875c91", + "commit_store": "0x66dF432569e693190648fFC88AA5F75CC285Fa6f", + "receiver_dapp": "0x49043C6065BcE4331d34Ee6C69d16252B51Ff82A" + } + } + }, + "Optimism Goerli-1": { + "is_mock_arm": true, + "fee_token": "0xdc2CC710e42857672E7907CF474a69B63B93089f", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x401ecB00c5b6Df3F529924B5170A6177A3AB1c45", + "router": "0xdAD60047E2Cbb315656F1757549F472EcFffAD54", + "price_registry": "0x2a79C673cE100dc24330580f2a564AeEf11Fc74f", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-1": { + "on_ramp": "0xBe3115e346f3B0897D2bD97b58dd09800B1c9900", + "deployed_at": 14990570 + }, + "Avalanche Fuji-1": { + "on_ramp": "0x31d5eCf30CA270e17337b99E1b21E9e828B8266d", + "deployed_at": 14990588 + }, + "BSC Testnet-1": { + "on_ramp": "0xece424587F322fc32a89804f056d3fC49Ff7585A", + "deployed_at": 14990567 + }, + "Base Goerli-1": { + "on_ramp": "0xc5458cAd4B7bE62B4b88dFE6d0657255A48eB3c2", + "deployed_at": 14990574 + }, + "Sepolia Testnet-1": { + "on_ramp": "0x98ba15e487696AC814851208F8CAf8121f0E602C", + "deployed_at": 14990561 + } + }, + "dest_contracts": { + "Arbitrum Goerli-1": { + "off_ramp": "0x897e6855816eD892EF23C7765Cf08664788D4287", + "commit_store": "0x1c3D94Df656466cfc4C12D2775be4f46fc77b8C3", + "receiver_dapp": "0x944F059ca5eEF187daef3D8A8726340D428FDfC6" + }, + "Avalanche Fuji-1": { + "off_ramp": "0x005e9C8c57430e03385368f9696FAA1C42429127", + "commit_store": "0x588e7eBa8df2155F3895a07E49026AF736BE8A8F", + "receiver_dapp": "0xb7d71eB87412840178571E95b05B1703d99A81ED" + }, + "BSC Testnet-1": { + "off_ramp": "0x9a37aD66Bc04F19e8Aa28D2a42e8F374c1f84836", + "commit_store": "0x29316E9d9A4FBe3910664944958Ac5C336c0F5a9", + "receiver_dapp": "0x538e1EDD7De66248321713beC94fa3D9D0c15DB2" + }, + "Base Goerli-1": { + "off_ramp": "0xFD0885391BA4A1Aa8E968f60d556D56D3a61077d", + "commit_store": "0x64E50D9af4407dAB94bE4cD37a458130e77477d7", + "receiver_dapp": "0xe9b14E195fDcEed8264Ce7a79F582964214D6F95" + }, + "Sepolia Testnet-1": { + "off_ramp": "0xbE015Db186383cd09b2170D169E7dF9694a447F9", + "commit_store": "0x1d2C8acF53d98014beEca677103Be065c8b47Bbc", + "receiver_dapp": "0x9ef068D31f93325623E9cfE9756A58405401a653" + } + } + }, + "Optimism Goerli-2": { + "is_mock_arm": true, + "fee_token": "0xdc2CC710e42857672E7907CF474a69B63B93089f", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x748f62a1C919DE20aE6CDECCC8A16519F828029f", + "router": "0x5FD5c71a5A3fB741B8d002C431F2b1B54676E513", + "price_registry": "0x30cD10363Be70109FBA90594DF35F18eFd78C8b9", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-2": { + "on_ramp": "0x39902524F192C9ACe6B3C1a8b7be66842C4EA92A", + "deployed_at": 14990571 + }, + "Avalanche Fuji-2": { + "on_ramp": "0xeEE91056b7344534134b2511665590Ec8aA4A8EF", + "deployed_at": 14990588 + }, + "BSC Testnet-2": { + "on_ramp": "0xD2De582855d3Eec43aD612A3faFBe322C263427C", + "deployed_at": 14990564 + }, + "Base Goerli-2": { + "on_ramp": "0xBce34b1dba66f9E6aBe260D0Eeb3F501837efab4", + "deployed_at": 14990576 + }, + "Sepolia Testnet-2": { + "on_ramp": "0x4b318890a8Dd9E15F1905cEB141044Ce5D9df985", + "deployed_at": 14990561 + } + }, + "dest_contracts": { + "Arbitrum Goerli-2": { + "off_ramp": "0x306CB37D07461e4efCB064dA6e60b4D9fa85A256", + "commit_store": "0x2D204A86c42329f40f3b5B4c4a0D67E704E052d0", + "receiver_dapp": "0xE736Ed75089e1a3e04bBaCA11893A76fb0A57BB1" + }, + "Avalanche Fuji-2": { + "off_ramp": "0xF8694639B5F148C06833a1DF4251D3965DF275af", + "commit_store": "0x5d9B554E8Dd3B4899b4841DFbe11EA55fF49cC8A", + "receiver_dapp": "0xaA1F2Aa8Ac8B9266316879C5859cABac91218250" + }, + "BSC Testnet-2": { + "off_ramp": "0x86d7f150D8263B571F44CBf5879418Cc5F6587c6", + "commit_store": "0x2a17B31b07db58EA9e19b7d2e0a8A359a7591674", + "receiver_dapp": "0xF2E35f4802F760481BeB0c366673D932618bFEB6" + }, + "Base Goerli-2": { + "off_ramp": "0xCe8A903dE11ddc103D1A6cf2C5c021872e5AaeFB", + "commit_store": "0x1925bca238d975e916AE3f9984Ab2759F2aDd4cF", + "receiver_dapp": "0x3277A065FC72A7c0E3fffCDD7512827556777eb6" + }, + "Sepolia Testnet-2": { + "off_ramp": "0x7CFD61cf92bB819DE715B1Cd4D1B4fb1bd0FB17D", + "commit_store": "0xfe88eEdEe1e20d239Fcb9851A0c850274E53371F", + "receiver_dapp": "0x471686D9713a4C0F11f623fE935A22f397949102" + } + } + }, + "Optimism Goerli-3": { + "is_mock_arm": true, + "fee_token": "0xdc2CC710e42857672E7907CF474a69B63B93089f", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x748f62a1C919DE20aE6CDECCC8A16519F828029f", + "router": "0x96Ea2127F0B6BE0Ccf34aF85Dcba49dAB2c1b6c6", + "price_registry": "0x30cD10363Be70109FBA90594DF35F18eFd78C8b9", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-3": { + "on_ramp": "0xc908846e83521CD0a37b89413Ca36d618eaD7a67", + "deployed_at": 15131856 + }, + "Avalanche Fuji-3": { + "on_ramp": "0x3701f6fa77914696CD83B77324A68601b85b547f", + "deployed_at": 15131854 + }, + "BSC Testnet-3": { + "on_ramp": "0xB7B4d6F6b96c541417838C76F759286fcc9337c2", + "deployed_at": 15131858 + }, + "Base Goerli-3": { + "on_ramp": "0xA3212F7e6a221daaAaA35bFF0d5BB456357B280B", + "deployed_at": 15131856 + }, + "Sepolia Testnet-3": { + "on_ramp": "0xC556cA1fAc9E00043bAC2Ece9593f176f8255A06", + "deployed_at": 15131866 + } + }, + "dest_contracts": { + "Arbitrum Goerli-3": { + "off_ramp": "0xcAa1E252C8890B930cA4a167c7Ce7D57507Ca545", + "commit_store": "0x17478F43dA12C925719Ea344592Eed1bBE0A1787", + "receiver_dapp": "0x5B095cDD702accd8Faa2130c2b6f533A28F363c3" + }, + "Avalanche Fuji-3": { + "off_ramp": "0xD206E643420BAbb3Aa1aaE29eb885EF04200928d", + "commit_store": "0x998Af278888C2d6E1AF8dB2D9809dACF6bE89AaD", + "receiver_dapp": "0xAe3408aC4C8a4a1270234C6Ca9D1051aEb4b0711" + }, + "BSC Testnet-3": { + "off_ramp": "0x8DD2E7060a419E96A68E77dF003e43bb943ea6Ac", + "commit_store": "0x0A3925586d28a8bA1AF6Db338cd432feC59c7287", + "receiver_dapp": "0xA7e019CBc9f3430bbB0F05c569797fbea91efC20" + }, + "Base Goerli-3": { + "off_ramp": "0x7D8a404D4dc926237b5F310e72b1EE8fA3701E12", + "commit_store": "0x819136C2C9681d22351F906D1f103f5b8B386315", + "receiver_dapp": "0x7075eAFeE0B814B4eb6aaD9E1eFD6B86D3020F12" + }, + "Sepolia Testnet-3": { + "off_ramp": "0x49043C6065BcE4331d34Ee6C69d16252B51Ff82A", + "commit_store": "0x66dF432569e693190648fFC88AA5F75CC285Fa6f", + "receiver_dapp": "0xdD24d7579f364290b680E22b75300AAce638E9ee" + } + } + }, + "Optimism Goerli-4": { + "is_mock_arm": true, + "fee_token": "0xdc2CC710e42857672E7907CF474a69B63B93089f", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x748f62a1C919DE20aE6CDECCC8A16519F828029f", + "router": "0x6572e9D22E3Be33069233616B1C9CbA9FDDfDD00", + "price_registry": "0x30cD10363Be70109FBA90594DF35F18eFd78C8b9", + "wrapped_native": "0x4200000000000000000000000000000000000006", + "src_contracts": { + "Arbitrum Goerli-4": { + "on_ramp": "0x2df7D687d02cF6Cc610E9E888Cb84db2490e26D3", + "deployed_at": 15131856 + }, + "Avalanche Fuji-4": { + "on_ramp": "0xc525cF7788f58DBA3A397587Ce737b8876cbD841", + "deployed_at": 15131855 + }, + "BSC Testnet-4": { + "on_ramp": "0x096Ad364c84746F23686154AE97BcAe520a84CDF", + "deployed_at": 15131857 + }, + "Base Goerli-4": { + "on_ramp": "0x7B3363AD3b1711376179A38efA45e3E043C40cB5", + "deployed_at": 15131857 + }, + "Sepolia Testnet-4": { + "on_ramp": "0xE0eba23f2cC06027e909efDecED8E2De476EA97D", + "deployed_at": 15131867 + } + }, + "dest_contracts": { + "Arbitrum Goerli-4": { + "off_ramp": "0x386aD221EB041290e5927d3d2d980d4A36111D19", + "commit_store": "0x81077C865C299ec402282622acc8Db002ecae2CA", + "receiver_dapp": "0xb7deDF359A5bCdD109E8Fa822D7D7E318FEC241f" + }, + "Avalanche Fuji-4": { + "off_ramp": "0xa8Fa3E931ec2add3eb6b46956A602320dD149Ae9", + "commit_store": "0x3117F05A37389aA4f2DA622C37f690A7f908DEB8", + "receiver_dapp": "0xCDD62679E7D01fB746E17Eb1eb541aC84A3Ec2Db" + }, + "BSC Testnet-4": { + "off_ramp": "0x68a8E8e4cCe6DEf522E15f34E45449F550684981", + "commit_store": "0x946BDEa21453b53E46CEeC0e0925D44Cd6E8C304", + "receiver_dapp": "0x7f1Fce567c78FE4b35cBbB074A4E25e10d82dee6" + }, + "Base Goerli-4": { + "off_ramp": "0x694b0d85D7fF83B7e5d06116DdC0D1bb026Be019", + "commit_store": "0xcCE09B797509bcC74A2526F7F549f71B568f4887", + "receiver_dapp": "0x4a0fE04874e4Cf3a374C0C33cbfc5106069bAAd6" + }, + "Sepolia Testnet-4": { + "off_ramp": "0xf33458F121A5cff13cC124750b3BfFCb34D56102", + "commit_store": "0x56C2D2DeE8A7d912D56111e25b696E9398D2361D", + "receiver_dapp": "0xbD4A5BFcBC9eF701330ABd94c20f492f047C421c" + } + } + }, + "Sepolia Testnet-1": { + "is_mock_arm": true, + "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x95168889CD6f182A966B99A3Ada4f08E3eCeA9EB", + "router": "0x717905F34933175A04a6E8f6e0d0B47264Fdb736", + "price_registry": "0xd2c25A23db2496aFFeB221d31B5C81A2B0Ae3E74", + "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", + "src_contracts": { + "Arbitrum Goerli-1": { + "on_ramp": "0xA734E75d9606b132869fAc8051Ab932076EA8cEB", + "deployed_at": 4342317 + }, + "Avalanche Fuji-1": { + "on_ramp": "0xb8B2f66b082A614D40aB389C722F19478e73D08E", + "deployed_at": 4342320 + }, + "BSC Testnet-1": { + "on_ramp": "0xD24dF9c44e2CfB2574Bc1fbBFF6eC1C7F4404361", + "deployed_at": 4342315 + }, + "Base Goerli-1": { + "on_ramp": "0xE1d7bb1e140Ba486538A868490f11A9Fe0C7AD88", + "deployed_at": 4342319 + }, + "Optimism Goerli-1": { + "on_ramp": "0xDF86A952fb23A8EC9fb71f031bB1655D81aEfCC2", + "deployed_at": 4342319 + } + }, + "dest_contracts": { + "Arbitrum Goerli-1": { + "off_ramp": "0x40039A61389d23F0F106F2921d774e971Ae2FE67", + "commit_store": "0x1f61cD1DE08e8c2038C4155C439eb5E2315e277e", + "receiver_dapp": "0xEd5843922C15fB8750366ec2e246c97d45B5e491" + }, + "Avalanche Fuji-1": { + "off_ramp": "0xe89A9727b05977a31D4A77EBa45275c14c06ffBC", + "commit_store": "0x3234a127c345653b85D3258A12b568aB56D106e4", + "receiver_dapp": "0xC7BeC5f164cE19e056C718A14411Bc2a3BEE0D18" + }, + "BSC Testnet-1": { + "off_ramp": "0x1c40a3667ca69dAA8e01B9fC52C54ad4313214Da", + "commit_store": "0xE48986ceC47743c7D60Fae2955083f16A95d3BEe", + "receiver_dapp": "0xC729A4AC7320531b27DdA703890E7C2CB130DaC9" + }, + "Base Goerli-1": { + "off_ramp": "0x2447be412EE66921791f870a5789CfE99906CE4d", + "commit_store": "0x0E2223248C3867d897fa368b69063F98A62369AC", + "receiver_dapp": "0xd1C95B8fcd4577F47De04f3C729A12F1fA7858a9" + }, + "Optimism Goerli-1": { + "off_ramp": "0x97604ab0E0E78acEE9F6f6181155CE7Cd7317d97", + "commit_store": "0xaDEbBa34FaEc7261B4f836d4Ff744ccb64AbA525", + "receiver_dapp": "0x4B298437afbE102009ce5eC875E325A0aac2380e" + } + } + }, + "Sepolia Testnet-2": { + "is_mock_arm": true, + "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x891847805D3D6766Ad515Abf9db986B8Aa147BB6", + "router": "0x27D9AB095E183A2D6e93242C44ea3503762a6114", + "price_registry": "0x779d3Dbc779BdF7ce35B0CF11438A7246831e41C", + "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", + "src_contracts": { + "Arbitrum Goerli-2": { + "on_ramp": "0x3277AD6B84418a04d2E89528e4faEB698b12Aa00", + "deployed_at": 4342317 + }, + "Avalanche Fuji-2": { + "on_ramp": "0x34d550380b89AB801bc59f31a1F99FA094FCF646", + "deployed_at": 4342320 + }, + "BSC Testnet-2": { + "on_ramp": "0x1cc7dee6B786b7e0027Bf87AB0a2AD9c1C39427a", + "deployed_at": 4342315 + }, + "Base Goerli-2": { + "on_ramp": "0x9b8fae26099b96AF3DB194f42ca4C543dfa8E21C", + "deployed_at": 4342319 + }, + "Optimism Goerli-2": { + "on_ramp": "0x15D1a152912A8A871fE036A05668439a87158c52", + "deployed_at": 4342319 + } + }, + "dest_contracts": { + "Arbitrum Goerli-2": { + "off_ramp": "0x3279489f87bF670E295013C073eEF5B5894ed653", + "commit_store": "0xfFb508760Db8e868C60dF489FE589c8Af36d4631", + "receiver_dapp": "0x20e84934de0cCD3654ceB67E9F698FC40a8c6E2D" + }, + "Avalanche Fuji-2": { + "off_ramp": "0x3C794C8EeEC4B2932297d9B7022ae57e2C25Fa32", + "commit_store": "0xc9Ce379B24E607f9E652Bf3C1Fe435e13FBFa726", + "receiver_dapp": "0xD7d3945aaEa87eE9b02964BD895a101A3d5d9770" + }, + "BSC Testnet-2": { + "off_ramp": "0xF711517BD8aB1dA0e4bbB2861ABBE24db81367E2", + "commit_store": "0xd847D679F2882DC71cA8bAb4A5259594ec8cC9Ba", + "receiver_dapp": "0x7Ab8Abb8Ed09B8252FBCcE4D62336B331dF6d46A" + }, + "Base Goerli-2": { + "off_ramp": "0xdDEe6624F2c8d779BFaCEa99eedF22897807F69E", + "commit_store": "0xc8beD93bEFD7Ea2D3914D04bAc5DAe312B90EF36", + "receiver_dapp": "0xE2A183438161E4971BCf0DDD9FBC40A08984B1B6" + }, + "Optimism Goerli-2": { + "off_ramp": "0x2E078df006f58E67B4f2eb428e77357EB960a2FD", + "commit_store": "0x0c60F5E60feeDa71b14C11f22DC3AcC073A14d0F", + "receiver_dapp": "0xfFF1d7e2742C385cC16f2835a217f76Cf697A815" + } + } + }, + "Sepolia Testnet-3": { + "is_mock_arm": true, + "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x891847805D3D6766Ad515Abf9db986B8Aa147BB6", + "router": "0xdE5B3FB30B002624197460Fd7F829e8DF8A407A6", + "price_registry": "0x779d3Dbc779BdF7ce35B0CF11438A7246831e41C", + "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", + "src_contracts": { + "Arbitrum Goerli-3": { + "on_ramp": "0x306f3448fC771f21B83ebb8C19E2387438216982", + "deployed_at": 4364802 + }, + "Avalanche Fuji-3": { + "on_ramp": "0x29C0cfF96B7A9871A6Feb40f7D5362AdeE43bd75", + "deployed_at": 4364802 + }, + "BSC Testnet-3": { + "on_ramp": "0x09cfd48fe21197A194a91FEd0edB81E1521C6c28", + "deployed_at": 4364804 + }, + "Base Goerli-3": { + "on_ramp": "0xEDC008585162F73018f14b24CaCfaBC03D4A70B4", + "deployed_at": 4364802 + }, + "Optimism Goerli-3": { + "on_ramp": "0xB2b7feADe8B400A194401DBc6A9821C8c11c5A62", + "deployed_at": 4364804 + } + }, + "dest_contracts": { + "Arbitrum Goerli-3": { + "off_ramp": "0x2E6069Ea9f661679D9E7d517eD3f3819c4012F00", + "commit_store": "0x7A45CE4452135Ce2D1F616d954BA6698eDb039F5", + "receiver_dapp": "0x6cD97c1b9A767c4c70E398a0530BEf079dCdfdA7" + }, + "Avalanche Fuji-3": { + "off_ramp": "0x71e31277e63AB37Ea32485cc0661B9A24f2f0eF2", + "commit_store": "0xD4324D3A34DE013F0DEA7B8EAca0eDB8325059fa", + "receiver_dapp": "0xBe5A4C5E279AA821630fED8f8AfC5e1132AcFBFf" + }, + "BSC Testnet-3": { + "off_ramp": "0xdeA3E7c1c63DaeA250118022812AD54Cf43c4C74", + "commit_store": "0x858634290B379f7DEa715E01af913771799B8D59", + "receiver_dapp": "0x896327FE054F749709Cf1Bf6018F32DD79fC23c8" + }, + "Base Goerli-3": { + "off_ramp": "0x631b4b0082694FfB3707657B8baE657c699750F4", + "commit_store": "0xaf0353EB9bD6Bf238e25518A9178FB07e70b9f16", + "receiver_dapp": "0xb9ccbC18085FCF559ec903753FAe4c55Ad34a16f" + }, + "Optimism Goerli-3": { + "off_ramp": "0x55eA8fcceC40318Dcebf3990b5FC13e1FBAA6304", + "commit_store": "0x277f3c1e074c2a5e2D6970d641688Ed9b112ACCB", + "receiver_dapp": "0xF0b1EF332840D28540C5F71EF1dE120334431f23" + } + } + }, + "Sepolia Testnet-4": { + "is_mock_arm": true, + "fee_token": "0x779877A7B0D9E8603169DdbD7836e478b4624789", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x891847805D3D6766Ad515Abf9db986B8Aa147BB6", + "router": "0xe146F928fDE54CE8b96d5A9C3E4cDeFf22604C3F", + "price_registry": "0x779d3Dbc779BdF7ce35B0CF11438A7246831e41C", + "wrapped_native": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534", + "src_contracts": { + "Arbitrum Goerli-4": { + "on_ramp": "0xEc73b46b8c4a39b485BAc945ef146F52963dF04B", + "deployed_at": 4364802 + }, + "Avalanche Fuji-4": { + "on_ramp": "0x2612dCe78304f09a7576d1bc833b5FBaAce0f445", + "deployed_at": 4364802 + }, + "BSC Testnet-4": { + "on_ramp": "0x0620a23882EF5814c4DB64F594B4771B30D389fa", + "deployed_at": 4364804 + }, + "Base Goerli-4": { + "on_ramp": "0xBd80016871eb751Be17cEf838D06277994473aeA", + "deployed_at": 4364802 + }, + "Optimism Goerli-4": { + "on_ramp": "0xE6B5339B871A44a8F605Bf71D724C8C3096F5518", + "deployed_at": 4364804 + } + }, + "dest_contracts": { + "Arbitrum Goerli-4": { + "off_ramp": "0xedFf27E460d0c429e3241dD818F4468B573E5D8d", + "commit_store": "0x6A71C9dB1503d7A74eB3c067487dE3487F6f82F4", + "receiver_dapp": "0x7Bd2A6797C8F5827A298Ce3f6851b4428AD97C32" + }, + "Avalanche Fuji-4": { + "off_ramp": "0xab45c01C95f03Cd97bcF5F36eEC533FC55B3a217", + "commit_store": "0x3504a8fC66ad9b76bd54219f07B181420434A62e", + "receiver_dapp": "0x24be9D55cb096d98cC13e365B17F1801089564bf" + }, + "BSC Testnet-4": { + "off_ramp": "0xdF79fCF6EC7eD9dAD20b210cc66449B37BBcA4fa", + "commit_store": "0x382dCbEab06a3bA37032cc8e61E2D991A972c93E", + "receiver_dapp": "0xF49998a4B07Ba4d1CdDA62dC21D2C38B162d749a" + }, + "Base Goerli-4": { + "off_ramp": "0xa33675eFa1f0fA709e3b36fDd3f950dA371Dc3f1", + "commit_store": "0x016C22764c861d754DaDDfE16918237BE6197a3A", + "receiver_dapp": "0xE0741da33e9cc8b47d1E0c006880aA808A8F5793" + }, + "Optimism Goerli-4": { + "off_ramp": "0x65C54F096Fe992Eb1c24f66F9cdc484D8B3bE1D4", + "commit_store": "0xE3713d1a73B7d9ea5a21F1A11DE670119fcF6e01", + "receiver_dapp": "0x007D13935235A139Ae3c3372ABBF61f9Fe2eb823" + } + } + }, + "Avalanche Fuji-1": { + "is_mock_arm": true, + "fee_token": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x033b274504d63757E0f2Dc97396c903Ce703Df68", + "router": "0xA464A0843a6e127b1913731007A0D56390BC3aA0", + "price_registry": "0xCaFBfaB3fBCA6B577ec1Ccc38105451BD5DaE034", + "wrapped_native": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", + "src_contracts": { + "Arbitrum Goerli-1": { + "on_ramp": "0x9b1E98a9A494e835CBd194D468f058de25722C36", + "deployed_at": 26098412 + }, + "BSC Testnet-1": { + "on_ramp": "0x317459077b0871253C8D3323Efc1e2942BBC755f", + "deployed_at": 26098402 + }, + "Base Goerli-1": { + "on_ramp": "0x532575b6632A87238FFc35F668ec43594D088BB3", + "deployed_at": 26098412 + }, + "Optimism Goerli-1": { + "on_ramp": "0x8EB1B2116F43b8E43C14179c5069093F40110700", + "deployed_at": 26098420 + }, + "Sepolia Testnet-1": { + "on_ramp": "0x090776f7E99716fe87dEe2B75473e3197BCA15cB", + "deployed_at": 26098397 + } + }, + "dest_contracts": { + "Arbitrum Goerli-1": { + "off_ramp": "0x931ebD0096764fDCAF4D88E2847AaB34EA957fA6", + "commit_store": "0x20258DAAC29Dc66eC1e3CF5856C961876471B153", + "receiver_dapp": "0x2e18750B97519F5e1b3d13ea6c9ee56911472540" + }, + "BSC Testnet-1": { + "off_ramp": "0x5Bf10fb982f0C05E4b10f3fAbC79d5211cB87bC0", + "commit_store": "0x7433A952954F2e83feb0d4396434D1416032999a", + "receiver_dapp": "0xaE50729bc32c250fc2730F70aECCB22beEa8d986" + }, + "Base Goerli-1": { + "off_ramp": "0x1b574a8E19BB8E1A307f47c2cdA3Bf6f944dB648", + "commit_store": "0x929Dd22fA4695266302D69475086e43131FF829f", + "receiver_dapp": "0xbCB97BF9390ce3826C872D8C887d8080aA91Cd10" + }, + "Optimism Goerli-1": { + "off_ramp": "0x2a79C673cE100dc24330580f2a564AeEf11Fc74f", + "commit_store": "0x65D539aeAEb0D5164E78F056C8c5dA354fb3ee70", + "receiver_dapp": "0x4b318890a8Dd9E15F1905cEB141044Ce5D9df985" + }, + "Sepolia Testnet-1": { + "off_ramp": "0xbcfa9cA055f281A2e57240a1eb938f247490a9A9", + "commit_store": "0xD2De582855d3Eec43aD612A3faFBe322C263427C", + "receiver_dapp": "0x2D204A86c42329f40f3b5B4c4a0D67E704E052d0" + } + } + }, + "Avalanche Fuji-2": { + "is_mock_arm": true, + "fee_token": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x56cB819B2e13Aef5807e2c6eF4A4256a6121F1c4", + "router": "0xD23c0A6c4CAce271a5c3b57c648D9bD379D3cCCf", + "price_registry": "0x1C2C1B41B97FCFE1d427c08CCcf5c6ED8b897Ba1", + "wrapped_native": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", + "src_contracts": { + "Arbitrum Goerli-2": { + "on_ramp": "0x732BDc1124C0928574fb2C3F86D4D53E4Bc3Fb18", + "deployed_at": 26098412 + }, + "BSC Testnet-2": { + "on_ramp": "0x6bE9698CAf97908a8b5c4A8C9cd96CA8a81cDbfa", + "deployed_at": 26098402 + }, + "Base Goerli-2": { + "on_ramp": "0xFE0d73c108D0a2a2bb103e81273a7cBB9C3b4F93", + "deployed_at": 26098405 + }, + "Optimism Goerli-2": { + "on_ramp": "0x5477C0B7491112412a7908dF5a4b30B17547E8aA", + "deployed_at": 26098420 + }, + "Sepolia Testnet-2": { + "on_ramp": "0xF11E8d51b6F980c64B373001F6212B367BA469C1", + "deployed_at": 26098397 + } + }, + "dest_contracts": { + "Arbitrum Goerli-2": { + "off_ramp": "0x635979f7F94bD5a503f11918aAbA94BFa7E58098", + "commit_store": "0x70b10209D353f831848e1a4E1E4cF901994f35fE", + "receiver_dapp": "0x51f70558d4b2E070D478a56f00B38517Cac8F217" + }, + "BSC Testnet-2": { + "off_ramp": "0x5d3a0bb8aD15b5D0b401035316EC55EC36F01319", + "commit_store": "0x166D464e862d25d1B44EdD00df7A7739Aa623308", + "receiver_dapp": "0x30cD10363Be70109FBA90594DF35F18eFd78C8b9" + }, + "Base Goerli-2": { + "off_ramp": "0x8689589C56E89454832fFeEa3702DA329FF2b31c", + "commit_store": "0xFeD7666412Cdb45396537B021593E395bD6f293F", + "receiver_dapp": "0x67c5a66642441C2128b6E598f8A64308133454b3" + }, + "Optimism Goerli-2": { + "off_ramp": "0xbe3C7F1766efe63b7c62aD2128670047B6D27110", + "commit_store": "0xD09e3365D6d5fDCFe48D23De9c64F7e8f568EdCA", + "receiver_dapp": "0xe23eeee816ED08Ac9d6218535544f129D1EB12b4" + }, + "Sepolia Testnet-2": { + "off_ramp": "0x7b925849aD41D524a4d62587df7a455f50f2eFEB", + "commit_store": "0x3C66740724297B50c10CF66a8e15C5EBb43F735D", + "receiver_dapp": "0x39902524F192C9ACe6B3C1a8b7be66842C4EA92A" + } + } + }, + "Avalanche Fuji-3": { + "is_mock_arm": true, + "fee_token": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x033b274504d63757E0f2Dc97396c903Ce703Df68", + "router": "0x29b634FcCD3bB59d263851779eCaa13Ff7Ec2558", + "price_registry": "0xCaFBfaB3fBCA6B577ec1Ccc38105451BD5DaE034", + "wrapped_native": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", + "src_contracts": { + "Arbitrum Goerli-3": { + "on_ramp": "0xc0e0EFA82784ed6B157DdcA82693eb9270041f56", + "deployed_at": 26205219 + }, + "BSC Testnet-3": { + "on_ramp": "0xb21f9E8F4B40434cF4F3d8C8f577121E26f663E9", + "deployed_at": 26205219 + }, + "Base Goerli-3": { + "on_ramp": "0xf525381c5a77E32E3d4BEb8670a3f0421179A10D", + "deployed_at": 26205231 + }, + "Optimism Goerli-3": { + "on_ramp": "0x8674B6559F538E0A8Aa02d91980eb91e5420d5f8", + "deployed_at": 26205219 + }, + "Sepolia Testnet-3": { + "on_ramp": "0xD86bcE9A4709302bA042e100F874cc815E12e4e0", + "deployed_at": 26205219 + } + }, + "dest_contracts": { + "Arbitrum Goerli-3": { + "off_ramp": "0x56aa95805eAb1bfE44F350d10624DA78D0dF7766", + "commit_store": "0x6D1575CF487d7b64bC05e86d35dBbB8490C16b62", + "receiver_dapp": "0x6f9C176499C412b5c48551FA567553436b439D0e" + }, + "BSC Testnet-3": { + "off_ramp": "0x21d989cf64806BCF2C227b0B3302Fd0956cB97f9", + "commit_store": "0x8685Bb51d37CABd11D4B60dB9C2a489D2157Dd10", + "receiver_dapp": "0xBA5ba034372287fD49dA4002F19BeE6C8E633a29" + }, + "Base Goerli-3": { + "off_ramp": "0x0Abc05f3F5F6b2A7e0080CE14D25f95fEF58c39A", + "commit_store": "0x1538dfbD1E9F6DdacBE5E98cfF53F3a7a2c2F8F4", + "receiver_dapp": "0xA20B642335968621788B108f2F4ef8174B439A40" + }, + "Optimism Goerli-3": { + "off_ramp": "0xDa684f2c7F30BDA4fD070ffA7Bf6259380E82e5E", + "commit_store": "0xb9ad97803E97ADF560e58d42aF285697A1F8138c", + "receiver_dapp": "0x0966f05394F97f13Bdcd9E13C28d5a75B4BD7944" + }, + "Sepolia Testnet-3": { + "off_ramp": "0xf6c51374d5D23CF63F94eCD4f44Cc726D15b4AC9", + "commit_store": "0x3cd537779315591F9E3495A7E03Ae2a8294498F0", + "receiver_dapp": "0xC9FAc13C9474a82D3F921E188f00Fbd5e70D6323" + } + } + }, + "Avalanche Fuji-4": { + "is_mock_arm": true, + "fee_token": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846", + "bridge_tokens": null, + "bridge_tokens_pools": null, + "arm": "0x033b274504d63757E0f2Dc97396c903Ce703Df68", + "router": "0xB38AeC87e1952206E75Dc9600092059E6E587899", + "price_registry": "0xCaFBfaB3fBCA6B577ec1Ccc38105451BD5DaE034", + "wrapped_native": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", + "src_contracts": { + "Arbitrum Goerli-4": { + "on_ramp": "0x3CBb11AC1ABfB4e415B9A70311f0f07FCe0cb5D7", + "deployed_at": 26205219 + }, + "BSC Testnet-4": { + "on_ramp": "0x9Fb8F11C408Cd484A4F5EcB0ae969994dbC01912", + "deployed_at": 26205219 + }, + "Base Goerli-4": { + "on_ramp": "0xd3A1cF0AEceE62236187aB23069f295e5a25D6A2", + "deployed_at": 26205219 + }, + "Optimism Goerli-4": { + "on_ramp": "0x4F43264311ccCEA86E6d5B90480462FE13585de7", + "deployed_at": 26205219 + }, + "Sepolia Testnet-4": { + "on_ramp": "0x93c554E5E15eaCC29E19676847B8aB5304b1719B", + "deployed_at": 26205219 + } + }, + "dest_contracts": { + "Arbitrum Goerli-4": { + "off_ramp": "0xFB324e02D7b1ED8c75ee21f7EC00d43DcB3AaF60", + "commit_store": "0x8FFF75FCB63e0E09269fE576fAebbfa2A411eC3C", + "receiver_dapp": "0x08CeA01430159c6d20c65c918689F888424dAa81" + }, + "BSC Testnet-4": { + "off_ramp": "0x7A122671abB7A95B956a04f1D08f6B92C4BbeAf8", + "commit_store": "0x2f1181B3aC758BD307794365988aed0817B610CC", + "receiver_dapp": "0xdc6324Cd70F9032bba1C7f0f96c180dCa6e266f7" + }, + "Base Goerli-4": { + "off_ramp": "0xB1D3D8dE960991e42312fFfD7055C14F1A87d088", + "commit_store": "0x8d9d4AD897b383189E567E9E45c03E2640Bea893", + "receiver_dapp": "0x0096bcaC2fE6156369eB8FcA01276a4D83787D46" + }, + "Optimism Goerli-4": { + "off_ramp": "0x34377fbDbcF336aF920AA48Ff224b81cC0E3b5F9", + "commit_store": "0xdd05a7905666c3C8FC00f8253d45c157A9DC249A", + "receiver_dapp": "0x6cf526596C61A7268046fFD319cB9930025aF94d" + }, + "Sepolia Testnet-4": { + "off_ramp": "0x509bCeDb15DCcb5761DD9DD356dF0d5c4E68f180", + "commit_store": "0x251702f9BFDd1Cd1BfdACD23696faaf65ceB78B9", + "receiver_dapp": "0x258018d0DCa868372d86d9d2c6a0168eaC611a96" + } + } + }, + "Polygon Mumbai-1": { + "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x5BDD59cde34F2f40DC34e0eac61057561175ba16", + "router": "0x9125a9B0eEf57E55966C31C0A0095dAE7b5a885C", + "price_registry": "0x933fEB900212240EC19D2752529e0007F182B543", + "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "src_contracts": {}, + "dest_contracts": {} + }, + "Polygon Mumbai-2": { + "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x5BDD59cde34F2f40DC34e0eac61057561175ba16", + "router": "0x30cC62ad8BacF4f1e7bCDd0EE24d9a7874513B43", + "price_registry": "0x933fEB900212240EC19D2752529e0007F182B543", + "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "src_contracts": {}, + "dest_contracts": {} + }, + "Polygon Mumbai-3": { + "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x5BDD59cde34F2f40DC34e0eac61057561175ba16", + "router": "0x03073cD021f57661A689F944A35e0041a08B8E21", + "price_registry": "0x933fEB900212240EC19D2752529e0007F182B543", + "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "src_contracts": {}, + "dest_contracts": {} + }, + "Polygon Mumbai-4": { + "fee_token": "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", + "bridge_tokens": [], + "bridge_tokens_pools": [], + "arm": "0x5BDD59cde34F2f40DC34e0eac61057561175ba16", + "router": "0x1d30Aef5886907e4c59e5BA5a083fb9509BD4707", + "price_registry": "0x933fEB900212240EC19D2752529e0007F182B543", + "wrapped_native": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + "src_contracts": {}, + "dest_contracts": {} } } } \ No newline at end of file diff --git a/integration-tests/ccip-tests/contracts/laneconfig/parse_contracts.go b/integration-tests/ccip-tests/contracts/laneconfig/parse_contracts.go index 685a59604b..b8ab13c627 100644 --- a/integration-tests/ccip-tests/contracts/laneconfig/parse_contracts.go +++ b/integration-tests/ccip-tests/contracts/laneconfig/parse_contracts.go @@ -18,16 +18,15 @@ var ( ) type CommonContracts struct { - IsNativeFeeToken bool `json:"is_native_fee_token,omitempty"` - IsMockARM bool `json:"is_mock_arm,omitempty"` - FeeToken string `json:"fee_token"` - BridgeTokens []string `json:"bridge_tokens"` - BridgeTokenPools []string `json:"bridge_tokens_pools"` - ARM string `json:"arm"` - Router string `json:"router"` - PriceRegistry string `json:"price_registry"` - PriceUpdatesToWatchFrom uint64 `json:"price_updates_started_at"` - WrappedNative string `json:"wrapped_native"` + IsNativeFeeToken bool `json:"is_native_fee_token,omitempty"` + IsMockARM bool `json:"is_mock_arm,omitempty"` + FeeToken string `json:"fee_token"` + BridgeTokens []string `json:"bridge_tokens"` + BridgeTokenPools []string `json:"bridge_tokens_pools"` + ARM string `json:"arm"` + Router string `json:"router"` + PriceRegistry string `json:"price_registry"` + WrappedNative string `json:"wrapped_native"` } type SourceContracts struct { @@ -43,8 +42,10 @@ type DestContracts struct { type LaneConfig struct { CommonContracts - SrcContracts map[uint64]SourceContracts `json:"src_contracts"` // key destination chain id - DestContracts map[uint64]DestContracts `json:"dest_contracts"` // key source chain id + SrcContractsMu *sync.Mutex `json:"-"` + SrcContracts map[string]SourceContracts `json:"src_contracts"` // key destination chain id + DestContractsMu *sync.Mutex `json:"-"` + DestContracts map[string]DestContracts `json:"dest_contracts"` // key source chain id } func (l *LaneConfig) Validate() error { @@ -54,22 +55,18 @@ func (l *LaneConfig) Validate() error { laneConfigError = multierr.Append(laneConfigError, errors.New("must set proper address for arm")) } - if l.FeeToken == "" || !common.IsHexAddress(l.FeeToken) { + if l.FeeToken != "" && !common.IsHexAddress(l.FeeToken) { laneConfigError = multierr.Append(laneConfigError, errors.New("must set proper address for fee_token")) } - if len(l.BridgeTokens) < 1 { - laneConfigError = multierr.Append(laneConfigError, errors.New("must set at least 1 bridge_tokens")) - } + for _, token := range l.BridgeTokens { - if token == "" || !common.IsHexAddress(token) { + if token != "" && !common.IsHexAddress(token) { laneConfigError = multierr.Append(laneConfigError, errors.New("must set proper address for bridge_tokens")) } } - if len(l.BridgeTokenPools) < 1 { - laneConfigError = multierr.Append(laneConfigError, errors.New("must set at least 1 bridge_tokens_pools")) - } + for _, pool := range l.BridgeTokenPools { - if pool == "" || !common.IsHexAddress(pool) { + if pool != "" && !common.IsHexAddress(pool) { laneConfigError = multierr.Append(laneConfigError, errors.New("must set proper address for bridge_tokens_pools")) } } @@ -89,15 +86,73 @@ type Lanes struct { LaneConfigs map[string]*LaneConfig `json:"lane_configs"` } -func (l *Lanes) ReadLaneConfig(networkA string) (*LaneConfig, error) { +func (l *Lanes) ReadLaneConfig(networkA string) *LaneConfig { laneMu.Lock() defer laneMu.Unlock() - _, ok := l.LaneConfigs[networkA] + cfg, ok := l.LaneConfigs[networkA] if !ok { - l.LaneConfigs[networkA] = &LaneConfig{} + l.LaneConfigs[networkA] = &LaneConfig{ + SrcContracts: make(map[string]SourceContracts), + DestContracts: make(map[string]DestContracts), + SrcContractsMu: &sync.Mutex{}, + DestContractsMu: &sync.Mutex{}, + } + return l.LaneConfigs[networkA] + } + if cfg.SrcContractsMu == nil { + l.LaneConfigs[networkA].SrcContractsMu = &sync.Mutex{} + } + if cfg.DestContractsMu == nil { + l.LaneConfigs[networkA].DestContractsMu = &sync.Mutex{} + } + return l.LaneConfigs[networkA] +} +// CopyCommonContracts copies network config for common contracts from fromNetwork to toNetwork +// if the toNetwork already exists, it does nothing +// If reuse is set to false, it only retains the token contracts +func (l *Lanes) CopyCommonContracts(fromNetwork, toNetwork string, reuse, isTokenTransfer bool) { + laneMu.Lock() + defer laneMu.Unlock() + // if the toNetwork already exists, return + if _, ok := l.LaneConfigs[toNetwork]; ok { + return + } + existing, ok := l.LaneConfigs[fromNetwork] + if !ok { + l.LaneConfigs[toNetwork] = &LaneConfig{ + SrcContracts: make(map[string]SourceContracts), + DestContracts: make(map[string]DestContracts), + SrcContractsMu: &sync.Mutex{}, + DestContractsMu: &sync.Mutex{}, + } + return + } + cfg := &LaneConfig{ + SrcContracts: make(map[string]SourceContracts), + SrcContractsMu: &sync.Mutex{}, + DestContractsMu: &sync.Mutex{}, + DestContracts: make(map[string]DestContracts), + CommonContracts: CommonContracts{ + FeeToken: existing.FeeToken, + WrappedNative: existing.WrappedNative, + }, + } + // if reuse is set to true, it copies all the common contracts except the router + if reuse { + cfg.CommonContracts.PriceRegistry = existing.PriceRegistry + cfg.CommonContracts.ARM = existing.ARM + cfg.CommonContracts.IsNativeFeeToken = existing.IsNativeFeeToken + cfg.CommonContracts.IsMockARM = existing.IsMockARM + } + // if it is a token transfer, it copies the bridge token contracts + if isTokenTransfer { + cfg.CommonContracts.BridgeTokens = existing.BridgeTokens + if reuse { + cfg.CommonContracts.BridgeTokenPools = existing.BridgeTokenPools + } } - return l.LaneConfigs[networkA], nil + l.LaneConfigs[toNetwork] = cfg } func (l *Lanes) WriteLaneConfig(networkA string, cfg *LaneConfig) error { diff --git a/integration-tests/ccip-tests/load/ccip_test.go b/integration-tests/ccip-tests/load/ccip_test.go index c46560d9c2..de1b526c6d 100644 --- a/integration-tests/ccip-tests/load/ccip_test.go +++ b/integration-tests/ccip-tests/load/ccip_test.go @@ -32,6 +32,7 @@ func TestLoadCCIPStableRPS(t *testing.T) { func TestLoadCCIPSequentialLaneAdd(t *testing.T) { t.Parallel() + t.Skipf("test needs maintenance") lggr := logging.GetTestLogger(t) testArgs := NewLoadArgs(t, lggr, context.Background()) testArgs.TestCfg.SequentialLaneAddition = true diff --git a/integration-tests/ccip-tests/load/helper.go b/integration-tests/ccip-tests/load/helper.go index 9b7065ce42..b2196d3643 100644 --- a/integration-tests/ccip-tests/load/helper.go +++ b/integration-tests/ccip-tests/load/helper.go @@ -165,6 +165,16 @@ func (l *loadArgs) AddMoreLanesToRun() { // LaneLoadCfg channel should receive a lane whenever the deployment is complete. func (l *loadArgs) Start() { l.LoadStarterWg.Add(1) + waitForLoadRun := func(gen *wasp.Generator, ccipLoad *CCIPE2ELoad) error { + _, failed := gen.Wait() + if failed { + return fmt.Errorf("load run is failed") + } + if len(gen.Errors()) > 0 { + return fmt.Errorf("error in load sequence call %v", gen.Errors()) + } + return nil + } go func() { defer l.LoadStarterWg.Done() loadCount := 0 @@ -211,14 +221,7 @@ func (l *loadArgs) Start() { l.ccipLoad = append(l.ccipLoad, ccipLoad) l.loadRunner = append(l.loadRunner, loadRunner) l.RunnerWg.Go(func() error { - _, failed := loadRunner.Wait() - if failed { - return fmt.Errorf("load run is failed") - } - if len(loadRunner.Errors()) > 0 { - return fmt.Errorf("error in load sequence call %v", loadRunner.Errors()) - } - return nil + return waitForLoadRun(loadRunner, ccipLoad) }) if loadCount == len(l.TestCfg.NetworkPairs)*2 { l.lggr.Info().Msg("load is running for all lanes now") diff --git a/integration-tests/ccip-tests/smoke/ccip_test.go b/integration-tests/ccip-tests/smoke/ccip_test.go index 13367c12d6..a2e434fe64 100644 --- a/integration-tests/ccip-tests/smoke/ccip_test.go +++ b/integration-tests/ccip-tests/smoke/ccip_test.go @@ -35,7 +35,6 @@ func TestSmokeCCIPForBidirectionalLane(t *testing.T) { if TestCfg.MsgType == actions.TokenTransfer { setUpOutput.Balance.Verify(t) } - setUpOutput.TearDown() }) for i := range setUpOutput.Lanes { tcs = append(tcs, subtestInput{ @@ -56,10 +55,12 @@ func TestSmokeCCIPForBidirectionalLane(t *testing.T) { tc := testcase t.Run(tc.testName, func(t *testing.T) { t.Parallel() + tc.lane.Test = t l.Info(). Str("Source", tc.lane.SourceNetworkName). Str("Destination", tc.lane.DestNetworkName). Msgf("Starting lane %s -> %s", tc.lane.SourceNetworkName, tc.lane.DestNetworkName) + tc.lane.RecordStateBeforeTransfer() err := tc.lane.SendRequests(1, TestCfg.MsgType) require.NoError(t, err) diff --git a/integration-tests/ccip-tests/testsetups/ccip.go b/integration-tests/ccip-tests/testsetups/ccip.go index 63d93341ed..9389b62690 100644 --- a/integration-tests/ccip-tests/testsetups/ccip.go +++ b/integration-tests/ccip-tests/testsetups/ccip.go @@ -5,20 +5,18 @@ import ( "fmt" "math/big" "os" + "regexp" "strconv" "strings" "sync" "testing" "time" - "github.com/google/uuid" "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/smartcontractkit/chainlink-env/client" "github.com/smartcontractkit/chainlink-env/environment" "github.com/smartcontractkit/chainlink-env/pkg/helm/chainlink" - "github.com/smartcontractkit/chainlink-env/pkg/helm/mockserver" - mockserver_cfg "github.com/smartcontractkit/chainlink-env/pkg/helm/mockserver-cfg" "github.com/smartcontractkit/chainlink-env/pkg/helm/reorg" "github.com/smartcontractkit/chainlink-testing-framework/blockchain" "github.com/smartcontractkit/chainlink-testing-framework/networks" @@ -100,6 +98,7 @@ type NetworkPair struct { type CCIPTestConfig struct { Test *testing.T EnvTTL time.Duration + KeepEnvAlive bool MsgType string PhaseTimeout time.Duration TestDuration time.Duration @@ -110,9 +109,11 @@ type CCIPTestConfig struct { SequentialLaneAddition bool NodeFunding *big.Float Load *CCIPLoadInput - AllNetworks []blockchain.EVMNetwork + AllNetworks map[string]blockchain.EVMNetwork + SelectedNetworks []blockchain.EVMNetwork NetworkPairs []NetworkPair NoOfNetworks int + NoOfLanesPerPair int GethResourceProfile map[string]interface{} CLNodeResourceProfile map[string]interface{} CLNodeDBResourceProfile map[string]interface{} @@ -192,34 +193,76 @@ func (p *CCIPTestConfig) setLoadInputs() { } } -func (p *CCIPTestConfig) SetNetworkPairs(t *testing.T, lggr zerolog.Logger) error { +func (p *CCIPTestConfig) AddPairToNetworkList(networkA, networkB blockchain.EVMNetwork) { + if p.AllNetworks == nil { + p.AllNetworks = make(map[string]blockchain.EVMNetwork) + } + firstOfPairs := []blockchain.EVMNetwork{networkA} + secondOfPairs := []blockchain.EVMNetwork{networkB} + // if no of lanes per pair is greater than 1, copy common contracts from the same network + // if no of lanes per pair is more than 1, the networks are added into the inputs.AllNetworks with a suffix of - + // for example, if no of lanes per pair is 2, and the network pairs are called "testnetA", "testnetB", + // the network will be added as "testnetA-1", testnetA-2","testnetB-1", testnetB-2" + // to deploy 4 lanes between same network pair "testnetA", "testnetB". + // lanes - testnetA-1<->testnetB-1, testnetA-1<-->testnetB-2 , testnetA-2<--> testnetB-1, testnetA-2<--> testnetB-2 + if p.NoOfLanesPerPair > 1 { + firstOfPairs[0].Name = fmt.Sprintf("%s-%d", firstOfPairs[0].Name, 1) + secondOfPairs[0].Name = fmt.Sprintf("%s-%d", secondOfPairs[0].Name, 1) + for i := 1; i < p.NoOfLanesPerPair; i++ { + netsA := networkA + netsA.Name = fmt.Sprintf("%s-%d", netsA.Name, i+1) + netsB := networkB + netsB.Name = fmt.Sprintf("%s-%d", netsB.Name, i+1) + firstOfPairs = append(firstOfPairs, netsA) + secondOfPairs = append(secondOfPairs, netsB) + } + } + + for i := range firstOfPairs { + p.AllNetworks[firstOfPairs[i].Name] = firstOfPairs[i] + p.AllNetworks[secondOfPairs[i].Name] = secondOfPairs[i] + p.NetworkPairs = append(p.NetworkPairs, NetworkPair{ + NetworkA: firstOfPairs[i], + NetworkB: secondOfPairs[i], + }) + } +} + +func (p *CCIPTestConfig) SetNetworkPairs(lggr zerolog.Logger) error { var allError error + noRouter, _ := utils.GetEnv("CCIP_NO_OF_LANES_PER_PAIR") + if noRouter != "" { + n, err := strconv.Atoi(noRouter) + if err != nil { + allError = multierr.Append(allError, err) + } else { + p.NoOfLanesPerPair = n + } + } // if network pairs are provided, then use them // example usage - CCIP_NETWORK_PAIRS="networkA,networkB|networkC,networkD|networkA,networkC" lanes, _ := utils.GetEnv("CCIP_NETWORK_PAIRS") if lanes != "" { p.NetworkPairs = []NetworkPair{} networkPairs := strings.Split(lanes, "|") - networkMap := make(map[int64]blockchain.EVMNetwork) + networkByChainID := make(map[int64]blockchain.EVMNetwork) for _, pair := range networkPairs { networkNames := strings.Split(pair, ",") if len(networkNames) != 2 { allError = multierr.Append(allError, fmt.Errorf("invalid network pair")) } nets := networks.SetNetworks(networkNames) - p.NetworkPairs = append(p.NetworkPairs, NetworkPair{ - NetworkA: nets[0], - NetworkB: nets[1], - }) - if _, ok := networkMap[nets[0].ChainID]; !ok { - networkMap[nets[0].ChainID] = nets[0] + if _, ok := networkByChainID[nets[0].ChainID]; !ok { + networkByChainID[nets[0].ChainID] = nets[0] } - if _, ok := networkMap[nets[1].ChainID]; !ok { - networkMap[nets[1].ChainID] = nets[1] + if _, ok := networkByChainID[nets[1].ChainID]; !ok { + networkByChainID[nets[1].ChainID] = nets[1] } + p.AddPairToNetworkList(nets[0], nets[1]) } - for _, net := range networkMap { - p.AllNetworks = append(p.AllNetworks, net) + + for _, net := range networkByChainID { + p.SelectedNetworks = append(p.SelectedNetworks, net) } return allError } @@ -229,7 +272,22 @@ func (p *CCIPTestConfig) SetNetworkPairs(t *testing.T, lggr zerolog.Logger) erro Interface("SELECTED_NETWORKS", networks.SelectedNetworks). Msg("Set source and destination network in index 1 & 2 of env variable SELECTED_NETWORKS") } - p.AllNetworks = networks.SelectedNetworks[1:] + + // skip the first index as it is generally set to Simulated EVM in dev mode to be used by other tests + p.SelectedNetworks = networks.SelectedNetworks[1:] + // TODO remove this when CTF network timeout is fixed + for i := range p.SelectedNetworks { + p.SelectedNetworks[i].Timeout = blockchain.JSONStrDuration{ + Duration: 3 * time.Minute, + } + } + simulated := p.SelectedNetworks[0].Simulated + for i := 1; i < len(p.SelectedNetworks); i++ { + if p.SelectedNetworks[i].Simulated != simulated { + lggr.Fatal().Msg("networks must be of the same type either simulated or real") + } + } + p.NoOfNetworks = DefaultNoOfNetworks inputNoOfNetworks, _ := utils.GetEnv("CCIP_NO_OF_NETWORKS") if inputNoOfNetworks != "" { @@ -240,32 +298,26 @@ func (p *CCIPTestConfig) SetNetworkPairs(t *testing.T, lggr zerolog.Logger) erro p.NoOfNetworks = n } } - // skip the first index as it is generally set to Simulated EVM in dev mode to be used by other tests - simulated := p.AllNetworks[0].Simulated - for i := 1; i < len(p.AllNetworks); i++ { - if p.AllNetworks[i].Simulated != simulated { - t.Fatal("networks must be of the same type either simulated or real") - } - } + // if the networks are not simulated use the first p.NoOfNetworks networks from the selected networks - if !simulated && len(p.AllNetworks) != p.NoOfNetworks { - if len(p.AllNetworks) < p.NoOfNetworks { + if !simulated && len(p.SelectedNetworks) != p.NoOfNetworks { + if len(p.SelectedNetworks) < p.NoOfNetworks { allError = multierr.Append(allError, fmt.Errorf("not enough networks provided")) } else { - p.AllNetworks = p.AllNetworks[:p.NoOfNetworks] + p.SelectedNetworks = p.SelectedNetworks[:p.NoOfNetworks] } } // If provided networks is lesser than the required number of networks // and the provided networks are simulated network, create replicas of the provided networks with // different chain ids - if len(p.AllNetworks) < p.NoOfNetworks { + if len(p.SelectedNetworks) < p.NoOfNetworks { if simulated { - actualNoOfNetworks := len(p.AllNetworks) - n := p.AllNetworks[0] + actualNoOfNetworks := len(p.SelectedNetworks) + n := p.SelectedNetworks[0] for i := 0; i < p.NoOfNetworks-actualNoOfNetworks; i++ { chainID := networks.AdditionalSimulatedChainIds[i] - p.AllNetworks = append(p.AllNetworks, blockchain.EVMNetwork{ - Name: fmt.Sprintf("simulated-non-dev%d", len(p.AllNetworks)+1), + p.SelectedNetworks = append(p.SelectedNetworks, blockchain.EVMNetwork{ + Name: fmt.Sprintf("simulated-non-dev%d", len(p.SelectedNetworks)+1), ChainID: chainID, Simulated: true, PrivateKeys: []string{networks.AdditionalSimulatedPvtKeys[i]}, @@ -278,21 +330,17 @@ func (p *CCIPTestConfig) SetNetworkPairs(t *testing.T, lggr zerolog.Logger) erro } } } - lggr.Info().Interface("Networks", p.AllNetworks).Msg("Running tests with networks") + if p.NoOfNetworks > 2 { p.FormNetworkPairCombinations() } else { - p.NetworkPairs = []NetworkPair{ - { - NetworkA: p.AllNetworks[0], - NetworkB: p.AllNetworks[1], - }, - } + p.AddPairToNetworkList(p.SelectedNetworks[0], p.SelectedNetworks[1]) } for _, n := range p.NetworkPairs { lggr.Info().Str("NetworkA", n.NetworkA.Name).Str("NetworkB", n.NetworkB.Name).Msg("Network Pairs") } + lggr.Info().Int("Pairs", len(p.NetworkPairs)).Msg("No Of Lanes") return allError } @@ -300,10 +348,7 @@ func (p *CCIPTestConfig) SetNetworkPairs(t *testing.T, lggr zerolog.Logger) erro func (p *CCIPTestConfig) FormNetworkPairCombinations() { for i := 0; i < p.NoOfNetworks; i++ { for j := i + 1; j < p.NoOfNetworks; j++ { - p.NetworkPairs = append(p.NetworkPairs, NetworkPair{ - NetworkA: p.AllNetworks[i], - NetworkB: p.AllNetworks[j], - }) + p.AddPairToNetworkList(p.SelectedNetworks[i], p.SelectedNetworks[j]) } } } @@ -331,7 +376,7 @@ func NewCCIPTestConfig(t *testing.T, lggr zerolog.Logger, tType string) *CCIPTes p.PhaseTimeout = DefaultPhaseTimeoutForLongTests } - allError = multierr.Append(allError, p.SetNetworkPairs(t, lggr)) + allError = multierr.Append(allError, p.SetNetworkPairs(lggr)) ttlDuration, _ := utils.GetEnv("CCIP_KEEP_ENV_TTL") if ttlDuration != "" { @@ -405,6 +450,16 @@ func NewCCIPTestConfig(t *testing.T, lggr zerolog.Logger, tType string) *CCIPTes } } + alive, _ := utils.GetEnv("CCIP_KEEP_ENV_ALIVE") + if alive != "" { + e, err := strconv.ParseBool(alive) + if err != nil { + allError = multierr.Append(allError, err) + } else { + p.KeepEnvAlive = e + } + } + existing, _ := utils.GetEnv("CCIP_TESTS_ON_EXISTING_DEPLOYMENT") if existing != "" { e, err := strconv.ParseBool(existing) @@ -428,8 +483,6 @@ func NewCCIPTestConfig(t *testing.T, lggr zerolog.Logger, tType string) *CCIPTes envName, _ := utils.GetEnv("CCIP_EXISTING_ENV") if envName != "" { p.ExistingEnv = envName - } else { - p.ExistingEnv = fmt.Sprintf("Existing-Deployment-%s", uuid.NewString()[0:5]) } } @@ -440,6 +493,11 @@ func NewCCIPTestConfig(t *testing.T, lggr zerolog.Logger, tType string) *CCIPTes p.setLoadInputs() } + // if no of NetworkPairs are more than 3 , need to increase the db profile + if len(p.NetworkPairs) > 10 { + p.CLNodeDBResourceProfile = DONDBResourceProfile + } + return p } @@ -453,6 +511,8 @@ type BiDirectionalLaneConfig struct { type CCIPTestSetUpOutputs struct { Cfg *CCIPTestConfig + LaneContractsByNetwork sync.Map + laneMutex *sync.Mutex Lanes []*BiDirectionalLaneConfig CommonContractsByNetwork sync.Map Reporter *testreporters.CCIPTestReporter @@ -462,10 +522,24 @@ type CCIPTestSetUpOutputs struct { Env *actions.CCIPTestEnv Balance *actions.BalanceSheet BootstrapAdded *atomic.Bool + JobAddGrp *errgroup.Group +} + +func (o *CCIPTestSetUpOutputs) AddToLanes(lane *BiDirectionalLaneConfig) { + o.laneMutex.Lock() + defer o.laneMutex.Unlock() + o.Lanes = append(o.Lanes, lane) +} + +func (o *CCIPTestSetUpOutputs) ReadLanes() []*BiDirectionalLaneConfig { + o.laneMutex.Lock() + defer o.laneMutex.Unlock() + return o.Lanes } func (o *CCIPTestSetUpOutputs) DeployChainContracts( chainClient blockchain.EVMClient, + networkCfg blockchain.EVMNetwork, noOfTokens int, tokenDeployerFns []blockchain.ContractDeployer, lggr zerolog.Logger, @@ -475,27 +549,30 @@ func (o *CCIPTestSetUpOutputs) DeployChainContracts( if ccipEnv != nil { k8Env = ccipEnv.K8Env } - net := chainClient.GetNetworkConfig() - chain, err := blockchain.ConcurrentEVMClient(*net, k8Env, chainClient, lggr) - if err != nil { - return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", net.Name, err)) + if k8Env != nil && chainClient.NetworkSimulated() { + networkCfg.URLs = k8Env.URLs[chainClient.GetNetworkConfig().Name] } - chain.ParallelTransactions(true) - - ccipCommon, err := actions.DefaultCCIPModule(chain, o.Cfg.ExistingDeployment, lggr) + chain, err := blockchain.ConcurrentEVMClient(networkCfg, k8Env, chainClient, lggr) if err != nil { - return errors.WithStack(fmt.Errorf("failed to create ccip common module for %s: %v", net.Name, err)) + return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", networkCfg.Name, err)) } - cfg, err := o.LaneConfig.ReadLaneConfig(net.Name) + + chain.ParallelTransactions(true) + defer chain.Close() + ccipCommon, err := actions.DefaultCCIPModule(lggr, chain, o.Cfg.ExistingDeployment) if err != nil { - return errors.WithStack(fmt.Errorf("failed to read lane config for %s: %v", net.Name, err)) + return errors.WithStack(fmt.Errorf("failed to create ccip common module for %s: %v", networkCfg.Name, err)) } + + cfg := o.LaneConfig.ReadLaneConfig(networkCfg.Name) + err = ccipCommon.DeployContracts(noOfTokens, tokenDeployerFns, cfg) if err != nil { - return errors.WithStack(fmt.Errorf("failed to deploy common ccip contracts for %s: %v", net.Name, err)) + return errors.WithStack(fmt.Errorf("failed to deploy common ccip contracts for %s: %v", networkCfg.Name, err)) } - o.CommonContractsByNetwork.Store(net.ChainID, ccipCommon) + o.LaneContractsByNetwork.Store(networkCfg.Name, cfg) + o.CommonContractsByNetwork.Store(networkCfg.Name, ccipCommon) return nil } @@ -527,11 +604,16 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( // Currently for simulated network clients(from same network) created with NewEVMClient does not sync nonce // ConcurrentEVMClient is a work-around for that. sourceChainClientA2B, err := blockchain.ConcurrentEVMClient(networkA, k8Env, chainClientA, lggr) - require.NoError(t, err, "Connecting to blockchain nodes shouldn't fail") + if err != nil { + return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", networkA.Name, err)) + } + sourceChainClientA2B.ParallelTransactions(true) destChainClientA2B, err := blockchain.ConcurrentEVMClient(networkB, k8Env, chainClientB, lggr) - require.NoError(t, err, "Connecting to blockchain nodes shouldn't fail") + if err != nil { + return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", networkB.Name, err)) + } destChainClientA2B.ParallelTransactions(true) ccipLaneA2B := &actions.CCIPLane{ @@ -547,15 +629,23 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( Balance: o.Balance, Context: ctx, } - ccipLaneA2B.SrcNetworkLaneCfg, err = o.LaneConfig.ReadLaneConfig(networkA.Name) - require.NoError(t, err, "Reading lane config shouldn't fail") - ccipLaneA2B.DstNetworkLaneCfg, err = o.LaneConfig.ReadLaneConfig(networkB.Name) - require.NoError(t, err, "Reading lane config shouldn't fail") + contractsA, ok := o.LaneContractsByNetwork.Load(networkA.Name) + if !ok { + return errors.WithStack(fmt.Errorf("failed to load lane contracts for %s", networkA.Name)) + } + srcCfg := contractsA.(*laneconfig.LaneConfig) + ccipLaneA2B.SrcNetworkLaneCfg = srcCfg + contractsB, ok := o.LaneContractsByNetwork.Load(networkB.Name) + if !ok { + return errors.WithStack(fmt.Errorf("failed to load lane contracts for %s", networkB.Name)) + } + destCfg := contractsB.(*laneconfig.LaneConfig) + ccipLaneA2B.DstNetworkLaneCfg = destCfg ccipLaneA2B.Logger = lggr.With().Str("env", namespace).Str("Lane", fmt.Sprintf("%s-->%s", ccipLaneA2B.SourceNetworkName, ccipLaneA2B.DestNetworkName)).Logger() - ccipLaneA2B.Reports = o.Reporter.AddNewLane(fmt.Sprintf("%d To %d", - networkA.ChainID, networkB.ChainID), ccipLaneA2B.Logger) + ccipLaneA2B.Reports = o.Reporter.AddNewLane(fmt.Sprintf("%s To %s", + networkA.Name, networkB.Name), ccipLaneA2B.Logger) bidirectionalLane := &BiDirectionalLaneConfig{ NetworkA: networkA, @@ -567,12 +657,16 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( var ccipLaneB2A *actions.CCIPLane if bidirectional { - sourceChainClientB2A, err := blockchain.ConcurrentEVMClient(networkB, k8Env, destChainClientA2B, lggr) - require.NoError(t, err, "Connecting to blockchain nodes shouldn't fail") + sourceChainClientB2A, err := blockchain.ConcurrentEVMClient(networkB, k8Env, chainClientB, lggr) + if err != nil { + return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", networkB.Name, err)) + } sourceChainClientB2A.ParallelTransactions(true) - destChainClientB2A, err := blockchain.ConcurrentEVMClient(networkA, k8Env, sourceChainClientA2B, lggr) - require.NoError(t, err, "Connecting to blockchain nodes shouldn't fail") + destChainClientB2A, err := blockchain.ConcurrentEVMClient(networkA, k8Env, chainClientA, lggr) + if err != nil { + return errors.WithStack(fmt.Errorf("failed to create chain client for %s: %v", networkA.Name, err)) + } destChainClientB2A.ParallelTransactions(true) ccipLaneB2A = &actions.CCIPLane{ @@ -593,12 +687,12 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( ccipLaneB2A.Logger = lggr.With().Str("env", namespace).Str("Lane", fmt.Sprintf("%s-->%s", ccipLaneB2A.SourceNetworkName, ccipLaneB2A.DestNetworkName)).Logger() ccipLaneB2A.Reports = o.Reporter.AddNewLane( - fmt.Sprintf("%d To %d", networkB.ChainID, networkA.ChainID), ccipLaneB2A.Logger) + fmt.Sprintf("%s To %s", networkB.Name, networkA.Name), ccipLaneB2A.Logger) bidirectionalLane.ReverseLane = ccipLaneB2A } - o.Lanes = append(o.Lanes, bidirectionalLane) + o.AddToLanes(bidirectionalLane) - c1, ok := o.CommonContractsByNetwork.Load(networkA.ChainID) + c1, ok := o.CommonContractsByNetwork.Load(networkA.Name) var networkACmn *actions.CCIPCommon if ok { networkACmn = c1.(*actions.CCIPCommon) @@ -606,7 +700,7 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( if networkACmn == nil { return errors.WithStack(fmt.Errorf("chain contracts for network %s not found", networkA.Name)) } - c2, ok := o.CommonContractsByNetwork.Load(networkB.ChainID) + c2, ok := o.CommonContractsByNetwork.Load(networkB.Name) var networkBCmn *actions.CCIPCommon if ok { networkBCmn = c2.(*actions.CCIPCommon) @@ -617,23 +711,46 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( setUpFuncs.Go(func() error { lggr.Info().Msgf("Setting up lane %s to %s", networkA.Name, networkB.Name) - err := ccipLaneA2B.DeployNewCCIPLane(numOfCommitNodes, commitAndExecOnSameDON, networkACmn, networkBCmn, - transferAmounts, o.BootstrapAdded, configureCLNode) + srcConfig, destConfig, err := ccipLaneA2B.DeployNewCCIPLane(numOfCommitNodes, commitAndExecOnSameDON, networkACmn, networkBCmn, + transferAmounts, o.BootstrapAdded, configureCLNode, o.JobAddGrp) if err != nil { allErrors = multierr.Append(allErrors, fmt.Errorf("deploying lane %s to %s; err - %+v", networkA.Name, networkB.Name, err)) + return err } - return err + err = o.LaneConfig.WriteLaneConfig(networkA.Name, srcConfig) + if err != nil { + allErrors = multierr.Append(allErrors, fmt.Errorf("writing lane config for %s; err - %+v", networkA.Name, err)) + return err + } + err = o.LaneConfig.WriteLaneConfig(networkB.Name, destConfig) + if err != nil { + allErrors = multierr.Append(allErrors, fmt.Errorf("writing lane config for %s; err - %+v", networkB.Name, err)) + return err + } + return nil }) setUpFuncs.Go(func() error { if bidirectional { lggr.Info().Msgf("Setting up lane %s to %s", networkB.Name, networkA.Name) - err := ccipLaneB2A.DeployNewCCIPLane(numOfCommitNodes, commitAndExecOnSameDON, networkBCmn, networkACmn, - transferAmounts, o.BootstrapAdded, configureCLNode) + srcConfig, destConfig, err := ccipLaneB2A.DeployNewCCIPLane(numOfCommitNodes, commitAndExecOnSameDON, networkBCmn, networkACmn, + transferAmounts, o.BootstrapAdded, configureCLNode, o.JobAddGrp) if err != nil { allErrors = multierr.Append(allErrors, fmt.Errorf("deploying lane %s to %s; err - %+v", networkB.Name, networkA.Name, err)) + return err } - return err + + err = o.LaneConfig.WriteLaneConfig(networkB.Name, srcConfig) + if err != nil { + allErrors = multierr.Append(allErrors, fmt.Errorf("writing lane config for %s; err - %+v", networkA.Name, err)) + return err + } + err = o.LaneConfig.WriteLaneConfig(networkA.Name, destConfig) + if err != nil { + allErrors = multierr.Append(allErrors, fmt.Errorf("writing lane config for %s; err - %+v", networkB.Name, err)) + return err + } + return nil } return nil }) @@ -657,6 +774,66 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair( } } +func (o *CCIPTestSetUpOutputs) StartEventWatchers() { + for _, lane := range o.ReadLanes() { + err := lane.ForwardLane.StartEventWatchers() + require.NoError(o.Cfg.Test, err) + err = lane.ReverseLane.StartEventWatchers() + require.NoError(o.Cfg.Test, err) + } +} + +func (o *CCIPTestSetUpOutputs) WaitForPriceUpdates(ctx context.Context) { + t := o.Cfg.Test + priceUpdateGrp, _ := errgroup.WithContext(ctx) + priceUpdateTracker := sync.Map{} + for _, lanes := range o.ReadLanes() { + lanes := lanes + waitForUpdate := func(lane actions.CCIPLane) error { + if id, ok := priceUpdateTracker.Load(lane.Source.Common.PriceRegistry.Address()); ok && + id.(uint64) == lane.Source.DestinationChainId { + return nil + } + priceUpdateTracker.Store(lane.Source.Common.PriceRegistry.Address(), lane.Source.DestinationChainId) + lane.Logger.Info(). + Str("source_chain", lane.Source.Common.ChainClient.GetNetworkName()). + Uint64("dest_chain", lane.Source.DestinationChainId). + Str("price_registry", lane.Source.Common.PriceRegistry.Address()). + Msgf("Waiting for price update") + err := lane.Source.Common.WatchForPriceUpdates() + if err != nil { + return err + } + defer func() { + lane.Logger.Info(). + Str("source_chain", lane.Source.Common.ChainClient.GetNetworkName()). + Uint64("dest_chain", lane.Source.DestinationChainId). + Str("price_registry", lane.Source.Common.PriceRegistry.Address()). + Msg("Stopping price update watch") + lane.Source.Common.StopWatchingPriceUpdates() + }() + err = lane.Source.Common.WaitForPriceUpdates( + lane.Logger, + 30*time.Minute, + lane.Source.DestinationChainId, + ) + if err != nil { + return errors.Wrapf(err, "waiting for price update failed on lane %s-->%s", lane.SourceNetworkName, lane.DestNetworkName) + } + return nil + } + + priceUpdateGrp.Go(func() error { + return waitForUpdate(*lanes.ForwardLane) + }) + priceUpdateGrp.Go(func() error { + return waitForUpdate(*lanes.ReverseLane) + }) + } + + require.NoError(t, priceUpdateGrp.Wait()) +} + // CCIPDefaultTestSetUp sets up the environment for CCIP tests // if configureCLNode is set as false, it assumes: // 1. contracts are already deployed on live networks @@ -699,6 +876,8 @@ func CCIPDefaultTestSetUp( LaneConfigFile: filename, Balance: actions.NewBalanceSheet(), BootstrapAdded: atomic.NewBool(false), + JobAddGrp: &errgroup.Group{}, + laneMutex: &sync.Mutex{}, } _, err = os.Stat(setUpArgs.LaneConfigFile) if err == nil { @@ -706,16 +885,12 @@ func CCIPDefaultTestSetUp( err = os.Remove(setUpArgs.LaneConfigFile) require.NoError(t, err, "error while removing existing lane config file - %s", setUpArgs.LaneConfigFile) } - if inputs.ExistingDeployment || inputs.ReuseContracts { - setUpArgs.LaneConfig, err = laneconfig.ReadLanesFromExistingDeployment() - require.NoError(t, err) - } else { - setUpArgs.LaneConfig, err = laneconfig.CreateDeploymentJSON(setUpArgs.LaneConfigFile) - require.NoError(t, err) - if setUpArgs.LaneConfig == nil { - setUpArgs.LaneConfig = &laneconfig.Lanes{LaneConfigs: make(map[string]*laneconfig.LaneConfig)} - } + setUpArgs.LaneConfig, err = laneconfig.ReadLanesFromExistingDeployment() + require.NoError(t, err) + + if setUpArgs.LaneConfig == nil { + setUpArgs.LaneConfig = &laneconfig.Lanes{LaneConfigs: make(map[string]*laneconfig.LaneConfig)} } parent, cancel := context.WithCancel(context.Background()) @@ -726,7 +901,7 @@ func CCIPDefaultTestSetUp( var local *test_env.CLClusterTestEnv if configureCLNode { if inputs.LocalCluster { - local, deployCL = DeployLocalCluster(t, numOfCLNodes, inputs.AllNetworks) + local, deployCL = DeployLocalCluster(t, numOfCLNodes, inputs.SelectedNetworks) ccipEnv = &actions.CCIPTestEnv{ LocalCluster: local, } @@ -745,7 +920,7 @@ func CCIPDefaultTestSetUp( TTL: inputs.EnvTTL, NamespacePrefix: envName, Test: t, - }, clProps, inputs.GethResourceProfile, inputs.AllNetworks) + }, clProps, inputs.GethResourceProfile, inputs.SelectedNetworks) ccipEnv = &actions.CCIPTestEnv{K8Env: k8Env} } @@ -780,15 +955,21 @@ func CCIPDefaultTestSetUp( chains = append(chains, primaryNode.GetEVMClient()) } } else { - for _, network := range inputs.AllNetworks { - ec, err := blockchain.NewEVMClient(network, k8Env, lggr) + for _, n := range inputs.SelectedNetworks { + if _, ok := chainByChainID[n.ChainID]; ok { + continue + } + ec, err := blockchain.NewEVMClient(n, k8Env, lggr) require.NoError(t, err, "Connecting to blockchain nodes shouldn't fail") chains = append(chains, ec) - chainByChainID[network.ChainID] = ec + chainByChainID[n.ChainID] = ec } } t.Cleanup(func() { + if inputs.KeepEnvAlive { + return + } if configureCLNode { lggr.Info().Msg("Tearing down the environment") if ccipEnv.LocalCluster != nil { @@ -809,6 +990,7 @@ func CCIPDefaultTestSetUp( } } }) + if configureCLNode { ccipEnv.CLNodeWithKeyReady.Go(func() error { if ccipEnv.LocalCluster != nil { @@ -820,27 +1002,53 @@ func CCIPDefaultTestSetUp( return ccipEnv.SetUpNodesAndKeys(ctx, inputs.NodeFunding, chains, lggr) }) } + + // if no of lanes per pair is greater than 1, copy common contracts from the same network + // if no of lanes per pair is more than 1, the networks are added into the inputs.AllNetworks with a suffix of - + // for example, if no of lanes per pair is 2, and the network pairs are called "testnetA", "testnetB", + // the network will be added as "testnetA-1", testnetA-2","testnetB-1", testnetB-2" + // to deploy 2 lanes between same network pair "testnetA", "testnetB". + // In the following the common contracts will be copied from "testnetA" to "testnetA-1" and "testnetA-2" and + // from "testnetB" to "testnetB-1" and "testnetB-2" + for n := range inputs.AllNetworks { + if setUpArgs.Cfg.NoOfLanesPerPair > 1 { + regex := regexp.MustCompile(`-(\d+)$`) + networkNameToReadCfg := regex.ReplaceAllString(n, "") + // if reuse contracts is true, copy common contracts from the same network except the router contract + setUpArgs.LaneConfig.CopyCommonContracts(networkNameToReadCfg, n, inputs.ReuseContracts, inputs.MsgType == actions.TokenTransfer) + } + } + // deploy all chain specific common contracts chainAddGrp, _ := errgroup.WithContext(parent) - for _, chain := range chainByChainID { - chain := chain + lggr.Info().Msg("Deploying common contracts") + for _, net := range inputs.AllNetworks { + chain := chainByChainID[net.ChainID] + net := net + net.HTTPURLs = chain.GetNetworkConfig().HTTPURLs + net.URLs = chain.GetNetworkConfig().URLs chainAddGrp.Go(func() error { - return setUpArgs.DeployChainContracts(chain, len(transferAmounts), tokenDeployerFns, lggr) + return setUpArgs.DeployChainContracts(chain, net, len(transferAmounts), tokenDeployerFns, lggr) }) } require.NoError(t, chainAddGrp.Wait(), "Deploying common contracts shouldn't fail") // deploy all lane specific contracts + lggr.Info().Msg("Deploying chain specific contracts") laneAddGrp, _ := errgroup.WithContext(parent) for i, n := range inputs.NetworkPairs { + i := i + n := n var ok bool inputs.NetworkPairs[i].ChainClientA, ok = chainByChainID[n.NetworkA.ChainID] require.True(t, ok, "Chain client for chainID %d not found", n.NetworkA.ChainID) inputs.NetworkPairs[i].ChainClientB, ok = chainByChainID[n.NetworkB.ChainID] require.True(t, ok, "Chain client for chainID %d not found", n.NetworkB.ChainID) - n.NetworkA = *inputs.NetworkPairs[i].ChainClientA.GetNetworkConfig() - n.NetworkB = *inputs.NetworkPairs[i].ChainClientB.GetNetworkConfig() + n.NetworkA.HTTPURLs = inputs.NetworkPairs[i].ChainClientA.GetNetworkConfig().HTTPURLs + n.NetworkA.URLs = inputs.NetworkPairs[i].ChainClientA.GetNetworkConfig().URLs + n.NetworkB.HTTPURLs = inputs.NetworkPairs[i].ChainClientB.GetNetworkConfig().HTTPURLs + n.NetworkB.URLs = inputs.NetworkPairs[i].ChainClientB.GetNetworkConfig().URLs // if sequential lane addition is true, continue after adding the first bidirectional lane // and add rest of the lanes later, after the previously added lane(s) starts getting requests @@ -859,29 +1067,19 @@ func CCIPDefaultTestSetUp( require.NoError(t, laneAddGrp.Wait()) err = laneconfig.WriteLanesToJSON(setUpArgs.LaneConfigFile, setUpArgs.LaneConfig) require.NoError(t, err) - - // wait for price updates to be available - priceUpdateGrp, _ := errgroup.WithContext(parent) - for _, lanes := range setUpArgs.Lanes { - lanes := lanes - priceUpdateGrp.Go(func() error { - err = lanes.ForwardLane.Source.Common.WaitForPriceUpdates( - lanes.ForwardLane.Logger, - lanes.ForwardLane.ValidationTimeout, - lanes.ForwardLane.Source.DestinationChainId, - ) - if err != nil { - return err - } - - return lanes.ReverseLane.Source.Common.WaitForPriceUpdates( - lanes.ReverseLane.Logger, - lanes.ReverseLane.ValidationTimeout, - lanes.ReverseLane.Source.DestinationChainId, - ) - }) + require.Equal(t, len(setUpArgs.Lanes), len(inputs.NetworkPairs), + "Number of bi-directional lanes should be equal to number of network pairs") + + if !inputs.ExistingDeployment { + // wait for all jobs to get created + lggr.Info().Msg("Waiting for jobs to be created") + require.NoError(t, setUpArgs.JobAddGrp.Wait(), "Creating jobs shouldn't fail") + // wait for price updates to be available and start event watchers + setUpArgs.WaitForPriceUpdates(parent) } - require.NoError(t, priceUpdateGrp.Wait()) + + // start event watchers for all lanes + setUpArgs.StartEventWatchers() setUpArgs.TearDown = func() { for _, lanes := range setUpArgs.Lanes { @@ -891,6 +1089,7 @@ func CCIPDefaultTestSetUp( } } } + lggr.Info().Msg("Test setup completed") return setUpArgs } @@ -921,24 +1120,23 @@ func DeployLocalCluster( ) (*test_env.CLClusterTestEnv, func() error) { env, err := test_env.NewCLTestEnvBuilder(). WithPrivateGethChains(networks). - WithMockServer(1). Build() require.NoError(t, err) + for _, n := range env.PrivateChain { + primaryNode := n.GetPrimaryNode() + require.NotNil(t, primaryNode, "Primary node is nil in PrivateChain interface") + for i, networkCfg := range networks { + if networkCfg.ChainID == n.GetNetworkConfig().ChainID { + networks[i].URLs = []string{primaryNode.GetInternalWsUrl()} + networks[i].HTTPURLs = []string{primaryNode.GetInternalHttpUrl()} + } + } + } + // a func to start the CL nodes asynchronously deployCL := func() error { - var nonDevGethNetworks []blockchain.EVMNetwork - for i, n := range env.PrivateChain { - primaryNode := n.GetPrimaryNode() - require.NotNil(t, primaryNode, "Primary node is nil in PrivateChain interface") - nonDevGethNetworks = append(nonDevGethNetworks, *n.GetNetworkConfig()) - nonDevGethNetworks[i].URLs = []string{primaryNode.GetInternalWsUrl()} - nonDevGethNetworks[i].HTTPURLs = []string{primaryNode.GetInternalHttpUrl()} - } - if nonDevGethNetworks == nil { - return errors.New("cannot create nodes with custom config without nonDevGethNetworks") - } toml, err := node.NewConfigFromToml(ccipnode.CCIPTOML, - node.WithPrivateEVMs(nonDevGethNetworks)) + node.WithPrivateEVMs(networks)) if err != nil { return err } @@ -961,38 +1159,36 @@ func DeployEnvironments( testEnvironment := environment.New(envconfig) numOfTxNodes := 1 for _, network := range networks { - if network.Simulated { - testEnvironment. - AddHelm(reorg.New(&reorg.Props{ - NetworkName: network.Name, - NetworkType: "simulated-geth-non-dev", - Values: map[string]interface{}{ - "geth": map[string]interface{}{ - "genesis": map[string]interface{}{ - "networkId": fmt.Sprint(network.ChainID), - }, - "tx": map[string]interface{}{ - "replicas": strconv.Itoa(numOfTxNodes), - "resources": gethResource, - }, - "miner": map[string]interface{}{ - "replicas": "0", - "resources": gethResource, - }, + if !network.Simulated { + continue + } + testEnvironment. + AddHelm(reorg.New(&reorg.Props{ + NetworkName: network.Name, + NetworkType: "simulated-geth-non-dev", + Values: map[string]interface{}{ + "geth": map[string]interface{}{ + "genesis": map[string]interface{}{ + "networkId": fmt.Sprint(network.ChainID), + }, + "tx": map[string]interface{}{ + "replicas": strconv.Itoa(numOfTxNodes), + "resources": gethResource, }, - "bootnode": map[string]interface{}{ - "replicas": "1", + "miner": map[string]interface{}{ + "replicas": "0", + "resources": gethResource, }, }, - })) - } + "bootnode": map[string]interface{}{ + "replicas": "1", + }, + }, + })) } - - err := testEnvironment. - AddHelm(mockserver_cfg.New(nil)). - AddHelm(mockserver.New(nil)). - Run() + err := testEnvironment.Run() require.NoError(t, err) + if testEnvironment.WillUseRemoteRunner() { return testEnvironment } @@ -1032,7 +1228,7 @@ func DeployEnvironments( tomlStr, err := tomlCfg.TOMLString() require.NoError(t, err) clProps["toml"] = tomlStr - + clProps["prometheus"] = true err = testEnvironment. AddHelm(chainlink.New(0, clProps)). Run() diff --git a/integration-tests/ccip-tests/types/config/node/core.go b/integration-tests/ccip-tests/types/config/node/core.go index 7784ca9085..1f9cb3dfe8 100644 --- a/integration-tests/ccip-tests/types/config/node/core.go +++ b/integration-tests/ccip-tests/types/config/node/core.go @@ -3,6 +3,7 @@ package node import ( "bytes" _ "embed" + "fmt" "math/big" "time" @@ -36,7 +37,15 @@ func NewConfigFromToml(tomlConfig []byte, opts ...node.NodeConfigOpt) (*chainlin func WithPrivateEVMs(networks []blockchain.EVMNetwork) node.NodeConfigOpt { var evmConfigs []*evmcfg.EVMConfig for _, network := range networks { - evmConfigs = append(evmConfigs, &evmcfg.EVMConfig{ + var evmNodes []*evmcfg.Node + for i := range network.URLs { + evmNodes = append(evmNodes, &evmcfg.Node{ + Name: itutils.Ptr(fmt.Sprintf("%s-%d", network.Name, i)), + WSURL: itutils.MustURL(network.URLs[i]), + HTTPURL: itutils.MustURL(network.HTTPURLs[i]), + }) + } + evmConfig := &evmcfg.EVMConfig{ ChainID: utils.NewBig(big.NewInt(network.ChainID)), Chain: evmcfg.Chain{ AutoCreateKey: itutils.Ptr(true), @@ -48,15 +57,10 @@ func WithPrivateEVMs(networks []blockchain.EVMNetwork) node.NodeConfigOpt { }, GasEstimator: WithCCIPGasEstimator(network.ChainID), }, - Nodes: []*evmcfg.Node{ - { - Name: itutils.Ptr(network.Name), - WSURL: itutils.MustURL(network.URLs[0]), - HTTPURL: itutils.MustURL(network.HTTPURLs[0]), - SendOnly: itutils.Ptr(false), - }, - }, - }) + Nodes: evmNodes, + } + + evmConfigs = append(evmConfigs, evmConfig) } return func(c *chainlink.Config) { c.EVM = evmConfigs @@ -72,13 +76,31 @@ func WithCCIPGasEstimator(chainId int64) evmcfg.GasEstimator { switch chainId { case 421613: cfg.LimitDefault = itutils.Ptr(uint32(100000000)) + cfg.BumpThreshold = itutils.Ptr(uint32(60)) + cfg.BumpPercent = itutils.Ptr(uint16(20)) + cfg.BumpMin = assets.GWei(100) + cfg.PriceMax = assets.GWei(400) case 420: cfg.BumpThreshold = itutils.Ptr(uint32(60)) cfg.BumpPercent = itutils.Ptr(uint16(20)) cfg.BumpMin = assets.GWei(100) - case 5: - cfg.PriceMax = assets.GWei(500) - cfg.FeeCapDefault = assets.GWei(500) + cfg.PriceMax = assets.GWei(150) + cfg.FeeCapDefault = assets.GWei(150) + cfg.BlockHistory.BlockHistorySize = itutils.Ptr(uint16(200)) + cfg.BlockHistory.EIP1559FeeCapBufferBlocks = itutils.Ptr(uint16(0)) + case 84531: + cfg.BumpThreshold = itutils.Ptr(uint32(60)) + cfg.BumpPercent = itutils.Ptr(uint16(20)) + cfg.BumpMin = assets.GWei(100) + cfg.PriceMax = assets.GWei(150) + cfg.FeeCapDefault = assets.GWei(150) + cfg.BlockHistory.BlockHistorySize = itutils.Ptr(uint16(200)) + cfg.BlockHistory.EIP1559FeeCapBufferBlocks = itutils.Ptr(uint16(0)) + case 43113: + cfg.BumpThreshold = itutils.Ptr(uint32(60)) + case 11155111: + cfg.BlockHistory.BlockHistorySize = itutils.Ptr(uint16(200)) + cfg.BlockHistory.EIP1559FeeCapBufferBlocks = itutils.Ptr(uint16(0)) } return cfg diff --git a/integration-tests/ccip-tests/types/config/node/tomls/ccip.toml b/integration-tests/ccip-tests/types/config/node/tomls/ccip.toml index d3b2b4593d..9fede9a629 100644 --- a/integration-tests/ccip-tests/types/config/node/tomls/ccip.toml +++ b/integration-tests/ccip-tests/types/config/node/tomls/ccip.toml @@ -3,7 +3,7 @@ LogPoller = true CCIP = true [Log] -Level = 'info' +Level = 'debug' JSONConsole = true [Log.File] @@ -16,7 +16,7 @@ SecureCookies = false [WebServer.RateLimit] Authenticated = 2000 -Unauthenticated = 100 +Unauthenticated = 1000 [WebServer.TLS] HTTPSPort = 0 diff --git a/integration-tests/client/chainlink.go b/integration-tests/client/chainlink.go index 8a79cb3ec9..51c7d5e13f 100644 --- a/integration-tests/client/chainlink.go +++ b/integration-tests/client/chainlink.go @@ -5,12 +5,11 @@ import ( "fmt" "math/big" "net/http" + "os" "strings" "sync" "time" - "os" - "github.com/ethereum/go-ethereum/common" "github.com/go-resty/resty/v2" "github.com/rs/zerolog" @@ -93,6 +92,14 @@ func (c *ChainlinkClient) URL() string { return c.Config.URL } +func (c *ChainlinkClient) SetLogger(l zerolog.Logger) { + c.l = l +} + +func (c *ChainlinkClient) AddRetryAttempt(retryCount int) { + c.APIClient.RetryCount = retryCount +} + // CreateJobRaw creates a Chainlink job based on the provided spec string func (c *ChainlinkClient) CreateJobRaw(spec string) (*Job, *http.Response, error) { job := &Job{} diff --git a/integration-tests/docker/test_env/cl_node.go b/integration-tests/docker/test_env/cl_node.go index e4182ca4c3..3045dd4a16 100644 --- a/integration-tests/docker/test_env/cl_node.go +++ b/integration-tests/docker/test_env/cl_node.go @@ -28,11 +28,12 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/docker/test_env" "github.com/smartcontractkit/chainlink-testing-framework/logging" "github.com/smartcontractkit/chainlink-testing-framework/logwatch" - "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2/types" "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" + "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" + "github.com/smartcontractkit/chainlink/integration-tests/client" "github.com/smartcontractkit/chainlink/integration-tests/utils" "github.com/smartcontractkit/chainlink/integration-tests/utils/templates" @@ -262,7 +263,7 @@ func (n *ClNode) StartContainer() error { container, err := docker.StartContainerWithRetry(n.l, tc.GenericContainerRequest{ ContainerRequest: *cReq, Started: true, - Reuse: true, + Reuse: false, Logger: l, }) if err != nil { diff --git a/integration-tests/go.mod b/integration-tests/go.mod index fd64af4498..f84628685e 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -20,8 +20,8 @@ require ( github.com/rs/zerolog v1.30.0 github.com/slack-go/slack v0.12.2 github.com/smartcontractkit/chain-selectors v1.0.1 - github.com/smartcontractkit/chainlink-env v0.36.0 - github.com/smartcontractkit/chainlink-testing-framework v1.17.0 + github.com/smartcontractkit/chainlink-env v0.37.0 + github.com/smartcontractkit/chainlink-testing-framework v1.17.3-0.20230926185057-20d07b113967 github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20230828183543-6d0939746966 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 github.com/smartcontractkit/libocr v0.0.0-20230918212407-dbd4e505b3e6 @@ -530,4 +530,5 @@ replace ( github.com/sercand/kuberesolver v2.4.0+incompatible => github.com/sercand/kuberesolver/v5 v5.1.0 github.com/smartcontractkit/chainlink/integration-tests => ../integration-tests + ) diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 9675ec368e..5ae9efcf37 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -2270,16 +2270,16 @@ github.com/smartcontractkit/chain-selectors v1.0.1 h1:NrSTMpxiB0yEi3BDfiiCkKjUVm github.com/smartcontractkit/chain-selectors v1.0.1/go.mod h1:WBhLlODF5b95vvx2tdKK55vGACg1+qZpuBhOGu1UXVo= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20230913032705-f924d753cc47 h1:vdieOW3CZGdD2R5zvCSMS+0vksyExPN3/Fa1uVfld/A= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20230913032705-f924d753cc47/go.mod h1:xMwqRdj5vqYhCJXgKVqvyAwdcqM6ZAEhnwEQ4Khsop8= -github.com/smartcontractkit/chainlink-env v0.36.0 h1:CFOjs0c0y3lrHi/fl5qseCH9EQa5W/6CFyOvmhe2VnA= -github.com/smartcontractkit/chainlink-env v0.36.0/go.mod h1:NbRExHmJGnKSYXmvNuJx5VErSx26GtE1AEN/CRzYOg8= +github.com/smartcontractkit/chainlink-env v0.37.0 h1:Yl+cMd3gzKx2217hLzDKN0EOmAjD7MrcWHzuR+knb8s= +github.com/smartcontractkit/chainlink-env v0.37.0/go.mod h1:NbRExHmJGnKSYXmvNuJx5VErSx26GtE1AEN/CRzYOg8= github.com/smartcontractkit/chainlink-relay v0.1.7-0.20230918212835-8a0b08df72a3 h1:FonaZ1kgRK0yY7D0jF5pL3K+0DYUnKcnStOOcIN+Hhg= github.com/smartcontractkit/chainlink-relay v0.1.7-0.20230918212835-8a0b08df72a3/go.mod h1:gWclxGW7rLkbjXn7FGizYlyKhp/boekto4MEYGyiMG4= github.com/smartcontractkit/chainlink-solana v1.0.3-0.20230831134610-680240b97aca h1:x7M0m512gtXw5Z4B1WJPZ52VgshoIv+IvHqQ8hsH4AE= github.com/smartcontractkit/chainlink-solana v1.0.3-0.20230831134610-680240b97aca/go.mod h1:RIUJXn7EVp24TL2p4FW79dYjyno23x5mjt1nKN+5WEk= github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20230901115736-bbabe542a918 h1:ByVauKFXphRlSNG47lNuxZ9aicu+r8AoNp933VRPpCw= github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20230901115736-bbabe542a918/go.mod h1:/yp/sqD8Iz5GU5fcercjrw0ivJF7HDcupYg+Gjr7EPg= -github.com/smartcontractkit/chainlink-testing-framework v1.17.0 h1:JcJwfawW7jfLBG+By5hGTVcNgKQ7bJCqvN9TEF3qBis= -github.com/smartcontractkit/chainlink-testing-framework v1.17.0/go.mod h1:Ry6fRPr8TwrIsYVNEF1pguAgzE3QW1s54tbLWnFtfI4= +github.com/smartcontractkit/chainlink-testing-framework v1.17.3-0.20230926185057-20d07b113967 h1:v/kj2OEP8Upw38bMEN5y2pAj7we53rBRvaCLzqK4ipI= +github.com/smartcontractkit/chainlink-testing-framework v1.17.3-0.20230926185057-20d07b113967/go.mod h1:izzRx4cNihkVP9XY15isSCMW1QAlRK1w5eE23/MbZHM= github.com/smartcontractkit/go-plugin v0.0.0-20230605132010-0f4d515d1472 h1:x3kNwgFlDmbE/n0gTSRMt9GBDfsfGrs4X9b9arPZtFI= github.com/smartcontractkit/go-plugin v0.0.0-20230605132010-0f4d515d1472/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU= @@ -3502,4 +3502,4 @@ sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= \ No newline at end of file +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=