From 72e16434bc0bc1856d412d1b0dc64375a6555dd3 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Wed, 9 Oct 2024 22:25:41 +0200 Subject: [PATCH] Merge ccip-contracts (#14612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update .gitignore * assert fees can be set to zero (#1380) Assert we would have the option to set any of the fee components to zero if we would want. --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * pnpm i && snapshot && forge fmt * Misc golfs and fixes (#1402) Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * Increase max signers (#1405) Improve tests and error checks --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * rename CCIPSendRequested to CCIPMessageSent (#1409) * Skip report execution on curse (#1408) The goal of this PR is to remove reverts on lane cursing for DON execution transactions. If a lane is cursed, reverting will cause the whole execution transaction to fail so any execution reports for other lanes will be blocked. For DON execution transactions the behavior is now to skip the report and emit a `SkippedReportExecution`. For manual execution we still revert, otherwise the transaction will silently fail for the users. --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * remove bootstrapP2PIds (#1388) ## Motivation Bootstrap P2P IDs are no longer needed in the OCR config in CCIPConfig. See #1348's description for more details. ## Solution Remove bootstrap P2P IDs from the OCR config in CCIPConfig. ## Related PRs https://github.com/smartcontractkit/chainlink-ccip/pull/89 * Integrate RMNRemote and OffRamp (#1360) Remove the requirement for self-transmitted RMN blessings Allow the commit DON to include RMN blessings at commitment time This PR has a dependency on changes to [chainlink-ccip](https://github.com/smartcontractkit/chainlink-ccip/pull/84) --------- Co-authored-by: Makram * Add report vs message source chain selector check (#1413) The goal of this PR is to add an extra check in the execute function to enforce that the report source chain selector matches its messages source chain selector. Extra gas cost is about 50 gas per message. Revert when `report.sourceChainSelector != (message.header.sourceChainSelector` * Enforce signature verification for commit plugin in `OffRamp` (#1416) ## Motivation The goal of this PR is to implement a check to ensure that the OCR3 signature verification is enabled for the commit plugin on config. This reduces misconfig risks and impact because previously an accidental setting of `isSignatureVerificationEnabled=false` for the commit plugin in the `OffRamp` would have required a redeploy to be fixed. ## Solution Add a check enforcing `isSignatureVerificationEnabled=false` for the commit plugin in `_afterOC3Config`. * Revert "reorder fields in MerkleRoot struct" (#1417) ## Motivation Avoid forcing breaking changes on RMN nodes ## Solution This reverts commit da570c5. * Implement getTotalChainConfigurations (#1419) ## Motivation The goal of this PR is to add a getter function to the `CCIPConfig` contract to fetch the total number of chains configured. This value is necessary to correctly call `getAllChainConfigs` and previously, the only way to access it was through events. ## Solution Implement `getTotalChainConfigurations`. * Add sanity check in applyAllowListUpdates (#1420) ## Motivation Currently, in the event of a misconfig where a destination chain's `AllowListConfigArgs` `allowListEnabled` is set to false while providing addresses to add to the allow list, the config will silently be skipped. ## Solution Add a sanity check to detect `!allowListConfigArgs.allowListEnabled && `allowListConfigArgs.addedAllowlistedSenders.length > 0` * Miscellaneous fixes and cleanups (#1421) ## Motivation The goal of this PR is to fix several miscellaneous items. ## Solution - Replaces some magic numbers with constants - Default to `private` visibility for state variables that are not used in test helpers - Standardizes some natspec tags (consistent use of `@dev` instead of `@notice` for state variables) - Add a `ConfigSet` event in `CCIPConfig` - Asserts full equality of `OCRConfigWithMeta[]` in `CCIPConfigTests` - Add clarifying comments in `NonceManager` `applyPreviousRampsUpdates` * CCIP-2815 commit report event updates (#1407) ## Motivation OffRamp contract emits commitReport event as a Struct to make the event Log filtering and searching more optimized, the report properties are emitted as a event fields rather than emitting the struct --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * GasLimitOverride for manuallyExecute (#1375) ## Motivation 1. OffRamp should now use destExecData to extract the gas used for 2. Manual execution should enable user to override the gas amount for releaseOrMint per token. ## Solution 1. Removed int32 `maxTokenTransferGas` & `maxPoolReleaseOrMintGas` and used the gas encoded in `RampTokenAmount.destExecData` 2. add a new Struct which holds the receiverExecutionGasLimit and transferGasAmounts ``` struct GasLimitOverride { uint256 receiverExecutionGasLimit; uint256[] tokenGasOverrides; } ``` tokenGasOverrides is an array of GasLimits to be used during the relaseOrMint call for the specific tokenPool associated with token Note: The gas limit can not be lowered as that could cause the message to fail. If manual execution is done from an UNTOUCHED state and we would allow lower gas limit, anyone could grief by executing the message with lower gas limit than the DON would have used. This results in the message being marked FAILURE and the DON would not attempt it with the correct gas limit. for the above we have kept a check that `tokenGasOverrides` < gas encoded in `RampTokenAmount.destExecData` --------- Signed-off-by: 0xsuryansh Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * Change data feeds from default to fallback in `FeeQuoter` (#1430) ## Motivation Due to the gas cost of reading from data feeds, it is unlikely to be the default option, we can therefore optimize the `getTokenPrice()` function by defaulting to state instead of data feeds. ## Solution Default to state reported prices and only fall back on data feed external call if the reported prices are stale. * Zp/update mockrouter (#1427) Specifically, allow for empty message with zero gas. ## Motivation EVM2EVMOffRamp checks the message for content and gaslimit and skips calling ccip receive if they're not present. Consequently the mock errors (ReceiverError) when sending only tokens to a smart contract. This update will help chainlink-local correctly process fork-based tests too. ## Solution The MockRouter implementation of _routeMessage was last updated in https://github.com/smartcontractkit/ccip/pull/669 and is out of sync with the logic in EVM2EVMOffRamp. * Hybrid Token Pools: Remove problematic liquidity functions and add incoming supply lock (#1396) ## Motivation Minor Changes to the HybridLockReleaseTokenPool to better meet Circle's bridge requirements 1. Add additional supply lock on incoming messages when a proposal has been created. I.E When a proposal for a chain selector is active, new tokens cannot be released or locked to ensure better security control on the destination-chain's token supply. 2. `withdrawLiquidity()` and `transferLiqudity()` have been removed to avoid issues with the supply lock. Allowing for withdrawing liquidity that has been provided would allow for the supply on the destination chain to be greater than the locked amount on the source chain, preventing a successful migration from occuring. 3. Comment fixes for invariants * Make onRamp mutable in OffRamp (#1422) ## Motivation The goal of this PR is to reduce the misconfig risk on the `OffRamp` with the `onRamp` address. Currently, if we accidentally configure the wrong `onRamp` address on an existing `OffRamp`, the fix would involve a full redeployment + reconfig. ## Solution - Make the `onRamp` mutable in the `OffRamp`. - Add `onRamp` address verification in the `commit()` function - Only allow `onRamp` address modification when `minSeqNr == 1` --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * update offramp layout (#1434) ## Motivation Some header are outdated. The exec logic is above the commit logic, but then after the commit logic we have the token handling logic, which is only used for exec. It has been moved to be above the commit logic * add CCIPEncodingUtils contract and gethwrapper (#1429) ## Motivation I encountered a scenario w/ RMN where offchain needs to abi.encode a [struct](https://github.com/smartcontractkit/ccip/blob/fc50683640bcfd73f0074d791fbaf7cdb6b29c71/contracts/src/v0.8/ccip/rmn/RMNRemote.sol#L90:L97) that is not included in any public contract functions (as input param or return value) and so it is not a part of the ABI or the go wrapper. Offchain is currently doing a manual encoding by re-defining the type, which I usually try to avoid at all costs. In the past, we've used a Utils contract ([ex here](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/automation/AutomationCompatibleUtils.sol) from automation) to expose all private structs in public functions so that offchain components can use E2E type safety when encoding / decoding. ## Solution Create a `CCIPEncodingUtils` contract and accompanying gethwrapper * Remove TODO and rename messageValidator to messageInterceptor (#1438) - Replaces `CCIPConfigTypes.ConfigState` `/// TODO: explain rollbacks?` by rollbacks comment - Renames `messageValidator` to `messageInterceptor` in ramps --------- Co-authored-by: Rens Rooimans * update diagram (#1439) * Make forwardFromRouter non reentrant (#1437) ## Motivation Currently the `OnRamp` performs 3 separate calls to the `FeeQuoter` on the hot path, including 2 in the `forwardFromRouter` function: 1. `getValidatedFee` 2. `processMessageArgs` 3. `processPoolReturnData` This is done to follow the CEI pattern and guard against reentrancy due to the untrusted calls to the pools. This is not optimal for gas but it also makes contract interactions more complex. ## Solution Implement a non reentrant flag and reorder the `forwardFromRouter` function layout. The calls to the pools are now performed first, relying on the reentrancy protection. We reduce the `FeeQuoter` calls in `forwardFromRouter` to a single `processMessageArgs` call. ## Notes Optimizer runs had to be decreased due to contract size which is why gas diffs are showing a gas increase. At equivalent runs diffs are: ``` test_ForwardFromRouterExtraArgsV2_Success() (gas: -65 (-0.045%)) test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: -65 (-0.045%)) test_ForwardFromRouterSuccessCustomExtraArgs() (gas: -65 (-0.045%)) test_ForwardFromRouter_Success() (gas: -65 (-0.045%)) test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: -66 (-0.046%)) test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: -65 (-0.057%)) test_forwardFromRouter_WithValidation_Success() (gas: 318 (0.113%)) test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: -1139 (-0.074%)) ``` * Standardize message hashing functions (#1424) ## Motivation The goal of this PR is to standardize the message hashing functions. Currently we have equivalent but inconsistent message hashing functions: ```solidity function _hash(Any2EVMRampMessage memory original, bytes memory onRamp) internal pure returns (bytes32) ``` and ```solidity function _hash(EVM2AnyRampMessage memory original, bytes32 metadataHash) internal pure returns (bytes32) ``` ## Solution Standardize to `function _hash(message, metadataHash)` and consistently encode dynamic fields. --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * Validate transmitter lengths against F values (#1432) ## Motivation Improves validations for OCR3 and CCIPConfig contracts ## Solution Covers validations: * `fChain <= F`, since `F` represents the full role DON * Allows setting empty transmitters in CCIPConfig to allow `len(transmitters) <= len(signers)`, while still enforcing `len(transmitters) >= 3 * fChain + 1` * Validates non-zero transmitters length in MultiOCR3 * Validates `len(signers) >= len(transmitters)` in MultiOCR3 ### Tooling implications * When setting OCR configs on OffRamp contracts, the list from CCIPConfig must be filtered to exclude 0-bytes addresses. The reason for this is that the MultiOCR3Base disallows zero addresses and duplicates * Signer and transmitter duplication must be checked in tooling scripts off-chain prior to setting CCIPConfig (otherwise it will result in OffRamp breakage) * `chainConfigs` must be set before OCR3 configs due to the added `fChain == F` validation * If `fChain` becomes higher than `F` after updates, existing OCR3 configs get invalidated without an on-chain check (since it is difficult to do). There should be an off-chain validation script that prevents this (first, F should be increased for all configs, only after which fChain can be increased) * `OffRamp` transmitters.length should be validated such that it meets the `3 * fChain + 1` criteria off-chain, since `fChain` is not tracked in the `OffRamp` ### Gas | Function Name | min | avg | median | max | # calls | |---------------------------------------------------------------------------|-----------------|--------|--------|---------|---------| | validateConfig (without loop check) | 7040 | 20701 | 8436 | 122591 | 11 | | validateConfig (with loop check) | 7040 | 21006 | 9132 | 123442 | 11 | * Split RampTokenAmount into EVM2AnyTokenTransfer and Any2EVMTokenTransfer (#1435) * Productionize RMN remote contract (#1431) [Original PR](https://github.com/smartcontractkit/ccip/pull/1308) - there is some discussion here that is possibly still relevant) [Open PR to add cursing](https://github.com/smartcontractkit/ccip/pull/1400) - I copied the relevant parts for the `RMNRemote`. Note: we are intentionally separating `RMNRemote` and `RMNHome` since they have different timelines. Productionize the RMNRemote and include it in integration tests --------- Co-authored-by: Makram * Add RMN_V1_6_ANY2EVM_REPORT to RMNRemote and make public (#1447) ## Motivation https://github.com/smartcontractkit/ccip/pull/1431#discussion_r1763653570 ## Solution Expose the constant as public * merge FeePaid event into CCIPMessageSent (#1456) ## Motivation Not sure actually why this was needed. Request was [made here](https://smartcontract-it.atlassian.net/browse/CCIP-3446?atlOrigin=eyJpIjoiMTQ4ODMwNzU2N2I3NDI0NGE0ZDhiOTIyZTYwOTNjN2IiLCJwIjoiaiJ9). This is the 2nd version, that alters the MessageSent struct. First version [here](https://github.com/smartcontractkit/ccip/pull/1452). ## Solution Merge fields from FeePaid event into CCIPMessageSent event * Add RMNHomeAddress in the OCR3Config (#1449) Adding `rmnHomeAddress` in the `OCR3Config` struct + generated wrappers. * Update pragma to most restrictive dependency or feature (#1466) ## Motivation We have several contracts using `^0.8.0` but also custom errors, or a child contract with custom errors. We also have several contracts at `^0.8.0` but a dependency locked at `0.8.24`. ## Solution Update all pragmas to the pragma of the most restrictive dep or the minimum to enable custom errors (`0.8.4`) * RMNHome (#1469) New PR to have this be standalone * ccip home (#1473) Fresh PR * fix snapshots * Update gethwrappers * [WIP] fix basic offchain logic (#14613) * fix basic offchain logic * type fixes * bump chainlink-common, general fixes * fix message hashing * small fixes * Update chainlink-common * Fix commit-codec test. * Fix error messages. * Fix ccip reader tests (#14619) * Fix exec codec. * Launcher integration tests (#14648) * CCIPHome basic usage framework * Fix homeChain usage * Fix calls in launcher test * Add encoded configs * Add more asserts * Calling right function :cry: * new assertions and logging error * Add don only once and update for all next operations * Fix typo --------- Co-authored-by: Makram Kamaleddine * core/capabilities/ccip: fix usdc reader test (#14652) * fix lint * Rename bluegreen to deployment and use active candidate naming (#14662) * Fix smoke tests (#14655) * Initial commit - fix AddDon in deployment tests * Fix types and add logs * more explicit config setting * Rename bluegreen to deployment and use active candidate naming (#14662) * contracts/ccip/capability: per (donId, pluginType) active config indexes (#1488) * Add CCIPHome fixes * Commit Encoding with new structs * Update gethwrappers * Commit Encode/Decode with new structure * fix encoding, bump cl-ccip * Update gethwrappers * logging updates * add rmn home and remote configuration * fixes * working int test, still some failing tests * bump chainlink-ccip * some more fixes * lint, build * more lint --------- Co-authored-by: Makram Kamaleddine Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> --------- Co-authored-by: Makram Kamaleddine Co-authored-by: Will Winder Co-authored-by: Abdelrahman Soliman (Boda) <2677789+asoliman92@users.noreply.github.com> Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> * tidy * lint again * remove stale files * bump chainlink-ccip again * bump with cl-ccip from main * fix build * fix --------- Signed-off-by: 0xsuryansh Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Co-authored-by: Suryansh <39276431+0xsuryansh@users.noreply.github.com> Co-authored-by: Ryan <80392855+RayXpub@users.noreply.github.com> Co-authored-by: Makram Co-authored-by: Ryan Hall Co-authored-by: kanth <70688600+defistar@users.noreply.github.com> Co-authored-by: Zubin Co-authored-by: Josh Weintraub <26035072+jhweintraub@users.noreply.github.com> Co-authored-by: Evaldas Latoškinas <34982762+elatoskinas@users.noreply.github.com> Co-authored-by: nogo <110664798+0xnogo@users.noreply.github.com> Co-authored-by: Will Winder Co-authored-by: Abdelrahman Soliman (Boda) <2677789+asoliman92@users.noreply.github.com> --- contracts/.solhintignore | 4 +- contracts/foundry.toml | 2 +- contracts/gas-snapshots/ccip.gas-snapshot | 2017 +++++++++-------- contracts/gas-snapshots/keystone.gas-snapshot | 24 +- .../operatorforwarder.gas-snapshot | 8 +- contracts/gas-snapshots/shared.gas-snapshot | 4 +- .../scripts/native_solc_compile_all_ccip | 10 +- contracts/src/v0.8/ccip/FeeQuoter.sol | 145 +- .../v0.8/ccip/MultiAggregateRateLimiter.sol | 4 +- contracts/src/v0.8/ccip/NonceManager.sol | 4 +- .../ccip/applications/CCIPClientExample.sol | 2 +- .../v0.8/ccip/applications/CCIPReceiver.sol | 2 +- .../ccip/applications/DefensiveExample.sol | 4 +- .../v0.8/ccip/applications/PingPongDemo.sol | 2 +- .../ccip/applications/SelfFundedPingPong.sol | 2 +- .../src/v0.8/ccip/capability/CCIPConfig.sol | 501 ---- .../src/v0.8/ccip/capability/CCIPHome.sol | 614 +++++ .../interfaces/IOCR3ConfigEncoder.sol | 11 - .../capability/libraries/CCIPConfigTypes.sol | 55 - .../ccip/docs/multi-chain-overview-ocr3.png | Bin 818615 -> 862669 bytes .../ccip/docs/multi-chain-overview.drawio | 67 +- .../interfaces/ICapabilitiesRegistry.sol | 2 +- .../src/v0.8/ccip/interfaces/IFeeQuoter.sol | 40 +- .../v0.8/ccip/interfaces/IPriceRegistry.sol | 38 +- contracts/src/v0.8/ccip/interfaces/IRMNV2.sol | 21 +- .../v0.8/ccip/interfaces/IRouterClient.sol | 2 +- .../encodingutils/ICCIPEncodingUtils.sol | 21 + .../src/v0.8/ccip/libraries/Internal.sol | 76 +- .../v0.8/ccip/libraries/MerkleMultiProof.sol | 2 +- .../src/v0.8/ccip/libraries/RateLimiter.sol | 2 +- contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol | 13 +- contracts/src/v0.8/ccip/ocr/OCR2Base.sol | 2 +- .../src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol | 2 +- contracts/src/v0.8/ccip/offRamp/OffRamp.sol | 479 ++-- contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 98 +- .../src/v0.8/ccip/pools/LegacyPoolWrapper.sol | 2 +- .../USDC/HybridLockReleaseUSDCTokenPool.sol | 75 +- .../ccip/pools/USDC/USDCBridgeMigrator.sol | 45 +- contracts/src/v0.8/ccip/rmn/RMNHome.sol | 467 +++- contracts/src/v0.8/ccip/rmn/RMNRemote.sol | 305 ++- contracts/src/v0.8/ccip/test/BaseTest.t.sol | 18 + .../src/v0.8/ccip/test/NonceManager.t.sol | 42 +- .../MultiOnRampTokenPoolReentrancy.t.sol | 26 +- .../ccip/test/capability/CCIPConfig.t.sol | 1443 ------------ .../v0.8/ccip/test/capability/CCIPHome.t.sol | 955 ++++++++ ...mpsEnd2End.sol => MultiRampsEnd2End.t.sol} | 50 +- .../v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol | 181 +- .../ccip/test/feeQuoter/FeeQuoterSetup.t.sol | 24 +- .../ccip/test/helpers/CCIPConfigHelper.sol | 68 - .../v0.8/ccip/test/helpers/CCIPHomeHelper.sol | 16 + .../ccip/test/helpers/CCIPReaderTester.sol | 5 +- .../MaybeRevertingBurnMintTokenPool.sol | 2 +- .../v0.8/ccip/test/helpers/MessageHasher.sol | 38 +- .../v0.8/ccip/test/helpers/OffRampHelper.sol | 22 +- .../v0.8/ccip/test/helpers/ReportCodec.sol | 2 +- .../receivers/ReentrancyAbuserMultiRamp.sol | 7 +- .../ccip/test/legacy/BurnMintTokenPool1_2.sol | 4 +- .../src/v0.8/ccip/test/mocks/MockRouter.sol | 17 +- .../v0.8/ccip/test/ocr/MultiOCR3Base.t.sol | 91 +- .../src/v0.8/ccip/test/offRamp/OffRamp.t.sol | 928 +++++--- .../v0.8/ccip/test/offRamp/OffRampSetup.t.sol | 68 +- .../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 81 +- .../v0.8/ccip/test/onRamp/OnRampSetup.t.sol | 34 +- .../HybridLockReleaseUSDCTokenPool.t.sol | 383 +++- .../rateLimiter/AggregateRateLimiter.t.sol | 6 +- .../src/v0.8/ccip/test/rmn/RMNHome.t.sol | 377 +++ .../src/v0.8/ccip/test/rmn/RMNRemote.t.sol | 280 +++ .../v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol | 144 ++ .../enumerable/EnumerableSetWithBytes16.sol | 454 ++++ .../ccipreader/ccipreader_test.go | 72 +- .../ccip/ccip_integration_tests/helpers.go | 953 -------- .../ccip_integration_tests/home_chain_test.go | 16 +- .../integrationhelpers/integration_helpers.go | 162 +- .../ccip_integration_tests/ocr_node_helper.go | 318 --- .../ccip_integration_tests/ping_pong_test.go | 95 - core/capabilities/ccip/ccipevm/commitcodec.go | 100 +- .../ccip/ccipevm/commitcodec_test.go | 36 +- .../capabilities/ccip/ccipevm/executecodec.go | 24 +- .../ccip/ccipevm/executecodec_test.go | 4 + core/capabilities/ccip/ccipevm/msghasher.go | 69 +- .../ccip/ccipevm/msghasher_test.go | 13 +- .../ccip/configs/evm/contract_reader.go | 18 +- core/capabilities/ccip/launcher/bluegreen.go | 132 -- core/capabilities/ccip/launcher/deployment.go | 131 ++ .../{bluegreen_test.go => deployment_test.go} | 166 +- .../ccip/launcher/integration_test.go | 22 +- core/capabilities/ccip/launcher/launcher.go | 58 +- .../ccip/launcher/launcher_test.go | 63 +- .../ccip/ocrimpls/config_tracker.go | 15 +- .../ccip/deployment_test/deployment_test.go | 12 +- .../ccip/generated/ccip_config/ccip_config.go | 1126 --------- .../ccip_encoding_utils.go | 282 +++ .../ccip/generated/ccip_home/ccip_home.go | 1894 ++++++++++++++++ .../ccip_reader_tester/ccip_reader_tester.go | 35 +- .../ccip/generated/fee_quoter/fee_quoter.go | 130 +- .../message_hasher/message_hasher.go | 136 +- .../multi_ocr3_helper/multi_ocr3_helper.go | 2 +- .../ocr3_config_encoder.go | 195 -- .../ccip/generated/offramp/offramp.go | 75 +- .../ccip/generated/onramp/onramp.go | 176 +- .../generated/report_codec/report_codec.go | 29 +- .../ccip/generated/rmn_home/rmn_home.go | 1508 ++++++++++++ .../ccip/generated/rmn_remote/rmn_remote.go | 487 +++- ...rapper-dependency-versions-do-not-edit.txt | 21 +- core/gethwrappers/ccip/go_generate.go | 7 +- .../ccip/mocks/fee_quoter_interface.go | 221 +- core/scripts/go.mod | 4 +- core/scripts/go.sum | 8 +- go.mod | 4 +- go.sum | 8 +- .../deployment/ccip/add_chain.go | 43 +- .../deployment/ccip/add_chain_test.go | 9 +- integration-tests/deployment/ccip/deploy.go | 82 +- .../deployment/ccip/deploy_home_chain.go | 525 ++++- .../deployment/ccip/deploy_test.go | 2 +- integration-tests/deployment/ccip/propose.go | 4 +- integration-tests/deployment/ccip/state.go | 18 +- .../deployment/ccip/test_assertions.go | 6 +- .../deployment/ccip/test_helpers.go | 2 +- .../deployment/devenv/rmn_config.go | 2 +- integration-tests/go.mod | 4 +- integration-tests/go.sum | 8 +- integration-tests/load/go.mod | 10 +- integration-tests/load/go.sum | 8 +- tools/ci/ccip_lcov_prune | 31 + 125 files changed, 12320 insertions(+), 8201 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/capability/CCIPConfig.sol create mode 100644 contracts/src/v0.8/ccip/capability/CCIPHome.sol delete mode 100644 contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol delete mode 100644 contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol rename contracts/src/v0.8/ccip/{capability => }/interfaces/ICapabilitiesRegistry.sol (98%) create mode 100644 contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol delete mode 100644 contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol create mode 100644 contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol rename contracts/src/v0.8/ccip/test/e2e/{MultiRampsEnd2End.sol => MultiRampsEnd2End.t.sol} (85%) delete mode 100644 contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol create mode 100644 contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol create mode 100644 contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol create mode 100644 contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol create mode 100644 contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol create mode 100644 contracts/src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol delete mode 100644 core/capabilities/ccip/ccip_integration_tests/helpers.go delete mode 100644 core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go delete mode 100644 core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go delete mode 100644 core/capabilities/ccip/launcher/bluegreen.go create mode 100644 core/capabilities/ccip/launcher/deployment.go rename core/capabilities/ccip/launcher/{bluegreen_test.go => deployment_test.go} (80%) delete mode 100644 core/gethwrappers/ccip/generated/ccip_config/ccip_config.go create mode 100644 core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go create mode 100644 core/gethwrappers/ccip/generated/ccip_home/ccip_home.go delete mode 100644 core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go create mode 100644 core/gethwrappers/ccip/generated/rmn_home/rmn_home.go create mode 100755 tools/ci/ccip_lcov_prune diff --git a/contracts/.solhintignore b/contracts/.solhintignore index 5ae38e28d96..d076b14dc6a 100644 --- a/contracts/.solhintignore +++ b/contracts/.solhintignore @@ -42,5 +42,5 @@ ./src/v0.8/vendor ./node_modules/ -# Ignore RMN contracts temporarily -./src/v0.8/ccip/rmn \ No newline at end of file +# Ignore tweaked vendored contracts +./src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol \ No newline at end of file diff --git a/contracts/foundry.toml b/contracts/foundry.toml index cab8b05ba92..1a3ca784048 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -26,7 +26,7 @@ single_line_statement_blocks = "preserve" solc_version = '0.8.24' src = 'src/v0.8/ccip' test = 'src/v0.8/ccip/test' -optimizer_runs = 3_600 +optimizer_runs = 800 evm_version = 'paris' [profile.functions] diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index d6841850728..67303c7299c 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,983 +1,1034 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19600) -ARMProxyStandaloneTest:test_Constructor() (gas: 374544) -ARMProxyStandaloneTest:test_SetARM() (gas: 16494) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 11216) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47793) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36269) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 49740) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 26920) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19691) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 40911) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15368) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10531) -AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 19668) -AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21253) -AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16418) -AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18306) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13048) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 18989) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17480) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28773) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243529) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23947) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27534) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241420) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17677) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28757) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56190) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112319) -BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28773) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243556) -BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23951) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2132690) -CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9539) -CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 66088) -CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357846) -CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 474512) -CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 441765) -CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 33798) -CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 56870) -CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 56790) -CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11701) -CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8762) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 309581) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 45877) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 29698) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 369916) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 111436) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 145550) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 369692) -CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 145617) -CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9627) -CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1752378) -CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1018901) -CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1018932) -CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9599) -CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 15984) -CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9627) -CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 184705) -CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 344873) -CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20307) -CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 267534) -CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14807) -CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9648) -CCIPConfig_chainConfig:test_getPaginatedCCIPConfigs_Success() (gas: 370227) -CCIPConfig_constructor:test_constructor_Success() (gas: 3397350) -CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61507) -CCIPConfig_updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1008218) -CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 25563) -CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 21781) -CCIPConfig_updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 1895343) -CCIPConfig_updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2464900) -CCIPConfig_updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9627) -CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 290657) -CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 293370) -CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 290290) -CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291497) -CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 291595) -CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344569) -CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1207267) -CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 290373) -CCIPConfig_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 292270) -CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 299419) -CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 492913) -CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9606) -CommitStore_constructor:test_Constructor_Success() (gas: 3091326) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28610) -CommitStore_report:test_InvalidRootRevert() (gas: 27843) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 53275) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 59071) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 53273) -CommitStore_report:test_Paused_Revert() (gas: 21259) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 84264) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56249) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 63969) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 119364) -CommitStore_report:test_Unhealthy_Revert() (gas: 44751) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 100752) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27626) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11325) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 143718) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37263) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37399) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 129098) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11048) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 20642) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11047) -CommitStore_verify:test_Blessed_Success() (gas: 96389) -CommitStore_verify:test_NotBlessed_Success() (gas: 61374) -CommitStore_verify:test_Paused_Revert() (gas: 18496) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424256) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1100023) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 37782) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 103730) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 85255) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36789) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94299) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39765) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86559) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 385246) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 141905) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 803071) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 179244) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29243) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 66444) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43320) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 210968) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 222232) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 126640) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237791) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246391) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329828) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 312265) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17033) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153727) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5665956) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144461) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21315) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36429) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51598) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473329) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 47668) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152356) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102842) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 163810) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 178205) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 42539) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 157347) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 172692) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 247069) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 113839) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 407451) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54096) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 131053) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52087) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 563391) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494179) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35380) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 544641) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64323) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 122322) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 142532) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 427328) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18502) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 278106) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18668) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223921) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 47881) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47352) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 313917) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70008) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 229325) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 276790) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 258696) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 226253) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 130745) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38446) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3251974) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83387) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 185829) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27049) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 45155) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27468) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 530151) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 345758) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187324) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2321912) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362965) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143900) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 366104) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 482682) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 189727) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 153641) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 59894) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8865) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40156) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38239) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 141923) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162528) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16693) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197728) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5579757) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35778) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 98446) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114204) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114246) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130213) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 138659) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 129838) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38257) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38440) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25489) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25275) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 86013) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36457) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29015) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107571) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22679) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 227119) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53072) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25481) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59341) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 179148) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 177430) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137254) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3825327) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30187) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43300) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109305) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 312579) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 112331) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72206) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 712975) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 147664) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 190529) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 121320) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 95349) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20544) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20912) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 78233) -EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 81762) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 234081) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16715) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95271) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 159439) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24089) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 117925) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 19902) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 64648) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35195) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 45120) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33019) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28296) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 126453) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15238) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28104) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21248) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28127) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38599) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29404) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32615) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 134833) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143159) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29043) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127367) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133251) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146446) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141021) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 297519) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15294) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42365) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21246) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 53764) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13464) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16449) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 13994) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61759) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469227) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57255) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14665) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84480) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60637) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173782) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 190338) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53596) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14499) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14277) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84029) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17369) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83005) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15275) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272035) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53446) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12830) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96729) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49688) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17384) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15677) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99741) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76096) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99748) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 144569) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80259) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80446) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 95713) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 17511) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 27289) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20333) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16715) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16654) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25415) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25265) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17895) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25287) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26292) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16503) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16417) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16459) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 39957) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12342) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 135870) -FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79896) -FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12603) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11421) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54105) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 44791) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12257) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 86926) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13089) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17071) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12240) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 107046) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 111396) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111449) -FeeQuoter_constructor:test_Setup_Success() (gas: 5355882) -FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 72739) -FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 30963) -FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94303) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14614) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20410) -FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 70458) -FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16838) -FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16140) -FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 45765) -FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 62252) -FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 84800) -FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 41227) -FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34682) -FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27756) -FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 101624) -FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20354) -FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27631) -FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27587) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40013) -FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29299) -FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18180) -FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 85919) -FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 54345) -FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 242337) -FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22390) -FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 31797) -FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100133) -FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 147680) -FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21043) -FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 116708) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22526) -FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 64364) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2094539) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2094497) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2074616) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 2094271) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 2094475) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 2094287) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 62004) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 61884) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 61036) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 2093974) -FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61563) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 109120) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 13857) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 2092636) -FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43334) -FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23294) -FeeQuoter_onReport:test_onReport_Success() (gas: 80639) -FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26677) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17185) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21290) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18387) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 17911) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18285) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18401) -FeeQuoter_processMessageArgs:test_InvalidExtraArgs_Revert() (gas: 18361) -FeeQuoter_processMessageArgs:test_MalformedEVMExtraArgs_Revert() (gas: 18907) -FeeQuoter_processMessageArgs:test_MessageFeeTooHigh_Revert() (gas: 16426) -FeeQuoter_processMessageArgs:test_WitEVMExtraArgsV2_Success() (gas: 26269) -FeeQuoter_processMessageArgs:test_WithConvertedTokenAmount_Success() (gas: 32441) -FeeQuoter_processMessageArgs:test_WithEVMExtraArgsV1_Success() (gas: 25881) -FeeQuoter_processMessageArgs:test_WithEmptyEVMExtraArgs_Success() (gas: 23696) -FeeQuoter_processMessageArgs:test_WithLinkTokenAmount_Success() (gas: 17375) -FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12102) -FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23599) -FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 30631) -FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 76003) -FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 151393) -FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50527) -FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63626) -FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 19932) -FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 88972) -FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 50821) -FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12296) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10616) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 3961646) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10800) -FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6704) -FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6484) -FeeQuoter_validatePoolReturnData:test_InvalidEVMAddressDestToken_Revert() (gas: 42748) -FeeQuoter_validatePoolReturnData:test_ProcessPoolReturnData_Success() (gas: 73252) -FeeQuoter_validatePoolReturnData:test_SourceTokenDataTooLarge_Revert() (gas: 107744) -FeeQuoter_validatePoolReturnData:test_TokenAmountArraysMismatching_Revert() (gas: 40091) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LocKReleaseMechanism_then_switchToPrimary_Success() (gas: 208156) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135401) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 106633) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 143893) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 230396) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 438277) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 269985) -HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39124) -HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 31124) -HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12628) -HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 17134) -HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 252452) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 157049) -HybridUSDCTokenPoolMigrationTests:test_withdrawLiquidity_Success() (gas: 140780) -HybridUSDCTokenPoolTests:test_LockOrBurn_LocKReleaseMechanism_then_switchToPrimary_Success() (gas: 208121) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135375) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 106610) -HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 143841) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 230362) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 438237) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 269968) -HybridUSDCTokenPoolTests:test_withdrawLiquidity_Success() (gas: 140774) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10971) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 17992) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3368113) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3364513) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11381) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 9977) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60043) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11356) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3124822) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 29954) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79844) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59464) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3121265) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11381) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72654) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56196) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225137) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 10993) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18058) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 9977) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83171) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55878) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60043) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11356) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11030) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35030) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5451) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3552) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 394876) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3649) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 34123) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 33965) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60758) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126306) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63302) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 43853) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 132031) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 312057) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17717) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 75784) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 75700) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38133) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53092) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17019) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12295) -MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 2149547) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2265849) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30248) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 47358) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15821) -MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 19662) -MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21247) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14527) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 213638) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60437) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17593) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 44895) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 50542) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 78668) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 311927) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 54728) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073667529) -MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19149) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15823) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 213716) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 62217) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46728) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 52360) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 79913) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 312231) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 56530) -MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11313) -MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19066) -MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10585) -MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18850) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 279972) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 254523) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 204488) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28703) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18287) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18216) -MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59228) -MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 43602) -MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283585) -MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422210) -MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511089) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828371) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 456841) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12376) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2139958) -MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141702) -MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807256) -MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158772) -MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112266) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254068) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 859969) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475059) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42833) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48438) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 76928) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65768) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33417) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79519) -MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33631) -MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47110) -MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25678) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18712) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24189) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61131) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39888) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32971) -MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 411393) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1526613) -NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37907) -NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23703) -NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38790) -NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71874) -NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 259788) -NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 263930) -NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 326647) -NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 298821) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 244682) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 232797) -NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 152756) -NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168320) -NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 220111) -NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125079) -NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107546) -NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 122943) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 42959) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64282) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 42823) -NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66570) -NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12025) -NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9675) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12171) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42233) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84124) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 36938) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24158) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17448) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26726) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27466) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21296) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12189) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12345) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14892) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45442) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155192) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24407) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20508) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47298) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19623) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37683) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55309) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20962) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51674) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) -OffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 40170) -OffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 107133) -OffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 88356) -OffRamp__releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 39873) -OffRamp__releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 97399) -OffRamp__releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 42865) -OffRamp__releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 89601) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 467980) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99186) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12392) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 93184) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 109891) -OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13260) -OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 17994) -OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15349) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 176779) -OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 332397) -OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 275765) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 167867) -OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 187343) -OffRamp_batchExecute:test_SingleReport_Success() (gas: 155847) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 572707) -OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10440) -OffRamp_ccipReceive:test_Reverts() (gas: 15705) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64218) -OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67373) -OffRamp_commit:test_InvalidInterval_Revert() (gas: 59676) -OffRamp_commit:test_InvalidRootRevert() (gas: 58728) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6572843) -OffRamp_commit:test_NoConfig_Revert() (gas: 6156722) -OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113211) -OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121156) -OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113232) -OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 354911) -OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 166399) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 141496) -OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 142440) -OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59004) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 239068) -OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 122234) -OffRamp_commit:test_Unhealthy_Revert() (gas: 57761) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 211577) -OffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6569232) -OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51147) -OffRamp_constructor:test_Constructor_Success() (gas: 6157449) -OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 137102) -OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103831) -OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101702) -OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 139743) -OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101631) -OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101646) -OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17281) -OffRamp_execute:test_LargeBatch_Success() (gas: 3374948) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372169) -OffRamp_execute:test_MultipleReports_Success() (gas: 298074) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6620946) -OffRamp_execute:test_NoConfig_Revert() (gas: 6204499) -OffRamp_execute:test_NonArray_Revert() (gas: 27718) -OffRamp_execute:test_SingleReport_Success() (gas: 175099) -OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147327) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6982447) -OffRamp_execute:test_ZeroReports_Revert() (gas: 17156) -OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18212) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 248992) -OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20494) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 210134) -OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48734) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48212) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 229531) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 86169) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 280811) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 92403) -OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28225) -OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 21854) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 501555) -OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 47569) -OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33855) -OffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154807) -OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28459) -OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 187481) -OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 197900) -OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40076) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 447326) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 247718) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 191985) -OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 211578) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 259646) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 140761) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 424145) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58992) -OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 74047) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 595794) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 543647) -OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33671) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 568625) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 568639) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 474070) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135265) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 164484) -OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3635486) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118398) -OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87417) -OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 75545) -OffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26439) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 171175) -OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 210959) -OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 25990) -OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152828) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 529679) -OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 310107) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2389581) -OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 223886) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 224461) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 767127) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 342767) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 165844) -OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 24622) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 66304) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 41335) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 83310) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 177953) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 191164) -OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11604) -OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14171) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 49156) -OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 27101) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 225708) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 234329) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 308936) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 283904) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390336) -OnRamp_allowListConfigUpdates:test_applyAllowList_Revert() (gas: 66512) -OnRamp_allowListConfigUpdates:test_applyAllowList_Success() (gas: 323568) -OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 64504) -OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13242) -OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94851) -OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92785) -OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97811) -OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92843) -OnRamp_constructor:test_Constructor_Success() (gas: 2852084) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114886) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145654) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145257) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143482) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145482) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 144861) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140001) -OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28810) -OnRamp_forwardFromRouter:test_MessageValidationError_Revert() (gas: 138698) -OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 26910) -OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 74122) -OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 12918) -OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 37224) -OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 18179) -OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 184142) -OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210451) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 124773) -OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 146166) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3882038) -OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 18609) -OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110785) -OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 76212) -OnRamp_forwardFromRouter:test_forwardFromRouter_WithValidation_Success() (gas: 280890) -OnRamp_getFee:test_EmptyMessage_Success() (gas: 102302) -OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 66336) -OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 87668) -OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 34930) -OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 117635) -OnRamp_getFee:test_Unhealthy_Revert() (gas: 17009) -OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10438) -OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35204) -OnRamp_setDynamicConfig:test_SetConfigInvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11402) -OnRamp_setDynamicConfig:test_SetConfigInvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 13001) -OnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 11359) -OnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16385) -OnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 55321) -OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97095) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 152669) -PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20277) -PingPong_plumbing:test_Pausing_Success() (gas: 17777) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 163187) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 182599) -RMNHome:test() (gas: 186) -RMN_constructor:test_Constructor_Success() (gas: 48838) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19666) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152152) -RMN_ownerUnbless:test_Unbless_Success() (gas: 74699) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 470965) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 397532) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18591) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 357400) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 32980) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 261985) -RMN_permaBlessing:test_PermaBlessing() (gas: 202686) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15494) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21095) -RMN_setConfig:test_NonOwner_Revert() (gas: 14713) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18213) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104022) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30173) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130303) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12128) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15734) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659123) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212156) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26364) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 33753) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 63909) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47478) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61067) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 627750) -RMN_voteToBless:test_Curse_Revert() (gas: 472823) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 114829) -RMN_voteToBless:test_RootSuccess() (gas: 555559) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 96730) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17087) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44667) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98565) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152401) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29619) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27565) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81485) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135299) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1648701) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14019) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 534332) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 399001) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144225) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146738) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12600) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187244) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 472452) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 370468) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1151909) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 140968) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165087) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121305) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98247) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145631) -RateLimiter_constructor:test_Constructor_Success() (gas: 19650) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 15916) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22222) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31353) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20336) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40285) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15720) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25594) -RateLimiter_consume:test_Refill_Success() (gas: 37222) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18250) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24706) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38647) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46384) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38017) -RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36028) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19637) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 129918) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19451) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129731) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89288) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10642128) -Router_applyRampUpdates:test_OnRampDisable() (gas: 55935) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12311) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 113880) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 201336) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 128515) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 215973) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 66281) -Router_ccipSend:test_InvalidMsgValue() (gas: 31963) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 68737) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 173606) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 56031) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 172200) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 242717) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24749) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44724) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 174386) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 244854) -Router_constructor:test_Constructor_Success() (gas: 13070) -Router_getArmProxy:test_getArmProxy() (gas: 10561) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 46458) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17138) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11316) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20261) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11159) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 422138) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52437) -Router_routeMessage:test_AutoExec_Success() (gas: 42684) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 157989) -Router_routeMessage:test_ManualExec_Success() (gas: 35381) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10986) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55531) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 419466) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20151) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12629) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67011) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11350) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17581) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39902) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 105922) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104037) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15493) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15038) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 112548) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 107668) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 115698) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12585) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54473) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19154) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18020) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 35949) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30623) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18043) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49390) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 6070356) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 6101829) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6319597) -TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3387124) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6916281) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 7100309) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2209840) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23464) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177792) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23740) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8363) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24843) -TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271305) -TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 541162) -TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18344) -TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11385) -TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 476468) -TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157074) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70721) -TokenPool_constructor:test_immutableFields_Success() (gas: 20544) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 273962) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 276921) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 289432) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 349729) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 276655) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 253458) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 304770) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17073) -TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15074) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15620) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13195) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 281912) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17109) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 136222) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 15919) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 245173) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16303) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 261558) -TokenProxy_constructor:test_Constructor() (gas: 13812) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16827) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12658) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15852) -TokenProxy_getFee:test_GetFee_Success() (gas: 86690) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25338) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35352) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30094) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133112) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 477240) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268166) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50700) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98609) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66174) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11333) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 9876) \ No newline at end of file +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) +ARMProxyStandaloneTest:test_Constructor() (gas: 310043) +ARMProxyStandaloneTest:test_SetARM() (gas: 16587) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15452) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10537) +AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17531) +AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21414) +AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16586) +AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18357) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13078) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 19016) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17546) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) +BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) +BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) +CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693) +CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 290034) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292771) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289373) +CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 337311) +CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291145) +CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290604) +CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344238) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309179) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1212133) +CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289400) +CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289661) +CCIPHome__validateConfig:test__validateConfig_Success() (gas: 300616) +CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773237) +CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293988) +CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 294035) +CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185242) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347249) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20631) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952) +CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27137) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26150) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1436726) +CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63878) +CCIPHome_constructor:test_constructor_success() (gas: 3521034) +CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173) +CCIPHome_constructor:test_supportsInterface_success() (gas: 9865) +CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2765282) +CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2539724) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23052) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8818) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5096112) +CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068) +CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19128) +CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773) +CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676) +CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19051) +CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1388198) +CCIPHome_setCandidate:test_setCandidate_success() (gas: 1357740) +CommitStore_constructor:test_Constructor_Success() (gas: 2855567) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739) +CommitStore_report:test_InvalidInterval_Revert() (gas: 28679) +CommitStore_report:test_InvalidRootRevert() (gas: 27912) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 53448) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 59286) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 53446) +CommitStore_report:test_Paused_Revert() (gas: 21319) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 84485) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56342) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64077) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 117309) +CommitStore_report:test_Unhealthy_Revert() (gas: 44823) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 98929) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27707) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11376) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 144186) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37314) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37483) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 129329) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11099) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 20690) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11098) +CommitStore_verify:test_Blessed_Success() (gas: 96581) +CommitStore_verify:test_NotBlessed_Success() (gas: 61473) +CommitStore_verify:test_Paused_Revert() (gas: 18568) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) +DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) +DefensiveExampleTest:test_Recovery() (gas: 424476) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165358) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 180107) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 43157) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160119) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262488) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230645) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132092) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38626) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3397486) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 84833) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 60494) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8895) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40357) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38419) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142469) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162818) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16936) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197985) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5056698) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 36063) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 99010) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114925) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114967) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130991) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 139431) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130607) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38647) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38830) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25726) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25545) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 84266) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36847) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29327) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107850) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22823) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226568) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53432) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 96028) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20598) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20966) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 74894) +EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 80393) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 230742) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16943) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95505) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 154010) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24323) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 114740) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 20142) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63070) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35297) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 43218) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33280) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28551) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 122690) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15403) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28359) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21426) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 54301) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13530) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53711) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14616) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40326) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12483) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 137553) +FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80348) +FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12687) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54684) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45130) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12332) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17278) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106501) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110851) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110904) +FeeQuoter_constructor:test_Setup_Success() (gas: 4972944) +FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68383) +FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076) +FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94781) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14670) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20550) +FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 68298) +FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16892) +FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16188) +FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 43667) +FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 66273) +FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78322) +FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39244) +FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34880) +FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27954) +FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97513) +FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20468) +FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27829) +FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27785) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40376) +FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29503) +FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18315) +FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82344) +FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 52638) +FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 238762) +FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22555) +FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29847) +FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100292) +FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 141892) +FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) +FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) +FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) +FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) +FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) +FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) +FeeQuoter_onReport:test_onReport_Success() (gas: 80094) +FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26860) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17284) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21428) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18516) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18034) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18390) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18512) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44703) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) +FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333) +FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122709) +FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42032) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28518) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76145) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28116) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 25987) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523) +FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12176) +FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23730) +FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28505) +FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74598) +FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320) +FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50875) +FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63847) +FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20142) +FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89470) +FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 51121) +FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12437) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10655) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4001603) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) +FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) +FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) +HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) +HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) +HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) +HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12669) +HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) +HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) +HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) +HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) +HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) +HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3047988) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 10196) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63455) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 44012) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 133528) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 315630) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17864) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 76453) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 76369) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38736) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53869) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17109) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12436) +MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1958738) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2075046) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48099) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15929) +MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17525) +MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21408) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14617) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210107) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58416) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17743) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45162) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46370) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) +MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60182) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46935) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48179) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77728) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308237) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52346) +MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11337) +MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19090) +MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10609) +MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18878) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 280256) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 254729) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 204595) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28826) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18324) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18253) +MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59397) +MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44190) +MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 104822) +MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 18886) +MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283736) +MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422361) +MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511918) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 680323) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828900) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457292) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12481) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2141722) +MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141835) +MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807623) +MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158867) +MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112335) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254201) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861206) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475852) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42956) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48639) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 77138) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65912) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33495) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79795) +MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33664) +MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47200) +MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25768) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18745) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) +MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500580) +NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) +NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) +NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) +NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71901) +NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 262159) +NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 265836) +NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 329824) +NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 300784) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027) +NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153748) +NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168256) +NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 219631) +NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745) +NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 106975) +NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 42943) +NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) +NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) +NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) +OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5656596) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 469391) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99637) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12591) +OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 205322) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 101437) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 111307) +OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13441) +OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72702) +OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15497) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177979) +OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335646) +OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278912) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169308) +OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189031) +OffRamp_batchExecute:test_SingleReport_Success() (gas: 157132) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554208) +OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10600) +OffRamp_ccipReceive:test_Reverts() (gas: 15385) +OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) +OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68124) +OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) +OffRamp_commit:test_InvalidRootRevert() (gas: 63356) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6260756) +OffRamp_commit:test_NoConfig_Revert() (gas: 5844428) +OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042) +OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403) +OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063) +OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 355198) +OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164351) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139364) +OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146555) +OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232074) +OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125409) +OffRamp_commit:test_Unhealthy_Revert() (gas: 58633) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206729) +OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722) +OffRamp_constructor:test_Constructor_Success() (gas: 5845416) +OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135514) +OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 102949) +OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 100843) +OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161040) +OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 100763) +OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 100801) +OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639) +OffRamp_execute:test_LargeBatch_Success() (gas: 3426635) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 373095) +OffRamp_execute:test_MultipleReports_Success() (gas: 301009) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6669661) +OffRamp_execute:test_NoConfig_Revert() (gas: 5894136) +OffRamp_execute:test_NonArray_Revert() (gas: 27562) +OffRamp_execute:test_SingleReport_Success() (gas: 176364) +OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148382) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6672410) +OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) +OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18511) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244057) +OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20759) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205094) +OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49316) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48760) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218081) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85349) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274194) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91809) +OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28260) +OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22062) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481748) +OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48372) +OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33959) +OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28436) +OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188084) +OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198518) +OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40741) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413233) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249776) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193590) +OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213624) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249506) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142151) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409289) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58293) +OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73868) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583401) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532115) +OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33717) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549738) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549752) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460495) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135910) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165615) +OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3868658) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120474) +OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89178) +OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81284) +OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74161) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173244) +OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214189) +OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27152) +OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 165098) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27689) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55260) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498614) +OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316158) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245360) +OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165602) +OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227234) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227774) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781510) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347431) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37634) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) +OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174512) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176424) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187723) +OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11269) +OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13884) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46421) +OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24463) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219355) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227977) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295350) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 277894) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325083) +OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65095) +OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13422) +OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94996) +OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92938) +OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97971) +OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92972) +OnRamp_constructor:test_Constructor_Success() (gas: 2734391) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114527) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145328) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 144925) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143086) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145122) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 144520) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 144604) +OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554) +OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051) +OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36596) +OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527) +OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291) +OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431) +OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640) +OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954) +OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154) +OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942) +OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010) +OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866) +OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599) +OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 279390) +OnRamp_getFee:test_EmptyMessage_Success() (gas: 98513) +OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64645) +OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86177) +OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35097) +OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113639) +OnRamp_getFee:test_Unhealthy_Revert() (gas: 17061) +OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474) +OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35348) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11536) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 13195) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 11522) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) +OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369) +OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) +PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) +PingPong_plumbing:test_Pausing_Success() (gas: 17810) +PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 20810) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137268) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20472) +RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1077745) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23857) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10575) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10936) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1083071) +RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19063) +RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10963) +RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10606) +RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147) +RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 594679) +RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15177) +RMNHome_setCandidate:test_setCandidate_success() (gas: 588379) +RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30159) +RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18848) +RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14115) +RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 103911) +RMNRemote_constructor:test_constructor_success() (gas: 8334) +RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 59165) +RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154457) +RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 18780) +RMNRemote_curse:test_curse_success() (gas: 149365) +RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 133464) +RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 976479) +RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 323272) +RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 80138) +RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 700548) +RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 54024) +RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 51912) +RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 18748) +RMNRemote_uncurse:test_uncurse_success() (gas: 40151) +RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 13650) +RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 78519) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 76336) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 83399) +RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 153002) +RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) +RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) +RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) +RMN_constructor:test_Constructor_Success() (gas: 48994) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) +RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) +RMN_permaBlessing:test_PermaBlessing() (gas: 202777) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) +RMN_setConfig:test_NonOwner_Revert() (gas: 14725) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) +RMN_voteToBless:test_Curse_Revert() (gas: 473408) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) +RMN_voteToBless:test_RootSuccess() (gas: 558661) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) +RateLimiter_constructor:test_Constructor_Success() (gas: 19734) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) +RateLimiter_consume:test_Refill_Success() (gas: 37444) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) +RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10662612) +Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12356) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114599) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202430) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126968) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 214801) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 64520) +Router_ccipSend:test_InvalidMsgValue() (gas: 32155) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 67177) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 170385) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54279) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 168901) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 239227) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24854) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44811) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 171189) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 241701) +Router_constructor:test_Constructor_Success() (gas: 13128) +Router_getArmProxy:test_getArmProxy() (gas: 10573) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 44673) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17192) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) +Router_routeMessage:test_AutoExec_Success() (gas: 42816) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) +Router_routeMessage:test_ManualExec_Success() (gas: 35546) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25224) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44799) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10998) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55660) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421258) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20181) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51163) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44004) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12653) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11362) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17602) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39962) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 106006) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104346) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15610) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15155) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 112962) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 107965) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 116067) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12609) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54524) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19316) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18137) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617969) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) +TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177848) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23764) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8375) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24867) +TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271569) +TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 542359) +TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18449) +TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11469) +TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 479160) +TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157422) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70484) +TokenPool_constructor:test_immutableFields_Success() (gas: 20586) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 274181) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277296) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 290028) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 350050) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277036) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 254065) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 305106) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17187) +TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15227) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15671) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13219) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 282125) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17226) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 134605) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 16000) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244013) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16384) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262651) +TokenProxy_constructor:test_Constructor() (gas: 13836) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16899) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12706) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15885) +TokenProxy_getFee:test_GetFee_Success() (gas: 85240) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11363) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10041) \ No newline at end of file diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 3768721ab42..a4067ff2b43 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -82,20 +82,22 @@ CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_RemovingCapabilityRequiredB CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 29080) CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 27609) CapabilitiesRegistry_UpdateNodesTest:test_UpdatesNodeParams() (gas: 162264) -KeystoneForwarder_ReportTest:test_Report_ConfigVersion() (gas: 2006044) -KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverInterfaceNotSupported() (gas: 124668) -KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverNotContract() (gas: 126927) -KeystoneForwarder_ReportTest:test_Report_SuccessfulDelivery() (gas: 362419) -KeystoneForwarder_ReportTest:test_Report_SuccessfulRetryWithMoreGas() (gas: 483436) +KeystoneForwarder_ReportTest:test_Report_ConfigVersion() (gas: 2006826) +KeystoneForwarder_ReportTest:test_Report_FailedDelieryWhenReportReceiverConsumesAllGas() (gas: 1004827) +KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverInterfaceNotSupported() (gas: 124952) +KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverNotContract() (gas: 127233) +KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReportReceiverConsumesAllGasAndInterfaceCheckUsesMax() (gas: 440602) +KeystoneForwarder_ReportTest:test_Report_SuccessfulDelivery() (gas: 362832) +KeystoneForwarder_ReportTest:test_Report_SuccessfulRetryWithMoreGas() (gas: 510665) KeystoneForwarder_ReportTest:test_RevertWhen_AnySignatureIsInvalid() (gas: 86326) -KeystoneForwarder_ReportTest:test_RevertWhen_AnySignerIsInvalid() (gas: 118521) -KeystoneForwarder_ReportTest:test_RevertWhen_AttemptingTransmissionWithInsufficientGas() (gas: 96279) -KeystoneForwarder_ReportTest:test_RevertWhen_ReportHasDuplicateSignatures() (gas: 94516) +KeystoneForwarder_ReportTest:test_RevertWhen_AnySignerIsInvalid() (gas: 118476) +KeystoneForwarder_ReportTest:test_RevertWhen_AttemptingTransmissionWithInsufficientGas() (gas: 96651) +KeystoneForwarder_ReportTest:test_RevertWhen_ReportHasDuplicateSignatures() (gas: 94538) KeystoneForwarder_ReportTest:test_RevertWhen_ReportHasIncorrectDON() (gas: 75930) KeystoneForwarder_ReportTest:test_RevertWhen_ReportHasInexistentConfigVersion() (gas: 76298) KeystoneForwarder_ReportTest:test_RevertWhen_ReportIsMalformed() (gas: 45563) -KeystoneForwarder_ReportTest:test_RevertWhen_RetryingInvalidContractTransmission() (gas: 143591) -KeystoneForwarder_ReportTest:test_RevertWhen_RetryingSuccessfulTransmission() (gas: 355218) +KeystoneForwarder_ReportTest:test_RevertWhen_RetryingInvalidContractTransmission() (gas: 144247) +KeystoneForwarder_ReportTest:test_RevertWhen_RetryingSuccessfulTransmission() (gas: 355970) KeystoneForwarder_ReportTest:test_RevertWhen_TooFewSignatures() (gas: 55292) KeystoneForwarder_ReportTest:test_RevertWhen_TooManySignatures() (gas: 56050) KeystoneForwarder_SetConfigTest:test_RevertWhen_ExcessSigners() (gas: 20184) @@ -111,4 +113,4 @@ KeystoneRouter_SetConfigTest:test_AddForwarder_RevertWhen_NotOwner() (gas: 10982 KeystoneRouter_SetConfigTest:test_RemoveForwarder_RevertWhen_NotOwner() (gas: 10927) KeystoneRouter_SetConfigTest:test_RemoveForwarder_Success() (gas: 17603) KeystoneRouter_SetConfigTest:test_Route_RevertWhen_UnauthorizedForwarder() (gas: 18552) -KeystoneRouter_SetConfigTest:test_Route_Success() (gas: 80568) \ No newline at end of file +KeystoneRouter_SetConfigTest:test_Route_Success() (gas: 80948) \ No newline at end of file diff --git a/contracts/gas-snapshots/operatorforwarder.gas-snapshot b/contracts/gas-snapshots/operatorforwarder.gas-snapshot index 551fde38f35..66bb19f1f6f 100644 --- a/contracts/gas-snapshots/operatorforwarder.gas-snapshot +++ b/contracts/gas-snapshots/operatorforwarder.gas-snapshot @@ -2,8 +2,8 @@ FactoryTest:test_DeployNewForwarderAndTransferOwnership_Success() (gas: 1059722) FactoryTest:test_DeployNewForwarder_Success() (gas: 1048209) FactoryTest:test_DeployNewOperatorAndForwarder_Success() (gas: 4069305) FactoryTest:test_DeployNewOperator_Success() (gas: 3020464) -ForwarderTest:test_Forward_Success(uint256) (runs: 256, μ: 226978, ~: 227289) -ForwarderTest:test_MultiForward_Success(uint256,uint256) (runs: 256, μ: 258575, ~: 259120) +ForwarderTest:test_Forward_Success(uint256) (runs: 257, μ: 226979, ~: 227289) +ForwarderTest:test_MultiForward_Success(uint256,uint256) (runs: 257, μ: 258577, ~: 259120) ForwarderTest:test_OwnerForward_Success() (gas: 30118) ForwarderTest:test_SetAuthorizedSenders_Success() (gas: 160524) ForwarderTest:test_TransferOwnershipWithMessage_Success() (gas: 35123) @@ -11,5 +11,5 @@ OperatorTest:test_CancelOracleRequest_Success() (gas: 274436) OperatorTest:test_FulfillOracleRequest_Success() (gas: 330603) OperatorTest:test_NotAuthorizedSender_Revert() (gas: 246716) OperatorTest:test_OracleRequest_Success() (gas: 250019) -OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 256, μ: 387121, ~: 387124) -OperatorTest:test_SendRequest_Success(uint96) (runs: 256, μ: 303612, ~: 303615) \ No newline at end of file +OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 257, μ: 387121, ~: 387124) +OperatorTest:test_SendRequest_Success(uint96) (runs: 257, μ: 303612, ~: 303615) \ No newline at end of file diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index dda850089c7..d7a4e21978f 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -39,10 +39,10 @@ CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559) CallWithExactGas__callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 15788) CallWithExactGas__callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 16241) -CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 256, μ: 15766, ~: 15719) +CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 257, μ: 15766, ~: 15719) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractExactGasSuccess() (gas: 20116) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractReceiverErrorSuccess() (gas: 67721) -CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 256, μ: 16276, ~: 16229) +CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 257, μ: 16276, ~: 16229) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoContractSuccess() (gas: 12962) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoGasForCallExactCheckReturnFalseSuccess() (gas: 13005) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NotEnoughGasForCallReturnsFalseSuccess() (gas: 13317) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 6a6226a4ad1..74b586f788e 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -10,7 +10,7 @@ SOLC_VERSION="0.8.24" OPTIMIZE_RUNS=26000 OPTIMIZE_RUNS_OFFRAMP=18000 OPTIMIZE_RUNS_ONRAMP=4100 -OPTIMIZE_RUNS_MULTI_OFFRAMP=1999 +OPTIMIZE_RUNS_MULTI_OFFRAMP=800 SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" @@ -56,6 +56,7 @@ compileContract () { compileContract ccip/offRamp/EVM2EVMOffRamp.sol compileContract ccip/offRamp/OffRamp.sol compileContract ccip/rmn/RMNRemote.sol +compileContract ccip/rmn/RMNHome.sol compileContract ccip/applications/PingPongDemo.sol compileContract ccip/applications/SelfFundedPingPong.sol compileContract ccip/applications/EtherSenderReceiver.sol @@ -69,8 +70,7 @@ compileContract ccip/RMN.sol compileContract ccip/ARMProxy.sol compileContract ccip/tokenAdminRegistry/TokenAdminRegistry.sol compileContract ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol -compileContract ccip/capability/CCIPConfig.sol -compileContract ccip/capability/interfaces/IOCR3ConfigEncoder.sol +compileContract ccip/capability/CCIPHome.sol compileContract ccip/NonceManager.sol compileContract shared/token/ERC677/BurnMintERC677.sol @@ -99,6 +99,10 @@ compileContract ccip/test/mocks/MockE2EUSDCTokenMessenger.sol compileContract ccip/test/mocks/MockE2EUSDCTransmitter.sol compileContract ccip/test/WETH9.sol + +# Encoding Utils +compileContract ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol + # Customer contracts compileContract ccip/pools/USDC/USDCTokenPool.sol diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 957d146f45a..d2a6b77eff2 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -49,7 +49,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, event FeeTokenRemoved(address indexed feeToken); event UsdPerUnitGasUpdated(uint64 indexed destChain, uint256 value, uint256 timestamp); event UsdPerTokenUpdated(address indexed token, uint256 value, uint256 timestamp); - event PriceFeedPerTokenUpdated(address indexed token, IFeeQuoter.TokenPriceFeedConfig priceFeedConfig); + event PriceFeedPerTokenUpdated(address indexed token, TokenPriceFeedConfig priceFeedConfig); event TokenTransferFeeConfigUpdated( uint64 indexed destChainSelector, address indexed token, TokenTransferFeeConfig tokenTransferFeeConfig ); @@ -58,10 +58,16 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, event DestChainConfigUpdated(uint64 indexed destChainSelector, DestChainConfig destChainConfig); event DestChainAdded(uint64 indexed destChainSelector, DestChainConfig destChainConfig); - /// @notice Token price data feed update + /// @dev Token price data feed configuration + struct TokenPriceFeedConfig { + address dataFeedAddress; // ──╮ AggregatorV3Interface contract (0 - feed is unset) + uint8 tokenDecimals; // ──────╯ Decimals of the token that the feed represents + } + + /// @dev Token price data feed update struct TokenPriceFeedUpdate { address sourceToken; // Source token to update feed for - IFeeQuoter.TokenPriceFeedConfig feedConfig; // Feed config update data + TokenPriceFeedConfig feedConfig; // Feed config update data } /// @dev Struct that contains the static configuration @@ -73,7 +79,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint32 stalenessThreshold; // The amount of time a gas price can be stale before it is considered invalid. } - /// @notice The struct representing the received CCIP feed report from keystone IReceiver.onReport() + /// @dev The struct representing the received CCIP feed report from keystone IReceiver.onReport() struct ReceivedCCIPFeedReport { address token; // Token address uint224 price; // ─────────╮ Price of the token in USD with 18 decimals @@ -88,8 +94,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint32 maxPerMsgGasLimit; // │ Maximum gas limit for messages targeting EVMs uint32 destGasOverhead; // │ Gas charged on top of the gasLimit to cover destination chain costs 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 + 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 destDataAvailabilityMultiplierBps; // │ Multiplier for data availability gas, multiples of bps, or 0.0001 // The following three properties are defaults, they can be overridden by setting the TokenTransferFeeConfig for a token uint16 defaultTokenFeeUSDCents; // │ Default token fee charged per token transfer @@ -151,6 +157,11 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint64 premiumMultiplierWeiPerEth; // ──╯ Multiplier for destination chain specific premiums. } + /// @dev The base decimals for cost calculations + uint256 public constant FEE_BASE_DECIMALS = 36; + /// @dev The decimals that Keystone reports prices in + uint256 public constant KEYSTONE_PRICE_DECIMALS = 18; + string public constant override typeAndVersion = "FeeQuoter 1.6.0-dev"; /// @dev The gas price per unit of gas for a given destination chain, in USD with 18 decimals. @@ -172,16 +183,16 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, mapping(address token => Internal.TimestampedPackedUint224 price) private s_usdPerToken; /// @dev Stores the price data feed configurations per token. - mapping(address token => IFeeQuoter.TokenPriceFeedConfig dataFeedAddress) private s_usdPriceFeedsPerToken; + mapping(address token => TokenPriceFeedConfig dataFeedAddress) private s_usdPriceFeedsPerToken; /// @dev The multiplier for destination chain specific premiums that can be set by the owner or fee admin - mapping(address token => uint64 premiumMultiplierWeiPerEth) internal s_premiumMultiplierWeiPerEth; + mapping(address token => uint64 premiumMultiplierWeiPerEth) private s_premiumMultiplierWeiPerEth; /// @dev The destination chain specific fee configs mapping(uint64 destChainSelector => DestChainConfig destChainConfig) internal s_destChainConfigs; /// @dev The token transfer fee config that can be set by the owner or fee admin - mapping(uint64 destChainSelector => mapping(address token => TokenTransferFeeConfig tranferFeeConfig)) internal + mapping(uint64 destChainSelector => mapping(address token => TokenTransferFeeConfig tranferFeeConfig)) private s_tokenTransferFeeConfig; /// @dev Maximum fee that can be charged for a message. This is a guard to prevent massively overcharging due to misconfiguation. @@ -227,23 +238,36 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, /// @inheritdoc IPriceRegistry function getTokenPrice(address token) public view override returns (Internal.TimestampedPackedUint224 memory) { - IFeeQuoter.TokenPriceFeedConfig memory priceFeedConfig = s_usdPriceFeedsPerToken[token]; + Internal.TimestampedPackedUint224 memory tokenPrice = s_usdPerToken[token]; + + // If the token price is not stale, return it + if (block.timestamp - tokenPrice.timestamp < i_stalenessThreshold) { + return tokenPrice; + } + + TokenPriceFeedConfig memory priceFeedConfig = s_usdPriceFeedsPerToken[token]; + + // If the token price feed is not set, return the stale price if (priceFeedConfig.dataFeedAddress == address(0)) { - return s_usdPerToken[token]; + return tokenPrice; } + // If the token price feed is set, return the price from the feed + // The price feed is the fallback because we do not expect it to be the default source due to the gas cost of reading from it return _getTokenPriceFromDataFeed(priceFeedConfig); } - /// @inheritdoc IPriceRegistry - function getValidatedTokenPrice(address token) external view override returns (uint224) { + /// @notice Get the `tokenPrice` for a given token, checks if the price is valid. + /// @param token The token to get the price for. + /// @return tokenPrice The tokenPrice for the given token if it exists and is valid. + function getValidatedTokenPrice(address token) external view returns (uint224) { return _getValidatedTokenPrice(token); } - /// @inheritdoc IPriceRegistry - function getTokenPrices( - address[] calldata tokens - ) external view override returns (Internal.TimestampedPackedUint224[] memory) { + /// @notice Get the `tokenPrice` for an array of tokens. + /// @param tokens The tokens to get prices for. + /// @return tokenPrices The tokenPrices for the given tokens. + function getTokenPrices(address[] calldata tokens) external view returns (Internal.TimestampedPackedUint224[] memory) { uint256 length = tokens.length; Internal.TimestampedPackedUint224[] memory tokenPrices = new Internal.TimestampedPackedUint224[](length); for (uint256 i = 0; i < length; ++i) { @@ -252,25 +276,36 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, return tokenPrices; } - /// @inheritdoc IFeeQuoter - function getTokenPriceFeedConfig( - address token - ) external view override returns (IFeeQuoter.TokenPriceFeedConfig memory) { + /// @notice Returns the token price data feed configuration + /// @param token The token to retrieve the feed config for + /// @return tokenPriceFeedConfig The token price data feed config (if feed address is 0, the feed config is disabled) + function getTokenPriceFeedConfig(address token) external view returns (TokenPriceFeedConfig memory) { return s_usdPriceFeedsPerToken[token]; } - /// @inheritdoc IPriceRegistry + /// @notice Get an encoded `gasPrice` for a given destination chain ID. + /// The 224-bit result encodes necessary gas price components. + /// On L1 chains like Ethereum or Avax, the only component is the gas price. + /// On Optimistic Rollups, there are two components - the L2 gas price, and L1 base fee for data availability. + /// On future chains, there could be more or differing price components. + /// PriceRegistry does not contain chain-specific logic to parse destination chain price components. + /// @param destChainSelector The destination chain to get the price for. + /// @return gasPrice The encoded gasPrice for the given destination chain ID. function getDestinationChainGasPrice( uint64 destChainSelector - ) external view override returns (Internal.TimestampedPackedUint224 memory) { + ) external view returns (Internal.TimestampedPackedUint224 memory) { return s_usdPerUnitGasByDestChainSelector[destChainSelector]; } - /// @inheritdoc IPriceRegistry + /// @notice Gets the fee token price and the gas price, both denominated in dollars. + /// @param token The source token to get the price for. + /// @param destChainSelector The destination chain to get the gas price for. + /// @return tokenPrice The price of the feeToken in 1e18 dollars per base unit. + /// @return gasPriceValue The price of gas in 1e18 dollars per base unit. function getTokenAndGasPrices( address token, uint64 destChainSelector - ) public view override returns (uint224 tokenPrice, uint224 gasPriceValue) { + ) public view returns (uint224 tokenPrice, uint224 gasPriceValue) { Internal.TimestampedPackedUint224 memory gasPrice = s_usdPerUnitGasByDestChainSelector[destChainSelector]; // We do allow a gas price of 0, but no stale or unset gas prices if (gasPrice.timestamp == 0) revert ChainNotSupported(destChainSelector); @@ -280,15 +315,19 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, return (_getValidatedTokenPrice(token), gasPrice.value); } - /// @inheritdoc IPriceRegistry + /// @notice Convert a given token amount to target token amount. /// @dev this function assumes that no more than 1e59 dollars are sent as payment. /// If more is sent, the multiplication of feeTokenAmount and feeTokenValue will overflow. /// Since there isn't even close to 1e59 dollars in the world economy this is safe. + /// @param fromToken The given token address. + /// @param fromTokenAmount The given token amount. + /// @param toToken The target token address. + /// @return toTokenAmount The target token amount. function convertTokenAmount( address fromToken, uint256 fromTokenAmount, address toToken - ) public view override returns (uint256) { + ) public view returns (uint256) { /// Example: /// fromTokenAmount: 1e18 // 1 ETH /// ETH: 2_000e18 @@ -311,7 +350,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, /// @param priceFeedConfig token data feed configuration with valid data feed address (used to retrieve price & timestamp) /// @return tokenPrice data feed price answer rebased to s_usdPerToken units, with latest block timestamp function _getTokenPriceFromDataFeed( - IFeeQuoter.TokenPriceFeedConfig memory priceFeedConfig + TokenPriceFeedConfig memory priceFeedConfig ) internal view returns (Internal.TimestampedPackedUint224 memory tokenPrice) { AggregatorV3Interface dataFeedContract = AggregatorV3Interface(priceFeedConfig.dataFeedAddress); ( @@ -412,7 +451,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, for (uint256 i; i < tokenPriceFeedUpdates.length; ++i) { TokenPriceFeedUpdate memory update = tokenPriceFeedUpdates[i]; address sourceToken = update.sourceToken; - IFeeQuoter.TokenPriceFeedConfig memory tokenPriceFeedConfig = update.feedConfig; + TokenPriceFeedConfig memory tokenPriceFeedConfig = update.feedConfig; s_usdPriceFeedsPerToken[sourceToken] = tokenPriceFeedConfig; emit PriceFeedPerTokenUpdated(sourceToken, tokenPriceFeedConfig); @@ -530,7 +569,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, _applyPremiumMultiplierWeiPerEthUpdates(premiumMultiplierWeiPerEthArgs); } - /// @dev Set the fee config. + /// @dev Sets the fee config. /// @param premiumMultiplierWeiPerEthArgs The multiplier for destination chain specific premiums. function _applyPremiumMultiplierWeiPerEthUpdates( PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs @@ -646,10 +685,10 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint8 excessDecimals = dataFeedDecimal + tokenDecimal; uint256 rebasedVal; - if (excessDecimals > 36) { - rebasedVal = feedValue / (10 ** (excessDecimals - 36)); + if (excessDecimals > FEE_BASE_DECIMALS) { + rebasedVal = feedValue / (10 ** (excessDecimals - FEE_BASE_DECIMALS)); } else { - rebasedVal = feedValue * (10 ** (36 - excessDecimals)); + rebasedVal = feedValue * (10 ** (FEE_BASE_DECIMALS - excessDecimals)); } if (rebasedVal > type(uint224).max) { @@ -823,12 +862,24 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, } /// @inheritdoc IFeeQuoter + /// @dev precondition - onRampTokenTransfers and sourceTokenAmounts lengths must be equal function processMessageArgs( uint64 destChainSelector, address feeToken, uint256 feeTokenAmount, - bytes calldata extraArgs - ) external view returns (uint256 msgFeeJuels, bool isOutOfOrderExecution, bytes memory convertedExtraArgs) { + bytes calldata extraArgs, + Internal.EVM2AnyTokenTransfer[] calldata onRampTokenTransfers, + Client.EVMTokenAmount[] calldata sourceTokenAmounts + ) + external + view + returns ( + uint256 msgFeeJuels, + bool isOutOfOrderExecution, + bytes memory convertedExtraArgs, + bytes[] memory destExecDataPerToken + ) + { // Convert feeToken to link if not already in link if (feeToken == i_linkToken) { msgFeeJuels = feeTokenAmount; @@ -843,33 +894,37 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, // We can parse unvalidated args since this message is called after getFee (which will already validate the params) Client.EVMExtraArgsV2 memory parsedExtraArgs = _parseUnvalidatedEVMExtraArgsFromBytes(extraArgs, defaultTxGasLimit); isOutOfOrderExecution = parsedExtraArgs.allowOutOfOrderExecution; + destExecDataPerToken = _processPoolReturnData(destChainSelector, onRampTokenTransfers, sourceTokenAmounts); - return (msgFeeJuels, isOutOfOrderExecution, Client._argsToBytes(parsedExtraArgs)); + return (msgFeeJuels, isOutOfOrderExecution, Client._argsToBytes(parsedExtraArgs), destExecDataPerToken); } - /// @inheritdoc IFeeQuoter - /// @dev precondition - rampTokenAmounts and sourceTokenAmounts lengths must be equal - function processPoolReturnData( + /// @notice Validates pool return data + /// @param destChainSelector Destination chain selector to which the token amounts are sent to + /// @param onRampTokenTransfers Token amounts with populated pool return data + /// @param sourceTokenAmounts Token amounts originally sent in a Client.EVM2AnyMessage message + /// @return destExecDataPerToken Destination chain execution data + function _processPoolReturnData( uint64 destChainSelector, - Internal.RampTokenAmount[] calldata rampTokenAmounts, + Internal.EVM2AnyTokenTransfer[] calldata onRampTokenTransfers, Client.EVMTokenAmount[] calldata sourceTokenAmounts - ) external view returns (bytes[] memory destExecDataPerToken) { + ) internal view returns (bytes[] memory destExecDataPerToken) { bytes4 chainFamilySelector = s_destChainConfigs[destChainSelector].chainFamilySelector; - destExecDataPerToken = new bytes[](rampTokenAmounts.length); - for (uint256 i = 0; i < rampTokenAmounts.length; ++i) { + destExecDataPerToken = new bytes[](onRampTokenTransfers.length); + for (uint256 i = 0; i < onRampTokenTransfers.length; ++i) { address sourceToken = sourceTokenAmounts[i].token; // Since the DON has to pay for the extraData to be included on the destination chain, we cap the length of the // extraData. This prevents gas bomb attacks on the NOPs. As destBytesOverhead accounts for both // extraData and offchainData, this caps the worst case abuse to the number of bytes reserved for offchainData. - uint256 destPoolDataLength = rampTokenAmounts[i].extraData.length; + uint256 destPoolDataLength = onRampTokenTransfers[i].extraData.length; if (destPoolDataLength > Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) { if (destPoolDataLength > s_tokenTransferFeeConfig[destChainSelector][sourceToken].destBytesOverhead) { revert SourceTokenDataTooLarge(sourceToken); } } - _validateDestFamilyAddress(chainFamilySelector, rampTokenAmounts[i].destTokenAddress); + _validateDestFamilyAddress(chainFamilySelector, onRampTokenTransfers[i].destTokenAddress); FeeQuoter.TokenTransferFeeConfig memory tokenTransferFeeConfig = s_tokenTransferFeeConfig[destChainSelector][sourceToken]; uint32 defaultGasOverhead = s_destChainConfigs[destChainSelector].defaultTokenDestGasOverhead; diff --git a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol index 1fbfd22d1c0..3935d6fab97 100644 --- a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol +++ b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol @@ -59,14 +59,14 @@ contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers, IT /// @dev Tokens that should be included in Aggregate Rate Limiting (from local chain (this chain) -> remote), /// grouped per-remote chain. - mapping(uint64 remoteChainSelector => EnumerableMapAddresses.AddressToBytesMap tokensLocalToRemote) internal + mapping(uint64 remoteChainSelector => EnumerableMapAddresses.AddressToBytesMap tokensLocalToRemote) private s_rateLimitedTokensLocalToRemote; /// @notice The address of the FeeQuoter used to query token values for ratelimiting. address internal s_feeQuoter; /// @notice Rate limiter token bucket states per chain, with separate buckets for inbound and outbound lanes. - mapping(uint64 remoteChainSelector => RateLimiterBuckets buckets) internal s_rateLimitersByChainSelector; + mapping(uint64 remoteChainSelector => RateLimiterBuckets buckets) private s_rateLimitersByChainSelector; /// @param feeQuoter the fee quoter to set. /// @param authorizedCallers the authorized callers to set. diff --git a/contracts/src/v0.8/ccip/NonceManager.sol b/contracts/src/v0.8/ccip/NonceManager.sol index 38212e1d5fa..5932e88b9c8 100644 --- a/contracts/src/v0.8/ccip/NonceManager.sol +++ b/contracts/src/v0.8/ccip/NonceManager.sol @@ -129,7 +129,9 @@ contract NonceManager is INonceManager, AuthorizedCallers, ITypeAndVersion { PreviousRamps storage prevRamps = s_previousRamps[previousRampsArg.remoteChainSelector]; - // If the previous ramps are already set then they should not be updated + // If the previous ramps are already set then they should not be updated. + // In versions prior to the introduction of the NonceManager contract, nonces were tracked in the on/off ramps. + // This config does a 1-time migration to move the nonce from on/off ramps into NonceManager if (prevRamps.prevOnRamp != address(0) || prevRamps.prevOffRamp != address(0)) { revert PreviousRampAlreadySet(); } diff --git a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol index 77816ceadbd..82de08ea647 100644 --- a/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol +++ b/contracts/src/v0.8/ccip/applications/CCIPClientExample.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {IRouterClient} from "../interfaces/IRouterClient.sol"; diff --git a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol index 1d4937c77a8..208c4e47ce0 100644 --- a/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/CCIPReceiver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol"; diff --git a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol index 89435ccbf1c..f0501b5d903 100644 --- a/contracts/src/v0.8/ccip/applications/DefensiveExample.sol +++ b/contracts/src/v0.8/ccip/applications/DefensiveExample.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {IRouterClient} from "../interfaces/IRouterClient.sol"; @@ -8,7 +8,7 @@ import {CCIPClientExample} from "./CCIPClientExample.sol"; import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; -import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableMap.sol"; +import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; contract DefensiveExample is CCIPClientExample { using EnumerableMap for EnumerableMap.Bytes32ToUintMap; diff --git a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol index b902c476185..567ad3c27d9 100644 --- a/contracts/src/v0.8/ccip/applications/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/PingPongDemo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; import {IRouterClient} from "../interfaces/IRouterClient.sol"; diff --git a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol index f9e4fd0aa6e..09c81ad5de5 100644 --- a/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol +++ b/contracts/src/v0.8/ccip/applications/SelfFundedPingPong.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {Router} from "../Router.sol"; import {Client} from "../libraries/Client.sol"; diff --git a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol deleted file mode 100644 index 463a7103351..00000000000 --- a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol +++ /dev/null @@ -1,501 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.24; - -import {ICapabilityConfiguration} from "../../keystone/interfaces/ICapabilityConfiguration.sol"; -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; -import {ICapabilitiesRegistry} from "./interfaces/ICapabilitiesRegistry.sol"; - -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {Internal} from "../libraries/Internal.sol"; -import {CCIPConfigTypes} from "./libraries/CCIPConfigTypes.sol"; - -import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol"; -import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol"; - -/// @notice CCIPConfig stores the configuration for the CCIP capability. -/// We have two classes of configuration: chain configuration and DON (in the CapabilitiesRegistry sense) configuration. -/// Each chain will have a single configuration which includes information like the router address. -/// Each CR DON will have up to four configurations: for each of (commit, exec), one blue and one green configuration. -/// This is done in order to achieve "blue-green" deployments. -contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator, IERC165 { - using EnumerableSet for EnumerableSet.UintSet; - - /// @notice Emitted when a chain's configuration is set. - /// @param chainSelector The chain selector. - /// @param chainConfig The chain configuration. - event ChainConfigSet(uint64 chainSelector, CCIPConfigTypes.ChainConfig chainConfig); - /// @notice Emitted when a chain's configuration is removed. - /// @param chainSelector The chain selector. - event ChainConfigRemoved(uint64 chainSelector); - - error NodeNotInRegistry(bytes32 p2pId); - error OnlyCapabilitiesRegistryCanCall(); - error ChainSelectorNotFound(uint64 chainSelector); - error ChainSelectorNotSet(); - error TooManyOCR3Configs(); - error TooManySigners(); - error P2PIdsLengthNotMatching(uint256 p2pIdsLength, uint256 signersLength, uint256 transmittersLength); - error NotEnoughTransmitters(uint256 got, uint256 minimum); - error FMustBePositive(); - error FChainMustBePositive(); - error FTooHigh(); - error InvalidPluginType(); - error OfframpAddressCannotBeZero(); - error InvalidConfigLength(uint256 length); - error InvalidConfigStateTransition( - CCIPConfigTypes.ConfigState currentState, CCIPConfigTypes.ConfigState proposedState - ); - error NonExistentConfigTransition(); - error WrongConfigCount(uint64 got, uint64 expected); - error WrongConfigDigest(bytes32 got, bytes32 expected); - error WrongConfigDigestBlueGreen(bytes32 got, bytes32 expected); - error ZeroAddressNotAllowed(); - - /// @notice Type and version override. - string public constant override typeAndVersion = "CCIPConfig 1.6.0-dev"; - - /// @notice The canonical capabilities registry address. - address internal immutable i_capabilitiesRegistry; - - uint8 internal constant MAX_OCR3_CONFIGS_PER_PLUGIN = 2; - uint8 internal constant MAX_OCR3_CONFIGS_PER_DON = 4; - uint256 internal constant CONFIG_DIGEST_PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..0 - /// @dev must be equal to libocr multi role: https://github.com/smartcontractkit/libocr/blob/ae747ca5b81236ffdbf1714318c652e923a5ff4d/offchainreporting2plus/types/config_digest.go#L28 - uint256 internal constant CONFIG_DIGEST_PREFIX = 0x000a << (256 - 16); // 0x000a00..00 - bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0))); - /// @dev 256 is the hard limit due to the bit encoding of their indexes into a uint256. - uint256 internal constant MAX_NUM_ORACLES = 256; - - /// @notice chain configuration for each chain that CCIP is deployed on. - mapping(uint64 chainSelector => CCIPConfigTypes.ChainConfig chainConfig) internal s_chainConfigurations; - - /// @notice All chains that are configured. - EnumerableSet.UintSet internal s_remoteChainSelectors; - - /// @notice OCR3 configurations for each DON. - /// Each CR DON will have a commit and execution configuration. - /// This means that a DON can have up to 4 configurations, since we are implementing blue/green deployments. - mapping( - uint32 donId => mapping(Internal.OCRPluginType pluginType => CCIPConfigTypes.OCR3ConfigWithMeta[] ocr3Configs) - ) internal s_ocr3Configs; - - /// @param capabilitiesRegistry the canonical capabilities registry address. - constructor(address capabilitiesRegistry) { - if (capabilitiesRegistry == address(0)) { - revert ZeroAddressNotAllowed(); - } - i_capabilitiesRegistry = capabilitiesRegistry; - } - - /// @inheritdoc IERC165 - function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { - return interfaceId == type(ICapabilityConfiguration).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - // ================================================================ - // │ Config Getters │ - // ================================================================ - /// @notice Returns the capabilities registry address. - /// @return The capabilities registry address. - function getCapabilityRegistry() external view returns (address) { - return i_capabilitiesRegistry; - } - - /// @notice Returns all the chain configurations. - /// @param pageIndex The page index. - /// @param pageSize The page size. - /// @return paginatedChainConfigs chain configurations. - function getAllChainConfigs( - uint256 pageIndex, - uint256 pageSize - ) external view returns (CCIPConfigTypes.ChainConfigInfo[] memory) { - uint256 totalItems = s_remoteChainSelectors.length(); // Total number of chain selectors - uint256 startIndex = pageIndex * pageSize; - - if (pageSize == 0 || startIndex >= totalItems) { - return new CCIPConfigTypes.ChainConfigInfo[](0); // Return an empty array if pageSize is 0 or pageIndex is out of bounds - } - - uint256 endIndex = startIndex + pageSize; - if (endIndex > totalItems) { - endIndex = totalItems; - } - - CCIPConfigTypes.ChainConfigInfo[] memory paginatedChainConfigs = - new CCIPConfigTypes.ChainConfigInfo[](endIndex - startIndex); - - uint256[] memory chainSelectors = s_remoteChainSelectors.values(); - for (uint256 i = startIndex; i < endIndex; ++i) { - uint64 chainSelector = uint64(chainSelectors[i]); - paginatedChainConfigs[i - startIndex] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: chainSelector, - chainConfig: s_chainConfigurations[chainSelector] - }); - } - - return paginatedChainConfigs; - } - - /// @notice Returns the OCR configuration for the given don ID and plugin type. - /// @param donId The DON ID. - /// @param pluginType The plugin type. - /// @return The OCR3 configurations, up to 2 (blue and green). - function getOCRConfig( - uint32 donId, - Internal.OCRPluginType pluginType - ) external view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) { - return s_ocr3Configs[donId][pluginType]; - } - - // ================================================================ - // │ Capability Configuration │ - // ================================================================ - - /// @inheritdoc ICapabilityConfiguration - /// @dev The CCIP capability will fetch the configuration needed directly from this contract. - /// The offchain syncer will call this function, however, so its important that it doesn't revert. - function getCapabilityConfiguration(uint32 /* donId */ ) external pure override returns (bytes memory configuration) { - return bytes(""); - } - - /// @notice Called by the registry prior to the config being set for a particular DON. - function beforeCapabilityConfigSet( - bytes32[] calldata, /* nodes */ - bytes calldata config, - uint64, /* configCount */ - uint32 donId - ) external override { - if (msg.sender != i_capabilitiesRegistry) { - revert OnlyCapabilitiesRegistryCanCall(); - } - - (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs) = - _groupByPluginType(abi.decode(config, (CCIPConfigTypes.OCR3Config[]))); - if (commitConfigs.length > 0) { - _updatePluginConfig(donId, Internal.OCRPluginType.Commit, commitConfigs); - } - if (execConfigs.length > 0) { - _updatePluginConfig(donId, Internal.OCRPluginType.Execution, execConfigs); - } - } - - /// @notice Sets a new OCR3 config for a specific plugin type for a DON. - /// @param donId The DON ID. - /// @param pluginType The plugin type. - /// @param newConfig The new configuration. - function _updatePluginConfig( - uint32 donId, - Internal.OCRPluginType pluginType, - CCIPConfigTypes.OCR3Config[] memory newConfig - ) internal { - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = s_ocr3Configs[donId][pluginType]; - - // Validate the state transition being proposed, which is implicitly defined by the combination - // of lengths of the current and new configurations. - CCIPConfigTypes.ConfigState currentState = _stateFromConfigLength(currentConfig.length); - CCIPConfigTypes.ConfigState proposedState = _stateFromConfigLength(newConfig.length); - _validateConfigStateTransition(currentState, proposedState); - - // Build the new configuration with metadata and validate that the transition is valid. - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta = - _computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, proposedState); - _validateConfigTransition(currentConfig, newConfigWithMeta); - - // Update contract state with new configuration if its valid. - // We won't run out of gas from this delete since the array is at most 2 elements long. - delete s_ocr3Configs[donId][pluginType]; - for (uint256 i = 0; i < newConfigWithMeta.length; ++i) { - s_ocr3Configs[donId][pluginType].push(newConfigWithMeta[i]); - } - } - - // ================================================================ - // │ Config State Machine │ - // ================================================================ - - /// @notice Determine the config state of the configuration from the length of the config. - /// @param configLen The length of the configuration. - /// @return The config state. - function _stateFromConfigLength(uint256 configLen) internal pure returns (CCIPConfigTypes.ConfigState) { - if (configLen > 2) { - revert InvalidConfigLength(configLen); - } - return CCIPConfigTypes.ConfigState(configLen); - } - - /// @notice Validates the state transition between two config states. - /// The only valid state transitions are the following: - /// Init -> Running (first ever config) - /// Running -> Staging (blue/green proposal) - /// Staging -> Running (promotion) - /// Everything else is invalid and should revert. - /// @param currentState The current state. - /// @param newState The new state. - function _validateConfigStateTransition( - CCIPConfigTypes.ConfigState currentState, - CCIPConfigTypes.ConfigState newState - ) internal pure { - // Calculate the difference between the new state and the current state - int256 stateDiff = int256(uint256(newState)) - int256(uint256(currentState)); - - // Check if the state transition is valid: - // Valid transitions: - // 1. currentState -> newState (where stateDiff == 1) - // e.g., init -> running or running -> staging - // 2. staging -> running (where stateDiff == -1) - if (stateDiff == 1 || (stateDiff == -1 && currentState == CCIPConfigTypes.ConfigState.Staging)) { - return; - } - revert InvalidConfigStateTransition(currentState, newState); - } - - /// @notice Validates the transition between two OCR3 configurations. - /// @param currentConfig The current configuration with metadata. - /// @param newConfigWithMeta The new configuration with metadata. - function _validateConfigTransition( - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig, - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta - ) internal pure { - uint256 currentConfigLen = currentConfig.length; - uint256 newConfigLen = newConfigWithMeta.length; - if (currentConfigLen == 0 && newConfigLen == 1) { - // Config counts always must start at 1 for the first ever config. - if (newConfigWithMeta[0].configCount != 1) { - revert WrongConfigCount(newConfigWithMeta[0].configCount, 1); - } - return; - } - - if (currentConfigLen == 1 && newConfigLen == 2) { - // On a blue/green proposal: - // * the config digest of the blue config must remain unchanged. - // * the green config count must be the blue config count + 1. - if (newConfigWithMeta[0].configDigest != currentConfig[0].configDigest) { - revert WrongConfigDigestBlueGreen(newConfigWithMeta[0].configDigest, currentConfig[0].configDigest); - } - if (newConfigWithMeta[1].configCount != currentConfig[0].configCount + 1) { - revert WrongConfigCount(newConfigWithMeta[1].configCount, currentConfig[0].configCount + 1); - } - return; - } - - if (currentConfigLen == 2 && newConfigLen == 1) { - // On a promotion, the green config digest must become the blue config digest. - if (newConfigWithMeta[0].configDigest != currentConfig[1].configDigest) { - revert WrongConfigDigest(newConfigWithMeta[0].configDigest, currentConfig[1].configDigest); - } - return; - } - - revert NonExistentConfigTransition(); - } - - /// @notice Computes a new configuration with metadata based on the current configuration and the new configuration. - /// @param donId The DON ID. - /// @param currentConfig The current configuration, including metadata. - /// @param newConfig The new configuration, without metadata. - /// @param currentState The current state of the configuration. - /// @param newState The new state of the configuration. - /// @return The new configuration with metadata. - function _computeNewConfigWithMeta( - uint32 donId, - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig, - CCIPConfigTypes.OCR3Config[] memory newConfig, - CCIPConfigTypes.ConfigState currentState, - CCIPConfigTypes.ConfigState newState - ) internal view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) { - uint64[] memory configCounts = new uint64[](newConfig.length); - - // Set config counts based on the only valid state transitions. - // Init -> Running (first ever config) - // Running -> Staging (blue/green proposal) - // Staging -> Running (promotion) - if (currentState == CCIPConfigTypes.ConfigState.Init && newState == CCIPConfigTypes.ConfigState.Running) { - // First ever config starts with config count == 1. - configCounts[0] = 1; - } else if (currentState == CCIPConfigTypes.ConfigState.Running && newState == CCIPConfigTypes.ConfigState.Staging) { - // On a blue/green proposal, the config count of the green config is the blue config count + 1. - configCounts[0] = currentConfig[0].configCount; - configCounts[1] = currentConfig[0].configCount + 1; - } else if (currentState == CCIPConfigTypes.ConfigState.Staging && newState == CCIPConfigTypes.ConfigState.Running) { - // On a promotion, the config count of the green config becomes the blue config count. - configCounts[0] = currentConfig[1].configCount; - } else { - revert InvalidConfigStateTransition(currentState, newState); - } - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta = - new CCIPConfigTypes.OCR3ConfigWithMeta[](newConfig.length); - for (uint256 i = 0; i < configCounts.length; ++i) { - _validateConfig(newConfig[i]); - newConfigWithMeta[i] = CCIPConfigTypes.OCR3ConfigWithMeta({ - config: newConfig[i], - configCount: configCounts[i], - configDigest: _computeConfigDigest(donId, configCounts[i], newConfig[i]) - }); - } - - return newConfigWithMeta; - } - - /// @notice Group the OCR3 configurations by plugin type for further processing. - /// @param ocr3Configs The OCR3 configurations to group. - /// @return commitConfigs The commit configurations. - /// @return execConfigs The execution configurations. - function _groupByPluginType( - CCIPConfigTypes.OCR3Config[] memory ocr3Configs - ) - internal - pure - returns (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs) - { - if (ocr3Configs.length > MAX_OCR3_CONFIGS_PER_DON) { - revert TooManyOCR3Configs(); - } - - // Declare with size 2 since we have a maximum of two configs per plugin type (blue, green). - // If we have less we will adjust the length later using mstore. - // If the caller provides more than 2 configs per plugin type, we will revert due to out of bounds - // access in the for loop below. - commitConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN); - execConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN); - uint256 commitCount = 0; - uint256 execCount = 0; - for (uint256 i = 0; i < ocr3Configs.length; ++i) { - if (ocr3Configs[i].pluginType == Internal.OCRPluginType.Commit) { - commitConfigs[commitCount] = ocr3Configs[i]; - ++commitCount; - } else { - execConfigs[execCount] = ocr3Configs[i]; - ++execCount; - } - } - - // Adjust the length of the arrays to the actual number of configs. - assembly { - mstore(commitConfigs, commitCount) - mstore(execConfigs, execCount) - } - - return (commitConfigs, execConfigs); - } - - /// @notice Validates an OCR3 configuration. - /// @param cfg The OCR3 configuration. - function _validateConfig(CCIPConfigTypes.OCR3Config memory cfg) internal view { - if (cfg.chainSelector == 0) revert ChainSelectorNotSet(); - if (cfg.pluginType != Internal.OCRPluginType.Commit && cfg.pluginType != Internal.OCRPluginType.Execution) { - revert InvalidPluginType(); - } - if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) { - revert OfframpAddressCannotBeZero(); - } - if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector); - - // We check for chain config presence above, so fChain here must be non-zero. - uint256 minTransmittersLength = 3 * s_chainConfigurations[cfg.chainSelector].fChain + 1; - if (cfg.transmitters.length < minTransmittersLength) { - revert NotEnoughTransmitters(cfg.transmitters.length, minTransmittersLength); - } - uint256 numberOfSigners = cfg.signers.length; - if (numberOfSigners > MAX_NUM_ORACLES) revert TooManySigners(); - if (numberOfSigners != cfg.p2pIds.length || numberOfSigners != cfg.transmitters.length) { - revert P2PIdsLengthNotMatching(cfg.p2pIds.length, cfg.signers.length, cfg.transmitters.length); - } - if (cfg.F == 0) revert FMustBePositive(); - if (numberOfSigners <= 3 * cfg.F) revert FTooHigh(); - - // Check that the readers are in the capabilities registry. - _ensureInRegistry(cfg.p2pIds); - } - - /// @notice Computes the digest of the provided configuration. - /// @dev In traditional OCR config digest computation, block.chainid and address(this) are used - /// in order to further domain separate the digest. We can't do that here since the digest will - /// be used on remote chains; so we use the chain selector instead of block.chainid. The don ID - /// replaces the address(this) in the traditional computation. - /// @param donId The DON ID. - /// @param configCount The configuration count. - /// @param ocr3Config The OCR3 configuration. - /// @return The computed digest. - function _computeConfigDigest( - uint32 donId, - uint64 configCount, - CCIPConfigTypes.OCR3Config memory ocr3Config - ) internal pure returns (bytes32) { - uint256 h = uint256( - keccak256( - abi.encode( - ocr3Config.chainSelector, - donId, - ocr3Config.pluginType, - ocr3Config.offrampAddress, - configCount, - ocr3Config.p2pIds, - ocr3Config.signers, - ocr3Config.transmitters, - ocr3Config.F, - ocr3Config.offchainConfigVersion, - ocr3Config.offchainConfig - ) - ) - ); - - return bytes32((CONFIG_DIGEST_PREFIX & CONFIG_DIGEST_PREFIX_MASK) | (h & ~CONFIG_DIGEST_PREFIX_MASK)); - } - - // ================================================================ - // │ Chain Configuration │ - // ================================================================ - - /// @notice Sets and/or removes chain configurations. - /// @param chainSelectorRemoves The chain configurations to remove. - /// @param chainConfigAdds The chain configurations to add. - function applyChainConfigUpdates( - uint64[] calldata chainSelectorRemoves, - CCIPConfigTypes.ChainConfigInfo[] calldata chainConfigAdds - ) external onlyOwner { - // Process removals first. - for (uint256 i = 0; i < chainSelectorRemoves.length; ++i) { - // check if the chain selector is in s_remoteChainSelectors first. - if (!s_remoteChainSelectors.contains(chainSelectorRemoves[i])) { - revert ChainSelectorNotFound(chainSelectorRemoves[i]); - } - - delete s_chainConfigurations[chainSelectorRemoves[i]]; - s_remoteChainSelectors.remove(chainSelectorRemoves[i]); - - emit ChainConfigRemoved(chainSelectorRemoves[i]); - } - - // Process additions next. - for (uint256 i = 0; i < chainConfigAdds.length; ++i) { - CCIPConfigTypes.ChainConfig memory chainConfig = chainConfigAdds[i].chainConfig; - uint64 chainSelector = chainConfigAdds[i].chainSelector; - - // Verify that the provided readers are present in the capabilities registry. - _ensureInRegistry(chainConfig.readers); - - // Verify that fChain is positive. - if (chainConfig.fChain == 0) { - revert FChainMustBePositive(); - } - - s_chainConfigurations[chainSelector] = chainConfig; - s_remoteChainSelectors.add(chainSelector); - - emit ChainConfigSet(chainSelector, chainConfig); - } - } - - /// @notice Helper function to ensure that a node is in the capabilities registry. - /// @param p2pIds The P2P IDs of the node to check. - function _ensureInRegistry(bytes32[] memory p2pIds) internal view { - for (uint256 i = 0; i < p2pIds.length; ++i) { - // TODO add a method that does the validation in the ICapabilitiesRegistry contract - if (ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pIds[i]).p2pId == bytes32("")) { - revert NodeNotInRegistry(p2pIds[i]); - } - } - } -} diff --git a/contracts/src/v0.8/ccip/capability/CCIPHome.sol b/contracts/src/v0.8/ccip/capability/CCIPHome.sol new file mode 100644 index 00000000000..e3875589467 --- /dev/null +++ b/contracts/src/v0.8/ccip/capability/CCIPHome.sol @@ -0,0 +1,614 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {ICapabilityConfiguration} from "../../keystone/interfaces/ICapabilityConfiguration.sol"; +import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; +import {ICapabilitiesRegistry} from "../interfaces/ICapabilitiesRegistry.sol"; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {Internal} from "../libraries/Internal.sol"; + +import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol"; +import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol"; + +/// @notice CCIPHome stores the configuration for the CCIP capability. +/// We have two classes of configuration: chain configuration and DON (in the CapabilitiesRegistry sense) configuration. +/// Each chain will have a single configuration which includes information like the router address. +/// @dev This contract is a state machine with the following states: +/// - Init: The initial state of the contract, no config has been set, or all configs have been revoked. +/// [0, 0] +/// +/// - Candidate: A new config has been set, but it has not been promoted yet, or all active configs have been revoked. +/// [0, 1] +/// +/// - Active: A non-zero config has been promoted and is active, there is no candidate configured. +/// [1, 0] +/// +/// - ActiveAndCandidate: A non-zero config has been promoted and is active, and a new config has been set as candidate. +/// [1, 1] +/// +/// The following state transitions are allowed: +/// - Init -> Candidate: setCandidate() +/// - Candidate -> Active: promoteCandidateAndRevokeActive() +/// - Candidate -> Candidate: setCandidate() +/// - Candidate -> Init: revokeCandidate() +/// - Active -> ActiveAndCandidate: setCandidate() +/// - Active -> Init: promoteCandidateAndRevokeActive() +/// - ActiveAndCandidate -> Active: promoteCandidateAndRevokeActive() +/// - ActiveAndCandidate -> Active: revokeCandidate() +/// - ActiveAndCandidate -> ActiveAndCandidate: setCandidate() +/// +/// This means the following calls are not allowed at the following states: +/// - Init: promoteCandidateAndRevokeActive(), as there is no config to promote. +/// - Init: revokeCandidate(), as there is no config to revoke +/// - Active: revokeCandidate(), as there is no candidate to revoke +/// Note that we explicitly do allow promoteCandidateAndRevokeActive() to be called when there is an active config but +/// no candidate config. This is the only way to remove the active config. The alternative would be to set some unusable +/// config as candidate and promote that, but fully clearing it is cleaner. +/// +/// ┌─────────────┐ setCandidate ┌─────────────┐ +/// │ ├───────────────────►│ │ setCandidate +/// │ Init │ revokeCandidate │ Candidate │◄───────────┐ +/// │ [0,0] │◄───────────────────┤ [0,1] │────────────┘ +/// │ │ ┌─────────────────┤ │ +/// └─────────────┘ │ promote- └─────────────┘ +/// ▲ │ Candidate +/// promote- │ │ +/// Candidate │ │ +/// │ │ +/// ┌──────────┴──┐ │ promote- ┌─────────────┐ +/// │ │◄─┘ Candidate OR │ Active & │ setCandidate +/// │ Active │ revokeCandidate │ Candidate │◄───────────┐ +/// │ [1,0] │◄───────────────────┤ [1,1] │────────────┘ +/// │ ├───────────────────►│ │ +/// └─────────────┘ setSecondary └─────────────┘ +/// +contract CCIPHome is OwnerIsCreator, ITypeAndVersion, ICapabilityConfiguration, IERC165 { + using EnumerableSet for EnumerableSet.UintSet; + + event ChainConfigRemoved(uint64 chainSelector); + event ChainConfigSet(uint64 chainSelector, ChainConfig chainConfig); + event ConfigSet(bytes32 indexed configDigest, uint32 version, OCR3Config config); + event ActiveConfigRevoked(bytes32 indexed configDigest); + event CandidateConfigRevoked(bytes32 indexed configDigest); + event ConfigPromoted(bytes32 indexed configDigest); + + error NodeNotInRegistry(bytes32 p2pId); + error ChainSelectorNotFound(uint64 chainSelector); + error FChainMustBePositive(); + error ChainSelectorNotSet(); + error InvalidPluginType(); + error OfframpAddressCannotBeZero(); + error FChainTooHigh(uint256 fChain, uint256 FRoleDON); + error TooManySigners(); + error FTooHigh(); + error RMNHomeAddressCannotBeZero(); + error InvalidNode(OCR3Node node); + error NotEnoughTransmitters(uint256 got, uint256 minimum); + error OnlyCapabilitiesRegistryCanCall(); + error ZeroAddressNotAllowed(); + error ConfigDigestMismatch(bytes32 expectedConfigDigest, bytes32 gotConfigDigest); + error CanOnlySelfCall(); + error RevokingZeroDigestNotAllowed(); + error NoOpStateTransitionNotAllowed(); + error InvalidSelector(bytes4 selector); + error DONIdMismatch(uint32 callDonId, uint32 capabilityRegistryDonId); + + error InvalidStateTransition( + bytes32 currentActiveDigest, + bytes32 currentCandidateDigest, + bytes32 proposedActiveDigest, + bytes32 proposedCandidateDigest + ); + + /// @notice Represents an oracle node in OCR3 configs part of the role DON. + /// Every configured node should be a signer, but does not have to be a transmitter. + struct OCR3Node { + bytes32 p2pId; // Peer2Peer connection ID of the oracle + bytes signerKey; // On-chain signer public key + bytes transmitterKey; // On-chain transmitter public key. Can be set to empty bytes to represent that the node is a signer but not a transmitter. + } + + /// @notice OCR3 configuration. + /// Note that FRoleDON >= fChain, since FRoleDON represents the role DON, and fChain represents sub-committees. + /// FRoleDON values are typically identical across multiple OCR3 configs since the chains pertain to one role DON, + /// but FRoleDON values can change across OCR3 configs to indicate role DON splits. + struct OCR3Config { + Internal.OCRPluginType pluginType; // ─╮ The plugin that the configuration is for. + uint64 chainSelector; // │ The (remote) chain that the configuration is for. + uint8 FRoleDON; // │ The "big F" parameter for the role DON. + uint64 offchainConfigVersion; // ──────╯ The version of the exec offchain configuration. + bytes offrampAddress; // The remote chain offramp address. + bytes rmnHomeAddress; // The home chain RMN home address. + OCR3Node[] nodes; // Keys & IDs of nodes part of the role DON + bytes offchainConfig; // The offchain configuration for the OCR3 plugin. Protobuf encoded. + } + + struct VersionedConfig { + uint32 version; + bytes32 configDigest; + OCR3Config config; + } + + /// @notice Chain configuration. + /// Changes to chain configuration are detected out-of-band in plugins and decoded offchain. + struct ChainConfig { + bytes32[] readers; // The P2P IDs of the readers for the chain. These IDs must be registered in the capabilities registry. + uint8 fChain; // The fault tolerance parameter of the chain. + bytes config; // The chain configuration. This is kept intentionally opaque so as to add fields in the future if needed. + } + + /// @notice Chain configuration information struct used in applyChainConfigUpdates and getAllChainConfigs. + struct ChainConfigArgs { + uint64 chainSelector; + ChainConfig chainConfig; + } + + string public constant override typeAndVersion = "CCIPHome 1.6.0-dev"; + + /// @dev A prefix added to all config digests that is unique to the implementation + uint256 private constant PREFIX = 0x000a << (256 - 16); // 0x000a00..00 + bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0))); + /// @dev 256 is the hard limit due to the bit encoding of their indexes into a uint256. + uint256 internal constant MAX_NUM_ORACLES = 256; + + /// @notice Used for encoding the config digest prefix + uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00 + /// @notice The max number of configs that can be active at the same time. + uint256 private constant MAX_CONCURRENT_CONFIGS = 2; + /// @notice Helper to identify the zero config digest with less casting. + bytes32 private constant ZERO_DIGEST = bytes32(uint256(0)); + + /// @dev The canonical capabilities registry address. + address internal immutable i_capabilitiesRegistry; + + /// @dev chain configuration for each chain that CCIP is deployed on. + mapping(uint64 chainSelector => ChainConfig chainConfig) private s_chainConfigurations; + + /// @dev All chains that are configured. + EnumerableSet.UintSet private s_remoteChainSelectors; + + /// @notice This array holds the configs. + /// @dev A DonID covers a single chain, and the plugin type is used to differentiate between the commit and execution + mapping(uint32 donId => mapping(Internal.OCRPluginType pluginType => VersionedConfig[MAX_CONCURRENT_CONFIGS])) private + s_configs; + + /// @notice The total number of configs ever set, used for generating the version of the configs. + /// @dev Used to ensure unique digests across all configurations. + uint32 private s_currentVersion = 0; + /// @notice The index of the active config on a per-don and per-plugin basis. + mapping(uint32 donId => mapping(Internal.OCRPluginType pluginType => uint32)) private s_activeConfigIndexes; + + /// @notice Constructor for the CCIPHome contract takes in the address of the capabilities registry. This address + /// is the only allowed caller to mutate the configuration through beforeCapabilityConfigSet. + constructor(address capabilitiesRegistry) { + if (capabilitiesRegistry == address(0)) { + revert ZeroAddressNotAllowed(); + } + i_capabilitiesRegistry = capabilitiesRegistry; + } + + // ================================================================ + // │ Capability Registry │ + // ================================================================ + + /// @notice Returns the capabilities registry address. + /// @return The capabilities registry address. + function getCapabilityRegistry() external view returns (address) { + return i_capabilitiesRegistry; + } + + /// @inheritdoc IERC165 + /// @dev Required for the capabilities registry to recognize this contract. + function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { + return interfaceId == type(ICapabilityConfiguration).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + /// @notice Called by the registry prior to the config being set for a particular DON. + /// @dev precondition Requires destination chain config to be set + function beforeCapabilityConfigSet( + bytes32[] calldata, // nodes + bytes calldata update, + // Config count is unused because we don't want to invalidate a config on blue/green promotions so we keep track of + // the actual newly submitted configs instead of the number of config mutations. + uint64, // config count + uint32 donId + ) external override { + if (msg.sender != i_capabilitiesRegistry) { + revert OnlyCapabilitiesRegistryCanCall(); + } + + bytes4 selector = bytes4(update[:4]); + // We only allow self-calls to the following approved methods + if ( + selector != this.setCandidate.selector && selector != this.revokeCandidate.selector + && selector != this.promoteCandidateAndRevokeActive.selector + ) { + revert InvalidSelector(selector); + } + + // We validate that the call contains the correct DON ID. The DON ID is always the first function argument. + uint256 callDonId = abi.decode(update[4:36], (uint256)); + if (callDonId != donId) { + revert DONIdMismatch(uint32(callDonId), donId); + } + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory retData) = address(this).call(update); + // if not successful, revert with the original revert + if (!success) { + assembly { + revert(add(retData, 0x20), returndatasize()) + } + } + } + + /// @inheritdoc ICapabilityConfiguration + /// @dev The CCIP capability will fetch the configuration needed directly from this contract. + /// The offchain syncer will call this function, so its important that it doesn't revert. + function getCapabilityConfiguration(uint32 /* donId */ ) external pure override returns (bytes memory configuration) { + return bytes(""); + } + + // ================================================================ + // │ Getters │ + // ================================================================ + + /// @notice Returns the current active and candidate config digests. + /// @dev Can be bytes32(0) if no config has been set yet or it has been revoked. + /// @param donId The key of the plugin to get the config digests for. + /// @return activeConfigDigest The digest of the active config. + /// @return candidateConfigDigest The digest of the candidate config. + function getConfigDigests( + uint32 donId, + Internal.OCRPluginType pluginType + ) public view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) { + return ( + s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)].configDigest, + s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)].configDigest + ); + } + + /// @notice Returns the active config digest for for a given key. + /// @param donId The key of the plugin to get the config digests for. + function getActiveDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) { + return s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)].configDigest; + } + + /// @notice Returns the candidate config digest for for a given key. + /// @param donId The key of the plugin to get the config digests for. + function getCandidateDigest(uint32 donId, Internal.OCRPluginType pluginType) public view returns (bytes32) { + return s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)].configDigest; + } + + /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use + /// in case one of the configs is too large to be returnable by one of the other getters. + /// @param donId The unique key for the DON that the configuration applies to. + /// @param configDigest The digest of the config to fetch. + /// @return versionedConfig The config and its version. + /// @return ok True if the config was found, false otherwise. + function getConfig( + uint32 donId, + Internal.OCRPluginType pluginType, + bytes32 configDigest + ) external view returns (VersionedConfig memory versionedConfig, bool ok) { + for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) { + // We never want to return true for a zero digest, even if the caller is asking for it, as this can expose old + // config state that is invalid. + if (s_configs[donId][pluginType][i].configDigest == configDigest && configDigest != ZERO_DIGEST) { + return (s_configs[donId][pluginType][i], true); + } + } + // versionConfig is uninitialized so it contains default values. + return (versionedConfig, false); + } + + /// @notice Returns the active and candidate configuration for a given plugin key. + /// @param donId The unique key for the DON that the configuration applies to. + /// @return activeConfig The active configuration. + /// @return candidateConfig The candidate configuration. + function getAllConfigs( + uint32 donId, + Internal.OCRPluginType pluginType + ) external view returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig) { + VersionedConfig memory storedActiveConfig = s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)]; + if (storedActiveConfig.configDigest != ZERO_DIGEST) { + activeConfig = storedActiveConfig; + } + + VersionedConfig memory storedCandidateConfig = s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)]; + if (storedCandidateConfig.configDigest != ZERO_DIGEST) { + candidateConfig = storedCandidateConfig; + } + + return (activeConfig, candidateConfig); + } + + // ================================================================ + // │ State transitions │ + // ================================================================ + + /// @notice Sets a new config as the candidate config. Does not influence the active config. + /// @param donId The key of the plugin to set the config for. + /// @return newConfigDigest The digest of the new config. + function setCandidate( + uint32 donId, + Internal.OCRPluginType pluginType, + OCR3Config calldata config, + bytes32 digestToOverwrite + ) external returns (bytes32 newConfigDigest) { + _onlySelfCall(); + _validateConfig(config); + + bytes32 existingDigest = getCandidateDigest(donId, pluginType); + + if (existingDigest != digestToOverwrite) { + revert ConfigDigestMismatch(existingDigest, digestToOverwrite); + } + + // are we going to overwrite a config? If so, emit an event. + if (existingDigest != ZERO_DIGEST) { + emit CandidateConfigRevoked(digestToOverwrite); + } + + uint32 newVersion = ++s_currentVersion; + newConfigDigest = _calculateConfigDigest(donId, pluginType, abi.encode(config), newVersion); + + VersionedConfig storage existingConfig = s_configs[donId][pluginType][_getCandidateIndex(donId, pluginType)]; + existingConfig.configDigest = newConfigDigest; + existingConfig.version = newVersion; + existingConfig.config = config; + + emit ConfigSet(newConfigDigest, newVersion, config); + + return newConfigDigest; + } + + /// @notice Revokes a specific config by digest. + /// @param donId The key of the plugin to revoke the config for. + /// @param configDigest The digest of the config to revoke. This is done to prevent accidental revokes. + function revokeCandidate(uint32 donId, Internal.OCRPluginType pluginType, bytes32 configDigest) external { + _onlySelfCall(); + + if (configDigest == ZERO_DIGEST) { + revert RevokingZeroDigestNotAllowed(); + } + + uint256 candidateConfigIndex = _getCandidateIndex(donId, pluginType); + if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != configDigest) { + revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, configDigest); + } + + emit CandidateConfigRevoked(configDigest); + // Delete only the digest, as that's what's used to determine if a config is active. This means the actual + // config stays in storage which should significantly reduce the gas cost of overwriting that storage space in + // the future. + delete s_configs[donId][pluginType][candidateConfigIndex].configDigest; + } + + /// @notice Promotes the candidate config to the active config and revokes the active config. + /// @param donId The key of the plugin to promote the config for. + /// @param digestToPromote The digest of the config to promote. + function promoteCandidateAndRevokeActive( + uint32 donId, + Internal.OCRPluginType pluginType, + bytes32 digestToPromote, + bytes32 digestToRevoke + ) external { + _onlySelfCall(); + + if (digestToPromote == ZERO_DIGEST && digestToRevoke == ZERO_DIGEST) { + revert NoOpStateTransitionNotAllowed(); + } + + uint256 candidateConfigIndex = _getCandidateIndex(donId, pluginType); + if (s_configs[donId][pluginType][candidateConfigIndex].configDigest != digestToPromote) { + revert ConfigDigestMismatch(s_configs[donId][pluginType][candidateConfigIndex].configDigest, digestToPromote); + } + + VersionedConfig storage activeConfig = s_configs[donId][pluginType][_getActiveIndex(donId, pluginType)]; + if (activeConfig.configDigest != digestToRevoke) { + revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke); + } + + delete activeConfig.configDigest; + + s_activeConfigIndexes[donId][pluginType] ^= 1; + if (digestToRevoke != ZERO_DIGEST) { + emit ActiveConfigRevoked(digestToRevoke); + } + emit ConfigPromoted(digestToPromote); + } + + /// @notice Calculates the config digest for a given plugin key, static config, and version. + /// @param donId The key of the plugin to calculate the digest for. + /// @param staticConfig The static part of the config. + /// @param version The version of the config. + /// @return The calculated config digest. + function _calculateConfigDigest( + uint32 donId, + Internal.OCRPluginType pluginType, + bytes memory staticConfig, + uint32 version + ) internal view returns (bytes32) { + return bytes32( + (PREFIX & PREFIX_MASK) + | ( + uint256( + keccak256( + bytes.concat( + abi.encode(bytes32("EVM"), block.chainid, address(this), donId, pluginType, version), staticConfig + ) + ) + ) & ~PREFIX_MASK + ) + ); + } + + function _getActiveIndex(uint32 donId, Internal.OCRPluginType pluginType) private view returns (uint32) { + return s_activeConfigIndexes[donId][pluginType]; + } + + function _getCandidateIndex(uint32 donId, Internal.OCRPluginType pluginType) private view returns (uint32) { + return s_activeConfigIndexes[donId][pluginType] ^ 1; + } + + // ================================================================ + // │ Validation │ + // ================================================================ + + function _validateConfig(OCR3Config memory cfg) internal view { + if (cfg.chainSelector == 0) revert ChainSelectorNotSet(); + if (cfg.pluginType != Internal.OCRPluginType.Commit && cfg.pluginType != Internal.OCRPluginType.Execution) { + revert InvalidPluginType(); + } + if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) { + revert OfframpAddressCannotBeZero(); + } + if (cfg.rmnHomeAddress.length == 0 || keccak256(cfg.rmnHomeAddress) == EMPTY_ENCODED_ADDRESS_HASH) { + revert RMNHomeAddressCannotBeZero(); + } + if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector); + + // fChain cannot exceed FRoleDON, since it is a subcommittee in the larger DON + uint256 FRoleDON = cfg.FRoleDON; + uint256 fChain = s_chainConfigurations[cfg.chainSelector].fChain; + // fChain > 0 is enforced in applyChainConfigUpdates, and the presence of a chain config is checked above + // FRoleDON != 0 because FRoleDON >= fChain is enforced here + if (fChain > FRoleDON) { + revert FChainTooHigh(fChain, FRoleDON); + } + + // len(nodes) >= 3 * FRoleDON + 1 + // len(nodes) == numberOfSigners + uint256 numberOfNodes = cfg.nodes.length; + if (numberOfNodes > MAX_NUM_ORACLES) revert TooManySigners(); + if (numberOfNodes <= 3 * FRoleDON) revert FTooHigh(); + + uint256 nonZeroTransmitters = 0; + bytes32[] memory p2pIds = new bytes32[](numberOfNodes); + for (uint256 i = 0; i < numberOfNodes; ++i) { + OCR3Node memory node = cfg.nodes[i]; + + // 3 * fChain + 1 <= nonZeroTransmitters <= 3 * FRoleDON + 1 + // Transmitters can be set to 0 since there can be more signers than transmitters, + if (node.transmitterKey.length != 0) { + nonZeroTransmitters++; + } + + // Signer key and p2pIds must always be present + if (node.signerKey.length == 0 || node.p2pId == bytes32(0)) { + revert InvalidNode(node); + } + + p2pIds[i] = node.p2pId; + } + + // We check for chain config presence above, so fChain here must be non-zero. fChain <= FRoleDON due to the checks above. + // There can be less transmitters than signers - so they can be set to zero (which indicates that a node is a signer, but not a transmitter). + uint256 minTransmittersLength = 3 * fChain + 1; + if (nonZeroTransmitters < minTransmittersLength) { + revert NotEnoughTransmitters(nonZeroTransmitters, minTransmittersLength); + } + + // Check that the readers are in the capabilities registry. + _ensureInRegistry(p2pIds); + } + + function _onlySelfCall() internal view { + if (msg.sender != address(this)) { + revert CanOnlySelfCall(); + } + } + + // ================================================================ + // │ Chain Configuration │ + // ================================================================ + + /// @notice Returns the total number of chains configured. + /// @return The total number of chains configured. + function getNumChainConfigurations() external view returns (uint256) { + return s_remoteChainSelectors.length(); + } + + /// @notice Returns all the chain configurations. + /// @param pageIndex The page index. + /// @param pageSize The page size. + /// @return paginatedChainConfigs chain configurations. + function getAllChainConfigs(uint256 pageIndex, uint256 pageSize) external view returns (ChainConfigArgs[] memory) { + uint256 numberOfChains = s_remoteChainSelectors.length(); + uint256 startIndex = pageIndex * pageSize; + + if (pageSize == 0 || startIndex >= numberOfChains) { + return new ChainConfigArgs[](0); // Return an empty array if pageSize is 0 or pageIndex is out of bounds + } + + uint256 endIndex = startIndex + pageSize; + if (endIndex > numberOfChains) { + endIndex = numberOfChains; + } + + ChainConfigArgs[] memory paginatedChainConfigs = new ChainConfigArgs[](endIndex - startIndex); + + uint256[] memory chainSelectors = s_remoteChainSelectors.values(); + for (uint256 i = startIndex; i < endIndex; ++i) { + uint64 chainSelector = uint64(chainSelectors[i]); + paginatedChainConfigs[i - startIndex] = + ChainConfigArgs({chainSelector: chainSelector, chainConfig: s_chainConfigurations[chainSelector]}); + } + + return paginatedChainConfigs; + } + + /// @notice Sets and/or removes chain configurations. + /// Does not validate that fChain <= FRoleDON and relies on OCR3Configs to be changed in case fChain becomes larger than the FRoleDON value. + /// @param chainSelectorRemoves The chain configurations to remove. + /// @param chainConfigAdds The chain configurations to add. + function applyChainConfigUpdates( + uint64[] calldata chainSelectorRemoves, + ChainConfigArgs[] calldata chainConfigAdds + ) external onlyOwner { + // Process removals first. + for (uint256 i = 0; i < chainSelectorRemoves.length; ++i) { + // check if the chain selector is in s_remoteChainSelectors first. + if (!s_remoteChainSelectors.contains(chainSelectorRemoves[i])) { + revert ChainSelectorNotFound(chainSelectorRemoves[i]); + } + + delete s_chainConfigurations[chainSelectorRemoves[i]]; + s_remoteChainSelectors.remove(chainSelectorRemoves[i]); + + emit ChainConfigRemoved(chainSelectorRemoves[i]); + } + + // Process additions next. + for (uint256 i = 0; i < chainConfigAdds.length; ++i) { + ChainConfig memory chainConfig = chainConfigAdds[i].chainConfig; + uint64 chainSelector = chainConfigAdds[i].chainSelector; + + // Verify that the provided readers are present in the capabilities registry. + _ensureInRegistry(chainConfig.readers); + + // Verify that fChain is positive. + if (chainConfig.fChain == 0) { + revert FChainMustBePositive(); + } + + s_chainConfigurations[chainSelector] = chainConfig; + s_remoteChainSelectors.add(chainSelector); + + emit ChainConfigSet(chainSelector, chainConfig); + } + } + + /// @notice Helper function to ensure that a node is in the capabilities registry. + /// @param p2pIds The P2P IDs of the node to check. + function _ensureInRegistry(bytes32[] memory p2pIds) internal view { + for (uint256 i = 0; i < p2pIds.length; ++i) { + // TODO add a method that does the validation in the ICapabilitiesRegistry contract + if (ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pIds[i]).p2pId == bytes32("")) { + revert NodeNotInRegistry(p2pIds[i]); + } + } + } +} diff --git a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol b/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol deleted file mode 100644 index 6d0b0f72a5a..00000000000 --- a/contracts/src/v0.8/ccip/capability/interfaces/IOCR3ConfigEncoder.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {CCIPConfigTypes} from "../libraries/CCIPConfigTypes.sol"; - -/// @dev This is so that we can generate gethwrappers and easily encode/decode OCR3Config -/// in the offchain integration tests. -interface IOCR3ConfigEncoder { - /// @dev Encodes an array of OCR3Config into a bytes array. For test usage only. - function exposeOCR3Config(CCIPConfigTypes.OCR3Config[] calldata config) external view returns (bytes memory); -} diff --git a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol b/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol deleted file mode 100644 index 2148f991c8f..00000000000 --- a/contracts/src/v0.8/ccip/capability/libraries/CCIPConfigTypes.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {Internal} from "../../libraries/Internal.sol"; - -library CCIPConfigTypes { - /// @notice ConfigState indicates the state of the configuration. - /// A DON's configuration always starts out in the "Init" state - this is the starting state. - /// The only valid transition from "Init" is to the "Running" state - this is the first ever configuration. - /// The only valid transition from "Running" is to the "Staging" state - this is a blue/green proposal. - /// The only valid transition from "Staging" is back to the "Running" state - this is a promotion. - /// TODO: explain rollbacks? - enum ConfigState { - Init, - Running, - Staging - } - - /// @notice Chain configuration. - /// Changes to chain configuration are detected out-of-band in plugins and decoded offchain. - struct ChainConfig { - bytes32[] readers; // The P2P IDs of the readers for the chain. These IDs must be registered in the capabilities registry. - uint8 fChain; // The fault tolerance parameter of the chain. - bytes config; // The chain configuration. This is kept intentionally opaque so as to add fields in the future if needed. - } - - /// @notice Chain configuration information struct used in applyChainConfigUpdates and getAllChainConfigs. - struct ChainConfigInfo { - uint64 chainSelector; - ChainConfig chainConfig; - } - - /// @notice OCR3 configuration. - struct OCR3Config { - Internal.OCRPluginType pluginType; // ────────╮ The plugin that the configuration is for. - uint64 chainSelector; // | The (remote) chain that the configuration is for. - uint8 F; // | The "big F" parameter for the role DON. - uint64 offchainConfigVersion; // ─────────────╯ The version of the offchain configuration. - bytes offrampAddress; // The remote chain offramp address. - // len(p2pIds) == len(signers) == len(transmitters) == 3 * F + 1 - // NOTE: indexes matter here! The p2p ID at index i corresponds to the signer at index i and the transmitter at index i. - // This is crucial in order to build the oracle ID <-> peer ID mapping offchain. - bytes32[] p2pIds; // The P2P IDs of the oracles that are part of the role DON. - bytes[] signers; // The onchain signing keys of nodes in the don. - bytes[] transmitters; // The onchain transmitter keys of nodes in the don. - bytes offchainConfig; // The offchain configuration for the OCR3 protocol. Protobuf encoded. - } - - /// @notice OCR3 configuration with metadata, specifically the config count and the config digest. - struct OCR3ConfigWithMeta { - OCR3Config config; // The OCR3 configuration. - uint64 configCount; // The config count used to compute the config digest. - bytes32 configDigest; // The config digest of the OCR3 configuration. - } -} diff --git a/contracts/src/v0.8/ccip/docs/multi-chain-overview-ocr3.png b/contracts/src/v0.8/ccip/docs/multi-chain-overview-ocr3.png index 39302619cb445c67ea075ded0124745a15fe7d03..c0d5e2faf7d892e1c89905e5efb6fd34df6c1bc8 100644 GIT binary patch literal 862669 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�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

CgV(yPfz{t*?cAJtNp0AYu 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 QNha8 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%0D>RFw)=RJFmi4>(V z(Yq2A_7-+4{pU{WIs4o1_$}c8g!hMPMiv6VdX9y3>)`<^;P@$27*?;Z0u|!NoPO<% zdhJszed-23qxMa5xdN@PGVtpl2i&`RcXGAYqLwsDzux}Sf#o$X_*rQA`0dxDf&-xm zBH{r9^RsjE)~x-I4nOs@_h&X025q6RQ`SE-^_8*I&ngpt{972UaZ@%0^?!M9>jAw6 zN9H)zvnRzmyVp1&fld@djqK62PK0z&3HlM(*-QLHBJ>HRg?a42_0>4RSXwptqN#$E z*_%WQP}}3@_!!-?w*V(LgQPO))B}4~gFJ9Ys@E5JSrA!8F8JNO7$&|j>!OPPzNVWG zsvqX+N{r8cK~u`kg2DW#L}%H>2xXw@Pga`nZmO|n!s>p_O%;zT4@_5?LE~8U^#-!Q z^Dbf-}gXl5*a|5xfx8@r2$?KKeSX@FV^46>{Lx> zBK^$%HUQ48U8Y*9C#+LvlL_bdDm3ZsUv%9P^|<6R{`pDz*loER7plU;gf|i*9Y&ie zSLQ9f6(^%2WE{TW=ihDn=lfU~&JXTP?Yy#tLt#Q_sV#(iT-P^li+wVqv*qubKMxmDIiv(uF%< zTx(|?{oA)^q-~k%Ss8Tly4)7M%f(C5Ul?1*LCteH-7$WFBMqha6u>K zZxG!xgC$Djnh53bOF_64k!qa;^JRqAnW zucRtw*a4FRk2K6{vQCm6q53jCL^xE4xa=*6UKZ{SxNg@AlZdZ54>v~YEGNW>QrxH5 zI*l!bhYrvJD3+CCiQRQSfL#BYgTngQrsDk#agiS5Vcx?2z71f^F$%vU{szejn<#9` z5n%RM%xB^EU`XgF9on2smTocL!q2Wdcq{1f&>kH*jn>A{i_f2;{`mo3XKsM#*oRAd zAifBwrf-Ah&d@5OG1{p*E8ZP!LHWTn(ONUI5-Tp;Gt$sL%3L&;b%eE~GA$JKFA%k|#5k06H9G#>9y zq@nj*MZ&&+PXxO=r}We!&%VlZ^!B3Poc2Icda6*vK?aDCHS|{?& zD<`mn$CD=Mh5Zv9I*aZ8V^!Dn#qZ3iuJ30EH8Z(8{RBv|?;Q!q@_wW?cw!xd)&QKfgXlbztBAe!(?>E1q zm^Q9?jN=3Sh;;W~T5rXD0i*=1acG(p4c`zn$;Qj|ru)xR(4@A|gp$I{N3WYp@H(_k z+8tLmf#r3h(_-QiaPIVR7v>A%u*hJMSN`&ZgL}s(#(mnKSzbp#_N;*7U^ms9? zqo6bfw*nXP`VR`P9MBl)>VB6ylJ9u=i+`%ZK4HDqJcffXoIXVa37p6GPi=0`jRh|E z%r4oc0*_x0K2Sys5(mgL^ik=n263m|SpX^LrRvj+EqF$vhSa*Q_L6zw3 z1kh%4nF5YX`aNnEQ{d1L&%*gD z_Vhk5fImjM2;2uP!lWepLZyJl`~q}_;CnPQFbz;yeY*H9D-1YcQ4T za4h_wuH-s(#o3ua#p$dy>J?|?8wxRB{x(%7hzjeCXNJ!4SJ|;8%mF3H^?tZ27&K7d z9u*g^2WVxnQRq0Li1z@8+%ndL9+!}iR;aW4#Pw`f3Doy+wZWXTObjS(ch@m+su)tM z>Pi5NA3V;AFisTdquVrB`#?*2vtqzo@t==>8pBbWyV9&}?tqe>U9=j@v2qhA=qsMD z7L^5s>=Prit4=vmCsJ`OYCckX#|lcL9S!v9kzYY&KGu5noAkAI7D@ylXp(Zn2!aF> zym=DpSbU?OX;XVS+M1BdVUP>HWc{z+#)-a(k(eiY9w|{s-ss_G(W$EiDRR`)Pk0 z3a2K)1MDgnpolNbPx;_*XAP7!XzA3W^yG)YKVEB`$oAjq5yMA8NSkBY&Ui3K(y1n| zhVBxrOFIE~p)f5QLzZqs0y~E&(DCq3aQc}hI^5uXcY9L^#>UJw*z`RF*J2Nyj{M%` ziKX00bHT##iF9PT%JI*6{#w(a_KlltNd)O;lNG!0uwF_`8*S9KvKu2E0Ji@6)7*Fz z%82)gxwpV<4grfX^yA@<$4BpLNj?-y?MYUT^WicE;Ch1vA-}O?)O}(AA;5DB{Nr|ANc%-EKvR7a@bVo z@1?ipiM6vUuZ?D4%b@-4-9m=b*H^17k16jl;(|;hJkD}!ff|4&piSh zerIohC1nPvyF|NPX%Eq`(0xz|des7IJyl@LeMHFq;flgo zcFJ!-Z7C_K*fpBnH~+}c+1&#V?|Ss$;Jn1rs|5fn55r}-tj+K@2a9Y@!gO3K47pFw zGQr0bDlJzs38fTh36Zy5bpFv@7(w(3<=5iGp#3M9{DK7a^ake@jmbIlmJ<_z_E=5C z&M?-Z#vmg>%6viP&QVMf3U)dj7~z`H+JcX26>3}FP=qM$o1w-DJ`1O`IwjH32bP?ql_38kEm3|#)u0aY

=L0=0s4yR6pk#WUz>*rw?giFV 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%0APdUpJ$Ly*-<{t4EY<XP!gZjfu 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 Zj~n;PJe9iqWd-=Bb5#FG`p=fX{y#Xm|Dyl^ literal 818615 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%0AaY>sguW89sxn#7QQeUrT)XqrA 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%0Af+XFM#M2U>a~QAMZdNtku>^52Z4_wIhx=vE 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%0Dao9Hi_%FoRYr$tpQ$h>6gmj5 z2P*E^ycBQq3!<iE3>y~N9T*SUm&v}Lq#G7vzvk+SoQS|qis<=`TFO%iv<@#5SEWLo z%BjlTy}D<<(a!yRAyIBtd6gI!IXp-&nYl9C!U7`plhAWKwEc+q1W1(2+1c5plIQHg zaq8#kAdJPVAt~VA4hngooc4g|n?FR|L&>FrHmxcxF>CN2DR=Ka1e~-0<WoVB#Q@aj zvLc3(vX!7?^BR(9_2<@YR;NyK1U;9p)mk@rbTY6k^8QbcoQo?_R~Ct?*4^g^34PH( zX0rB&s(p;AuR@Wc2nc^1zI^$z+(plf9jYMs&Ip}exiJgzS3%lCE#*p)!Hv2nV1AK` z=j{uSY_SLmUTn}3P$R{m3FU7TgBc;{e}<+OCh25KX2#48ej}XfuTEaNwKg>VqcGLD zhS4b=vMse&r-_;d=A&9b5bWH6FkpLU$Jv8uQy6_iTa&&+_}KOMyf~xS{y1wGZ1;FC zho)l4i5o`-!_;qScB>Vi6=;j>f5X$dDqp?G)(=DPB<678uM;#H2Vp4#=!9%a9`WR{ z0b}U4<3kZ85?tfeFakq=LRA7omS7K7w;S2E<!cv<T^Pq&CnCyjq?<a#eSsprEO1QZ zNsqSTeN{;<LYvC(A+%|X@S5VHrrt=qt`-cOdOJPTP@U~whd`-XwwHNh$<8o2<>uuJ z<1I&4_}=i_>^@pw@6BdvwAZ?aLq{$tzK;1)-xtYsF9Zfd9OL=uQT-wRa%yiVjLW~5 z=aH4I!nqwi-skFy@ZLwCx=BRoFJvHmz`zrw2iH&?*#faGtSE3Xmx_%doDRbPDy!rB zVaU<#f!ZSL5n(wlPuyu50Jr><MHfCdF*h|Jv9kE&ypUm!t%y*2TO7;FtA^%j!6mG1 zC>6ZfdOp)CDn>=BwtKiK4e7uAd@Ehc+dl)hGr9O@j*YX3{bVGPP@=bGQ?=H3Dm|j7 z7N@~(v}dJW#1r>r6{ftE!%0joZ+95t8fa^oV&!lFplq`7s?UG}An5hlC2ODqw%DwW zG3+dG<Goa{MK`=wKm7YyqC239{N_cBwU?LIv;J_$s;kssCj5Bvmus)?XUVO$6*Yd< z{f(mKoe2~4df^E<)#rwq(#^D-l!?v(!qt65i*-PkVPBk89!H`3u08uYe}W`z{1}L@ zYY5){*_rjeoCE-;1dU6N{jl<v5}4A)Ip3Ofh{jsGnCYJE_e)Vr_U_mHA^f2aXb%|4 zA9VN-;q7bWRO0Z_wvd~nMgE!DlX(rXc|6g1LFG^fBtFmbQq(hE^|f@?61Vr*irAW( zKs>$SBj>B+m445=Ii}A)!bjZYb6M9@ZtjE(0>9~ZPj^D?pl3QI(IIIaHxSrSloM=l zlLRqw*4Z$BGjW(aeN)fXV#`42N%FyA4cX83!?%{NylK8sxN?+8RRi0NMuX<BE|%9z z67e0;N($vvv4Uw@CCdv_)@%hAnrI|d8%&LM@B1P<pt2IT#tGBHzMt!be|0dTNGJ1J zdPQ(TZVcpiwZ=aGNQk!S$^gUB1EsMlZCv;(^106Yv<)CiM)`o*ce^S~vFU5JmKw=R zG5K~_D`J$D>*BkcBXzHA`fj>7!!yb-I58sutN2XX7o-3;$%WN<vm;T4_#{V+RQjz5 z<yy0PSt2iu^TjLUy$f*>r~@Y)hHuVsKk1jd$Cj7i<A~{n+T7W9UraHCs=_=)U-rGe zE%7R67c;Ncx$1z71N>l9?_P_&XN7YlKj=@(HQI11Vr9ak_T?y-#6UshZrNnGCDUa! z>*N7Ggu~9Dnn_4j!JT4{g`DZ@GP;%^jIy}RL(M{J7jmB~1g6FFs1bE{G54^-_r$X< zGFxkT9U7=99i4;1E3F#@0`5FGvc06@ITXM*e4)PE)g`U+6sP<FlKcDOI4-liXtCve zd~hp()MVSdUlae1izHy)*RqvkD67g0+03YrmR(#oRLj==fi?9L$7O2y@u=zwQ=oVl z+AB+dUSg6g05FCSqhwtk`krVA>{&0tV??TTN%TOxs+l=gAn`!NJbUB>-HA+qsbUxe z<HC4Ciy<WMU0WSn3k~X`msAxv_w&q19nxEtzkWSodHS33Vr!H5h;Z#|8H)ZWB$W&e zEn``$6U7YH8B7o&g3zkT0N|x&(R*hi4(;1-Nk94uvu|AGs=9vtt#i52;STcPilXA< zj~2q9J{Ep{4gKsLs&!8?GESnx0P4NT(n063XyqgbLGOh@EFEesU*cy}UNIP94x3<# zaur7$K;Yg;%hL!tQqhdu8&QI2&XwV0Piazd<_^_RfqErQQ?B~`-t;0z!UU~r#Ud>O z^|Nlv`M;Qg<6_F{2h&M22#yZYsR*UU%xIFM>6K`L!~)yOarlIw8A}S>Ne0|^&BRy- z3e&onAEe}`%16cn=v0T_%DeGN-(_=43#?$yELbg+iF8Ptx0qI1yXntwwd_Jo4z(z~ z0uj&JWk0WWf$7vY^=qqbw{NC%Hc_rwg!fqsj~V>zRfz?*1OT;62)8LhK&{Cj!IAs8 zPi&C0SUM%2n$fI7)}xl^rRaPD1pQg}QuJL|W=8XbR>FwH%QNDQm>r5)ae3}w?3)fW z%O;g{Z9U5OW<48+AKj?lS(n0Pb+h=i$o$umNlLv@5=W)`s!W|I_vfSho!3DvDU5bk z`lRXw+!*FATVC=u34i}xBCr8B_Ptlh4ms%qDxl>nbHy(58CgMUnBMt`Zo!jX*P|D; zwmypVSgP88BmvjlTk`CT)-CWOn1`e{PZrWvIm1}P!?}*dYj+zV(c?r#K`At1r>kgf z>99ksu7pNZ<W-Fu52?70KrHbT;@6+f8YKpBOnrrH&7DS;hroR_7tz$J9@>+B&r47k z9>}#16!*UOZrefbkGNbBLTgsGc5`jEy}d#DO2<6AL`NY_@+3837HKWU&#_JCSoKTN z$c+SWe?MeTS~zZvab}3;lN?8X(C9}bhew@0GZ+K)D}*hAUdgCKpddsGwvlkI;Cm$Y z>Nl{OV5Eo=@>UnkygWT`id1_;F?u+|be4`!V((HC9h0(d=XgrDTBhYP&k;qM88`k| zTbaQpF<{rZAqC+kRl*zV>&z$}Jde*&bzdqK$y<F)aZFznO=^DdVjCFr65_2he2g=< zB3KVH$bX-j*-A4}!nyJ|W6H5-FsXWae_C$|lVMzX;KAJu1_Q_VfL?`nE#g=V(PpVk zovc(<<r9Z6*P$Qw1eS3XBwM-QGnW~E(@3yC@3ML8?h_vMOm$vySRq-}ycDl5Z6vdI z%&?HjqBa2L4RchBE+x$EN)xa22VStTZnjMT_@x2WIPsFIFd?Z2(sj?&FrcqBfz)<% zqoL0gXTvmcTT(_w0jj(@Qb!tJiP9+3jY{}ic7G}5s}}B#>leQ8&iEO>X`QTo`^dZ` zhjk+PTz~Z5?<zAeP?~4~hJw|_wx>uroz{e2mT7aY!SLuUkFt`<=Q86nofik97xNs6 zCEHZiYOE<NnA@DB>Q$@HMSP7S-$$$ZWA~h{OslP=s*@9pI?5UaZQjw4{Jdx54fe$p zHeqIwpZI~xVY?5^i$?H8Wuy7xbETG6#dNkM5Zg{CLd{~x%=*XB)VW5PN*TJrJ&6zy z<`L!aa%#U%h!1zf6gAAq(MrO^02SO<U;5{}))+mn6iTH{JcZcLZeqVf96|BH>|5uq zH=b{J!QUm4`9WeuqeTVSORIa<Ys@401Y%*am^8t`hPgGD6ZQEnO}mSf$)p6p_`6o3 zA~W?)WZ$p3(P@8>E5A=Mt}1j*$d>Ks2OMI?jq75M9FZSecAnz;Q1bZ#pVQdUEe@U{ zD?yTDVR1&jOj;5$`=g=^%ERaHH4<D3QG`!kKNlsb1k_ar{Y73}6LR)plV;}kFo+-b zzc1-ulG<%}iFp1D!WDP__AIbpTBAz^$v$fNE;#adQLLEA3Z7{2qzU9-&!}U1VcY@k z)1Inv*XG1CBhBE=kA8vi2JFa<%s~)8w0Jw)B5y&O-o9tIQ^z-bnEx9c^YWe`f`&3- zQqy#%BL)rsRZF~h+^J)QXWv_}bN+czHVr6R6dh|wj)<9vLF1}#Jvcl4L}N7zH2$o` zPoGm4a`WfBP<!<ewA5$XNT_D#vYoNEBgMrm&9yrwlV``=+K0`C(P{N2xTg;tjSoYD zXzt&W49bu{-<CqG+5;UE--RB=Bo9J}0}~)6f`#p^eA~NtKqJI{0fgUXV4OO?`N1`X z%<v<QOLxwJ{>{9ym28%}LalRzT^9+eV$R%{!#+$N>ZX^pq~Kw3%4<u418}2gSVRwa zV|rrJ7E~wg7vK5c_^P56a&nn2Gyg|h-*%v|i!*`=@H&~X9tJ`!l5FZUJ`Cg>PwQTK z7#3ltrlr<Vey$_F2Yn0g>6b2RtGvcvvFztF-g2&)IY|rGQdN5{7zKPjxGdpwoKbl< zyY7rANp)a3)m5XX8xe%7YZwuCxCpc32^XG}V_MVvpUOqJUp?D5EX?x78+f{qa47zb zLzM%EBL5nS{CUBu#)ExV00x5&T>^-RquKFSz~mi#qx57=BMRW3QZ8@hQ27Csk5v1N zRf{3rigKJAU2GNcM1>i4nCFl;wi?u|se2<ii5v*+XDCD>ZTVE^kf4{XsA_*K9T?n+ z3?W(5k=8<bb|O_!{$>O9(FWaE2G<<ey2Vzfxj-a(4v^EEv1lsE3oyt-@%d4Su}CWj z@b`NB6g_dS)JX<X&ny_j%p~&Ox`U)x9m670t@SY+%=%D&I#i;7NYOjdG}!05b(;bF zx2#qg$%*1c$T#b%q)d0b7C#A0(N9O3jmW`%r)fUs9|1Tk%uj8G_NTjkj)=xZfjric zu&)GeSYQxRetuM4hj{D<$P{VUGGpF85X{rgtN6l~a_uJ&kSuov>KUQj?d-gBax<L} zCnx9mH&w#Gx9}sXt9D1Y(5qLkQYS8ziJd9!xqPjx`>Hor(DOpF=`^Ovy@6^0+OqEt zPB1VAvTy5pwYiJpu4FM`DzoOnQ~JbF6-<;N$)>K=Ap?gnhy}WQ__rDV&6d5(#;zSj zC8^4VQW`#^FBbYqHly><1#ayrK_plABaf*JMv-%ZfA$7T?$x})7<DFHUFdntnUQy0 z!_}~ZRTB!Ys>1kNm*m(zyV_@A?19aQPFMT)ZwnBbMS)gj_`}C@C}EfJp|7`wd>k6$ z<w^Ily&Pimfx7TRQi_-`X|U3)PA(9M0laJC6t0FTN)hrU|9;Yzqb8tj_2J{k{(Y4% z$^jIP9}5Am(jNla_ZjJ{WBhPgd8+kcxMk}t<z=2}(b>kUg0fQ`d-g<Rj+u7v#LZuI zg6PDgjf-`HIPLpB3IBw2dN)y8h`sVYeH6)`qUMn=Z5cGVuiQb)NWpJL+lsBAcjHH0 zBTW12(e@Fh0+(R#6fZ^+;&xN2=Zp1Pyf0;xR~~gjU9qnW-(}*wcfWvn=<VS~)wzs? z@k3&>2lwk19n?K?OonQ(w8xXJllV2i-@(i-7x#Vp`3wLET@SIuzhh3?T74L95!CAH z>RLN{P;c=NN$%m*Z8~XRh-rujz9X{RQrBM`&UKD6+BN$<lBev(U&g51o7ykp@NOBB z<D^bcM@$q9;+!m`n9z0v9BWK1+vbK*nt^_O(!n?$YsCmr-5q*$nU2qy6D9l+alfxB zEIzA7$UWw*hk#5irWA%><t+N=fwrj^X@3lp3B!?$AHsD>yr#A^)(GWx6ts1)?5L3n zh~6u?(Br2pInwh(*gSv52ASv{$o}dN(WXle?#T=NNa(Ud^^W~2;3zCGJo@Vyt;@jx znVgJ%HXQFbUP>b=XZj+1=8&iF<K}qK<9}Q`L)v=-`z&+bfIRstK?bFS{}w%+H;04h z);iw&<oaOZm2z)KSs_=*Ye3#jFaT|C=Zr(>A+Z4sn8>~;Ap1fsYLjA4e4Z7`t=28i zujZe$kq%Dga5t)EX*g$kBy%c2G565%jo=6NH;3}1_4P*wTX!?8p4;`QiKK`_;0RG5 zGPDl=!_uoJ)^i`M7F)}SXG%Bw0w!f99hM%f8j>6yS^_!0XFKTa3hECJcsX`TK6wr4 zO4h@rm3P}!^&AFRXpUXEKWa4GnBsN!z-V=Zuzf1W(QlxnxpIAOO9=>=M;gdgcih(6 z>IVqb&?rQe+%Tl!Yrk9}B?Oe|3Z+aw!nmQC(KhX|z1=$lVvZ_-CWubqErw#?kVL`| zy(~o{C6pjlci46B8h~*$@lU3DAn3-~n5cT>LuxC$2Hw~T#K?YHLb4zSsq~v_k(G0x zo~Amb>A~lTt7_A&O%o+l^}o^#3Y{hbWIa@XQrTMvx77bMX4hDv+BNaxz_y;6z`1+> z_xn*K)Pe}4iv@E@Weu8HGD++@P1cnpn|Z9O_#&bAh(1^G><U%KNq!He`;%|)OKZyN z8@)RX%I@HV9(inVto|mLM_%u}fnhm(Sb8+0n_LU?DOU!Z2&j(#Bt6G(_Fd6=c|v9` zE@=v^jeOC=eYy=WDF@A=8Zgtp%f{d|{VZqv6IoUS8lnxjhEDa(@R$NwpkL@-_5j3A z_5ta>&rSmS)IAYdX%hVX&?qv`uceE|_Fo2bCgS-0xY$07YPEjeoy<`tlbBB;H-A7^ zmCB>$k<a#_NH1cqY~Hy=m|GGFz-U&8*gdvYJ7*xhN)bJ(n*f8EWg}Z7K)I^+(NEjl zYYmX(auLt2p+$_OWzg(uDB_@hQ~|W;XoA&v)v@mr`RNO0U&eY)q^_Aw+P%>H_~>KB zZdni4dWpU9Yb)6s-813#Q-ZnQ4v7Pq0<4%2ShQowwD`7?&9(*c0ztSq?JZxz+nJ%< z;Q6^|P+BS}o=Hl+eg;r_{N2J^stm%egKH6komEm+i;bF2Jj^l@Bs?oGAr`z@|AWx& z5+&ja-`M0btTT|(7pX00xwJVC9QJNdHfw#I9AIW@-vRN$;n@?OIEO|cW3=8Z+*K+F z3Ex3sI~9cY04^XV2Nl53phdHH-Fu1|P^<+*T=F!tV|Fr#ww@~v!j_4xEx)!sV7Z+h zU=t<~%CVhERBA0e0#zJ8a8Lu2Ffl?7RKlk-NiCPbjroeXIHODuWcm>cRm;;5>Rq*O zFQ3u94iO-!X%%3`);3Z34y5HMBrF@1@CJ5>Y;T#DSg`y9M<jKNlmkawBA|^*Sbrqu zwas@`587zb${wg2>Br}j(+M)eAnw~uaqG#R2lgQ}9Yc9#<eFRSU93DdnfsPH!4Xd! z0sGk85Qnk|hGAF|2w^#Uu%2CEd(!cSC>89@-YJI-AA`4K5WFYAxA>lD$#}FxciDe{ za&C;I?Wl#Dl^PDle1?zYM|4Cc%0O!Y0s-L5N7kDI%c?TOhABFEH+7Un`BQW52Ruam z03SU*KHe>h7$?sA{-y#2q5dWsNY)c;DJ4~NckVwb4&6=Q+#y&!Vh1{nJ+Oqf^{PVd ztsrKFil20&h_!zQM1+&9_UW;!cI7K?8E5gt3DTXo{(O3Lr6YQOK7`e^FD15>2J=NP zj~7xPl&2vLy#Gk^N2!rT)a%ut#BwAOS7rhAUsa(`2^Z7l8_s3>$DEmoy~_q5|Ds?z zwhZXwERec1Sg%H%J_Z<K=#-kvS$0n=KyJ$+)Jq;hyx;>JkZa=z@biXt((ryx@AgbP zliu<u^_-gz5YD`sqonDamS*c`!e&}QbGErYy}TUI#wbWFvl<)v8DMZNOxhTuy$aCt zyXfX7sS$EM!?L}q*@YPl_}m?~Gdp3fA2DD^-9rHFyBu)O(ffgE2cs69Ta)e5w677p z!_kam&qWAKP}7d|(K!5$7?2>RWcY7RiSB(3HM7H-qL)baSpo9uaBX@2cpiJQKxG*t zehF|$_!Dtgq4V>r87sRv-iF9R()xh6zFuNS8_t!G5J=#0fX2VW@r_m?sPdWY!s!4= z6{nRv+H8GhCY0Y3(rZ;W518~9x!if5a-XPOr`rz7`l;h^BoDz%owpqCp2ghyKsM8g z#HD0qJ%^H-O(cmFLoe^qlJNColzLbKQ8guzu^JhETpP@0TQ=EYN{!j~)lv+?xtRXg zarc1?sN(lRAf0sdNn8sO^A)@uQw`upMDiD27*lW3mX$6zV<#ysUG_wv{ilPi^V*7S ztZw%E_#~d8Gnk^H=Wq6ao9QB*FSBqG)^v9kR;r$=h;SiXz7u?DoMdlq?}^Oiv3%Zl z{T!2bvSsd4xY96nA`ULYxG|n!{L}=X*otZRCF&mng!c7Dx*=$Ni0nAgSHkFZD(iE- z#K$fH`4nDTSy|)d9jTe5Cx0zB<|#)|b;+}~{E{X=mtr#j#OBlIphN3L4Sb6S3I@#n zy|*dydQ>}8dbfw5#+Iwlhrq6-genr9AMIo4WF2OQ2XgB4&+R`w5()@or{r81wdsdv z!2TQj>NXWVHAH9I`h%1)X578Gl4;<TO@qp1jCCsvop6xB%n7EXqzGcC0DjKw_}+hH z_~n;3HjJv-k<22{8532mA$xe>RdbxEkoBPdbsf}S>gh?`CRs1!ID5Ue56ww011$3O z7)K$5gDmlocb)<uG=}a>s7G^6FAVFDr}9^=9s-r&_9xOKt!l}7B1U_(Fj6D!IGZ=B z9?eZ(oEm7g42$JJ489j?B@G|y=35(@gZhOcQlRB=B`+pV!&r_E@KM3IIjIrK*ETrS zVh{uGh3O#;{Z;w3*`j7JAp^j)pXT5#hnr`Lnv!+%1@CDv_}n=g?wp#~5iNl!8jE~C z3Y}(&K|UWH52;MPcd%;TZA>>gsZhI+vNnYyItNs1;Aj`If7Dv{V?a(kmQ3|8ek`x) zOL!aiu^s)gtpVy;uZK@f$pi0DF7Na{r=jQHe}&vzNJ39eM;~mOiiZ;8&kGNF*qMH? zXrnsUR(^#ycU>(|nBn}dmkZqRYSIG4d?irwG=$;~&PE+1qC?tMqhOYSmkr~@+^w*c zSn<crQr#d|U3+NvK3CO`+m(M%86D_v0L0OAu{xMGpELo`2sJcb7n&e!HB0@IkL0|v znQMH1;|1_Ew9Rv8G-KiCF;+ttl<Cy?_{~_=*Y5ho!`1!qbeA=resa=!9uvbBEb5f? z{+!!u7)oV-yDDy|+wv_{JG1ANL)^No$Zb5ne_-ojl{md^r@H4mn%vs5${r~T(_c!v zDoA{u0~Yk6z5{Bl!n~CRc0*GD{PIvs6W4^WWo!z>z!d5{)&P-v!HU`g8#OP%?9fS= z2R$&6KT*{ZTg4RJz3mGrHP?||4$V4!^&6O-`>rI*PQS{ebiDG!>^&H>AjT;3XQ7#- zS)-N^AFeMy;fsQWZ%aLmc^y4nnM_Hs9{bGLE=wKANIE64#mx?(*aBOB14{oSsh?*# z3iD1*Suw9NbekIOS9YUM_k#dd=e4c8YIaUcoARemjgxKf4il;>3i>Z-!)xVB4e-R1 zAWTImT$F1i`?hb8kZ?e~d$An`il`gC$New`&naIhreJxK05*mQU@J7gTYPZO8y;*f z5D88(Oz>P?1niw->&IqcGU!#uHWHSd`ov~?JWnR%gE?0K9YX@uu*`5%BIPYRx6itw zqd2znU5DB4j8syFa|I3211)tU0enfOlQ-^jQ0%RA)pA<l@p^=^Yv!b&$f~UySpKVf zu*MS+(DQmnIQAw5Y*)#Ca4RHLsIl_LMq_0HrEy1It|Cax+KNF(zyS0?rOM<^mT~Zc zj-*pQlshK@@;)42_~bKU065+>Oa!}W<}@HOMRepuj*NHMN%j>zJ0%CvCB;4p&)xWf z0^5m;obGtT+6i5OUAS>O=;>x66Ug0LGK?*QOu`U`(WE*p+4wM#@7gtE7XeM<m^%c6 z+fs$;&R%@?)VocO`Ds@HSl#niyg6+`i%jBx9}QhWZ(>wP-S#S5P|R&)U|1DG#71Q$ zUttHTrp;M)AdvwT?!$emj3#Rzh+bv6p|>>CYl-eo>+zH5%<^g?_(A|R`wBz+stpPb z@q`=Xm0Q+g0JWO@n3qtxf3;-^Dv=5(`bU|nPOr=ALNp8#DYUNiGJ<6c*Ud0{f|f#O z;P?=+hIy+7IfD>)uAnG~Q^eSF>+N4;F>l@A-w$w7p22e-We-D2Nh60l0Ly53^O>|; z1u1U0En5qW95a%JGyD9DET)^hK^C*QY%_qmfT?-({6Vp;9LmcEAMX-5P)8x2*rj!z z*hp6v`FFnzj%b#?Ml~;ylrK-PlB87m5{PAQ)pMlNCPIA!l@%{&$HTIIGAEduw@RJ< z#GFtPMyXksax1$#6siCfV7|tWk>Q(e48l=~-Vv4P?{6@8HA&!7mxI9j5lB$wW_Ck) z&mTc%7kx;*$1LvOH+J`t$vdnp*7SXh`M+CSZQM*NL(1I>WqJalg-XoA^kp4)yc5TI zg4-pW=;E`6XGQ6nYQ-ZN)bAa80n2w6O`8rtgP^<*p2F>j&dYCHC&dTYzr{l+=9|ng z&*r8!8d;N?H&1{V_D(yoQ{+kZZOJR%$xj>AT@Ii2<W$j|q>kmZC)1R@9YOYMS-1&O zQfg3oQXIi$HKDVd&oR?Tmk+YUKW#|3tg`Rl?@uYey`PmJm>Y~=4&i?p_&Uh~c{d37 zwM1b^I*sU^jDtcpoHef*nV5QEQh`5WE`X9>V9eu3{_wVu*UxyZ!SC}O{`6^q;!pbK z%ERyN=#65Hc-o-f<Hw!$eeh^V0(>G%d@`o{46?W5%<%bsWiE5XxMib{7n+H91%V#H zb~c26_soin^-g->^DuodXx8l;5)_feG^U#cp&nU)zoN(ZO}{Hjd#~+`Aau(pFJ|tG z=r|}8nV@6<+|r;P4h_{EYF7PR&te|`S{5t^X{b=9c2#I&tgV>WqbCa%o<A~K5<1tI z-+krs-XcG`HhK$+h<d2r&xc^;e>T&v-!Hev7?lXdH_o27It#X{wzO*{>*<z3qg8Vo z6Vn$ATQ#7aY#b&&_Q1I;7CcrqO;(qcpFZ6DK{@N4i{f_MvA|VtV=r+G<e(&<q>S)A zu3LcIaEym>!;wRmf3XikLx=WlZ}Ab=Nk|0Cz4ow9C&GXfc?}K!wCBlSGF_DkARR|l zp#f2P(+<7uI}Z%1yKHSZxp?<;s18Spx0vPHs-H0k4ob=!tn&J@y0Dk}jR}(MDi4ea z{k<f7gt%m#r&G~$<(c0cdzVW^DEHiAsX2PuD#-UOK|1rhf=aK^TTpv50o!|dcC-KG z|BCt_OR}77?SH)`S6k2SU06<icW+&sI<&@_BWIJaIybiAVjQF^ho)^_&_v@Mfg8fC za-dlrAG(4>#m<8#RbX^<r{$LWD#EEZp)>K$-e1j9K>}j?4<*vy`C3fBEzN#7GYoO$ zfM?81xhMZjz>?xEDXJhH`$uw;^fS?KVM<7K?(<u}ZV9DZIkj?0?^H23;Md+_9zBx} z<|&TdbU80OYsSp4f1IS!<@J5ZxA8BsclASKE-LYm|Lu|g$saT84Y}A3wz%BO9zk)w zU~&}iQq&exN|Mw*pum}Q(9S%)-kzy0C_4Exr!C$HQyCh|*qIGxwPV)+zSxBAM&WuT z2@2VdlNm^3497b^)+XzVO%)(548mG=6_8)N0BZbuId#rcEx(s%WMr&uQoqUnNF?pt zmFgRQ8EGvnpp)U_M^09K=oBNV?5wBR!B_q{I2)DHK#>n1iNX@c$<LX6-`!n7);Q+1 zlV`Cgp2UPtn~z{vEmMv`+d0><8m)sa+zQk6k8n0ZnN|y--PJV35$d2DAg5dHrzTs) zNJ)D^_4JfxAikaO2R&Yu=<BD)|Bg!ihwOp+o{a8SG6se3M{0k3WV27Uh}b+NgsQDa zPoh`GyhVO#N^SQ#=3Md<D-ZlBL%=xtBvg@C2Hg?htD$-CqpuXI!zY&&+V1@1$_V+Q zE6ADBZ>!MyAeYkCGN0+W6?ev#=XhQ!+8q+Nrw56cnYGwSDs`K83$t@T@BB3{%VWfZ z1m|F{?F~2kc{lnZ*U^E!V~L2QIE&;Il4nwvjG=PnL`36aO0cVWB_g3EM=IR7MOxJE ziE_=^%12g&t+1aNW;fy7137^jrNIGE^hDU~B|{AAfv?SXS(DuM9FU!Nru9c^L_o@9 z%T^b%jh^u+*_11(25lEzY#I1higZu0SO$5^w)VntEoK=lBY_QJtf9X5#no#ApmMb) zIMl=_l`3?a)%&HKY}F@kF)0>iTm~}vqpzl+#k>@%q|8imx3@(|9@Ig5PIClvTf!e2 zjK0`Yw&yuzYs6`ksz1{o9npS&{)FPe<Rw!8tn?Qv5|p4bI#9S8_9Px&>O7a?+9>!n zh(jnO-Q0adxXn&n_g^!sSNoC^J|7f9V3`Lca~D!57=^g-)<ozI<^6H#7cao2pIw?C zz`zDWTP+@uBl~RtfiDmMNrEgST!yR53mZMtY4+mlB?gSjTG+RDChBe98k6&V9c(*B zJoE-Wv0xmFQnbtLpFJm|q`p-;G4oJ%_?(R8W6$D<!0d}wo1yo|!)UM_<zdQ@$_ZAF zZvNBE!XJKO9%fa8odb^uyn;VGBGjF4oATF{$ryU&odM^T2j#9i0+Bl)`V4`$PwmSh z9E<^1KUl`g6D<zZdf$#!9Uh<7hSQ?-)9zCzfP7p4&4X-uSXCnYtCpjrjR$CNs7#F% zU8-37%Y&3P*rGNX;!jyj?L((t<E7n1msL;6ZhIWeR9slxq7Wg~zZoo}<K*h9i#SwT ze;6fTG<n@R7%mR&v^-E|7}w~T%7s{iL<nbBy`SFRFG(22vfIx#8Rc5Y;<asL;L$`0 zYK70jyVQP`GCV+v`X(++6koI-Z@)HK`r_V=liS=Mi}#VhKH~C1`sUmawPWrA$`j@i zS686)>1-5r21PkkD9S09T#s@J2C-$38TPs#F#me*xsYv=nFqmC4Bm#_q4s?E&=*); z<&_^=8TS}fPUoI+K*gnvAQ=8cpn`6o>hBu}9sBmZc@)cwY%@!&gFqY^ZZ!J%EPNHe zC6vRSUD=1AM@9TQLY<B`u&BsLVOUhO0_{%`jXKVry6}F{*5q4c${o?i%HOQB#`kTt zK)NcgCF#&-x+Op;Ta?4N>2t_&72zV<7t>9ncA)G&6J{Y*Zd>OM`2A9@Kuprr1_!Yj zdBi=yZwLO1_$54Dko7ko2zA@0GU1`c|27_p;bY8?w32)SpU{@wx9w0$6znC&cB1Fn zb#Fb~ZNbL~`!>!E^ksGz`vd{r`cndtMW9u1^KMZ7p(JA1{c)S~V1W7Wl|}DcfXAqn z|Hi2CvT*;|B^wbUt`VIy35{R1T}j&~XO;@p<CTC>o&l%Xval0HO5z14&;d}8`h5U^ z#U2S=6^qm#uU@%QaStC*jlXuC%6HKS0%5$#tJUj*PrufW&>Nvk7yrG~gimgOTMmn& zH)J?hLn)cEM9RBbM@T=|e728EoBQlo0;?ZLO#h!2Z(XQJydV#rcR1SyxPgBhJzga^ zdQG%{JNo~*KRo*I_)i6%^3WoMp70inAd{=oZ#2WKppgcl+U_5b(iGC^1IHfpa6NSf zhqf-=r4RRSR#!+G?;kdofrb@~(Dh9ToWH9(|LI4K*W{Ihb8kLtbu!ZpUZ{D#=|}(X zgRM=Ra0!fY%2@L;c!S@!vg9Np?VJ65X8x<L!O7aU6?pz~u)e$`qOuG?pp>N+^?b8p zkSxjzt;U&CF4jFumJB;;Ku?(<589I^+Md$mKaE!pK`>C}K@iOUhh?&RGZxR=TbyaN zRGHpWTrDd1pN9qA;7W9&k$9r36S%xa+mZdKi(+%1hz&vu+^vTq^&6;Xws|~W7B`Q% zz}HQ0evfsxWXeazW0KI$bRIUCL;)evw)ooBzlm3g9e3;3JAn0rX1Wip8fU2P?9S)A zWO{>51`h<W<&fY%(grVXa~$o!Z%p?;_loVB*~T&dOFZyDJN}i=zMLA`X4sX`q_*Tf zm}=Y=6nicjE=DUH+l<RM@#qK06#^_3g|dKHBm{<+w|Wb#UOaIRkDzTF7`Ml8^sl@J zHKqSOivrVS|LA)F1RUiX+?U@1di~WAK_w-!ZG}M*<j-UnOh?aHgugJ?IVMlNcSBxE z$17Wc335o|KtW^H#jcl!CX1$N)Y44%U6`!Yk{BxZyj#`>(TrnipsWOuMH=2kZb8@i zn%kwFxa+MMs;JS4RVno8&!5J87$l&l?FQ7faxMKLmyVxLY}=Kr=}$2+M&7IeZNe*3 zE63}%BkjCDZUcchyuJNye3Xtt)IZv0D+aOh0WU^_=(1<!8j^H-?@@@3J6}S(PIw2S zBG#Js!~MW*3b9HWR@?fu2#Q>Lb9qcrn!?+57Ej6q4hG?=(bYcf$tHgjtHPOvavr~Y zl5j6Rb&$D&jv7OlgXiE6`Ym&X#(Qin2WnZG@HAN7Gt~Ua--IlQlJHlEKodDn6XZNi zsfYuyWp%OYQY*nQ>=#vMAD;$$M3^gnN@jm=(w8~esqcwVR_Ue^V_SbaG58Z<5(>JT zDN)dkHvf+xI2a@V-;ZRK50AM7Zj_0081{pV#FniLgn7%83ie%IthXt4*l_z_ks@38 z`l25sD21~Lhd^lWW7gzHzA>aBlj3(+p`LV~LGQcLk9?Nb9=bBXNt@sL3?Kgz^6J1l z1Rq@AHgO8vV+JujM1Tc6Z;p63E$!fhr~qJ%^MqHfUKLTwl6yo|o6_=#P)&FcWr)A+ z)-WF7xVv$S|0#jmoBM1}q*4Cdw5vCR821Cxg|(oMxe;9OD%kUc^iI>N3w<vvBISFn zQh&_NE0534wUXfGwd>kf;C|079$Ty<TFl|o5nWz9kePS=!Ud6A7YBF!4@}kLWQ3*| z!?E^Uq%ODsgQa!0{KCj`H!-sRZm4`|tD5C76Gs-M9U(e-y@5N)OzHQF!k?gJ1umVQ z)W6+(5DiT=Z0WE%GjhT~97@S<XfXSx-m6Ce1Y_1exqvgEH!ypDCtV#EU2bIieXRVT z^hb?*P-{=Lxmh&>s!%1M4i$ALRxNclJNTnlLBej?Xt->*Kh=O53S2gIblDa*4&G;M z8ORIu!fOV?+=ri~4T;)Xa9miRxX61If2J}>pnXAF`tg3?FYVlIgpHDVabj}zd5wAc zdgAx%(hZ|F%pB+c*hQ%)k)Ytz+s~3O7bPEH0IHnr6y8V=Ra}q|3b<_Bw(tDP)sPg* zD4?0_@2#h1aT>TVuP?<xS^BxA(8>PA#T~DER;u%#@-_te&)mu*QzE?fL|hOIe&inS zYk1omjHE6qd=TFvP5dQr{D`BVv_1)3$U!fdUW-sFBWWbSi8)F<3<U#3i9nr<>9p&e zjMt1MkhaY)$AP`X0Dhq_9iIyR17=ElObh{N+WBVDNnd*Z#l5cqXLAq}$5RkYFpZhF zqBW9qF4UQ`ZAw77e>aJj$FSVcbJKf)m4BIhbm{>A;u-t7Z`D0nT}1}ntqfbBq`(jH zque&CbL%v&$0*KHLmW6rMEkL26Wzs9D|a)dRD@m%uS|clf@z*kX6qU?y_|g<@a&y_ z;=pG%Y|XID^4VxiT&!aN&80sqqgw(}<I5raw~Y$iEwT4_h$clY+bw6ExE=2eN-1OY z^YiBJMS^Ywwlhi`B-2o;mo?k0PnZ3w^-`rd+u&A!YIXdvvC<GgPzicQFZ9V=HEe9O zRLhaQ+?0h~{l<3h`Mp@Cr-%P3RMHP+i)fQk4SbUra#3Vc&Ff52c-x0dN}uJ7<cL{f zi5uXfDcp(~TyzdAK7X0*Fm-Qt?cm29D>YnBf9w|QTQG{n6_wW|JHchFD~HCr>^AC1 zElR!IWw-L~i^y<pwv059>ie-)j&utbS#G@?P8Nm0x_mZ0py_g~O^J6vVZeZ3G{XDD z{0w*PQZIQRinaV3Y{Ecsq|NtOCqHS9$mkxL$sfgPk(WUI$XJ3_Tb<6W6LBb8hpLCs za%baZ-wv+FCvN*CX*QbOge{R&u-k3Yy0~-DE2GUyL`EG*l%MG9>FIfUR+8@zvj}%} z3eNZQhD|U2mq;Zq5HzIut-lc1_e_L4+&uCa4Z=y|dpM_nq$`gSXSf`>xUSNYXA(0K z!3fePmOK6RAPX*&=k@U?bay$Sx80kTi6|*k+J@(XzuIxo@p0V&C!Ss<V_o637g>rR zd@s&5H*qpt9T*4ABps7*e(=Xg$oLTzm#_2_+5!5k>0$Qj{JKhy_VwEKuRCObJXD(4 zMkMX}r;?MQ0Y>V{px?x|o(1Y1+1pRzD?ttI*<~4r3xQx|kWm2BX`_IIF$sL5L8A{F zIy^MI<agO<K3#tSRPB^XwPRmzlinFG3aSNV(Nby}_N71`IU^qaGuV@`bcFp`d}gqs z1%QEYRd9IXO@nLLJ+^z>cloZaEU|`k0;vqqeZ5940azfO*GAm)H_8#*QV;j}u?&4* z%ywMFqu{@85U(O^M{vkSVD<Nw05C57#zuNz{Ekbe-9#$AF_^kYpzG8^(>uFH%+tAh z(QuCl6ANI>c@I#B>c#A=7;odnm1?T(O%}B7vIXvGK^N+Jy3WoMbOf(iomp1g^Lgy8 zdVTNZb1TbG@JnFr(3_1l^C6J5pbEWNJRZ(VLvQw9n9QgD0h7TCf&a1)B~aI7yLRgj z2L+0SUGs#?Cpje42bU@q)2*(5q{zy!q;MSTdqyL%m*|62zurL8m`LzccdcXvbkF)h z%}5^NAQl*_>Qx3zaJSBV8Q>LBU+dZ>(8%hw8g4vBEuDgU&{HXpCBGyyX4_Wo3498g zSJxwqU}LK<9;=-uxiekKJg_pG?aL=aermBLd0^<iCNW{GEASSt_%vLPzB#^pqUp{g z$j$Gudr`Ima`TE(@_sl~IYU$5+8Zir#H#L*5{%}D&bku^$G(sxZPRc!=T-MAId~|m zZ|@UHUp3W+uWQTnMk8y@OT#On*0W7Rp=q<L2@OMnX30k9tEZd;Z{4a|9X0Zzu^lN3 z+a}<=9qB(}F%e*^vJZ&bFvyP(NRZ=B@^Jto+?XxuR(};hg)aTPsGWVQK9PJNC%cf% z@Y5yj4}sp*)8jLGxBp5aiRV$G%#Gw_@mj~7(XK+CR#QzB^Y-z=HFK&i(R4M^ApTdQ zfzvNf#6IK;F&V4!yUf%c=+o!YrPGDC`Es3)zbX4^Qt&@5ZV~YNRD5tG_ADa@bdE<} z8((7dq+C93u-(Q@tHW6){NPa)QYtpASYl6p%kV{iMhtf+IgbCJ(6OAOTa&3cPg0I1 z1EfOWKsI&-)IU?5TdacfEmPUSu8kIQpx_}GOhTg;HA6N<l#ScV9jeHJ0Z)hD4}yei z#vTMq3G67=PUZOugtasUhp6}@-(%|02KoO4kF1agJzW@Rx2?<XDsQ#L^p<Av9G=!( zT-_rA^QuC>I)_zt4Mbocz7BeloJl8X>7F++mB@SR`;`l+!)fp6DDwPoh%K`%&8`gW zMQEIw4oGS&Ta}fvmMuh82bKktm7f*Rd=?_0?-zfBP}M3xthy}}D<7^+x!wPgo9dp! zrB|Jn<nms7`-;SC9nP@LI)lxGtHnIG$SZ{2^#cA~seZldo3k$tLtOtXn4@S@3qZhc zc{F>h2l{>ADL+Rt!dM9csF?-<kG#ATB<OL+*UqXW-@b<q%`cnSlK?g`8!8a6h{%pc zK>k{54LveTR|CNUw96<W)DLR`u|Vm8p{H8X5CbJA5O$9%bXJzC_dL^cQk<ietPv;O z0h)9Oy{PoMi2w2SsO8y7WIP3O3Tk2pj3JbcYjIL!e5I)S9o+WFo;N6tk$qb5_HrR& zcKY(@i(dFJvPAg5A!Jp^=Q)DIThA=!k?f!@BHtB*yt6G*X@w#Y7z*=URV29aoy^$< z87AL)f6$9m^1EDI@Y>6%f^CYfSjNbLoVNdc)mnUHB~A`r@$J>_t8=gFxG~e%GGHM` zL61w{lTH|7nyMU#UqUy6syT)ct3ryFJ&k<pqTIh0?-X#Pi_FjdzAq@UMcUvDP_S*s zqyEGhu!$MRPqKP`;(IzwV3EHR{?0ioJGie(Sv2sfx2WL%;kn=g)-NLlbh6|*X_9{N z6=9LZpF#rEsP*WNb9<L<0Ley+L2F44s_X-#1Xzis*-a(P10!q`(cy|^@r$DM^@_Jz ziXTN9KVvKvHSF^c{{%mX`LVAzK0B~NP%7O4{858N1-pWRg!6DPu9V)SLt*=-dA^IP zv3VB(6I&k_;SBpE*MM-rV*nepA!$TcS41Vzz6T~;cv~s=QNvjeE0^M`Yat!nAb901 z#J#Zqt{oD4^MQW5amy!SbQenI-0uJQy1rN8NJvbd_6~edGpuMMUgw?g3Sfy|EQP3I zzWGQPVyL0*T{4Ay>(9f|FecD-C;Mi20v%sj>qsEE?y`=02WU5U2^|xFmt)=sC~zd% zf&O>IxX&aqX$8cJ5lhcnmn3)awI}yg2ly$S1Pu|Rm&85qVUJt&wvPJXO)mfkWZAUq zruWw>q`+c+_WdFF=QSgggH>=!|Mld{2zE|FAkS4mP_vPw;+Cyw*1(7DK$f)I?yK9m zvOw08B*P%^ZTZUR^;0uFetu466%=mw;hp97v(Vx7qkCS$0|=e?|MCErzT=8&GjtvK zD$k~gJ@t*IQl4e!6C<RAu$JYrKN1%M!0sM+{NcuV*pGB18MMCSpP|%6so*|@w*wnr zFwAh2X6qq+nOg^S)!{s6p>_-(@Y-W|iFU$PIAg7}p?f5M(8$`jonmm|+(mD0^d{51 z&(TV=l=A=ASuHn{fT5l)zE57fFPo*yHdxC8VX6CYc%Rl05Rvu-`6&xZ$Vb=)`g3Rt zDpv%6)jsbo%tw5e&Hftueoti>xah<<v%2thU?qP{DM-yI{KvPjpHyx=h)8zFtn4w$ zv^5ZaSl{sX0q$bgg_<mA?Mc~;wR3^E&EsgYX1LQ^@I!F`13%6*ve23q>^=Yd(}Spa zlW4gCUc-t8#RI6j@sIOfvK8G?gUx%oRSd32<Pe(s@x1o|wk*W@MQ`H7Sh*tuC;y?n zW3N%n7l{*3xgyouXS(*({X@s~)gbNd;E@zWE!tr;Lc0#NbiheBDGp8fupQbj$hFQ! zFh*623R#AI+e0A7-D!(41OkrqThsbDlAzXnm;8i|_d0zRq1P9abTe;#8k6wA@3_4> zGXJ{k<{v<YxrvK{Akb2?2JP?)v!iW8=`=IoSEPul6v$q;+Lc$TEzP#{;wF35HQY@8 zGIDwdqtGY%*B88oF|2H^tR2hLGVJoF$fbCWw>S!&cX^{C3$M;8OgRo^C-qgZOZbOc zl9%a1sA?Fs-zbNGA^9R#I=!(;2u}pBD!1@lt6esZj({EYyz~Z!lAzC*I|K=Q-s9g# z+dxy$w2qDD<jt4Y+jCBt)<Xw`RBn|NcrX#SLJta=u-i`rtzib&2uY-5{SU@JZ~r_( zBe)eeZFwgi0>L|qv{q8wPP^6P_KU%<Ub*#EN9d2{Oetmd25Lt_1rw=quwQ&<9D_6+ zWp6-d3wa4>{UE8^R1on+nvU0--?87fGOHZwiIULm8BUXTPg-ySvYEw?OEbzaXkw_y zIF0-5a=uwl-?hrKg;9Ho6*8x)s~uQ@aU_L~%Fj=HH{d*BJJC%h^Ynob2+<3&l@n@F zJ1I;nVFKX+y%>4u=!nwGb--nB(~MD(K*8i<_IBvB7Z)d*9cf|JcbW+R4PrIWhrD5< zTHA5_Wbtcd5tc-Hlm46@6dL{tIj~Qe;GPdx{4$t-xQ+5B*fJ-s>=Nzn4uN}h`lQxl z?YgL=_0*61dvYj3(Vd(mpp~XMddc<9WGU+xoPk%@<ag+#$uc|A>$yw9|KMfvinFlK z*JAe@hZ002Y4g;NW>&w`6JF(twfphF5@oe&%3ym26HoD>T;CUIUpeiYz{e@*pn7R$ zfnKIbZKT)2OIogEP}#gaSSL5wP`#k*`}&EG8ARMW-H^J?b`Ycja{NBlr)vG)LOo5F zd5EqOJl+%s!Cz6|)5z@8po%}fkokw%5Bw(K?|zmcD3(u@cUuB*RCA_l6|6)fVn&=k zBEA3(;dGER$ez5*bgnoiQ(h6v(=WUK0ao5UN_Kz@8bKTu)UQlN+-PM!H<r~>VZEw- zwKvtuQ2k1~BBh%oLT>Iet^*Q1?~s!^`P)Z4i=sVU)4_t;JKn@7M~K#@n>Cb}=Agw8 zCPN0P`TY$Jg!q}L=W24%@D3iY9*M;Zw*T5f0~vTPT^R51D`5T=c$}hvS*ynSG!xB) zd>PP0RqDB$DTl%ze=(&lb$#|iy431tY^5(u))=2!O7IP&YT{w^^mQsU7<9wR^Clj? z<#qV2`P8+{Hxs&Vj7Ogf^gevJ4|lGcmVj7tH#ioe2MX&JMh|VA*QSM`Y%v1#9A|;C zg&SfcTOP<|2vmT++WRDXA}<%ZD;>j&dR-@ZXWn*E+WVl%V#ZY7Qe<(#)}}$9FMpm+ zS64*3uwnUEgQI~loX!}SED+0n;no&3TiA*eE0(aaNYlp-bJIiBJkdT(G2&?5nfUp5 z2u?b<X|yRN<-VLVR5EvaVq!rUSNk$0lYi-ns#SedP{yNEPy>1NkJu;pGNgB0d{Jof z0VFxVzG&3ivl)%0I3Yw-#9`X=q8mnDgNhq^oKFxzihCIN&L?uG9WCG1S={OA*KZmQ z?ECAr#1-MSj+rQK{YR|7;>=X_fvmr@`Pl1<HuHh6Mb*b=a>qi6al<g?fL;C7`{Bj~ zKOKjGs8oj;(~kZkkd?<CCt92x;XtP|csZU&jHz-gaqIvgkdlnIH64@i7w0~3uj+0A zwZ03NR-MJAi#cn}@m6P}%G17v#1TiL5UNhk<r)g12oZ6{srUCLvT9<YHqK<@E_T#l zkb3AQ4D@`_p&PD~lTon>!#=rnP9Dgu!B>!fg?(@F;m5BK<c}1All3l}(++QcdMCXT z_ZFd{CJI)teFvV+fPF-O@N`gClH_Jnmp_pZ5>oWNJ${emgn0nzaS~kQrz6p`2R}H^ zh3RO{$!1u5DfwZw5)hz%;C>U+QzBT;3kA3%$hL`xqrqwVq?`Wz^Q;$@WKF~jmu?on z4U;^I0Iri(gb4{uXP4W6TH6^Pk&sGylfU!t&j_<?kyiM(C^2x4g#Rt>ghMUw$NabN zqAdZ1nA{D_`XB+)O$33gws&_Nr*GAc&%WsX$ub2@Ze9WTC|a-;Ch6+8k~*$;a8q|& zY*2JA<0y=5u0N-?=k5h240LDspZsc!r@A~HLQX)zb;AkxH;U#u&IN*su*bRQyoL|! zlE*rdiZ2Uv6G04-APy9M!`etWD^o8@UYD6Tf9p$Ke;&BbeB?%s{c+mZsU@2}SafvM zhznS>b5iTvlz4}`ud`(HL->NwHUEJj2+JvJjm)jPAp5>Y5hNQX)cky)GW3)>>WJ4? z@67}2f11FsJTTzwixW`~RLq}!kP#ayuYeNEC)!4k10%E<*q<Tec0<TUJ~QM)Nb??j zT1EkV$0x;s8i1SGVxnf_uTqkC&E>l^SZH%k2`HWD#s@9M%KsX)fJuSU%OtdKlz01x zai?9Yq+FrtfTGeBftPp<`KPYV)t1g4r>=nFR?@|E!WqSXP&+bUac}yRXc4M1O4-2( zAmW}-z*K7AEV_nfTXMGzu-#>A3Yvqzc~w3&`RVI1tHIdlGLZR56T5`xw+Isp&(x_S zfi39rj~QNdPVu0+kPOv`p=+h6JB}B1$GOpEJNuGZBwarGg~DFKRL@1^C}7lR7K031 z+<Kb84rSQc-h$%MGqJjtq?=hsZB1LMG#25lB0<@4cKZcRI#3)#rg5^joE6gFvMWOs z@k?#_-Y?I?IJH;)@JtE-!tgQdMXkSXgv6)`!)Cbg&|I_=#mKy(58<>d^`E=%DlQGz zgXV0j7C!$)rCuvdZ0}t*gd%w&-Lf*4ARWp?ww8w3u?`;K<AhDP(^8al`Dn=jAZh@P zqJ4d;M2WlWXu<8FL>bXcm&!>wwWR9<*Qcp+A*TDu9qRzmcwEw*!3xKQYR8^s)B4K$ z#ku1-b(s_Hb-}`XQrH&+qgeUE6t6Xbn!7|~6~v&j5K{T<+V!NhRYMv7$J{!|#Hit8 zfPnQF;QV{L6ydKiDY38|g6#TvIk^&43M=Ff=iBl_G!o9&RD|e$Ps^CsfLi-?68`Ir zDu<&U5OL^Q2RsfIWYKo2+5cB~?g^M0OJK#bp+BOXjC*X#-<^)V`cOL;@l!S9=8yZc zL$|4v*JO4}TF!T^4bFM98HMZX+6*tt0lWNguEWejmzVEQK{ypV-e%iT3Uc>1E-KnP zzO74iIzx5Q5sEoQFVy4ez>OZ^2+Nvkof=A3i!(jG?dYO@wS4ZNKos|OJ{d4}KtCgv z#;40}!ua@h=X!iQEZ=e}XD})#Sl%LM!X27^E84M-qMUa~EswfD1gHkwEj}|i`@u%x z!BSiCEqW6qw;?ujm>cC{rRL#&^nF<%Pstb$)&GtXK(f1t9Ozw}cp}_}+qyO=HCdpO zJk|GE-fFz_ko`bZ5Xd^8XkQ<mhCM*A15_`eF(;UQb!C#zYAsjB**@$EHy=NXr>`4x z6c5BU1HH;#rDH2Awx@=gnX<WZMBnDOs&)tZKNs+m#KI6GRmxYg4EW=C3Q6#AdxJ%* ztsolI(LeXzdEx<*%m=Djko`T*x^W@4F55LEoD0K9pVKfvGwmdh3LZ46BTk*C{w3(t zsC|D!yEF*qLAJ~~Ez{Nf72;vuLa>$68M*Hthyxy;su;t{yLEFPzlS>3fvs7#v_AOG zK)o~OwKuQGPKMgE7f)C`t!(E#!RqN-!yJ$dZ`WI|{3LTsp@lxBr@kSiG_N_?hd(b} z(^N6^0^`#yaIHwhBk_c6w}WWD7i%%xYm+{L>bU`?<Xw&zNU1p4poP~L2H+UBmt5VI ze~(dOtb>WE9vn9jQRtY3;LI+u>&g;a-{A4%&FwmM2zD#!-;$JHXx2xR*eA@8E&_*@ z5OG+q5xA_3xmXPbXuU8kbe!|g9{gUKKmtUxr%*+IAhS+T_C!u4-hF)wP9*B{*lOfA zX@Is=G@KxjDQSAMlNOQRm8YTg<Y}>HdpuFD%NSo2%2PvJr&iAPpT)4$Yep>mZm7mS zy@e8p?|)n=Shc@#Ck!X7)5nX+FJUBy{8t#sVRZQB(UD38R;{dB4ab4tQ7elThv4I{ zfUr^vY0x+uK0hH;Md3(23P%RdcBbsmE={oQ2!OL#3RWK}GPcuRQ!BS;Iu11Lmux6v zW+V(9i*N|W$`g|FAPi?SHOIn4Le*iAru=Vc?0<Vi$K7l;CM@bBMdrG_tJ`huOilya zP<GF_kmsK+%j`n7mC<*6^n;Z`!67v*3J%)|TeER!$jP;;(1FCuhtop^)b>c05<a|w zqR7()3#+j~Bsj^=@xM+lLUW3g<o<C*^E*7JMn2i6+ElRJ`k*a%d*aqvr!g4jIQF>} z-p~rLEP3va(LZlMfb{cIbmKeaten(?f_Khux3-tR$Z!7qN}5p?@n;^ee9l4_@%z>T z%`{}$A}9&TC3}33S7ZC!m<27|2ze;x|H!p`98z^4mIU{COBXMMQ<yX8af<+O#9Gq) zT2f^HP$I1)`;W){3vvDD8O^75>k5c3Sp%D5BxLRX-L`EYio_b0<g6=})MqO`c*Eeq z^<8KgFYNi*_$Dz&XrYAsHt3o~<N%@L!VnhseoET(F5B*-Imit2?!KAlVtV{8Tks{- zzwVGFibB8rn<dx;s>R;|I!I`idl!uplYntzV^S{-0?Z6LB3$Ixpz+0H%w+I?d_HQs z9ycmpqdvuN<EiD`eju``1Ulev5^Vjyf5IQkjCo_g=GZwq@2qJMfYQk__UNAg=^Y3% zuj~Mx)qmn}Za_$tB>C<@ghnOaMWYfQ6$Cfv@Z^Iu<Fx&<s)=n!u3m@=Xz13$yNvJu z=gpyw5U*AWGhF^z^XkhkTK=ay81ATme&6n_zTVI13HS0`tV3RRRUhp##0SgyWJZ6+ z4o?vU&PMs)5-^y!V~$G7#L)5Ye<@MxD@;RV`3chybBRN5tvs15hj>kK$!7BW)KV`0 zD;RGS3Gedb82(}s<KPS~fePr{D}HCU*s&ZYu$Ua#wj-q0YB))f%)St_NDywZY6h$g zAg(ipHA-kcH9&Fu?y}X~?#c#@RY5>O9u2qWYLn9o@7HI22ctuUd0?gM+-C2LHYpZ6 zD*pJSCOooa_3vPvEF!tN?EJR?e-j4ABB1?lx}F3~*71J{lXd18RTjStPJRm)sZAUy zoHQt>+Fbl)avbORw*@D)fGhB$9nH*}X$dS}e&TnwBb~!mX<p>#I#=ET6*`j1(B(^G zeYv)4_RIM0YqtIjw!@y;VB0Of1-tJ#tcY3Z0EHR@i)Ihrn`lc<xJ}i5ViRb$N~_BQ zeVUj%_S)xQpbu=^#usc6LgE>={6FrKj!Lfk@bUnw{ot$bwVBo&JZEE|B!&9V?RMgS z@?A7xBF_{>CTBwna6Y2GQDoGm&DElQ$sf!EL`;ON4vOAs{I(1D*jLI_po>G5_hzR! z8j$ABoBJ{ehVi+&l73!v)_JW&XR>1KNWd<9_|M~oIS2MjBk(KGo(|!~0g)T^^i@Jq z-)YcthezZ8Z5!T8b2a5n$qY2cMcsCqKlDF6c%`lz$<<<cA9A|0m%6^bIzz%xu~A-f z8xf-_0n~u$M)SL8Aoakbfd;Oi2J)J=9UK}lSm1y7gT{hK8EWgTqiXzM5pf69cT=r; z<%2~W-#1AOfS~Ikf0+me`HLd8+|wa|4gRq!;%HMMw*5bDibhVl_nqvO9rn1QZMC_& z2ma@GgX?)=PXFyCH-3{^Nyq{&(`v=4NufSYC`nd37`=lO!G9l;!NNBqeX!8CBw)85 z%{UWIH>*|_a@6wACoX|OzAUf3mPql%57;PiRPK|TL&K9lZkCb$#aCv$GZ$GH%pQwc zS*eU{c<r<4F0r1UuHs`Fj3ml>&K08QXcT^AX-K|1GDL@5R%U`s8l#mN2Ab2&z6-uW zGaEZ88{uZ7>2RoZ@m9J+;zeGAI<utz#o2quW8J^+;|)nkR)~l~R@t&Q5m`|xt6`?d z-lS}0B~nH%GEzpi%PM7)RU#vMU$Qs9^Lf?%zPsO__h)>6|J;v9k6XE}*X#K_$8jF# zanQy7QFq*z;Y0yGOX`oN7L7}R?CsSE#}V&nLx3iA*<ZQF!O@0d5gcs{2{^xC<;yom zk6F0QO17;8)|CEFp~(qe;K${DSX>-G_AyT0Nyeh<-75$=-}RsK-gp2FM+*m@UKMu6 z8wTDDaIDlAo%);-7LSTB>23Y9{fLl9_#?xA!XN*KcysRy!(-$2uW#oy+p)$nHEe%H z(p3h9xsCpcslqeSYsc7L<i9Z}7O=$ge8W!S(c{Oc#_NGu8pZbtSaJmAlF&3NqC^D~ z1cw`IzXY*Le%D3wcGU`+{i<8lk8``2oBmNWjiaK8>)-SH|7$t2)0!6eW@nJt<!5vC zd{(O1t8ddW+<WHW)dlv4MBzh0F(S-ch5r3{rT-h;sR2YeMurDJnJlw4AZe(s@y99u z2qyM$8J4L)I^h2)pDwB4qIRshSx5zMGx6AyI3E4p;GX_a27~6XDiNOe3vG+c_6+cI z*kUfYBL!Z0z!c`ZWDI1MoMT!Du`$-Zj_WDDSmx@`u8Iv|7)h)--eejo_zz+=6aL5^ z|GynshX?GPhFa$#nbf}2@SkHQyY!<PJNxv~l(2HH_+&#Et{3wa|1#11vekzR|0rCH zP}TexRn5<_@CI*g0P?C=;xv2w@{RgP4(J}YvMozdjG{P$s2DMV77?-6Fg}e&Wt^?O z?clBc_i%tf8J*aiKQg3pF;hJd8n;6TOI!dI{_%hqL&ZAW{Ts5pU{q*Nw45pnUevYB zvTV?K?1%d^{9f_=;0a)zz>B+m!h3S1mxt@?o2S^R-cvj))8r-1!0Gz7uSYhrJ1Znd zHzcWJ)@vv8_Z;ioWvuO($T?+vSoLPY=T7{H*G?BM_MIJo#OgsnhbL5eyQmR{S+L2= zb?oe&fZqEQsM40*vo4tmN{A_i<U`f<4qslgrkRzXa_6rg?fnu;lANrgf4mTYC|*qN z-7LKnKfZw=A*229pI<9uFW`C3kCw1Z!O9rR6s(LD$~29hF`k(GoP0j6n;)aW<3v6N z>_R}sZ@y3b1sQ)vpP7dQ<$F8bf5AP62H_KjfgTNuy$sN6BO!RGf;HMO%1$$S;tN=> zG9@qqP>|<9c5^^Tn_@-Nok}O~2v*g40M&=L^JWtn5(eZA-S>|X{_)O+wa^{#J@NM) z_zUQf`Hw(PPNhxs^LplUkHTO+;PPv)41gK{Ck`ktoQ9`UM?v#+FQ+EfgzIYQytc)a zjFi%^71lCl@3YBkT@a2p@GbBFV<iAO7ZQLkr{>(hK5GPyn<88cC|Y~tXRW6Y7CV|* z`R-Hji1)e2O-zU$1gw3H@%x*9qdCuzlS`hwtX%jwVk8Hg#2?T|YU(%kUoP>RPDZi| z72!wSf3?Z!h_G5-|3_o@zrZ>5A?$PC5oR!tfbY^Wsk*ab57_GpFpX@_EAPH#jM$fO zI{LeH@zp-(vulM$k4!6t2nNxhBb4s$uQ-5Q=sfoQzFt^IT;%I$LsLS~?X*@#n4}mJ zboibt(jf1F__2Izzga*R(n#YF{Fg%jSCJbbxle*=q7^N-k7dwx{v+(xp_+l_*}si* z0F&F|BUT|B0nL`ium^Pf#sPVjoz3mWuxri(8}|n?ux=|>q7%taK4i|FG~0(L%rK!8 z6!rkk;3m=^c8&x+XMm%HVOf|QEh{EhsB^RY5J16mucqp*39d$Uq~OKtx@Thvs+%O^ z<bP2x8uH*fd$S;1!{|Ex4VKHqO=Z-7<tYyX&J(gZ`PUbQajZov#+MK2I1YbKkWQ4c zN0QzjDUO1e7E0v^%$zFlVEn&*Up#L{_5f!3d!a^%<np)dz)L`zj^Z&o4z7{G;!wV% zTsY7_x(?jm$U%z)v5(<ydr%NS@^_}YK;k@N_g;#XiAjL3$YvJcT8(PYfM-FN8zsq) zxF_#JnN)T$mhK`2tl&OPXrddnc}Hehqha0^tFpw`n`S?mKF_2D$h?MVeSV4U{u-J= zzefu^M#8@yL*;_UdaY%ZVH6zudN6rP24wcYvB-Ye@RutIyyjxiiX>CsE3cUNcy=>e z5*(&|{)#v#_EdtQ$q_8&A3^6|h06nah1RQ9F!uwA28k&jueA{xQ80%P=m2p^Z<ZRK zRa%8LgcO^%VocSMP#hF_W2>7F+^dX#f~V~;8?W;%wg8G!p<5rX(iCNE4b5*q*mrTL z#BwAqk;k-b?=_|{3|#Ju_5(4f(jvQu%CdbQ@nsqD9hHr%;|yP{&+eW04G7(MXxpd! zHeo!AaZltp^Y|89_rq<7t1bYvSc@^k&B@JdMCkkPn%DacB8LV4r=I)txNM}?)|Aow zM@o$=Y?}!?n@V6d@;vddY~&#pQBRmQhCFdAKOr00nEv$)?QPCD+f5Q%{czhD;g{zw zqW3U4Vq!b7XGLN=xpCDzUT3F9+PJMjseJzfXjo$42kLqP=ze8D4Rl4-@K;or;J91% z(?-`71H`hu^DP@3NV(&}yhW{(!7YbOT@1?lBNPB2Ohy8J((*yz(!ah7f|H0a3ilOC zSpq0_e^7=0!GzLT@-3K1ZFlSgxmXy5HKZnZ-j4eTLK>$8OdD%8{h3q<Bj_ujLa3>e z><?p78P)m6=*KCuNz6VXov}ImSZ0Yz%426yhZE04_gp>lZ@^M6nuSoCY5c;6U*Z!V zJxU@Ae)rvUBVoo^4+LdOe%`Ui9e}WYIFGWe9Pr~b;`n7Fk6d$3!PkPn0;LSdzD5#- z1w_N>L&h16M-f*k(*DlB7jt#*S=Be+J~*l%3X_hJ55zo?ptwaF*7QPH6)bWvgMbq% zsf$gpXam_>6y0=l56PSRw6?c5tdT4Y^2bRGYoOBAKe3~{u{aA?UKPlNY8&QW^dk3U z`aC!8BCk*Pxlc4HDj-F9L43=^2$aT>gakT~1R{`Rg=Xw~#0<;&NrZctXbkMN8Xd1? zgE~9NRKL5^TXM;Bbzr|J{Hl>Rxy=#CW#?^S-)*U-=C9rbdf<XL-X8~=itX-VhA<Bs zc_h#rhTKlBOq6D+xD8q4-2xxpc`#;p;bIMYWWXdnjg0B_J(j)zxg*_Ntx-siOtI#j z<IFYfEU>}82oj>X+@LEXXat)4>`%FLqqwq4FA9bY)0Ys!{w@v4#m$9;9l_|O7?<s} zv8G~Ik<UKur{d?PB;v>-+sBg6KQUgO?s{i8rtShqWdx)^oUCq?-v-#C!5FB{rta4a z3+`NX0S!C;4hP{!X6`^1=ABBZAp2@&4FewJuO8#@)l6aMFcLO}eGX=}*n4v0j&rLX z@cZUll^A0x1VAR9zdYK&G3M%yo>ehxN8tv`acL(vo-ri`hsgA^?#jXzU8Ua9r>?%1 zCu3FBKW_vvuZ@R~@&cuKYjN;}&FfM6x@!krR=$uwgI*nNlpjw_!@Dtrr6NQ#dM|?F zT$HX4hb8hCd3g!E{6!?_+9{01<8Ur!akNmv5#Vt`)Mq^sx)u3HMY4*=vSBLnkI4hV z33HhUwL-*kB50+3B+>skKjloqa&TUAT#^_6?6;g-BYkeOLQ5bY!n7`LNMbNfekK6f zIf45^KcmBbs=Ib@kY2pY{Vb(t<i|kAjSN=gw*0A5%364R2&pp5mb<f0lAIYo3W7#e z*;6>0tkQWEcAbIp%z-^+V|f<sJ<(OoOXZYo>VogXvLEEp(3Q{%nukfi`3hGYT_WZw zy)MT{m)R;mrF5K*y0s;U@@L>_>+ZbtO_-RS9f+*u*CTrc`}r8l47^(q^0NmchBNO# zZWjg>^Dy3iv5?@oUPrguTKSmJK9;#}ZfDA9Cj$1qpILzl4jWI|V#HOWR3j2&^KbH@ zsF;07D#boqx)7orJCJcrdVM^JHnT=tisZh?=g9R5OOH|JP;e0d!K0XybOmk9T%PL^ z<GEdsi)*dqv!=de&<I67p{md{yD9<sLXr2i8R~xvR?X?jye}JI>sD9#qP_GzV;bp~ zX74|Ge&b}=1|$PpFOs9bu-C5$du_r;&O!pQ0t>F$6pw)L<9}hVU34$;Z@lYfG9RFM zFJU48({3`>eT=*Q9AC(kKziFqg3|22zVVlYTK4-1%?c0niYhn}1UimekpiPBo}-OH z#j14f+!`njH%-+t1>rUaxI0zoTw8}gC|kg2iIl{#6l57qg%6KmmM=kRoGrXQRTLsR zdNfxxKwF~%mUXUV7LU@|op&+^A-iklPBdj{@9*0+iz<Q3Fr{NZ@U>K614>PNEL429 zRN!>ak355S#(~<bi<ibgOl!>FaOynle2svlBN5irjht2i$<mp(RC=Uo82^xc$VeB} z%D*xIN|RGR4EH)QHW%ZF>_9p+*e}pt>Dd*3LO**pD#>>Oo=#zMy>Vmp#aWaJYj9AT znwi68<A}M7nB<+!Ajp}nP^5-VKl%);_4QnjFL9>!{*iB1CsNtV*C#V>^uB)E+*@W? z;t33{OW#VImx!k%f_Xr>gZ$BC7YuwN&PdViSNM^L`&_HnZdUs=TK_a-`I@WDxh7un zS`WCp#TBrKfD$qjo<3lTfV(CrjU-y+Mw7RuwMcvGR>4-_$qTCzj!bVclm;ni7$3vW z`@%FTK?M?*FC#(9-&_cwctLp$+}eMV((xz@B#PE93nn=)tz{I8>TZ)MK4iq*f`-$! zo+I^{D%dv`yF>kH`}L}s@1DKkvPYcE6`iEO<MC0~?h#lY#=MUPWoa4kq%>V`|M4Cn zaqA6dCD#`xn1NO&Fa`{8WVqprduv_WxvLKThT0mEaL+aSe0B`&7)@nW^u<~#%kO1T zzoIakA%1`S#a0~DNBG|AS+wg85cgv2Jd$=`iB>I5k;l9ei5;FYe+ObM+HAJEPeJ?c z#gE4v7dDarBRQpm38AZRHMkf{7OGvtpwMa{1uZk>!8io1A%<CMoa1vu)xsx{?O2%y z>xww@L7{-b9-}Ie5=&)3s@1;9b~bhmq`(<O^4Tw5i>c?^K2Q)#h3^u>&lVfjJBNLE zq<K{^GHEL7b4+FiVK|!G!ft@m>t}qof1GddgqjaDMjhBMBo7?%__|n&TRr)Z{q{@o zn$01`9p0^}+&8i;HM1pCnNNI)X`b`*c$So_zf?IkvGCUNjb+m3%x#bMB^$Z(U?IgT zKJ@HZ^47qY&*_Yxb<N)TlY$xQ3*mrNV#^l}s(#PswL>aoL%1lmw`#h>J|rU?A+n)9 z`6NO2()5|6)C*5lsOlS(ZYe26&O^`iC&Syj^fUs7#qj6r#U4p<hp4%vot=JL7&7o; zMLL03rn=X$PZ{Qgs(0{vd>>)Ha0GB=roW0sIHk%4s9DWt`@30%aP^Cbd^PMLJKb$_ zfZJl;__4<_1qitHPRRG0XZe>;Yz4B#2hb|CUJqCx7AA=q4>??O-0e;K)3w*{?}Hgz zH-W_B1HbEnnlF{Wqp~T4(Y5^g`v;mu3Pw{o*8Nf(S{McMXd;iK^78Y24A)yLKfuD3 zN3!?SXH-=I?A}P_Q6R*U<WHz!zn@GJby8a!E5c(qX;h=oxwj5M@tSIWRFSl-0(bG< z%})mxN{}+)bnfTpc4MS(?Y`eF^!3&1kv+2Xb#AJ)$mSNUv}b9%;Nqn!UTAqq%eLVJ zjezzxX<4%hnWDUydccQ?N(R4{mcYz#J9DyEP}`5b^5Z?})KrICWqx?1)$vVN&Mkjr z{6QOWAQrr1*cY#9z#2SNf%c<<R$dLq8X8&!8)@<8U5nkXq75fYkF128J}d2USg>et zx-@BbGH^ou*KO3lW*QuGHC%e`r!9CS#h*r6o9~zx6wZXl)p9|%i?zX6kmzM)lE-@8 z6eU|7s|inp?+z_ZB`vQpfh}+hRd7Xic;!;>X%I=t-oVdpW)EKQ7-MiL*D&geTNXG! z){>w%wZD1%v*yxR#Ja3NfxNW71!%*M%0GvsXPiN&8?$h3<|U!Q;B!F~bXf6?#8sG# z<qTi=V;Jh422ls|&W9Vcx3rMvAki?Q@7UWy*^p4iv|p>o`iIjj%Rplv!w-ZN$AZHO z-$Qn%9vgpfY4{}Q!8Q|Z6MkcN>Sx)9gfTL~<&LvIe|WZg!6?45nW@=|L;X7lT?Y{I zEf#@3j2f9@6|+H!JzuBbQH(dGlcqdz`PQ;t?nY3&F0g*{n1lS3V;N*{VBgZB&Ux*# zD7@Ph=Ze)qVl4qlLFXhXsAX-R`<7=KmWdsqZwXc>Q>-W%E4=&ttSD^b%Fpz$;ULaO z$GG8&*>t9b0@^_Ph*p?;=$N6<kD<ed7@#%=6N&5VpHC}?<HG}8X3NsOmGp-#aW)+W zq4iI>8laSJav5d>jpKXlEXg;>NEC}Vf@(UqE;s@o7Ahn%7rljRd#|nQPYoQF@7lEQ zj0)y1sm*KM73OCa8|T`n*vUv|`ke2UUoob_*af`7nu=+pb%kx>C=@_T@0<<vZGo^Z z?M>l~+1a(WvU=d+zytnw!*PXsg&YZkWvmVY-rUMmdK@7<tAZ=Q68Z~yF1OUh#r||_ z!P}Y2^x?Z?8hn?0clVZcsjy!tFE(lO*|J@kGwIeEt8Aq6lDYq`J?UuDK&2Ze`Uk%} z40uv1=O|ZT#0T3$fQop>qFoRiZ1rqBq#0%kYDOio5LRTo*sW&2lkz8qT_RI&a)-e# zqH}T{!oCVL6HRNrG=}WpjeB;i#IBmwEcQk-^G?fkzg*%VKT>=D{gOT6FUBoN%Eqlu zg9VnbY>4>@(zk_xCT9yjns~AP0@#}<?PNfE2DV5kUnCfzrO0)M8t7Ch<~YvaCVKgY zc}XP~!%8>j8~A1u6CR{qb`_D01Q!?oM}oEQz<Kl84Dhz-=#-3^K3I~Oto|Hm1M*PX z3cEo`9<(uEBDWwlBwi0XqZ}T9(m}~K=)E`bN|k*DtvI{hGG;ZuAaWWCJ}DsIfs0cV zs#pfOl?*3SX`m!78~p@@1rO-*mWURvdBDrO2&!`0S@3T7Z+;A5j#FIIcH)|BP4eex zZ3!-!82I#Ar?Hw5AU$uT_S2|U=BFju!`?E{HD<i3XRX?mw=-*Sb|P+9^ZgUdVdAJF ztck<oM=i#vm+mD+9l(3?E0G0LD{a2P#xrIKb)6Q{w|aBk3cJ+4H^2<lSqlRLUZ$Tr z@VB@79|-)>Mqfl?BOXitY3@P22$f#8O~1!V%mL8PG60oni{@T&ErjAA-RI|1tq<4{ zY&i^nSPqFY)ZTlPZoLIx6IwSKy)!=VYOxA<T}7{ts(tEHF#Pa4DD*ASy1A3@oH%k> z1$0FCuIf|Hr-?zHgFRl`3yi3f9LKSVg<SC$55T<NO>%CW4;=F>pf!ABYPv#gW~feP z(uz^E-CF9bxkH&zDM|QtNGO2cW>CQb^xitGdQY6pl8sb&)X$LYJoUD4I1`Jj=anMy z8b2)Vdg$2M3-)7_JW404#|~r0t<LD`+bDMEW$72UO@GDscIw+bK5ba~ts{4zmS9mw zirO*lSyYU%CAhc6Ds9|?x(Cf3wROPg#03r<+|dg2Et3&CuzE4q62`)_eaEG|!9--g z*2zSB)-g8n{DyVJQ*E|=H)<b|BNiDMtH$ZQ5AkSBEt;^4A4QnK6TRzl-TS{Uj<>W< zk2i*}*Oh&31RF;RG|0$_U&J?izmWn>gg)wq{2TiC3ymYi{MG*p-01ZkZs4gn;;~S? zp|%PH{QOubwNupdn2=OAbF19(7>;<?$#m#_n>B?zhRXd&AeWkTKGnRj9*A>B2Fk7X z1MSR<<R4P6`+1Ta`Y0Cfv3zv`fV#9RW0~R~z;o=heUk@f2s<31It-S1g3-Mv$a)jy zoL;xc%Zrz|slFMi=gK<txZwci(J^6l96ZM>YBvo#<Al$J9%tZ$J;)d#%c!gEn)03J zC4RrJ7G6y--qTMKvz;v1V4rE<7uRdguk)xVEMTs9=kWMp+0<BDm5&A?rJIu(S&fIK z)+eFJ62LBw7oQ1028(Fl<g&oj#B|zCZiUUn_tZ1Gp;u%huXvIhn4rjZ`bjG==6>C? zN+Nr=0Y%#RQFBqAyZ*&r1X2i1dk!7(?g7e2#CNXBEj;K8*s}QzUHnwk7J*#2B@;)O zf5H~=k)1mef6#5bnec-OPz#5v2+j5H-OyiU_;H2Sn8}b6Ai*H;<ZCa3eQE>+tID%Z z#HNP+^ts&@^EEOPIN-L^IW>Nhz<kyPRvn`&!xSQ%CdRRxoI=PLGJS^*=n1LRDpQp@ zD+qBsfx<}gUCf>Sa>)+$u|){5eqUO9Sr(f%UBRTP7b9*X;*Tpq!G}^xbfw4c6-eHp z${IAkBhm*CV~U*eoDne6%%U!h%kn2>jG~0yJwZ>l01P&($9<tGWpW>lKGS-Y9ZwAe z>JzZe@0oVnYM&MbpC^y(5t4(zH*Rn2q)s{Dot(gO(;dfDPh;dxK8h<(AdJZ@U%w6A zUY*OxQ{6^*L72~va*69-%03*<sX1=vMC&L8D^3<YMLEUGwalT&tJu7`Y}MD{NDVR2 zEMB&<pe0qC_Euh*J(B*VEDz6>agQZ$2{%4pF(WV^K1Ah>W~UL@?H>G=C6g2YrH**? z_Y|xKMh+VqnL-xZhPN{JIV%1S1phzpJmMLMr)eLsTUTrq^f+`Hn6{N@Kg2z1dwq#( zVI7LLh_iRQePl5EwDMX!44ed7D;4tOA0DmP*~W5k0(435vDiv6^Bg+^eXN2!5l}Qq z_KAU&GXoONG$$H`i*srf^PYMoaqD&%THsAI&{))W(r@J($8k23TNaX#<eF<Lkvc)C zLrxdbQpIqXmqy<UVQPSgGL#I$vLDtwZ3S8}Ifs)Pz^Gvd4vTO!ILDpdckl?&rMkCF zDkrOFS(OuaKYssk|BJPdqkJb9_5F6WX;i}q0yXh2OAw{&p*BC-{ffoV2$s`OKr6KB zt^NMIv*cKy)C<=ldDa3D@F;c#gTf|tnUsg@UVo9QwK3F?K!wK)H!=3nuT<d{eN-H| zgQx<hn40#UXfgZ7HQ$r56D6P$d+L~!vozT)(=ei8#QS%-L3MO5np?_TM)<`iJbr=J z7jI@|;V#_Wxau+;b(N>J|Hk;N(5A@Z*xI_=*|C=XhiH$&RM>Tl&WODBfHw?Q^Z~7- zEP0yn*<<{aR6M*{^61Pz-)tDdHE#Y#bQ|6*7$!XhnrF=UDJ%ApW3`Zs8mDSC1I6!Q zu#d+xPq-F2WoGXqgy?hz*6sxE#%c!O&L(0Xj3;6vF2qZ8#VTzlZcT<zx-QQ48wm>9 z0rM%wKtoXH9n5t&u4G>~768@8GMzNd_xf4Dn;s82gNswYBfHO|eJAXM`~^LDvrcyq zMY`A%5!b;|{0tpMphS<jk$DWILhHRiw>RJ>O1wnVrSu!;;Ei^0dIVfbzt_W;$ymvU zRw$BNdKCrJ5^Lamvca1_)YL25${Qh-+l&)lmw;(E=l60LkHQ;GhHkm}OjWs|+f4pD z(1NjRDjNzp6Y$Qoi7s~`<ZPSS3g}}KeZN#&?2Sv)hM#EZS?u~^c7>G3Q(bz_6F|Z& z`kB85YY$HGUSCyiH7iq?(;i+RHQRT0^%0G?{y({v$Jd0_VHL-&Df}3|Vnn<0#8}~9 z=?%)p>7_3T@0Z70nH_xzqVR0!<>{Ep<2w~xE3*=@8SCPK4cyp9mpWYnTZJD0I)-s* zr}*F;ena?lt_*pUzyZ|btHzt$|H_8<rQr}wXZ|r>gb>}iwDDM^pF5V#vgQ%L6ZVxn zjdW+nO8Ju$0T|`S$Aqa#M2kYrtrKW75B;SDuo+6FU^9C#@dmX=QW;KVK+1D_&5Q#q z+{e|H>_!{I0gE|*Ql6v&w71xg4p{-)M0WxlAd3NYU}<H1*$Hw}d6d=gK-r;SbrR+q z1Nb9~PU!YCJGRYt;1?}GU6v+GLDEz7@Pun`*;HV;<9;psXljx|*p0jz+{jZC?=nhj zhuciVz8T-_@rT1;`BtxxdMmN`I9+9{fng6eZhQ$gIqJX_;ce<@K;E1HxZeq#>s$m+ z%Wzn&6qT=AUM(ZwK+bl#xpff2OmS0(T}AfV_+RQt#7wW3JY;v}F$jj5xxV=Ani$kd zxdNefT6<YpRU&zL?s}F4hi-pR+KC@0pNftzsj8>ckhn3a4|9NdV9)zX34IPuuz2=Z z8gQ<?p($5UhBV=)BhZv_l5aK83QDlYxUaRw{?FxU9k5YZm)D`4xhsEQ&m8c;1C<`1 z{R4((3hTtzHUa;swyC24G{N63m4vEAcvW0HOyp$F19rOXG|;>-XQLt^K>L8ESQn4> zvhu(R2)>DA^=Lvtr%;z5T`{o^!#Y9PLmpZ%6>$N2nA&&5m>2Gc=)G|x!3P}4@Qonq z1Lj-gNn@n!%?^+_n%|d^=cS`)jpIaGWi}5Eq0J#!hcY3mFegifhG4XBz0R2Kw#$Go z&4r3)MpQk5kXqmL2aGp)Z`=n4_g3CeIs_)9G<JRZXpv>qD;o)a?L1IY<ZoqM%7{9^ zGLGZDmSXqyC6rn%tn=+ZHV<LOuL$W3ObcRe1j78}S=@QB9KK!sEN;$?<RXZ5w@iBu ziI|JXCnVeo5v}$KLq6|EV$9SN1SH>09RtjzvJHxYGbMY2qzczh7k3W9uaAcQtG`EY zr?!!YKP_3j!u;F$PA}N`<M&v%Uyu-C5c{0D(4CQ>Eghdlpf#wKq*e;oYVc{2K^Oty zV^;&$!!GC5FMJQgP3>dcXEFYW%3B|0-i*y2ys{^gI?B8vsH4PZ-fvUDGA$rsCHjbj z1dj{Bo;JV(zyBj+2<*X|MkoFg<BnC8Yy^-&G7_4iP{=f@brGz+(JYtA6uIv96txl% z#Qu=GBHu~uA-@AOBek%P#c#wT%=--wJIS1L(rz{26qJbQYE9Eh()^}4RU&^n2Nb?) znK8Tfvejai1eq|2<dSGX1T0|r##*;q40!CVLIR=1SYmeS2>9x6*v?>JFC13OppD*v z2i$&+tg_|j@qQtwM3V_JtZiN`BjiBayD-iV2aMFGnrud)Q}>~qy7NiwQ1Bs)0yfo7 ztxApVNT3A&f+ZMbfJ+q1yQ_YkNJ<_!BK|YVLtl90&8`;xxN`XSGJ|ha-|I|0{tg|9 zk=0|vMJGo}g)o=fAgiA5er0l#+xvudNR$;%DSJ)omT;$2FinvP5^qEE=@*Ah@K4nR zzZGcmM^d$hMXV~RST@I|>FC9o@46-S6A@b>n8lx;XpEkb(%aHZ%<^($r}<Y{o5_C~ zK=b#Ds{S|b_g^Glyd#M*$z|_1X3bxgJn`}5tT3wii&C^wX#aC;|CZ-t$#?xPp|{*z z(BRN7%BC&H(Z7S1u{OOHmT=Bkmn}sVBblz;3?*Y$s5}q`-FBYM_Y%0dhIT2A#5wgH zz-IC+mecjLFmQo|XGEeqq+twJZk+p6>tT}Y@fWkG7t79m5A2#`Xr;fte1IEGv>ufP z8%}uxOLhgP@6M1|<vL?2ds`K~$Y1Ry>h&IiYUf_ihX?Ggb5I>e0TZAe=%Vrti?gA) z?m0jN>!0cxS~!{oj+Ec1A}odhmBJXK%eaXBqxFUdXlb2V73>ZhCG%vwEK+Vc9*)c1 z9#kjo^%zZgVPzZip&SSghW3YC&6(=T&aOA`k@Skl(!Cvm)^f_ZCQH0oM7$iFVNX<r zNOTw40TCCkWEamk_I%-z!P1j?`<3IptgQ0^PN;H*Ci7-B-Aq?Ub_DKn685LUal=h} zTnS~6`1CMNX@}dQ_SAfBkdd)oRu*&>PcepQ{LLa4E;V0LnVmC~+)zPyK0I&d)W(g8 z!BQ#xYJXU>ytiNLc7@offuZ?7sE9V5nLVNdL#aqrdY5-82f~TD@dRR2ap!dEdRZqj zP7jY91zWAPYz`-bEzyhx0kf4Q^Rad8;jONBjQeGeNb5`p9ETsD`>h1}7iVi8KU+HZ zM-2u#MS1B`m7n!S0?R{T>1xY?2;}rO1e&gqt~Z?Qy=n$f`YHN*fCN2bQpgjY!n%E} zd=HS?2q4A$JMF!^&7x!UsC!X+$!yz6?erZ+#uur13{UsFFFZE?ISLX!k!XsbK`Rbm zUhk!<W{0t8P&TTCQn}H?-v4Rs`g$<)j8RQi!ZpXmRwe(XL>_ymC`gi*)kQ~+h;FYA zsTDVm`B19!o_J_GQeOvZg93T&!~hUcl=(lO@KBdpGZvVIn4=2ggQSAG^kB4e1?Wz< zPjsw}=<a=HheU-u8G>=8Nr?<3mn}5MU@(7(__N3@Td&7v=+y!$$OM@-3{0G_B9^=! zP_se2u>sl&PO}7$f{n|x(E3c+Wqz&(lC24JcDAjGG=YRZFx_~PF*W-}KpbOy<udmw zqEqeHDQUFZQ?;{DU{ALiOK*@CwprwE5r2$vuN+erD#tUps*3P;`3~?*?}(lJ^=iFo z!K^T~V5X6US^6kDxd7v@9ma0=?C@=U!B+qNEjNZ)FeB!7uZ{HNZHFW>lTX|~2|EOj zqe5~K7#MsV*7*M5lE@GNnQP0hl%49Ex8R*#B8-pCPb5fItA!62GeqPLN=G~dHeq#f zka!#7pD%+}X*;zD?xMEK#{hEEPSV*k=@Y5<{nYK%7PG=|A6jAVo>tg?PZm)RuKr$Z z)S9y4n?0aFj2SM|S{FxRc<XI$_*GF-L)O&FivAcTjm2Y3`{u`@dlR@dn$PodffOtp ze7X>|O)m`|;QT)-LHZkvW!oFk3|bV;D*mVyVZzVO4<O{M?o9USnX1U+<{jTIT$HXo zFCBI&+`nIzykcYJHu#2R99cpTnF?o?l-(Z>fXQXwhllL)Z4cO$`ix>q1)95o)ok1p z+>QSAlZY?LHdX$tHdC?R3*+w@P{F7qvBe0w=^Lu=Lx8Y&=q4$hOe+IFvJ4V%?`0hV z_cf9iK{(sQ8-BoQe>Qci`cXInq~9FonMYcD<j_d1tX-%M2c{-kkq_UKr4f5Nba}#( zduP2XHT)BZ5_lg)T~*~hJTSqeL5!%4q`wiS&gQs_OKlB}EXb$T0*0<~Y|~DfA7{7A zZUSkkHLe+$-nzNpix&hgW(~EuP6tF#y}kbROI*v6lMFbSE;#I2r$6pCopTYix{7eX zRp35LhhLceE43fTr*@`)OYKOT9j`o<VVu!b;$YcoR5D>R8e>)uCXZ|Yzxkqh9om+6 z0YGmA?1K155N!$yfp05DD$icbDak>cgM3)~P=PHTDn#cL%+34zsxQQF-gR3(E3oSF z<zQU`kI{XzsuuEEQ3y$*W=(PU^G|{2Ee9gr@-R)BoyVoF^-navuzf52zrQ^Tf51C| zGxUN`4aETC>CKg#lZ(4`Y8aeikrF6(+2Y0YD>;~sOar|j8lLzGvLO=8=H|j@ez)c6 zLt6>(ifq4J(lsf<mH!-xHbSf)6R=xFi_kCnwKvzs5-@igA~~3mxZW|VqW5+$Zvejp zNj~~pC5l&wV=Ja+Wfq+nfin;eg=?Lzk%!6T#O(QIsf|17dWD%V7_A|2kz-)_p|DpD z$P83lll0K(MF2PTSu_fPYjKaaJx76d5e>Cv9i;fvfGhD;V2i<$9#3g`ZaOiAT;zbC zGAfFC)XnAZ)+t-y%f|`7EZ^naqM_I<6vQU!)~WA22Y*1d$OBv{vaO%F(1wU9j*4~^ zPug99<Xt?D36?V{c;ft!9SrZCZbF}mvFp#i@o>C<Kf}Xj?Sy>{!QG?71MWMmZdR)| z+|>J?yZ!TsAYTuoL;rR}@cKJwS?TE=p{3}fCB#A7Onr{}_ulVA!Y!gRdF^+;us7U- zqYY%`93}n<e>i;;(a#Q~94Hm?@RR7+qP>-4`H7!HC!2{I&^aVfx1Z%T{#*{jiJ)F) zeUAuq^TZPUsiCE3r%gDXEzinriQ1iXx^%BEEskfViWJ6Qk@qgZl^6S=K%ga<#)nib zJJO$|exE!x=dcYmU(VN1wgA-aQ}SNPHC6K~A8U@Ytmi+HY|!#k5vU8Oh6%h(@2DnE ziTI<CeuAVJ3*`6ihc)Vhm%uA63w9zu5tx8R&5aM-i67Y6ZVQ25MDa|)cT8lp)A_M$ zKyu2ihK`f3BGqL$TuF|Rp8E2M!B2YDWvouU4!R$|eB*I~HF6{+Q3_+R9Ij#&!DK!d zH&TAPXVAQ8KR;a82JG((25}*%rJU#~&PBLX^Q$zYT+p2}E41v)<iGL3Cv8j7uoTv5 zM&Q6k0S<DGdTqXYZ955MQs;c1ss9P7AVcyE{y)+=B!a)y<T8xk6oWBatC2GagP35| z;$nNnB4xFGY9!#B#_VHqebhxuU-g>UYA4veAkJwd*hd$dMJ}~6ICN;GwEjHNn{2W` zcy*TP3H4MI{hFIy{hV;EjbgpY#TSFdXw7Jvt8r83`lj2gYDQ-7p=#2GDCO{5A-h3) zTml-%x%&!K_!>q6UG#Dme4_L8R<jW2?9tjX6=;o@bW?#slk%*^*yC<M36jC1Eu*Vg z-YLFzGEv;K6pZU^q3%$)`}_-2kY70Xm~ywuv6oZ@ZpWYKP85GR{y8Vt)!eIuGW4!f zn7Qnc-UF`ySGigeM`#S~edMdNIh;zwnDI=866)InOD#-~3BzLJbZ+Li8^{1zrn=>@ zXwIY}cDqAcBW9PX>B=hHtdTmlgh-fqDo$0qs!0>f09zstrxNj$sUC>q7t(56+u41^ z4wJM+g1(=M#Z4a3{{B3W77WaPCH%+8=6}(W<BYKc%HOQ%i$yR>Z*~vrHHkKeig@p9 ztaodRHSD-L6LZ&SbeDT9*t*wU2%7&(0cY63`#fV~#C|a+zN$^nIyq6?w_6MAVYG~U zTtJ!!guDm|k<=<vm?G-<cu~if;#YZ#v>@W@Y&jPsZ3>SnH)w7t`EBse`=;GCtO^KN z7a4(q*0f4Y<oJFqM2yp_I&>A7!#&0A(~g+WGQ)`{XnUVZcJqN5ZflrqsZz1+h%pQb zZ9(V!+{{V-0E+ww|KJjVAXk=~HLLI%NaX{ry#n>x`S<%770$E=8+oq1(g#+?JPevX zy?Js~7JzoOA2pX}fl3%nW9a<;GHW|O3GbyhSNLvAW&v(3e<@A#L}trlyIWgZ&$i2c zE+8hbB<Q1asDXs=zuMK|yO2$m!8ZQ?ZC#~<bWAz-aNLD2*3`{UC_|+CR0SrH5|ihC ztxfRdTEE+1vRz$g%7Esw^HT@#Pm~j_1aaY4f;!0V%?4cruKMYj@#~bfeQ7|^C}@LW z&S_YJtJ53+&GfSaAy6Q{=w%S}$%aig1Ze=VC)^+B+L~olQQL6JIT5Q+6bemJpy&Ok z8-V39Hd?X4$koy4>=@*b$HncR;BE}VOel~p!u)%|TRd~+eF`dyp`}6U9YH1ERc5;L zM|$&kb@G^VnSuzf9(Vq+8()aqm3;=KpvL`<ip#=a{D{af!y~6FnokE{5|L@jGlL6) ztC)d<Bn!}f3cr5ZY(Rox0POATLg4B4ULE`BNUqGH4~+&++6e+?A%_^mbnG89llG=7 z?szJR3(DBmu|^xSx0xy3%_^DXr1TSYU(FsDz+k_Pt8<4dLGrth#_qMf2^>HdM`<iw z<{A(;1v;<`&EkqqSvHK_*2ozEhEI`C)Wzz2bjr8aEf*vdztg7v8o&}c(HxL=DzC7p z0b*{mDyjzm0w@U1p;2i19}6`QgfgdAj@gu}xefLHR{gm*tev=}e?=NeBBpYCFyDvq zJJj83TOFVc8rh+@pc6ayD0H+=GE~|krQD>CUX-;uH6#T?Vt1|*t&pe4)8f%^L%dES zE&d*bRMwu5H@Ua7ZTcb5m9lW*++A3sO-Mr0S<PZoZw|fpK_Cu+I`9z4@&}&r-5Lh6 zLxW~Yg$8zYFt{qyt&7}bV|nIO3mL6kEAOYCVmrku-kcEVl~JKZbJ-nc5p{4s81j1) z<^2^Bvb2&yHVvD5??F$4MyXhy7&|?(k^D}>CqR5O`*wa4h|>|4nZ?yUr+OGn3pN6< znKL~g({uk53>im&Ox)b!OBiH@ojD8E2cB1A2&G_U#LThSiN<|%uEz8@&e9d#em%he ziW!l6KkiEaOa4^YAa^H&986MJYR+|0>F(vEqp)QZBQ0|TI$9Brf3uK+EsShUzZJ7w z{#FCtM|AdqhjR2G_szo*t_KbqLrLL=@lf^SQwpzS=~w39R)B-or=DmESDd?7JE+>Q zL`F6L4P=lJMWXy=``_g+q=xz*mdvk@KJaZz-nx}CIVzevoOjfk^Jg241DP@_#Dny_ z?nWebp$y$G^>RL*nSc9${hjv9eR1x_`z1-l&=!2x9;hqe;))@%9kQOf;Y-J@DJ+!B z081Yr5L4wO+F`&fSoCA_^ri1+)CyhT$a?@ydxWMPL2xYF$B+Cb1Bz>r9NMSeT=@<Z zXk9J&qw0zzNfL`K@~7?$>9=Pg8U$Diz^hxh0?A1z38;9qlj1Z5ce+l(sIGjW&Hc;V zOfOb=`kDj}(7@Ftmvo^1^Jx6(*9Y*F$3=K_hr|oUaUzq0^vHSMoah#SZq2L<OHiKD zkZ^S!zMCQbW}KTH$K2g4S`r+Ds~nQD?_F9CjB&pg7%~Gbi-Rzg&{s|EKnm6mnQkDN z;ASY~>;MkxK1)<<a!!g9tw~DXOi1d##rJ2|+mu3_wa|vC-mbPkml9aeK9-U4e^(X$ zT4BGx(9k|0Uvj=-l!QWR6_MklG(@)vMKhI)eO5I5e=8Z>%$qyVXjrO1m+$dWuusG? zCDyY$ea=CFi{K)tf2#zY5ot#%#}Nu>1>pqJuzBwKn|xW}vIQCe0$76{`*t-OSrO|F z*gy!kh9Zx)FD)w{=v*cwd?Jzzpn1|PxuTDluyLxR8HB3p(p!ry`R3NsM!=mP@Ad>@ zfGJy``H9F+!8B&y3|KoX*3Sc}5y?N@h~5E0x-ty8KV&MpC1M@N4>N>guT1w>7y(uG zS@tQQQ+#=SNdTMgbLr9iAS^94W^V-aiGQ^c&?*UV<+w~X@_Q7iaCfL&1SQPtej5R? z?LazVbC~R~(dB!8kmQQ9C}y9p{n%3&nMu5H5$uNzJR@j<sV?(;B_{c#;0II(pHc#? z6!kbxVDGwpdkZ32ETNK)!&N#T4(js=ZYGP*6@}JWB$m{c_l$H&qF^Zv1HX*(Zhsab zKu`Eo?)Y!hmwyP_{)bKEXIT66o;giDZHJkS+4`>3=*6~2VnoTMFtd&HBG`qf5qt2E z)E#^|r{*0WC)Tjqnk4_ky5*&}#OjZS7eRlfMTm#3`B?q|jB&?vNjFEr&+q_r&tZE6 z3Jz9auzH7%@-j^iLS_5GF)e^f0j*tKD63@(#+l{_&X^G*mfw`{yf5xH1?^}N#7{-9 z)UhRJ=t`48h5g1Cp<Q<1_UvO2OdWZp+`SmuK+!jbc{Bjy3f|y!is{S_#i|XvykV+m z^x8b37<44?P5i*pK$ZV1<GP3&vh=-bihEU>TYry<;1)7Ku_$QWCo%ne<`dwJ9I!?} zlrawz!1IZ6zK!|)UOT<h*9S9S?mj`{sF0b34cX9lGAM@1xi>o5y1yKtqUdZ(!w2lJ z<-j|@?j-MVYN^C8^^X7ZlF&v+D%;M-V?ArzDWEX&ky-iJA8+XY-$rxxk0&FxdQ<)v zzI-;l@Wk%3So`k+2G)|c$#)?Lh$tDUL%hQ?3?25RlrMxpXO%Ur{yniuR3(!AhTI<1 z!?&x8tAW1G_z}ge*NFi+w`vZ`Mm~}Nl7El{5dLrM3qKK&{ehha8l_Xvh&o(3Z>)LZ z8cazukO8T{bP9$6fPXFSl5tG7R8m<0^+)s0%s7OpUt3D+9Bq!{f^i!umm6d+MW=7~ z7=gY_atb_>I}KPz*I?;@3%1M-a&?9&reA#ZA=6|@F>g%?XC84ifsWl}=&|sJ*ToM{ zLs1fSfbx{j(;euEVV|Tm+p>VBb+iJOXJP*M$f5wQ{UPyw1>*2;xWxBSwFY-EzOUix zpfLb&TJLmxpAds|ro(yp4SVw}G3Ih(VldFNh@OA{yQp9at3iV;n*TW1`b&EH0qc*= zn-;5KR&DQG9{P}a_C_S8eE!A$y~sVV)qW!zP!NzpIeOQ9Pq3~hXTDwm|6}R6vsas? z$6{B-FjRXuPJ!I4qV&k6P(-ZKcl<*Jegf+_(tMy|KYrnpXjlzpE(d%|e4BXOOTL`X z-KUFTq=rF!uo~)}a2$Z<VbG)aQWeP)-Pp%xIIXNl3Bany_=}}pY%*YRMN>-g)<8{w zK-g2;Kx^m)xT<Ztny{}y7Jv{@j#I1fIMtY{djoM{ZDnpwE3APqR0-iIu?vd6h1ZCh z31_$ww{AE#-VwSibd3!4Rc(Man14w!bc0+6&JN7dFKjpw?*(>-Ee#E!C`8li)LNg) z(&q0LX!dIHEjtlzm&eZ5$}6CAkGlWjXO(5oi`tDEU-_PWP|HvsbWAb3X~v3x3OE9w zri0=0EVxP6<_f-BJwZd9e20pbxLfv4r?#9Hp!(r*o$V0;n88nM1@FU+r)tSC&EnZT zU@Q4w***V*ltI+n?F+XBt#7>c<ac?XZ{O!)_*`qhcO>d;=R<ex!o!e=5fP17(;*Vs z6WsP-zbXxPM1F$DDWg<hs^#gvGeFC640>w>p>8<PJ=f#1<Jvt}abU#x8CVGF@B&dQ zHOLsY9;|;RfRKNRxO!2)4`a#IJ?bzSWGV^v-w1#we^eTD8l0X!8w0^nmxU(b5hxym zMWbr>7^Ff?C^`L(lA^Uj54iTET<yIw02a|Wp2?*tX=sKzfbsHOWRhF%;bu1j%*|Rd z!ub-e5Ue%{tA$9N$2fg#!qk)lFzzJXmY=<>14?F3?<WcAg+_r_z_V<7DZ7_aokR1b zOk+vl>3cg2-+optD>$kd{ZVu?kujk@>(l=vcMUQ-A{E&;l|aTuPZP=5q;b_0<(|yG z*>o-4vwth4u7<KNYTl&Y_?4&wx$;%`_c*YN7tnl?2r0U5%%f0s#Cw|P!cp<duJ+^X zu=K|n#cgoS-t6#Lntt)S(?;bzE)#1R3wGM6vcpy<u99HPr49E`wL03{RENc7mAKWl zBq}*(Ij+M=R`9zU>)KjAYD{JVf^Vk6q2@yYj(2~F3oK=03j17DaV1mSU10YbYg0{o z!{qmpxW7Te^e4ETjUoIvSCAzQGmCer*1z2j{^M{waW~iCapQ^S*r={x7()a%_j{lP zTiAr7FByiHOd|NG4ID@gdH9J1+hDM-7N<HjuH}i$4{-6lW*vsbLLc5XSoQi>?D57! zvU2}hWkq}m$$u5T3<3EsP2CV1GsWv))=6xKdRLyGBJMxV7Oiiub@{nA4d|4>(S4`- z`6EC?;46dRWkv)qlh=Z?WMt~C`H5p&Ua)kdxrV0i01pzEE!)n+4zMyXHmhEr!#%%2 zj6uL2276usXPk)5MHC3g8023IHxywcjT#U;BbC}U>76wV#2ovu9t7u?`{WZgjl&s~ zQ;O<@T7p+Dg2~kt`MP@^P*SylAwu>P;2fC<p#^>}4;7~l5!ck0shw|FN|6_nJE232 z4ZO>}wecQJhF?=^DNY>l4ba?4kW=h>=NlQIaN=D`KyA4(P52os%SL%k;}z3UuL`r# zK3tjISdr6cyv=NJ)`IhJ{K8iJ?23EE=h-!v&3pX|3?~^q7Q^Mcs<<Kayqe*@>D516 z_eAk+f*5cTSb<iVpA`iRt>9E_kPdLNfn#7gRrBSrbUcC98-^Ju_&Vrb$6cS^S-JT( zbXMC}3t|_gQNC_H%=Uc4|8ySv=?15HT~(P(vETn1B=<^X_;XGP@WH&AKrYhyQyf5^ zMgWd(T9$1h6{<}To2wAt<8@r>WWJ%r+ujnZ<wNOLO7g^;iuQZohZ8~ZGYcPl?i<0{ zYKzfX_eGC1MJ7Hp^e4rL_;Vek;$%VXfKm^jnolt5;<1O1^2)$|&7CQ>a;BheZ{(DB z?FY;Oz=e3YAIdC|-TU-Xqn?0t@cEtXkOggQjKs!t?sB1vJ1kIkiP+f|%zt63hr!)R zNVtw}%^(x?^thy}NKb`H19iG#Sqb=F$pZ^%P;-nkdFbB5;9!gP6btd-Z@O;{%eo6F zgS$;o@P<d)o~mKFo7Mk=zrK%;Pc0Nicbr6L8<RLGz^>HsC@n1q)@e2hSjCp_)1k`K z%NX3!*?ny3_%R2t1y+gj`~%wj$>Y5hC7rQ2^VQ(k;!mE6NPepNjZT6?$Ir+fdFVZH z9AZZcQWgl7CsQ0dWAplCz#zc~);&be5Jq4T)y8uQl*4(V0%cEK{80&|+!A$`dD)v7 zKDE~pT4%#0+vvS3L5!W^=v3or^jmXbC!@tk>+fex|B!Au3h5ew%~@Z$@^J}gCXS2A z_t@L9kRTtX#pz6k!l_m_^xAUJ3(vs2ax2bMCpx~>tO3gwg_-0*_tW}Cny{ojssF~{ z^9x~(YXx^EG{-jY_}44wud0$Ez~4rW(X|~1%i@pdgz5*V^C?xJ7|P=xGq9WN%;JGM z^j^`<4H_t8bJFfbY$f&u!dSsvvEOs!tv#-%tNa?McyR)1;sBqj$ZaK)VE=yc9+V2S zP8{7}2D#b|&yF<!yNv;Qz&N^VVPDZpd-kkR-(@?hQ8s9g(Uu`o-0#o%M@hN|NtSHi z1dh{6A~if>-iy$dy#Z^36(dmB!s*$tftOP>H0?Xrc)UQ>>xdVUeG93)(IDL-y>zir z!&iT<_egrRhN+GJV>dFgq=)S1cGgxZyJp^Px9qvgdhF6fQxKjSPY?isf6KR830)fs z#6{U=ss|>X@sCRH!==l+cl!r9bL-ET=73O{|Gl6LCZr|%3J8J)hDk|D`3(H9jbq8B z%?7nZBuLiRbj8SjN$=&D-q17w4oNta`x)AWp=oLC{%#PQaQEJFZ?Xnp9DQhot@LB( zYIKn{hD~4B5Wpe@_gmofo`Fr^cS5>THrtynHYUc{x`~fn>X(!h6qMmb<%@sWxCpdz z|I6`&K^^oR`qQNOT%mTms=;VyVdLetLFKyj-sP?D2^nWO35My@v}7{?&y&h4^Dv4B z4~RL1V7EWcHg6U@!L5AwJhSr1k^MT<>ycLsk}3l1ZV!od3ERD1&T}nWrz=kJTY=?` zdpC~*1Qx1XxgM(4@4gmpKiSeVmGrHGb(E1P*UbGKfAZtCKs!S(B8GKj7GH6dlkho_ z_boOJl~*Y|7Lup893wj3=yQ;R&a`(Wx-%k{O&8F|5x^gMwZ9KN1Q;X(1GGe;{osba zQ4i6ZzJ3rJ@aRz_U{(!qq3Nw)X6BU)8({_fy1xih04?8HNqYi9EXn{h(ARe;Msph= z)mxkTFEpD1X3f)@+aOy|3z%ll_F%;p&DvXrbT3Mst#6FYH-bQ4rtZN$zTIvc8~Smf z;B=`Y^Kn}fYbF7c|7FGF2?=?dWkF@RlT6lqrMByf7KQ6jI)&XGqqKYo3@mf3`;{zl zQ0syLU5?@H1XwqZ1QM8N<R_<r+cR-B&hRlrsGElZvb-!^V13CLme9Vc&S)FJdePU! z=^L^~r~=R!e-rS#0>{Z-?b(;&O2E(@B=GLo1T^o5x?SjOj+Yl{y!4oj8{NNBHze`< zqEPdXXEDnj@nF1-9w#&O5g#Wh6l`{cK<lfV$_bovy%57WYiS-CHqWh48E@i<Htj|q zMS3NsJ5KRXRz$U=#@naTt}v1PgaE&1n`#$o;C`w?53t_g7g|o5Ps9QdO=S~4D52JF z;tlzkA1@tCl|hEVBd1{j;<bvod76ALtTi*=_9xz`x^(pYB{Ic)n|#$^PF?X=D9}%K z3=kbS5J>5B6*hKZ{jGLDN|y%2tE0dNPCQR{p~7|~C|TucePUn*fmX-MXlVEVnkcPW zH88LrZ;^%d=uyoPdIdUh$2W`PtyKfZzZAOqiPr#U8V!VPi!Qy*@#q34Bo=n|+JWN^ zISx~o(;>^o+K%nX54qhtP3rLWff)Sm9G)oueOet&aEhYf$Gf{f(fGXUz3#+s+IST0 zYs{!9G{;M3>?@!@SY{8Cebul(4W8~N0K>o4NCvX4R0j$n=K$3W`~rZ+wj~IFd2r#N zBiMln=AhBk$Sf?<56*&?VlTPK-L;#lF=Iw8RtCHST<O|n&;M_kmc0{Tmw@hp58D80 zkQxIeq68bHUvy6v$*$ctBZWtO{o@lR6=&xngaWEpz%_^f4~6qkbIvfbAvU6LpL12> zg_)EbATNPq=41Kdg-;-Om;WQ!qqw`+xTok@T*gep7DvEEn0;u;GM4eSLbsg^H)2`4 zqZ!Q-K{TP@X@-Fr?5~Yw%LlyPgppvf%}{j#+?9_jk6>W<=|F%x?EfPKR?I$0P7R!e zqZTLH#UsBPrID$knhmaN0Z$Z=&KrO~0=Lsw9L|yiTI7-c-Vn{B3ao90dVK>VU<zHk zWk!9BK&pPJbF1Ub3~+k;s9#C{ksvma7s__YK+-=V7o>&?uxaWk98`zH%L5hAcD~^@ zk_FvHnwt#Xb~HTa>(=?C6YctnaxP|F?%|OsYA1zLZ;np=-A^$*C=4D(r+zBnU#C9E zlT6W9Jl=UQP~;;b>4Awy^@uuEXO<BS6~!vd)ET<duh#=0&H&$vP4<Yx4y>RiLtg_Y zUQ>1-RalPnNoM9(a27Fpjx75hOah5XnfcKsOQSb&84QAG7fj^F-b=-1pO16sX6nbD z-9DnA^-xzl@btAjWgW5)YtLW@290u?KV8dK*mof|G?0?59_GCx`lmSwT8r(*L`Gg; z2MD>_N)))NS@LBEcMj1B)+Sys@bUFM4@0t%M<y%!8%dD1-q}xFtb588?UCbnoQmp| zZ&<98gVs~%tDnNkY_-J@tW7~2Lf*Lk1(P1@0AId>?UKVI%QTsep<2x_@z1Vk$^b*9 z()#mef42}st8Y;reN~0eqp1A!zE6y~vi(4`Te)R*y}Z~dTK`(UPDW;DhP8X)n&O%? zO?km1forxjp6A|;a!xJrnH@^My+%AiL<=a`GU+};uU&W?f}5a2THUlZOg1BCdxqDd z{dIUSmcsA|0|V=R&tq8*VUq2+5hv8@e4NgyYQwOX?-M_Npg)m*sqLj8NnH)BW%IYz zHeSKS6KB#uTA1}ZqXI|w6mx~VsM|&WeQAN>F{dQXvMsC4LwJdCq%eGDvG*scI=nv; zosO3_l5*c*cpEJ4g!|Z~#mwiCQSg=L0h>m=z7G4K76a$YR**dOuYsv`O<P3;91|gD z=$rFhL<9@;)5wsVfBt9KWUZ@v!lpQ5o9L)%bNEnNL56Nt6o||=7at3K$o~2vAVcOx zn@+e!mzu+uvg+gA=g*Jn<yU;Z<h_R~53wX;#huiNKLZ#>YU8M{^;ju{o&(zGNA01U zKMR?H94K!4(@>FJ6!(vn^0@Y$quOOZ{Z!d)nx{~pU*Wl%09&4&j_IPVi)n8gT``V| zT3dSG5j^d=F(Z5xMy|02Iyx^PUnxTk{-%jRY7Ew+0b_Aw*QVjTkW~L=;~AUAaV_!J zXvu{5w5We#$JTAOBl*lh8C6hq9Q+h{M(^v0IKTb4=3RQuFpQ(J)<PHf<ECXdLvK1H zVGCowYvx?)zR?HYRP3bT4nqceWjKL121hvt5*ERx8oJFvf8XZ&9%QeqwnNTI)w8Xu zQ{NTUf9%7crJr8JEpB7;PC=<ZT0gWia=LhE+c$seGA=smbicy(`bMPv)K|3*4Vppp zZ$`*n2W+cbS}NV_ts(#Uc#_8(q%Q(#m2`$ZM2lvQy$z<1iGQ+a5yYAz-u)a|i65X2 z=aA6(F}ZZ?;&_)>w@2<dFYd>d(i<&jdmze($VNt+Z4Em_kQ_T}?%_vAc9@uyG<vUD zVZ*vSaUNJ&&aKb4qUG5ix#$c<6EdP~to*3*Y{Ov&2EDwF5>2lf#IgNoPm}s~Dfq`W zy@IIMb}3Bo4Y>_Uj+lAksM9K|K#NPi4>u9Q{+d$gRKC35LI@qF4(0(H)Z@0!UlHd9 z1Rx#R7ltt~#lbl4)tVZg{MpGAlu=y7`2v(Kkeb+~r<a#OQK94z?WgaRifG993iN-t zZ{G~+ILvmNEf&0Ks@*<UadxQl0_Wu2mL|v8M(+Vk+S$38`k|hLzWjsU>AcUv{g+l4 zmw<$GPNiM=53ryd)ZgX2Jn(k}Uzt}*1+?YnI8`iUm3v`A0C79Y@9VRuLH3DQ)n>9y zF!0gAC$Vb@5wUBf8;W;@N=M)JKT!<sRDtFkjpz)I@)@9NhLlEghiqkiD$7zhUbNtx zt*^0{Gczg9`QB^@eIMT?OY(?UiOFgPEf2r;+(tGCruvsghfm)d`g(@rr~QRh<MmpN zkxwNyUbkP{9fNHj5Tc&Nk8AIH;k#GizlzIf9>d6%c|K`DOURFi2J^@J(0T$p4?c)W zHNs71b81HCr5yX@e*aH2gUZlXOUljg&%xrdsHB=P0w+O&)!!C2KRTkff$2G}iEH*f znAjLEsn?OoGsmz^p`bOee@Weyg7f0;llgw6;yRT{phiTBZ8F(HrnIo!#XU7m{Kbj| zLEUJdwEWv!J1V)W1$Sa#K)~9!(My6!JB(B%Kzzoc)MMfj(%46OGqSR>u7#{6&FdSX zlL1UB7}1HpE)u#;6)-POtgv4l-_S%$Fh`NI<7J>U0ua!wAH%%Ds2_bN^y!nDgOW3z z^1`$9TO)_oUK%xO<d?Xwy(?JCf1y@P0xwoMTLwB2w3Hnk!FsT+oPkgJz4-gMV)LWq zj+a7awhc2}PFo5bP+xi$jAcKFtmwS+y1m6ay=HsDONDN3?+iwgSB;Di9@yZQ|8bCi zL54~s*Qt<RKVScalsJZ9Qm?WU6{|ax=+m0wKdsEoeTL3rIw3nt(O?vDjhLRLKzd^t z0<QEV1eyn^=<_t6hq^zwo8x2eP}Io&b7?$%q>NHMZ%=^}Z=0iRx&gKTw*_462ymGb z>9PA!xm#;yDWtYm8PsH+7wipM@E|8Aj}UXXJ$ADz&*I5wHk2+R4$b>eq3Jk_X5iKV z)!ivj`T)z6dg_(ZY#UTn$m6%5U~(Af6cK0i&ieCf@TkX2aO@+dwl_a}tNPGgU2>`) zSM$un<>MB752`+*7rhAk7?b)`vrFLVoqyl&;MF2KL93oC-_uhdo8o#hdy~Ez?9-Ln z{3&0!M~If+xTS9ihVUwodL0sOZMk_)sR`Zg2y2QmcrqxivpS0KE=&5?p^(5W65l{U z__6bqZo^xMr!dTRe)^AL_D?Q+(e8^cU!Xk*htlRI=;;>iJddj=P(F!^dwQWOSfzZh zZzuSxyi$m2S3Qr#-itfgfUFCz?5_c!=)TMz0;`^)MBly+>HAC5b0y%}HpggB*<uoV zs?a(%igG{o?GcyU!l;*#F+)A_vUqj#H%o^*y8QIY1tT(UliXc@;^%StEuGLIor9x~ z?<>J)kQf{^#fN)F*p^MKAp7f;pCe)5)UMWOab(k!{-I($My!!wvUPGb=`hAw%&Kf7 z%dm_SB}^pra4<Yp((N)<5{e|uHl(cBG@fo~6D|WODy8!ab9!)45CxUORge%vc<3?Y zvyuNJ=-|g;kf=m{PQaLTXBk@fDnCSwN&Dd=)}by45Zo8XVlDB$v?NH>*LJ1BBL<#0 z)!Wl2D(J->FMvc^y01vbhE40c1<iZ+vH`tQl9Q8D*yq%N<8WCRRa0KM_TuNyduOiX zfrJRkva!-$hF1OMXGCp>!yxvm4t(&<U&)4M&<`hJyMi-7$?*<MtTr^7R)EJHAz-Fn z7b}`eErqo0mb(BCkgpkhWU;lS^psM;=Ia36?<5I#8@0{w=)V5j-G)`ntgew4mc#!a zYi}J_b=JKN4+x5)(jd~^ASm4}EiHLaN=X3$=@L*x;?O11B_J&v%0fzz?hxtj=J4$A zG3TE7z3=_RKYW-E4xGLB>UFJax$LVeB+<kXx~B&oT@rm$X8euceC2SWqM=vRar((Q zj%o;!ux@D596<x|dl!B!Ds-B8%JWfVZJLIo2qwa88Ge#KrhP5**$mZ#9UsRL>6(mT z40N!BFY>d`a&%%0TT8b+Q-X<{GMe8T^u5)IICAZLD<T*UDSctmjW7=a2EauKag31T zU-<6WB_PL6``xiWB@(b1^7@uFw`etXky7L~;Jb(z<g{HWgkkV&;(p{4RQ1%K1etIu zrAWY5h%azIePEAeam3$h)!v}%E9Eov+x`4143#ZaRkb}I@wwUhvRq@Tg@4q3{%y*$ z*jG`r#q|Xh5Pv0r84Upc0a5C`;d<#^Y5>XvGAluwj%78Q??WS3`FAHfo-tLm%v=|y zm)$Ifi_a}lmQU-Hfdr2m;)(U}yV<73{8^uSHpf1UY(KKxdN<vRcMhBx5GzGLGC^&x zz+JzO(!T(d{ymbO9P2PLn}IU`o;y~EYp*iNpZ~DJ8!wqUg#X6EdjeoMU))RBGG1B} zw*p=A_Ufkg3%_3+%@qL9=h=QoMyLu6D$lXvC#+x#5mFQz($m1eL`)0@2*YgpjAGeG zURK-&_}#}rLGE7?4Im@ChjI1BJ!+sZy>{a}N#^{~rQ;KqWSzYi*Bz^!cj7T}S~<ea zXPynN7KT-?fd&gSzkYh&tmu|rdPau1@@akd*O}Q<?FWEjVB^9S3K{Oh&W3Xxc5yqw z#P_zWwX$4mw=z*n#v2Wx;AemU75uCR`JNOpFRmQ}tk~*vyN`#m5B!;pzh)BPfP%#% zU-NDQ$bc>2$#5^wUg!8Dxf=y!vuWXv|8BsZBWXMGo-dhAwC4@?EbeTsjft*~H?YqY zb@a?`K1#5Fb7~q(k9TE!QdOL}T1d~%E(LI|8D8qO08Seu@(jRLsjp#<dv2+$P{I3_ zgD<<wyEoXkbE@T^Hn@C-BfbtWNDuSCMZfjrKcQ;`6%>qpY+Q++PMrk>H<Kaf#Vs)^ z#W@|0GxuhdiToZzL;i0lIH0@5piBXokCz83z-Tl;kE$nUG6l=emWlv`4)9HUka4v= zp#{7mGMe3f!H^xqxc+sef5NA?7b`vffnNgtAHfwsh?Rc{e)lVh0>S~+@I~A{r_ZEf zPu#vLqg3S2%i!_i!iyWb^W$#VIxPh&;$MbyueAca)ez}NI!QZ#@88E5uCj;F*<bPv zs;ro=*HchV6h7q)53L1R-N)k$*WJ*x*lQQkYGg7JUjklx#@jO4ld%#VOa(1t9(&V0 zIPNV5g)oPLOZ+sr5PvxO$t4pcRBHM&m}*Qyr+VmR5X=5#C=Kf8f;qu$8E5<NXXWk| zKm-3HzOO|oBXm}<1UTNtAps&60l^;X3ndmf>!*L7)#G!AQ3{vq8Z7#|o4O=oz5I17 zDhEk_I^dOC*axk)wuhaLYd7(cf({6E3nrLSpaUD7;2<fw*Xdp2V0*A|)D;x=ZTGpR z<5VN<3Tbs&MMSTp;6*RWlq0a5jqvm~lU%|hztKLc)|B-Jq)4Pk_f7@h)3pdnTr6lA z5ZdczWjvsS*V3S*R`w(6J!(0=6n-NswK#Ar9093SGqij_HAU#WdnkzJ!BIcRXP_Xm z7%vnO^?gp&djKL7E^Gds&Gh@R=^=9{c2(>@D@Q}tE;|z(j!PZJ3JI(!(Yf7SWliVb z7_5YDHl1FIc>Nly&>4WRGC`~Y2xzQZKmiloJrg2pOl$<5)M?P1g&5FAvXQf79A?My z-j&uFs+=!|8ROK}BBon36#ODo<wS$LPXM?nB$eaJdzIG`^@(YYOS`tD-5H37K6OU^ zM`<+Zeqi@BLxfIJHB{D`MY)<-l&kT@Lk|#N<`8dMee&uM)IY01*<TN|2G+X1y@Fvd zJ(<EI<M)8@^dz_^wb+m)y9ydip4_Bjf4uiolvW4-U8_O#vYQwvdrU`S|Ka#X3GECl za`Iu*>BCc?$F1j1<l5loWaMWJ05^rYc-Je?N`i}dxd#hzf_Hy_xjNCnMFQe^P{eBm z)xl|ifZ+=@q!}{bpS0^PQXw!%h-CV-cS3)sszYhG7n6ZrNt%udv@M_&+u_8|(ijzA zn%uLk_TI|AxV&3gJ5VB>ewfaU?gw^kG2GHgbVFSOKICy<e7^>DbnLl~7<K93mcF() z+wf*kM**ucqyd9G0}TxgJ|Ur5fs=DO(#`>zo5B4UbJ-j!4svS@h#vwFDAm#jW|YN1 zxklV;`al@!ul<WK5EFT+sTv>aSQBczteI{$Xeqml@35E7uw-`pfyxXxbb>By6=2VB zF*m0#M{-gmwRwz<C?!tzDo6o(tT*K2lv_vU{TF!|G;5gP)72s$_JBRxM_%QYTEimD zGt%XRAs9~($kgq{_M%(k>RBXZ*uba{y{2ItrMh}`(YY1GGlCCX5U<3`C6*BCG2_NQ zXTO6&_Ol^{aDIzYh)}{?r&P|v`~($a>YPSzA|}DIHHB*wmk5|~iHR9OZWjgG9tJoN zJ0>BQ@u<t^r`6zd#Cv!pQ2ZelV2woim$-kL0iVyDh6e0k_f(aJL#wlH4b8rAjc6tg z4kM47VdHO$we?^ZrX-Ilo8wZreOrdsBTEqU++?W%)(tLdK+K{c(4dv4rN1a*pnbKs zFmk#F;l1%PS#-BxceHlMK<QR%yMowR%K0Q<qdc9AuEgwNh78zJldy}sRqh!WWp*0a zyPu+MKk+>eec}h|kdba>IW_;u1wf7a7v$(jNWW+KtbQui1FikflguVwh&oQ~J5+n` z<iC$Q-f5D=l~oHC0+s~YT8o#z4YBtAuz<d&sJ6#-l;Z$?Boy%W;TM4Y<y!;GI)h@> z?$%NLuWx7V!dV3}=2E^u{`FdQV~e!X^n~^4&HR_-a3%xnsLt30H)tmu0mtf&rC;}@ ztE~yxBpise+B-u;Gd@TWqNXqjI4J%r@K{lzNY^JJSpH%BcY)@@ZcpM>I=g!)0R&`| zm75Qv9i)pNlb2dweHT*5!QrlJL6UmqACh`ty-U3rmRv7lWPRm_q;9F+gTVjsw<q7$ zT@$P|4dHvwzK{xUUpVmU{?N9v0es#gWw|rrM32(dO$FU{lWRvx0xmA@R;G6N-=T{r z2k!yzPs%}!13i+5{wy8p&rY^MFXiTZg$#Wb+P3taVdtkS!Ft06qC(gO)N6o`{Idh1 zFlg<vaj0<~;h~|C^O;eWtz7jsv|tDgLz(r#%ra;7gS*f85VfF2c`HPjF@>c^5p)Bi zALn*8QDL&)a8nOU72+5hu8InuSXm9%G-=18uLeJ-XPWavJtA164dRsVb>jU};8$SA z6iq?C{~J<{zneJrbYF>c>~<k9=k1!j%+6%-I}}||0C+8}5r(jA8+&aHXLR;%iJ8G9 z=!jrpfSNFOx9=^fp=%r4aLTJCM-<tPG_Su{JLvgB%7z{eOnfU{#@t)f2mI6I{vUoo zWMWE<h%_yoy;74+AcN1-pz~`_pnV^{PciI_ggJ9AbM#q6Uw0B!ATj(PQ)bFK4!YS> zmt+su&-vwlHfT+2IF03pdC7_$y^a&Vn7~cD-i#S~IsMAX+{BOC*^N(f+V0|xYG+Z8 z8F2&BtCS5?-xmg6daAA9{UGi&K-NR(RLoTdc8>lG6dM8SB=Mof-*cgXd9JDC;Ww(g zpOf=N3yq8G<%;gZ_q@LCQaPUNx~x>owl>hdU2vp7xblb^XyT+bI@4wL=n;NZrCTBG zaDI7f7#Zca4QT(n*lVndGzu72<(}HRRHCdY`jrvtUI$X{@RwV-4FDc7wWrh!eH1@m zLdZib|5PYY37qM>V}liM05raOAa3Z7(Y8r2p^5Fq@}C;d@U>V^OY3oR%?+b;1`VD$ zb{4m1VsYyo_aJK#FERNej<IDN;^~hLy`OsR?W=hIDqxu&8AKyJwW+uJDof|S&@6m8 zW+2^C7l%<Wev@hhtk3EDy^hzepzezw0LbR0zo!xPfF<%{oNjOljR`c$J^P&l>6cjo z{A3*4S^t?}MSrNX7(kA(@~<uT3$Yj$#bhd^UU#7AhO*OjQ#3%9!vfEVIu;x`+EBhy z1JxWtd$a6e__<@1Da)fi62=}Sd7ixYe7P<?FG1Bv)jeJAU%3KVLtlUj!locsBKkkl zbac)q_{7A-D;Gd{C<AI>>1rFZ2v<0yEGG$SFBJe0Fka}16M9;{9O8JmdGTqOH#KP) zQS33p)x+-fE7;%zM3|xT7n4Wz$j4fDn({}}o9?xp19OIL=B8iH<K~Xk2iQy;<&@iP z`g@9+JwSJVc^=)52{aP!-*C$wKnq1~t@)LWn4hF!4!;4gf|Z?(9u$Y7FSH`;3ykD@ zUJwU);LXKrz`#QL_C}Z5mj5uY4|E|*NBG;o4xUr55#xW?EPo&~(SntJrRp-j-CFcg zmCpcWM1u^S5_MLD15Sn|c-lsJOysbr!D^6E)XQi+2K!xI&xg?$+eo0-f5&<)C=>Tl zy(!ay?SS3=zT7nBtGf;wB5+IU$vyBw$KK}?Ab*4#0X=yf#rLeu-0$PoTwAbxL&l{I zfOP<jR{AhXPE(+H1m{C3MfJyhPQ4T;$k`F6f_CW%+^E^QpGvt7A?E9ee;)+H5SL-t z@eMj4#x0I!)9ujKPH%hn{{6>g;q=>)9fmJB_UP;t7t8gs?gjGo-xUMlk)JQ_n}_ZQ zLm?u9=C*|D7n#_c__$jZ@bh5L8~hr-{y}OZcFIJwiZC)__R?ZoFW&nTd-TvNe)81d zP2Al2)r_g$0yd;_F==V(y78*REiU2oM=3Fvp~$NNGT05uP5>|y9Vz5JRIYw%0b1rj zS1N7C*`X?ZQ@PKnHw)l*RC^x&7Ko-BCbZ}S8nKx6Id;(77$M$LjZXMOrG0%Noi?KU z9ulE&S4Y%}olT~7hs--C1kQjxzNz3uUs&npDR{`+2cZYG1P;o;;Ac6%ptEN<&vI)l z{#+LuWQ$DEzgBUzOnCV8%Ej=#iFj;gH)%>|CQuIz0}bdr-nhcBK4owk<vijYN3tZw z)Fbb0)oVIWf~E=FJ9nQW4=E4_Y7_AA^ITvfAk=<XH}`8J;ZnSJaA6oXM<t07@TKg{ zeC6Q--X*f}2i62G)X5*=pqZ0+&q5jV=Q~1fUj#}3ivOdGIE44nqj)HbtYAj<157^{ zQ>lS@;riT`@!U2PT<qsIZg_1mEcXkx&BK+($%_?%UlkM52%2Go+_yQymEbP)&xm?D z>&jzBu3m2)i*V%V{HHE)^lacZ?uM9~;RAah(FhLI1p_3pP@Xiogw7>G!TRa+P)Wba zjsuV;?e2W#5d%l?YXqGPdO*Q4tn7a23N;0Cjf0>)gymO)3H>TC6|O&D@Q?DzxW{MO zjCa%RF;w)dtWp{|Ewq7c4YVy$IosoB=FdYWjoS}Yf?8*;``pWDjV*~aQ#R=TB-i}F z6WRgIRdm6WN9v_{6=kX8H%2$H?fVCJmPzD9{KfFDfnoq*4+jeY6l9=7K_8Om2Z{+s za)tL{t}>~(q`$xaH0Y$mSqQ`*Hw_GgZqQ7wp+hnT5nd%VO<h{bdQfr~DaOzQ?Q{Qi zp7W5S!TDzbwa2R|oSvJa-Ww?>@6clK>V+$nggs<e!?8wd-IZ0TjEkN#8a=qvl2BbA z9vXUQA0pp?!DyQ1z`8Th@u;jN{+o4)yk_INF!ut3L&?To@L0-qwaS28689SD>k^)1 z{lEy-b3WK_L~~oHt{J{|4lrq-VMh?4HXF)ah-Oxo3L_V!)wb@B&fA*3dcb@LEpz>4 z<)}y?-IMscyN3AmU}XiTc990IyH*sz)5WZUo7x*l>3Jyqe)Jd}?~d-weyX^F*0iWX z0&T!_N57N?J&yNdx~VQCl*Xm%JS$<8o2=OLXyIxoiW%<9Z|#JIt10W2%c4{Pqg~^= zI%Fobz?rt=qNqb4D9e68BO(RS+{&Ot52oP3#$-vT%_@E|i5oy=s4iTj5;Fw7%be$) zqpq4+ssU%c1+atuwv==n$_lxj{%0<GWh>F>&F-_u6T%tJMWEA)$Ut3=1@4pb$7;wS zei-elVOMq(n>B$#6l*bQb`v=q0NoVvCAZ?`IoA)*)y>Rl7cgwMFwMj%z{EE<uKk5^ zEZI0u9n$546#bEqW!PzDRf$JjmqT4G7wCC+$<u#Fa3QHp8rT%iw8g!P;|d>Q7@}(G zxB{%34+fvjAa$q6Rw&=3<x*eFMo-RB=Oii1AEJeIg%$+RsYHJdps$|DCTo%nwA3eP zR^;?8^$j%h?&Q_eWvn(=7l^k7G#d=Rxe#l|3Jkzr9ybpZXi(EY@e~}yQ}<QM%susa zvN@t6?CudXg4;)bv~k8}G39VO%B@ZJ=4ZtivxR5{G(L~)XA<v#(V}mEu7i^Ga2=pE z_2NG)7>S<(EG&vU)ieE4)%Sv$j1Q^MH-NDb$GwH%=qrZ7I+6wH@&W?P-zN5L3Lv-+ z-nMef{FXb6P^cfa_Us>TwU;<n=cC>MGhpuOiiC@}DYBTH&&X_xA9-`G`#QKAlh=)T z@7rej`%H&5d2$Nq^>{?g*9jKJL%~_v-{iNq#55+IoNLBWidF2pFk?RBs%bbT1x7Xn zfc0`f|B9l)ZsbClW3VF#WsaHraBAu~l!!kp|20@-B%IJ;hlwor3?)KKCAuY?2CY}Z zPRo@Hd$Irg#=Y(jmY>=hf2j|2xeJgnGx+wOm>0Qv3)(xbYONoalq!Ph)gtvTM7#T4 z3n`i22K@hL&nJtOO4%77C@qNwn3F^=$Bx|+z`gl9&q4A(c-?Ni{Y=X({T0Baex}N4 zjK{m_2m(U|)s8c$dPOZDl#!*1{GmHZ5>;XL&51K@6?b%VZ%N7lGy<3@+o-yK%^28C zJU;+=R08YiY%)l<hb+4{D=I6k{{$*aP``#^(PHu6LBe<Z)ZJ-o;-0;fCk->*&trxI zhe;WHTIAqjPTt?B+6kb0u*Z^-Zv#&<-Cyxd-+rMdI)XgG$|J+_5bGBBv}iT!XaXyC z(m}1;nBqzwyR*#3mJ`sJ8>8{o4S_(-S%3|ikWJZ!48Z^-Vvr%oXq?3HXbZn?F&G5s zIGi9Zgx+G<giaHLkH<}gJd7DA<^Vbb4A9Sc;$pBkX>wq;e8olTDb91pKcoyD%8`-p z{_Sy2cWkNT)U({4^+mM{hMc;dfp9avI2T0TxXP<i>9M%lrS!?g(Wof2yjakqB4?4_ zWCG_wmg|S|a-*+ZK9b4qI8u1QtZvA6vhH=aCY=Kv4Z^9K#3nw4Dpc73YnI-S3{C~` z*^MwvVleWQ5p+4KAdYJ!JAzG@GfzDuD4JDUQA$b*g2w55f+~lVjUX790o^Q!ssd_- zo@pxESyb#qJ2SoUE|8+N8g*O0zJM2NIP(wN9a)@UIsrsa-$hQ3256DK>`i1ooDN3x zDd`R506k@>m;2oWw+5`LNgOoE)SJrHZdQi!dYL`E_&ybih_@EGUDPn#pYLlio?O#a zB;lZK_<YnAl|A}Qq7iB|fNofT1sPP6`u6`>lOjBErukt5*<T{X*URl0tq>W8H4omV z=DZuklbFQA(kj%`9IowBU%YW|9qUC0-5-@WiAE|&vx@QmO(d(<5PMwu@0bf_B&RtF zHC964h?}+wFGS2olUSe~gp`qu71&2JqZ3OuYMpQ-OG|P+d<86!MPZ4#-OG2F{Ko0T z<BBaiBd5U9^IgoXV-!1{JP7M%BD=OsAR+RDD#u-)=)Rx90&lR~rO;;Vjl%BA5FJw( zRos$pv7(k%v|jcn5q#zdfX4xtuP}gyr}Gp2($0<!tRDm5%gxL+pPLNPei5Cs)EoN_ zaG09Ax1agL1!G)<+!oG1P2oXe^{Oz>Vwhq5Mgio!#v+7Nh}~Y@$_4d^PUka<P*_fn z|0KkndM?~PVu=K&NsPOCx>?JhJLfCaWB9%E=u_Olz~4<s$dr9Kk;^q*kWiL+(+|DW zNxl8@`9>h^^&pD)0Z+y7)P%yK8gSqr;O;VsD19}hn(YPij!kom7Z(1re8??z9`9b} z!j-pMbNIdIz><MKV~H{_Q}P9N=Rfo4kIe(h4QoH5iDA3e$SU|_!dyGVEHp-ZQ_;_0 zAgnFWhp(;fNz$;XCgw~8IcX~1PK%!}$d1z=X-3t1>X}T&bD6i7FKj*<uPwD~p@mVh zno2iX0xQ1Xu5k?)rSMSuYTgv@*T*lAm~gFW@ou{;xH!MvA>5s5j$Nk8E4c+&%&7l^ z{Kywo@_X<vAAI?%*952p6^#y?4W)}oAq1U=U*W?W63yCm=D$9#hMsZVzwrc7H8YiG z>-epk#=xGmCpN~0)Ox5$P!jZF03t6>0anj`&201$DX)3{w8t{{P=n`FE}WPWn#t?n z=bjcUSFj+b?|TlifhFJ+-ytIL+7c^4cSQ$@KC*61FiA$AvJ3oCX8{*K1wa~jsmjWN z|DqtX#uJh1cN};6iPh5xmm;|h?zBW!m4fO(kNyXM(x;x(_M4x-SM52AQ|;*<EF&*( z<&~oxsa|T4%emlx{=FMfQU^J>P=N;z?%egeLr@>t$*2-LD(KXjrro9jb|eM)?tvda z>V&^Q$pBmxGTlG&8z2<dFAS~)-A$oFq~B(^D|S9z!2LnspFuO$8zA#v6=xcFJdtIS z&_2qWR=~QJOo2k<Vc)Y;H&@!QmK`6TxT8pZTYmEnJ&n>iP9{(y8f+DS)El1;7hnx_ zJ6B@Z=3LqWJX~#z%oTNwOEZgE0Z6AR#=##nM?kUTR+bu!aR1?y87XpyA0N(<M1JBN z!*w~5n`Y7pUGALvA9aF6Yk)cQ>WD)_rIA;FEtj2$`R<Rv+mK=|yGoaIgd3^9!skxK zP$w5fnbO}1U<hRBLDnXWRP0m_>d0czS3pf+hyR4_Gwui-&1~6?j<fKuE|)LgT5sg@ zu8>yjH#DdBnmw-MK{;hLjMa$~-6A6q>Vb~6sOEEcmD%?>5UFMgx_TOz=BVTSuI20> zkFacR=n~Ky#I`$njuqG6xY6YA3s$4bYz$@HF+oLdLf|qUK491W?vB6(wlhwGPW2M` z5Rfh!Dcl)x?2g}O0pEdUB^Hnr0?n|0L}&+z47F>`xmeY1mQ|xQTRAdHnS~j>_sbM! z$v-k^?xsVP@xo+isVudaUy^QE%V#!u5U({**eOH_HRKxI>dtIky48V+E(iLx-1_lI zFIkgz*B-OUK?k^?=~=;Qhq~g6&m5>Hd%%bGba%T#4rzyk2>7olzo#6G->or-1o_Z( z5ox#Qnv0lq&Vx+`3aD%Um6u_C;F9=4>rJNpz2y(y@F(Qv3OGUi8nY7hjLx8UHIer% zP)8Mh7|&;F*AkKSa;D)JKbbRFnt}v`8gI~XR)gDC$Z}?OcL*GphQ;xT+&a<dj2@`B z#8;Ms4*d#r5CsO{`13N|Ix>i_@SA3DQ;EuT=O{5*R@r#=zW;iFwI2xVY{PBFv#379 zB$OeY|F8h34k5sbgB1TM=C+G;iE5IO`d#`#ypM-+>wh#PfGGXTNzh1S&SPUgbHQ}q zo>ynlc@<y4S{$A7qr|$SU91Z$-X_gW83o46E|@CjHG=6IZl-dKYPX(0%l+=)+sHPW zxA)7GLS9Y^?5TrrWfuQQSXeCLjxNJg2hsTkFZFlGI+KH1LQA+L%XOv0$-8hd6$g;( zNhiBs07e^%L-RhDQD!wh9-2@}jm)4|dGOkBuyRKIa-b#MBtQDDWVBqArMuVYp94Ol z&-1r;5BC>vA@A1+nfLi(>|Y+}`uTZa?^2i$=^t)_MVIw>o=_Zx5?|C8u-3Z#$%I_r z<gZ8@!lN!Z(S>?Ot8J%*QirI$3eY{f0h%8Sp^k>{XjO0S*Y#}dCh#y9W?txEmdv~U zL`e5-^fZe<z1wDVEMLo%tvn_ukGzn0_%PGlGU^EbV6rHeLXC11!Ldh+tT=Y18-JU> zt^k^p9H*joLnqTEkJd8K{W3uT9Ns%6vZj7s`S7d!0`Jsy1tLQFI9D4Ft@o4FSo<;1 zbL(@SMX_DuvH?qSs!jb%Y>Cla!E1NK7^%yE($mCQsJsSU$oDUP`ydYgV4q?2yVOfP z>CYUSnz-gD9}UK}6amB1#gfZ7I3zAI+>iVF?`v&~K7He%^KLCQ3bDu8Ja%Nogb}A? zYyBPsl<}I><{_bQA!ZruluU&fd4CNH?m3x+m<gbI8%GRg=yn&B6ZWEN`IiZlumq|N zCo0~5))@_wFu?}3PU9ClQ3Ko{OMSUR3WB|z`o2^jP-$9v_3#OJ7nD$+nA85txu9cV z{{2{JqM$9{E(Gk4b1p>U5lZwLCw<#Sq`v@1b3$BQKJmu=+Tr4gvd7!0;2~o=ms7i9 zueB0YpH9|{hS$>I(Aw)E5p=+%;S)LQrl+qdJ={Knjeduytl@lnr!smAy<X{b>?ynO zRR$#nQ1Xr>Wa(CDonGL$6Q!&_Nw3{%qhFn1@!7B)JjTab>$Y}s%<RvndNn>GT5Po? zM>uV3-<EIAF@GRJcK}lPfj13BaniVl5>dS0B8v5>lq|%#-mjkR0w|SEVEp}%(A%Z| z{q0aVDB*Nqa=L!Pbp^oPI}m>zeuZ8}jHER>cd0+y)p^bZC|96fPHQdhdLj^?V)br3 zl-UE2Ef9k8Y2wZ-fyKZMsn5$*ZlB1UPF$vpc=?jrAYokLB)@NZyCtg9V0`{i+^xaK zXT*7gQN?^9EPjlzic*L<fyc74&jJ1rJ&UrfQ1q2anpCMx+ia%CH8rWma7>Y*OCN<k zOH2?2QitrQOcMN-MDX1cu<u;<m@of3Y#K=D&lVo{CU1uQ51D-c)M1MKU4<UzEW0tS zz1NLfN#j{71`N*mS{5m+TT+eIz;f5hDafO=SOKt+%2JIeOGX#Vd2<rTg}cPBPgBj_ zeE#KDFpn-t@a|gNtn-qfR>fMktQfgSvrhl!K~SkrC*_L!7SapOYrtn<bXUzn6{(|| zDs+FymcM#?zQ@4-(r|}p$+zvm-F|AtdUQ;)naaZYYxGUNzG~R?X28)sMt9RC^k?p` z@>Tn#YS2-sy@6bAjO1SZm*6k7{)c8ZLQ8haum&uM;t@6gWkI&p^Ssk`jD2B0Jx(t! z(ajAiKay}Spb%ozEg&$O*Gv+9(p|e#u(^?|eux#TUlA2Dto{*svz5BFfa^wVov^D_ z_=KZLgIP;rpEq;z2&hh!yq_dQ<Hx`U5>_!HF^+l=j{my{A%11ZKq0oAp|Z9;dkN0% z<zA*5<3=;d3(U81MkXC}6Mpod!JQs%yGtE%h+i>WM-NpEq(DHZ6kydi1LW%Rp1?VE z)l>nRJFf3!;0#ge3?WJY!$q;G){Y4#KX-nNG1FV{6BZc1TnzyTi^H@3{|*cTg?{~a zy?EAt%(~+4{ZeJ^Lr?{rL6h<4$Nu}k=;sUw1mTp1ItSVW5X1BaF$<jZ+#w%Pr=Z7T zdxo{R=a9#m`n~qJIpcy)@aN8Q5d+<$0`<ltozbTfo`|&E2;-*qgqh=n>sK`rHfJh2 zPds)%NMiRIsRK=RBVzv3G=qp6fTNyBPu=njKXVR*2fh+;pq)==_zs^5<nR?md0o%3 zQY!$nG;mHHoS(7!1n7`VLHoc%@ov}H)s=hic@=J%TI(u>z0!N`hFeE#LJOXQQC~S5 z+Qfzdt-(0?$Y+h4<^8Rx)N$jk?WT&cx1L<+5s&c`P;jFKNVc55kt(Ol>C59A!J{>9 z(um^O>zy}4qFE}oKwqJ?@^ezfmLn0H0`e1fYo3p4^QyQ@^LPqkx@l)g<M1g{rgAk? zrej}zrAz+XAYN;Bukq-v_d#u-y;LD~c!`XW^tyTPFd?hH7Ms&v+|oc%3(&{uFZCym z+v_xidQZE}Gi4SuG}Z!1pen6HjYg;Lw_EagrRGp|JiR`&-sUT<;6bN@TcM_9o_>Kv zvP%c%h|iHqlJw>@OQw1m2?H&y)U1#Ar@QOHnWf7&uRq+rH^;cyIpJg7DYQQa5Ee6~ z<~a#)jfFg>tmuzy0s;aZC;5#j)U7c}ab}$zDUOd$(FC2RsNC4qDD(EGqcrLr&0E0A z-@5TMm*%0$`(?-V=4Dwc3e`?WmD5-)Ea5X9biAova;@6=nFEFpjQ!Q?T8~AFHxE{m zr(5FGLT<Z!VbLr~*2>dSsVa2eO$AJ>X(varn3=t4!!gB%fFp>D5lnY~u~lP0-$gHS zkycNG>k2=NVB|2k*<d$jKCwEc9|hyH?G@7|a~3$Kf$jjAn&E;*uHV56`0htb%0;GY z?)&t#7H|&iU=@$_#C4&c+{93gNtN0#QOD$ClS+5K0gkP=yiRe1p`c^DOOf(LG<#qu zHe%^dP+=~877!LM+p@Fjhd5M>u#2ZM*m%r-MxRb&CvV)JGRfsa4isq(5u=mt0_xng zG1rQt<N#)lRQr2Jj=QrbNA%X9N#n)3-<9P|w&K|g_S0)=WnMg-d@s<cfyq_dt1Lz; z+)pfbpZqZN*lRnt&BMdH7bXOV;W(EJiI63>N!#<IvS5|=RK7lT{KccY<s#}O>0ruD zthRd|vvBzYdBUK_6WJ+FX@!{krk;`Mwxnx2u#r+blwD|}kI*SFuCmT~_^3KCS-{&6 zp#$@t*ckBH3iVu<s7KxnRepe{s(z{W<Xetf6jOoj!0^cF=4<NK{4Av`Sh%aLwf%%n zijTmfh};TiXT#bDl0r9phWPAs_i|r{4VyE`-+UtNY-X0}DReKQ{m>;uy81-6z-6U; z4sl^<wAMlT&}EHtNvE*V{;n{Waek(9JhwD<-{1v7NeTHzZ+^m~zd|aW7Ep&&bO=VI z4|nR-x9d~jf~*g!rO^Kol48+=3HT5(>VHYV<$jV;PC|Wsy~oyN7ha8TCe@DaP}sVk z(_xRQttM}fG3$4`&h@J(1qDX9k5E04na@{c4(6l24%?CS-)elbmaUj__7Zr~vA^_r zZ8BpT21~QFaJ=-z<_{}fQX+uuF0CAveD5v*E7){N5ms8G38*kg?8~E*zudHJc-PkS z<k;kkgxkqy{=&GL)Ms;@aX1rU2V2i~<cJL4IGhA=n3-~<Zfv33S`sf+c;P~2tEtgc z@Oy`~KZ==TkiU|Q2HXs-NwJe*!;&A7&49Nn8Ta{xv%DTzF(<Y)!s&x+cBZz|`7k1^ z1^#VQ1yVw@Iu)&m%pSJl*0mDENbUvR@ZQ)l!^^89mWWRM`t<?cN{L9;qs^Yq=_GDb zo4q_i5-vTBju(R8O!8fN5^l_SjCd`|ti0&1cXJ9p((-T~Y*4e}oVYD@&Ac^kU~wN4 zB&e@|`QB>=+cLK5+$9N@>URC2B}V>VxXpe&Z~gUW_Rf9Tdvo0%HK^6>embCk`b`jT zGyv$USweSr<-)V867NZpTIXOs6z5FKXX@=6t`>s<T~52P+WXiK>FJ-`^^%B+gY~=A zH^X@g4C_4g#8!KBdsQj=P4}Mql=}wM=pagSueBpZJ<6>rMnbIOlx<a}nl{!74Tg(2 z`y1aW71z^xi6d`!XDj7Y)B^*yeF)PXIyhPzc77`rI6YU<F#N)vN~T0iHSo4^>0_P? z#GLdWm11I(?J)LMTxCjjduE@9X{0$4wZt58L&j5o!xgNQqdSMw)zKF>Eq=7f=2oL> z%h8+WLZ5JBS1IATZDIwsUiA)ti|*@}D?;@Y>dVryi?gmryD<Yob!jV)GeUJZjcL!g z@0RaezdIV2-rwSWeB;Q&pl*0)`dLd9J<JbX-&y9-8^~Eb^!Rqk;F?)iO@&6e%y|Q^ zk5Yk!MlDeE*O$o40PL*(P*|bC%owNrus>g!&w(tfR-O&w^wijziLC!sS5eH#69<^y zsFJ?Rz*9JZ&#CQD)|}`N!YN0m_?=V(vP2rrq-JN`c^<t3y;$GnK?s-c-MRrV4Y^}X zbQ8Fu*c<nU-szhis`)c#!|pOdNzAWm!JnY9zn2RBC2l8kU5;o<ndr{0I*JR_VD=IF zpT%RAx|MBZL;>{rE4fZj9hSKa1f=tFxemmQifVO=(eYUSDz$2X%bZgm2W&t>brb~d zRf`a-#K%wAdR*okK|7EE@YjXiv%$V<BlsEyrgxVpckee4d~)g(=Q6ENA!o{b>3?M< zk+*E6zT2`H*R9ZrsnB|kI%M%%+4*k_0s{MY!d-G*FQ>N~?w4t~FR}!C0FzC-Q=nZH zDCmvc(dBq>$0zE-tmiiJsMMqbM}K3a&b{??+@sUw8L)s>TZs%0%iA{RM4T@kKYW~P zq?Q~myEUtjYByGKmzR%MZi)M~C07E!N2QCP!!CQCHlnhkb@!mJxzqgJeAjTr1-?Ar zC?VwQ<Cg(0pN+daQePPxfy_%mxaw3E^M%&B0>w!%PE<dI(7ibWKAVV+*e~HiTFqud zvnp^#Tm6;c!?qQlQ=*-)+pY-*t2u6)TF<ZcTZ!S_jPL~&Q4G<>PBMTA+QKy3|NWEz zIz$g4XA-`{)j+fSCrt?*?E0_nw<U129khl?+9qusM&0YrJBGJijzwT0qQ+ldX_^~j zJyHQ3-qy2iaqGQ!Ao;D}HW0p0bxgSQbG9@c;NuJm_E9`z*8u*I@C1|32{%jS)8*j~ zGOKf!ojtklr}x^A4xUYSiN6I~)eRn&HOpl%dHo1^EQ6`86=4EW6lnTn#OW22ZPJYj zOa==M{d*%cGJQ;pPc+Jw2`XQI#!-rECLm(dr&?GS^y;QRcsNO2xEvUl*kbw3)WzT7 za=Oi6nStZu#{%WfbMM5SY|0Iswj7-teY(%*vFOUvj^C>utWQ<p^t?cN<#JDVX-0rh z^g@jhH^ML18nAOnAMGh^)$C|h<Wj(h?MF>Up3AU>p3J;GIogy##v7?>b>&Y~DU2T< zR1C*FBWWwikgrI&C)BVNhJlIsvGQ=ubkvd#%1Xan5IeC-zF{|RD6ETirJ{cER$4Yy z97l|l>@%x@ewfyk`S~>IVRMj{*&^B>F6{@s(yKRQbM=-lwC$TKe@ZY@CK*tXK3fQj z373CfT0BdR77pdzQNL>Wzk~2w(8Erg`R|goeXmaAyghe$TlbOK&KP(gc9L^`J2qM| z6hd8Ppg`4m>A@@kp_fhBIbhd_cdqhwyI_}ugp!NMyrPLwnCOg6>=a9yr&bJLR59EB z5I^~BN3g&1E!A!;m1X-EPNvgq@>YX^_5@dDpkPyrMPGU8I%M#$nhr(gIwz`ZA}@1Q zeF=FM$I4>GkMBH4CaPVQ?a6Onq_eufwJS*o>X*4lEiBnU^<M7jtxk@&FG<Rs=3u>c zynTwXr9`LR)342%<JA!^L^A3$a92caULWN7w+|jYDJ<M-K^WCE+mrEGecV{_OlR%8 zQe;@ePSTMQvt`){vH$~{rJTi;0A{?{FHRq&!hEu|)<(8el5QTbYSYu}a`t_g>3S`v zBIt1ZMkmLmwS}~^j@4$%eJifwNHK<kO}tQlp;Y_=9st3CA~@l%63FlDnE_xEPDLC4 zb1Ej(^Yc8}k19ekct?R}4{UY(#CKQXgo-N$va8Hj$yqenXWI-cQn)~I09xr;n|6~5 zrN0UQg(nLeT?P~sjJcZCA%-G8#sRO-UIjc24CS7fwoG^x0Uzzp;oK88p?8sw=Cgko z?JXT#BSU2|L}Ruaou{8t1vYwIri5EKFW&R&&o?sAdQDsZ4N83KwC)@1Aj>R4>2Lb7 zWOS_UNbAeU)S=al=?_40mZ*fMOGMnJZmfMt&pHM%NAhMc(W`MJ0!k1NpS5w#rv^)S zTt4LBEHSFqdBw|Uk0V^wyb}Say(5LmN|(6qef3H{gHopa94BWIVdb$~nV&iTi!U{u z3JH!gHhZI0%U?7)?1G66K1!=5yFPVmUeThPgn~yUVgnjULNZLIKMk0#1lZ!mF_qQD z`nw8<sw7Dg{<{qepTRarD;%-v8M$T|8_lKH{lkWVKQO?&fQ71bK%n_~Q&5*kw-BF= zQZwt0`*!0=Bmv{i3=6K-BCwaqHY!^`!E2wkL^7Il451J{URU9r;=@h*r1buZzB(GN zbM5vb8xNGOeHt#JqY{ZIJ=h#6GQw2Xudrr1BTjJ#@hOVnh`P1LNLV(IAvxTVO{X-_ zKY3}pD9&!2KK#?_-38VsJdnGvJRkAMotbMUJM6?`uT_{rs7Y9ih*3SLe@qEvDEZ-D z2-mjg4Fa>i?ySY`nT^q{PHV($=EVzeC(DjzC+!yx-BOM3^e+#YZ`F(M*ri?e3x=v> zOuuT8zw5>?p%!w(xqs=AlLGE<R0QB#226k@UeRaP*K5t{c|(iZw(i!JDshVDt?~bp z!B_^!eDcvMHRB>(Siqx7V<S>=uNqIG2NBAtHx$^Cz`AUWl?DCb>IPux*VDA$%UyQr z;WRvUTzDtzmMw)@n2oB!DYbXd`>YN#6yI={WaAfllKxJd6(cju_>35wXQs`14(BLK zYNj>apKS2~k<5YB^c)Wj-{YP)Zcc91Doer6d3_`-#)hS4pIPs?uHMYhR~wOHwu(y* zQb|(W`I3`m@|70O?<1yeex1pOE%oA+mle)LATr$USQ**;RB2nfwKpLf7}(pvyDOhl zg=qCSIaB~~nijj(pw7-%Z8cm(_QHs>C)54zOotK9dNF1&K^lS-hT38%D!bn`YYC`* z>Vxy&iR$EJiK)iQjLz`3j>@U(3)a2I|6|ef@?&bnhY!nd<mwoyri$d<u^DerOBC69 zWr%Q;#U`;4ebh+o2&gt%cdQ38<rd;^dHpE-ZE(IhS!Jmp>y0Z0kWvIcO8_%f-D!RM zsdw1!s5%IDJNa$#*B-rp{|>+m6*X@AlfI3e4BP>CTmq}o9j=N)qZ2C`r<~hb9YbtR zBE1SlY-=9E+4Xoh*zb<%$*u75`1C2p3D*psi(d|4-u23F4B2u(F6(hHo2DSVaGSm3 z;++w$3O9=kJ3d!f?@$&rh6?#>WWlv!PXWd!6mmGCzj%s%tGyxwRq^osmwwy7grM@L z2lDwhJoJ*rH}fVGcS5+uNe5qTL2-*Th+F=KOuGk=Y5X_mQILa1RF|AfgBn9Ux^Z7U zL&hubHigxvi$sREJ{1%<a8h~k04Lrsc<$=3>jEv+WlFOG>jO{ep$5xvm%?}KdS&L% z1YuRGHRX00DXt6SD(>4ZC#TngcGkGca+Ld4laAk$=ivcv!~&SHS6a#PShXf%98@_g zm4XX5X_&M_hzTmr1Pjfw>#@(UYC8_4+wW19K3Fv@EVAz0%PL?XOb^Svn68|1O;YUi zQSR<&5EoxeX9H4S*cCZ5z2P%`aFw_G?$MVZR`6EpF0HpHSZ|iP%u#U$T;1b9izZ<g zPQ5Lyu*4zUI^9l03#Qj2)TK?EW{y?wr8FVCe>giAb1IpI6IK3$nVi(}&4U761qBje zyL{@FsE;8d{Z<nTns8ckMRl|*MEDw?fQwLQtF)~EPMH``Jb2YO4}^?7T&6w=y5v+J zXpJEPp?o@J|4W@H>Vka`L}B1bx58mN?mN7WDhoe-<uSx|LdA|Ry&cjxk)x{ck@0hR zeXQ~e=8Al+UB!ln{=NyofXBNzCy;@>#l#rIuZPxT%#zU=!IxW}RV;mYyN?QxZ6+nP z52bL;XZk1TVQ>8%ny$k9PB<z0q*G&yvsI!dCryG!T-Wxchi@F%??qnna8U}2z+HI( z?mhW%?(vOW<1xO<YPMJ<$ZriS(r>;!voKy=_R6S4gH6|ulqk7`vdEvA)ug+(wCy=B zeYZ!m$$iU(_XqnOrPyuFZ>7tpLbUUnU%`m)&xwCV8lT->&P!=n*SLOQbNnbcn^k7> zb38ZCYFT8Z;}O`_&~WOpChCUJRfbh2aWGZcjYsD*C|b$xeof30=ZZEyJxbM~+#ED5 zy*H-c63-IlrCIIvE$Bum#=TxnvBh|+^Mu-k+C5(>IiX=F5T;!DzYS9eEISpe<+x!V z^!GnwxK%D{{*N6D;amR9if_I7v7J*mz1)Xf=3iE_1=i?%%D4b(Avzij4yJA;=GZJc zrI{kJOls|o554OgPHK9+Hd#hg$zoo(E4ptl6jn4itRya%EEDr&x>6a`ZK-l8kjkj{ zygqfTs-Xmw8nM@IIV+@cXF%n*P*UX6<>3-(?fcf{Hd~Aa_vB)#FQn&g+9vTSeTwDi z%X0zv{DK=+yYP?Ks***$^u3eCq-Q%4%?n+yoR%jLy83*N#&s-hlf<Om+f;cG0MHUx zX%f1VJuu;^Ddg%QKT<af-mm*rhmRx^k&N3=sgi0~M6%<~ruopxCn_GdQQb-k=j8#3 zK*M3ZrfT3lDvGv<n5m)s4L?f>)DEL7H9I22yliQrnK&e0usHcd6S8RB4t~dkejcSJ z7N;J4064U5pAC^m{toIPpdj%fcKCm1`7AjNBfvo2{hlOo?_?3ngDHY@=vechr}hK4 z^s}+7M2)G=7)HTnD(`7^=KhwP`~v^O+!g&4k$mcq6Q{y6iwEjH3s(@DK^5%vo#xmi z3Z17%4g2}FGghCXy9k(smfuA7N=83ff3VQINMtbhflq*hNz?mSJzvzQEsYUSsn#g0 zxTL!<xeccI(^}2pAAPIipMVoJ9N&cz&KVYd>OD_D-s&Unc$??8)Q!|jSJ`{mD*@fi zm+2gBwhF#}k8p@j#Urnp!{#oBE3!RN6v2MGPTz4hWax8K^$TEH02gC=@qc4lp#Jck zJ9oN@B*OK*(Qkv9WJ7JYtmWP&=TiGwt-@kJ7U`a)CIsPTpj$r$Jit>8)}NY12?Xp9 z^2!+&`MzBJeBv0|>w4%IWm)IIkM2kFbCQP1c01JvCwYu>35VlL(^#&eeQ|gyYHH&r zU@V^H3D2GFdr){X{8;?Z>`m?A;nL+Oaqs2$+FMKa4TjnS#h(p}en8$n+>%-#B17Iv zJ41A~gc8bm1DU*qA4%|7wxny@0$knry*@?ZHNbAxT`_mm&v-dC^)fkq50grFYkd;G z?u&fA9vz>prb})GE7rrSB>hsLkdyy8^2|9<F*2I|u<@;*lUxjO+hy%hjxJX)g-P$F zU4&ox!k{GRYRrD=7<*Q<GSXI~T~IN?zdW?^`q@(_sz@BlW+>2Xe}dPcJ?#A1@<rrn z83t5$BF`DWD#LO+H-denR8aM#CZ=FIplYIW<u6m80IMyZwK}%vN&Hn@{T-)u&Prkj z_k7uth51#DKo4ogw5@~Vqf#9Hky}1lp=2~zUEcCoJp+ojr^>5{Z+MpE)lM`tw58aA zvLH)<*!~yuD{?F2;CJpufI`U42Z=ZOSNCP8)j?*oeE?$i?{KhRr7A3DNL|*@eixll zb4hcD6SSe8-Wq!V38APF^$d`$$%c`i%J;_MzNe#wd;cW@!26yW01pri=XGLq6M>1b z=)H+h3yYMbfha}^>6{lv;xIUk>KJ90di#R5Pe?K{yUIHEQS(@0&;Tk^T%aT>YZj3K z)>bSc0l1*+J14_npt#y|Bi*q6p@P;rH4J$S=V5Nn@GI~QzK~8X`fzabplZ4`#ULb> znI`ZVam<bTJ?_1_8l$h?k$_w+I^!Hp%NPPLHbu-)0cs;fnAbiPq-FP+IIWrq_M{m1 zktotfBE>;TpYZjuC@iowh5^t;))-L<JIZV!JQvalx%2=<4;RzIb+gwM>P_;ODY{*_ zTJYdXAu;S<zsyw>=$h|^QEU!;eUI-l7X~`6+MBogOP|b~3#-0f3~J$RU(cLlUkQhp zTtVU6P@_VJBiP8sCg3Z^-vOY%Lp3bwf8-Uo4<w`SwSBz+hDGW$z|IL>?Wdd&7n#He zo_WIzRq8CK0Sz0UU9S}LQ@PADpeR)#A=f5;IFM(oV*KhTc{eqWscjnf3DC`V1-Q)U z19qd)pHlM*Ra|FtBfB$I+udHar@GNb;G%&9tF6pi@g_-)Ed<Tz3l0ie9FL1o+?j*9 z$S6D^w?*kV7==u42>K28Vg+%#kNNrkPMF;JD3|)=^VU*x>7Gjp$1`P~nt>#}rpZA_ z6D>M2DyR8fpY>EP1RKJ7LwBp(1Z`o%-Q)hzT}@ZJIZBLUXi{K;lj6+Yt;yMjQ$?hH z=e@%EBb&#yT3i;cggA(=E*R*FAf1)q;E#e@9?B5b&W9zgJ(Vk}>BBMR@vDywH$hi+ zhYUrPMQw5cignt4k!b&!dDu*p$_DMOX58@<v`r)|U%uJ4kqU5kKd_Q;eJE=d5KgB@ z_K}Is2$PDevKh#OUS0&?{Z;_v6q$fjNaMAMq=Nm>jxQ7;-$Dn(d~w($oXue8sd<L^ zUS=RRNh<))+Y0Ph_rbfoJe0;iISv67Vxuz9&-U`fc3HJa)!XsYMaD{qnGv-hg=ceQ z^JA)DnEo~fR{HvPQrP_rpkOE3Bc<MTo`+q30n$&+oYrr$&*u4GqI_W^A*AeaKfwII zRUMR~@%Nn%97%<b2`&XtITGxpfN}JJ$N0dKQ|E!-|3Q&JMq!j~pxWLi0bmpQpI&$g z_NPcd%d!&=TD+eIWbvY-F}{4qOeYr_0d|!bCAk%m51B7MQOlIe3PEFh`|u24h)|?{ z#p9%fj_10j*sR&d8~Ri_xS5UX20EYvqy%H^Gc*!fsAPE`vJ)rff}l;iFji6E(&O7H z7Sr07zwrAQCpCK!UI>@_P6-ueC1&l>EreT}{qz7Tss#7`!{<vhwxd4--Za~j*SL3& z=QOqM$gj9$^;7^ENjt{c0H4RfUwt@`a;ot8@O?9@X%w6+Pfmw5!@@#=LrKM~S8KCD zJSe7>;tp9$>^qKZct}$AcEj-#=g<p3xd7I7g$HJmdxny22L$J8I;xSi9pApXbU1r8 zOe`IFd2>2(4R}m^JSbSM?S0uVhs(gsCj^<c8i4qAxQ;J#9_hWv@A;Tr&+Yhh^5M#` zc4=8z)_qOybl7_Ow#;9Cp`jNQl$11SQ~`dSSf!0I^quV;VIZcJY%JLM5|hnf=(TDk zW^pJlT$J_1eN;nI=`x+KFO)*d`%j=?C9ePsFl*B)W_6t7Y1LQ}pW;<PshaV3r(8vb zp=H3-_=;j^tTn*IfL}Cf-`bjOJ-9?RY<fqi(4RU)HR58xpWTZ};`pN}rOl@0A&n|y z(S(v~1O3*QEF3V@{nayYK(_D_Fd-3E(Md*6+U0&F{Wdd$`RTM%<?h||>FH?<e%w0n zFn*5c)z#JA2v_@^+|ui<Awy-;{%3dEDyHbr`+-rq3-+gNHDUlZG)8Cr3T<K0xEG9P z+;=Y8{H0GfDFF_CnO#T;nk=&cQz==Sw3I@RZn?WYRVUja6_8kcvsBb7{NTH!6Qk1w zUySUmw9y{e>@Cmhp4x1)E#a&q2Am9B3Qa$Q6jY=lj4hJNs~$T$qfkc7L2oV8X&GD0 zD;d2>>k0j(cTB(~*@8V?>q&M<1EuNl?Gmd`Kx^9oWhy$=V@hy`5)A0|ccP2b)i;}> z6=KR~3DNsOBzm{doqOa92C~@M;9%l3tfeeNzUAfk`Ls)N_88>UCJ%8x&ae4YEpx^m z!)2|q?v7*$yu8Z}O}<G;fS62U$LoPX6`A=dSd1_?c$+kK^JX6fie7=*#Le#rYzVWj zA5AMV-QH)KX|*mYIZoU*1h+5BON#wx)Vs`j?Q2&_sl|-qj)&rmhmx^5$nK(dCJDfE z;i`fQwX@Bj`Y@#TMv<>GA<dY>!pus*+NQbUGNlmxX=t77?&=5=he2gDAilifNO2aj zqdYu3^c);2f$>6oMu#7F{=!5v0Mc9{ORD!+&acL{IGRpAytRh~M`_B|>&9+6DS8JK z362hzK@&5Lt-u217me4sZbyv?yDAp!uFRCYvdmwVz(&1A8}?{S1ogz)iK<aBzLeIx zC$&g$m78&xYkz9>Uw$DN-BedO$p(t!>_qJ%)9B>1dfQ7r0R(vEHal49p$u)oHo^e3 zgk#SMvK#10dtT@YbHM5ig<Mz32mdOE9u^&U{!3Z_ArX;6S<`bfuknr4A_@uDL|PLF zcACwO9mR8Va+FOt1mCQKTu^GY?wd<M(Yx1JgOGN4S+yuaABYJQ`SWUqGlE5_lZ?c_ z<baKnaKzL}zA%chL!xmLy$<oAIW6E^pYz4qJ>!MGxKqw411*2%`m41+u^6axW2h1e zEFSuW*A*d*MIDY_3eW5cuZfgIz7Ge6V*gU(CY}U!I=H&gV*n38;21otQ{R2#?XT(S zSvx&Dd$vEJACf~~bT>D*?lMcYih)--sqi<Pk0;RSGpkWNCa;;5Tdw(S3Cp#t9qqLd zyr+U69qnCT7P=VfYXmI(U>5up<e47C0>75ORCjklBjI@ZQN`D9U`vv2xvi!%lRnB} z+}4>~;%bP#bLP}tVm@Cr#Z0S-Al4`xkAUgP-N&q^e}ZX!Q!rvdA4j>xQ_-k9laxy- z%Hs2KxrkA}6s|0Z+*wEo{lV)_S%A@(6QmyU?KybF4ds>By*uGKfH<~iJOLt`kcdF% z&@Ybwl$i>h@tizPQWg;zUoN3-0ioko<A{H{fqp5YC<f+zq(bRo5-;*-?yqlL%|y7b z!2)o?XCx5|kW0A?L{P)|E6$sDLtZtMr}lXcUWd&ukKp;MGC$<*LM@MNBD?nvuV9|L z^T9-_PySMT*))e>nJPtFk;2+jFvn{Uz450IHrk<wKPP9QDrSRkalVl-e&k#~7Ms)N z4npa7&D78b2W=$vQ5y{P@(J;bvKKMSf=*e+b?&9EYsM=S_aW@{W9n;QGjB_Kd-Qdy zfmkE!3sP5}7GcFp0|^scY-E2&_hovRY&tmACwBWNivFNT@@qA-u4Lmo@O#+}MY6$! zAC|yv@Q*8}*o4!Wg)<DlfGPhZVO;|zeN+H_TjQlqxWK`|C#soYP9u7s14rje(uRnS zF0N}x+ZNdck^BD4LIFG|<oi!UKd5Lj;X2Xsav#H4g`eSr($pE8K`SqJjv(p~V|Xa! z4=^|(iztUHd-U1q+e?J`3KJQ<n3%DnlT(FjCfI&KjqC4QdPWmaQupEYa~M){aN6O& zyZ2C*dJ}wZTG$y2Trocj{twNrVC8)t2m$Dx?mb?6XLug%88r39!Yn|!_&hAE-)J7t zl$V;jmQ2U7YkUf`jY~h`z49H?oeX|ad0*DOovST3RkX>}9(gAkIu4l+3w5Kgk&PPY zRIl_I)Uw3$I}W;XQe%19bn_)Y5Em66sa4k_w}ij}0)^53w3E2Gw<lLd19`kQ%_`o$ zv1C#N<v2FG<;m+{2E))Z7Th!*MEk*sCP}!mcXzA9$b7Bd3*w9is~nPd!^)ustrYHH zg>~Ewo55QYU;7jYvW_Ya#RW*;ZO?~DphjRBGXerJIiFUm*E^q-$I73bpv&94T(Yhh zFNFRT+K51DSp;G8s9!>x8EjwpAP;gb)~~o66qRe)Q9aBV^`1-l<AjP>vgb2;3w6~j z*xO^m2MVJ;$%(xx`r0!0BC1WlqP*8VG?87BFvE<L<j-?1Q?Cy;M;5IyJ)5q@=8PaQ zPO%SWAT2%X&m8ochZ*|g3P7Hco>GTo1H#^iE=jwNy*oJBLqkLG=;+KkIu2+W3>O2M z^#&ZJx8#2~0jxVWYG`rYfZ>cRM!Sxc+Gx(-)LLY(Wd30+z^vWt`1I3yixWcuXrGi= z&BQ|x<w+axkB67Uy}HfZJiba*yni45JjS}H!Pvu6A7w-0jT`wNI%-PQ(u=M83eBBc zC8vkkPH=V^)!cMEywX!lM@~Th1pl&m5o+J?_a4h%=sJXttly%88FiM$Uay9#@+tk$ z7uUfx1d>vLYsiI^Wh97N@gu*&!F9_@n+(d<mX^p5A3kj696&SPR~T=B9p=u<Ev9m9 zjr+zyM!|k~Sb#Jx`T?`kr7|o-haQg29Us@W0N2YApD3?b#NOw|!BB?K-sM?$?gE|v z3q1zdr96zB(Y!j3-R9h*;1;ogB0tMMQ3DH3W5Xg$s_#)5>x20(G}R5Kf3Y}w73vy? zi=C90FFeRPME2<#<ISuo&GcC|{#E^L716t=ilhQyy&^H|KOF{efc1xW5hB;_MYz`- zWX09gS0z*Dq&mpSex~pN?2_N?(f$IlyFX-s_8|)t2)-C}fw|;uU<%WVnKEQS{-kJj zQtkc-Q-5!s1?FAWvqRm~F#Yr^PSD<z;UzR|=(S9`;(5Sp`T8E36mI$!Zn|4L)6i;T zu^W`ilro7FRvua=@oj#{v@Do^dmrV<*swCiZy53w!HQKYs+Jl8j+b6|v??EM$Wum! z_j~73dfWv71Iwg-^A6#aGm?Zk+Q~bAa~Z^b2#*QYiI~`YmDCnD$>?hribFuiqGj_Q zVz_9$2ZbzmfaKWof-i*-NzNhElpBcZq6N>uP>M7Ztwmq)U~IO8c`-<@&9i-zXAJ)5 zdBBrWulnUsQLq*07HN4fJ}0L!vae=%qCSsOK@(y>ev8h?YOeZR)g0}kU69FNXHs67 z^g9E8G_ta}6)xWTzgT<kc&_{CZ@ffN%BQR(qa=GLJCwaLGRsItQYtfKWrQNh%t&V0 z6tXoWJA02pviDy1d3|tQb$##q{{4QB$M2sWE|<^e{d%8sUS~efId5}rRZ>>>3cdDw zaRh9%YK}IV<FPA;_&1M+f%(+VvVPlXy&T46c}Ibqt><J9XwkUp`k!FUkrMC5172(> zK?i@2FPJ*)#di{+V9Umdrj@G-kf7i-x@W}jx#cLQR)4a`g>0KO+ctMHr@@h+$A?Q! ze5NyS+KaHtE?b2=YVy$0F81<Oyz6+_lf1;$i<<Gxr1L$S%<Z?@WBqP@wVGozOI-F6 z{bX)eRpjtKENgjjH8$7!xS0lIZL&dxylNbWCk`@{Of+2{`r-IEc{n2H=Ba^qNiu#X zc$shC9VUitp4W6+QS;e9uj_VD_`GHO!=iMV39_DqCufqL5m@6(=fZHnZ`to|LK?yc zRGQtXr_LBt(;v(o!lqshIbqM=o@H{m*94j`k`iJAT5I6#YfA1%_TY|$C6U#9dEjQg zIv-pMi|*_elmdL>q$ym)(_LN5K_0Y<TourbzV`+=*?({g;5#htcc;cC9#$HMRyq+q z3-Th@9TfSxz3OuA;QIV$BJPQBRwkWyUxg}1GK$YG)Qi@yb@W9f*x#+1)7I`)dnSBA zDZOM-XUa6G=#=-*Ah~z2N8;b~@f!tNmk!Iy@cGpBnXai`le=l`^CiQIL%>Gnr5~(7 z3~YKU5B3yI<iY6L2@PZvoZzg#$0~0=hg)|{+a;Y^&&_;oQ~vzz9%hJZf`%KLJ~`e` z_j1KU@058{fdVOOsQTi%5U+1`-Q^xFSsRR?(zicA(cdY+v*|BX^vWI^lNnraGnVfS z87CkvB2LjPEfIb(_o!K5jCCrjsyFp&u}-uC)x;gk4Zof<9~W}A9!dEXRg7<f^!2dR ztp4#<Vlm8a6dh{xQwwdywd@<iqV!g`a+i4SCIie}HRmWB`qMbz#|KF2+$=4}kG+`} z3nu<I+%-x4%TiBLf&AZAtrn&ac28&Q&32wkYRsr$<6g*;{`^1R3zYAXr83HQ!{55e z_2>Pqdp*hJ3jH-J)uRM`W{JKRVb67%BXeMm!)Rdj*`VmF+X0t-eT#?-tbQwx*stB` zt=H*WpC5QOThm@)H0O2rR%lbbuv&Wlq)vX3y1AK)jr3cUcZsd9Sv&k`ed(*e#_x1i zfN=)-l5h*GjnEY`caE7%&vzVFnz~7_F&VJwe!x+5PAUS~TqW#yxTi3V=BEY>J=s`< zQvZK%Cb%$T^(~)SzT5QEYUka5(d}%NS~R`<VOlRT<&=Rq$S@h}2{ja8z}Lh!iA;+- zmlT~_5m>q2SHexF2eIfitBr-md`G*L(swx<@f+Oxrm?OF?M=6|h)p^gGO_|3#xdPO z%?U;xrGZ59C&w<DwWRBY54bspEzMTXuGVN97eoQh@LF#{@cXF;IVa?V<LbhV>$-k` zLKV95ocEt=i4-@PTa>;F8~8&Bo1H5yZN>%Hx{LC=?=R^#E+(f`og8*Q4@d5dyonlT zkDu!QKwAa79iLI`)ouwZy}c??a&^(alNG{3^;$)z-rM3qjg6`u1vV)#aaMY9s_*VC zp|g+o;JhXvv`yMv`(hjFpYGzCGHzqJFlwn0C20A4Ea`FXhYzyGiUN<tBtVcPJffaR z$;7PbE`2*d<8r#Vu#b^LWJSWm<fHM?On=wAn1qgRT&>|B91{y&wiI$Vm)%yGa&>)& ze${(mnfZwLfz4Nz*-@5^H&J~$y2ra|=T-4aHfQA*+=idEkyZ|;Z%t}%+I03Qz35DO zbqe&^y5^mwsjA^o22GB>$a<{KI)Qs+Jqsd+1<k39K9MPC8`u<fnD;muw5Li`w=jfJ zG%dGIdleUVE|kqmBp@hb(m#9anW)l-M5@wF@>H!;o-7*4=2UY=UkS{A{iy~)2hh8H zetcx*q5ew5Qt|9YqGkGe%B3VmvyR-fYm~%vNgES)hc3@)qdc9T@;TJJL5P_?9BXaH z|IL*p%>3J}ifbG$YKGDzF3g+H!cTd}Hk)s*ufW>7V@ym;GomW~$XHsqp>TmxP>=q; zu3$>3t9Th9XrUTqyk8i0w+Q0LGS_FM8&k}m7R@#<-_s2lqczap+ea(+sry<_n~Jh> zj6VexRoYrREG`IOD||v<YV=(2JS+$Ip+Md>cIM9wxw!SgjaXh9nVADL%ZC$=Td7N7 zVdIP(%I{1R+a}MX4f*EYX@2Z+f|qOZF%6ZaNaXvOxM$5&TAKr_AE^tkiSo9kXTZ`p zl_349l(*(f9D4s+3nZ33c<CjRf^F%cD(O=kT~*=fG?~>bI~D*3lqn_^WWo4L?F)CR zuXja<R)~kxt8=X0AI&iM%HSP)iT*THFmV_uC@8WGKH^Yme8PZBDdA?~M_K8<?|@9{ z2Wq8j7tGH;2Rajzy1zZn{(Y|ZjP}Y8!I6fQ{oxxmxSumB@GzNZ7*dL6zzT{H>!3r) z@L`Y3>W>2*n;oXH>ze~aqRFK!Q!c9w3)KrN(rs&T(*DOqkESCd->xjyp+34*cj4-W zO>2j#ecx7}wrRC?`ao#TEs894Sl4VfyRbNsyS{oELvNTzN{-bCyXIsc?yV>d`JgGf zt<_Cc`>nR6ur2EiSNGADjs~r}4v!ceo^VqG5n^<azv@c`{@c0d2V<YYVlq`VwPIrR z&CA-aE;ya}n!~FLdm7L(Ce^N-vArC~cpT;b=`bDp{{58;8}n*RtgJyrMZ#!zJb9A& zl^_KL#pj1kG%ryP9LD*9W{xV|NhdXP^H}q$v~0V4-@kZLCw%L+Mtsueg`=FsK%J&g zZvw1?whST4&jX&9cG#%=R&1s-hnw?)_?>qPT_VA`Lw|KFAQiL;*L_*-2O9H-p#~*m zVT$~=4>GtaFkguQHh-!yyv0>+Y-%!wjT)+tCq~|r`y(&NONE<<C*jQ-nU*&$Q0jUv zpqFmZbb<=^6NGK_<Ac{YAK^GrKaknfRc7qDc9pPnvpXKY&O@Hg;4nO-^$qbmELxTk zOjJVZfmb`mF6I_ofvOtM{Kk?S70E&k*ooy>yRh>Q4Se{*@ggMUpHMHwVI>G~qsS*| z<zNYc5v)-f#f8;v%n%7RzBf~wAWlS)uCfv>9o?nI#>VEjq}EiXCyB<yQcR{_qzAy9 zAHQ2eT0?iQ;!@@8V)Db0hc?pM{5HP!XTK_7INt(gUyym3VWadbP&G+VrB>SUgI&={ zoR#^p16z@(ZL4z(v}^^rez=Lkl;7})@>*Fqpp!8yn1xM4mJm)%8J$%K>p%SZ%-OSY zN=p7qC-1_$yD8&BV4h$%)jNu*s$*m^sSgDH6B)~_p5Fb&+xOiz>8L~a`t(n=*?dr) z)eAG3Y2kFjeF_n;VG)-mR%pNLgD7q$KHY}1yAtEF-?<lEpkOO;|6-0d-R>c=$Bik4 zx7$#pK)KBC=%j2=ULIqkGrWQsn*Q-wwJC?ktyB~C^BBW$olT|tXf6Z3P8r|RMqXyQ z-Y{;a-&w!C#bQ9E;gH4^2jlG*;g%yS$x{%_F=vt2JEL`bNQZlA8Xr4~eywjugZYwn zvC|9RyoQ}(NBa{#d|D6Z>^Ava>G6ccgW?B`WKTT5UCGP29jW}|+_`;&ES^uKh$gzC z;Ob26{ZC3XIbo{k-T@WZoyk<C#DsNI=yubfR1Tx<)+6L?pS`O&&*CsZ@F(ErvF|+D z2L@in-UoJXt#9|}gw#D~_{w5zhW{ItplGC}u<2)f2=jxc9jth_4>FDh`LYKaQT?SS z#f*^6{2G;lgu@r;y5t03u}0$!=Yh%k?65Vs^@2DyV%~cYEz0xt^^MmakjlO=wS0N% z$UXd*beK#eIF-K*uDhMOK^?3aTEwQQci)pW!bUjq&W|BZ8(c!fXnrnoETcIQKxpq9 z!tL1ruKREkFT9{vdzT&WRN>EUbv=EbM$NH5-728jJnHRCI(q|2vm4Ozz9V3&od-O4 zypPe)aOCH&OPfx#yoURNOBWCt$^etvuN2lftTOqGU0h~6F1?Bi({SiHIdraG?Jvn1 zFjDG`Xk47FHY$(QZq*}vCryj2+b7o=dhAuUMm0wvrhVJDr5}IqWsIcuc<bFIe#2T; z?A)!L3ypN4C|spgZEiGW9|MsBNghCVCi47M#7T_zcjes;C1uh02Kzpn3D|TCu0S;_ z(a92<%6UX`vmw^=c2};V!&mF);l$kTCp|6jZ=y$oKiEqCpnrz2?ehC;XV^IIoWh$M z)^QO}-Luyn-Fm{BX)Fi5P=3-QSbUpSnZ>*6Qa34^&NrLqAkx+Uo)mt1kK$NnNg;G@ z7dW?t8d8_+bnc8*tbs3H7{d}t)eJpoM6t_Q^g)q424CC&CXfe)hclTrr?VBdl6Y_) z(>?kfs3{pioHl-nbG=f*e#H;Za-}b#`emDbPDQL19?pJv4i_f$HTGbH&^Bs#oNeDW zNY%j6O`b9`DV?iw;jV`)UErNkJ+i<0S3o;M-IHX4l>*I4#7AhTtI$Zlc(nr1>#%vp zXkoNvo9FqR3{vv&DzvzJjSnOO#4&{~_38&Poon4^JQ^S))&e|DJ|FApgiGyw>(OA* zYQg)P4q2(yPM<Fvx<QYB{0tOG5@Pxv{5~%zsIx?RlK-Aq?slzYv^{G=)w*>5wgiNs zc|rnXpLRx8XFe)xHqAD=r4b_7lGZnw^(iR)Z{_6bDhoF%EFPl(+3u4FZlG%mbe?j7 zK>F~Ba{=Jq!pirjPbvA7*1lk8@Osd~o*;I#NM7($%8RpdOXdqMoID;Q4J}^q4!5<g zgj{)D#@O~5x9L}1=r3~KkY{8ZshLy^7_okof}X_1GMWWtQw&?e&~Q1pCclu^m&xKQ zaO)H6-*S)wa+4*O5XJyL25R^&Oh)OOUYH`IBrrsRcFY)=n#!xH2L2-i{jiKcHBRcV zjmO&?O$qwfo?)coSa8$<tMs<hn{4r@Oa#AdVofw1c_EI=tD>Ct9RkCv(`tEPy*f_B z$k#=LD4`6#*#sU|xqn@x5<(U;SD)h$)};O`uisG-<bwZGY%eh=wemES4xYFHJcC7t zqehmNmS?!QRCX!I*uS#MV_$QV;&>m+mxkZ|VmncDYBBCtrRdZ3CERK!qFhSWhokbw zbNDsfUD5goLNQ|*Ea^U@Yo%0!w@s(aoIQoH?FB`wXh7w^C*nlw4X(c@MCS1dVymJA zCZWo)ybFFE`iKuaa~`-;=ULuVhF-#y58@d*6dV+e7Ez40A2H64adzsMowBp0iuj1h zM83I@MldhZW{XHOZk>2{ar;qE$)?ABW3NefkV<w?d6NHS_293AQ8h^6u@$0W7Q8`s z31Z#N-OO7m%x@{zS;$_!O%SV9{HR70<2F-2EMrn<ZFa9tAp6cr>An%UtJ^~P+}N}M zea#TOyH<$@>$awF^FFjZ=^N{z3~90dp+A`6DyxPc8Ae380U!I|ghKX)-H=^N9w?DB zYP`?^Yp@;g!d+-_b}D0`R&|2%xf$1}Wi&fa_sjezrDRSHDW&JUM%d#J!}s!MjizGL z6npk=;Ni#pzFXxDC;i7yadnM?KWfh}NQFgWHK<ged+NXTv}5Xt+_3bH)8p!i-tof& zvPeO3l0#&EOb6Hk7G?=4_>7YyZGMH%s(-ACsd!C?ql6sLovcim9*}oj{j$b(eOl}c z-u|x)GT@Mok_1Jmc%3C8AF}&9;DGZ50W($gJWvQI26KmEKcpc7jr?B-^un|*a9*~) zGCZj*Br4?)&i?~@U>NVRmr9UN?X@uZ<K<UK4Y~g&4BFKj7I&lue9uU%=CK3Kv$Y4* zzJ(;{%1kJ|k(jqskG`Y#He5K!y(Na5JzNvqpj}_przE7fn5s*)!=Xov{;Wbzkh{Xl z0R*0<H`=@Xq%b9eQ66n>UY2Sh4qNFN)#<-BEkgbjI$u1mqI83Ir0c*VM%X?t`s>*m zY%vXm-EwO}3DsFqo+(Cikrbm^Ty$zS6g;Z#;2Q-Aw}GCB13n#Rt644q+CSudaM#Xl zc(|0Ai8%VX8jO7{mNcIzxz_qv>>Eyrcu+g}u!peT3QWk}w5y&ptmM#+*E^r9E4NZT zhn1bOMEH{1I$9yy^SZ=5@TwlG1dTAdkqq&kv;VME?BKffSCJl4eUU((ir`2*Ksfl| zK6Gc4jp9)}$8#f5)sI&0cc#*z*r1S*Dp;j$Tpum+v%uxz0V7booM~nKAKhE>7knnz zsjlWFTSqf!X0V$=&oa60gV*mNHIZ;fz{eFi3Y%B>O*Gxe^<6GWJ#~>&y0Buja^2~< zZfIoz=DQ+X9*ZDCtWS<XD+sTD`K7u|bAIJAecJNR{RD}Ouex+?f`>DI^>x_@_g2`Q ztc^1JkNL!?z-NyR4gZ92_1@kJJQe?Zz0F%CW=&`FfBLelM;%;gciVRW_FcZ`aj-q} z4O^U$n4q$`{kEHE4*IEKiJ6S7tdBn(4+*jl{ZBh{hW59KUMaU3N!`pIIHCPw69_xc zXDl&yu;!aCBaz5VJmZ$=)bQc4S|Jq^FR*?<IRYyyn^)@M;%<T_(D^WVgQaf^oRY~@ zLUdX!G`N_)>dToO&!q_Kxv-hXGL}-#sD5G`e{bl)`d6KI56)NQ?0gMYK_6j5{6ETf zxwTQ!iV_>R!vdFDCmgfmHOnoK*}OPjniggENA$k+WEfSRls(0u5I^|QZC^atFlHUg z&JlQ(Naq9m<{R(GhblJ)s5Qwqniyy*Wf`IdS@&o>fqFN@2)J>u{R31b6S`fogbF*6 zoixFNPmFS$<x4{Xla8$4m*i-Te_h;g;g^V+ixK%-bMKm?Ka#jYpc!h%Pe@RRIv2$! zCOVu-2C0D^N6*8;j+-?l`k{S(w+d}V`jPxH;=oqc=ioW4%r{+5$jnrpot-u6%Dtl( z378OWE?!CYo63ETPx<hd!3mgY=`ZfV`&FDT;dMb!L-$w7GvC1=HKp9OKy4bFQ(!>| ze4f=|CF>~E#*dwPz>b~o1PZnQ|G_7glEO5MRD)-T_#d_ph<*v(&8q5t_@Gz<P^DWK z($dA3t0Lduz$ECGI&<Ic6}E|z+e0rRq6-7k&%*c>rgyd%klqd^V7wkwQ=`Dd%&Z#G zBAS$5^X(*uW}ca@Hea0pattmVn)+^By0|FB&CjN*>txoT^A`FGFVSnA$LR!`-?WM) z#WEltF(8GyW>@DtA`e?t2vMl5QavCerxX%@wDKd7)a5^o_W$+ZS1}2&nK=8wjG>Jm zY?uljAHQt|JN?3W=aBxwm)MQG*^>&WbM?-#MR3Z|x*jou9V(|hO~RAKCL3L<b>pN` zrtC6w*>Wxm9fktZ8$guG(ep>5`J~&KuBH$#A8Zs3gu~!?s5}yjLu&#4wPzT#58|lU za3GQ~wAO(VkWq`G#2TnAHdFivmEfT6xCf-+PX&GXB2igcITH=J6^J){#Vjn+=O=rv zQeEtzFfJe0wiI_?eN8B<9|26x(iYcNO2By%$`<NIl=S9~ZF*fO&t=i##>Gg9vK_h4 zbOu_Ly##KiYV(=+fuNydksbmYlj~fV^wTTyKN`|I3?e=62CM7vIjA9gxQm1A%Q-Dx zZ_DNB>u*Oo!^`?oT(&m3&0ASrlK4>t2bZm%QflM`Dg9lAaFTf~>-WgLUuy{>RcD=U z^$niQ7<_)qooa<;a9q%a*`fwWi21wX#6r<E`2gQ98yk+bqa?wGdCkFX)p747<nZX3 z1hfOC&ItLr{#EFM(Y468T0O=k4wf$qo@#gB??2_CkdlOPG6}Pe>;y)kglWXHr<iZw zz6HF0f6nIjwy#S>$No8t3}x;<#&QkC;PuvW1a#4yOkdnGEa!e}x7Z>6Oi~&*62XB8 z)J^;l4>v$e+cOeVvF(cRof5*=gLXXKfIs+-Bp?hqm6ZoSSpy#sPP%&t#sY4X<Xy!W zugnfL=3ALg?7_y1I3)kY5*?xL$DGSUZNHRc!Sw2k)4ij-mSY=4Z-(>Ot}-7UZAr;w zgAhTi{itUI5=ODIKzIPF_W85Bj8?~g0KFgYAc}b#%bT=KQMfSM_vaHBa{BI{*NEW1 zmyu`J^@z4gpHEVKYMeyE=h?H+?rY8tD(bw$!hkY4yBl>M2w#|2JJ#koef4JS;%`Mv zIkk-uX(w*4{@Uv=M8%iytdBJ24Sm{w_`OX$DPU#{q)8r=MH{2okPI<v28Y{e`|+4J z%KeS|hu;nd2EL#-ld$xh;Qy-(58@9KuNZ&u4f`UJqiEqOT$|yLH>-9j`&EL1@AQ@E zYCtCak{6*0IV?t29Rb7L@+1)t-JDplCuD3$fj06aKB<Wep!j*yI?o+QiHaLHNx#`m z9BjEUt(>!xnAaEhl{_*dhh+kD4}nIdL!u<naYN8?SB_=x**&gU**g}wHGe9w0nTN* zcnT-~O2^`!Mq9s5k6$AJaw>x={csnsW1U+PS_0m&soWh4O}=N9A{imLeF3BKZt3&y zz#stbMIRm>ZYed<nQg8pj!)On!VX*<SCwsjEorc@x?tJV<KB`;Q<|^!^8Bqg36ys* z_n=}%QV|mEi9IG%*$hW!x$Jk3DN#l&q4M(fhV5l~Hi2!|Xy@7kSu7Am$%Y+(qGkF> z8p&`~HVc@N9ZVPg6MU~X$0m=~!nb~x7VB_(3#|d824iIG0c7NS4W<TCS?CPaA^tuG zPEG${pp5T|DQt-@e_}Z_rO1BJkfeaN|0D_m@bD@wWi>Q36vR>gzl^@2hU@k-$K2T9 z;UmF-|9zUn3V90BRAInqeiXVFPC|IJwKvlNlOXQCUsXqk`Nr3$&mp00_79b9Cpzg5 zQ&RWs?cYV!EF)CSiCx8fl$f!1o@Ru*Uuj{LhW&vq`<>QvhE_j5;cKC-bfn2&PGT=l z6$Hdg9G}qM6m*L+Uz8;ru2Tzr5fsS^sg8;F=UTC)e{}D$YCsE6-M$Ic6@xHEALSFf z@t{t>p_J=@83KF#99D75+1lowp{M`%r2jiuOeZ=7Rr0qJ?+-p)A0f*x(RayN8EqS` z7TwykOVc%b>`Dg$$DcjUini%w79rMz2H@>zA~AY+GV{kD;O+gPn=q)%c=XF~BY2Sy z;Kxa1mlj12X%NL;NzqW$y$$JK$O8W(sCdHqE@z)nu<aXg^yEL$lZK+QQBtE#H~ibo z9cQB~N-s?Win{o}FPLu>D`+CyTY-{z*DAF+;i(3P-~qXebWe74kJ~}qomlIWKO^a$ z`^Vwb|EML5H_B4uf3(tuUzVYG*NGCso6TW2T3=fhY?^W>dbo`7bS#s_dF8z6dCh6; z&S;=!O*qpXj?!+~YST1)T*$!F8*mF^-#H9rBnf=WNOqo6#_9I9-l(!UmDQ{-E3W2R zn0dR+@xPA&>ptPsZuSj`rr(jAU4?0Ei(S6|hhxy|PX-*BDQ=-J<+Jj#zG?6IBBWmD zC_cc2<jRb!v9HJJ2Am-#aob%n;(8r8Ll|d_9pU{C4QSCW>{BxhD9FLbLaCm?bJx88 z56{(qxRLYT?}=vU`eZdnRm&Y6A+wcKQa9J_HCY=|AwA`R`q?tNcDD<IT-z=mz>?Y= zrIJi~!gzON;wJGl^x3vvE$xX*BToB+8R*=9=60FEPX0{fS{0An4f0wHr4lu?Ff5Uv zhdi0Nq`@gd=?@+adP}R*-p2$S(@#3PQ5D+CrbG-hA1dYD!1J-_V_$#K?~AVm%PV|6 zeao+4FBc3FP$?oQ+I2`M(Gjn!X#ct16u%t>7Hn1DPJ?K~q6_7TaGyuOq+)CAuC568 zrhmAXSmFouy}+_M5y!#VNxl?$z4i4g`J2f{lyokb!(tC0@ZJ{<*phh}E_{uGGH&AT zrS&2p$<SrlH$dDx10zH^P4@q-=5avZ9^<5-LNw|DH{b&k$^azoW&mjWSwLbn-Is7x zJ{*WVlj%66m;c_}&ZaWIqh2=DJl(c&7C=6GL5~oGJw1ZGkY}ODZ}{jmC*IB__%jXl z?}haM5I+5x3xY`JpCaIA_s#|{?8fGo3tQ_}X0TDSRIT7-*A52TpOlANJ(P=%7hgO` zrqW6mbi#I(Qn_yhK&Sw8s$o+uxch3o*h<qTFhkK<!{X_r(If$n5bkN#eo6@+r~Ces z@3>a~sf-9twc9ck)W6z`Wz_bHKbz|sJNg8R*>^fg@z?er%y*<vdSjnLX&<uQkg7am zQ`g+v5X+WwRDz(`5?AFS-#pc8s4?bR^e{UvjvsB?7;*GnLRmJqkM0LjSVoDvbOm!Q z)JH~@()D!flGUWy3#Koc-M{}ruFJA<*Qce5EGwaL34D?<m1-N!H$#y>vO4yN(pwLo zA9a3RI#|n%&b;d{@9vL<r4EN-&QKW3gpe((RW#9`nh^;69APOb?9$PuXGR?VL$N2V zir0gkn-Uc*%Skntg-B<!_8mBa4-uZ}{P^*J7cc01e0(~EZrwJUU)D){-F^3uI6H*> zJ&5#yLy;<lx!vDqn0>|?wKs+g4qj!0c~5Com4?Zf<&jYRg!}U|)0N`@xu#CfFogn9 zjNx{{z1x>^zkOm%jMxN}+^GifN$u21wv45Ne4Y4F=Bgb{{ESMe?%cVwuCxc2cFoVW z^cWzF{;$+S@4)*t#b4g9BGoOd-6qLW|B5jKGOZ(m>86<mUo)gI<)6vdr^daH6-6Br zs{|hz*3;vP;){Uof~89*_yP|cI1=D|U*zP3!Q*nr%?pYYfsAopC;Qkcj*J-|#$P60 zURdfI`eg1eI(=c_?aZ-0-mm&R{->}J&%r!Ykau+@1v{mcb*pA4`S)kRV%IH&d_U3z zpT=ri&@1V~;Vll^O3W0qF}qCJ-)l`43X!-a9W*mgA%E*uGI<^>MsG~IOalyfe*R9U z46F@J$Te@<hf;U0r|%7ZJIchy7JONB<I2H9hv+#tF6Z9q`c;m?6=F3t)HqUH@!$sA z-uk{Ih>_I!OeiDEoHZ{Ne^hUK6Q%!fmLNZ8&F|x32@c$osJMp0LiEM8C;&)}VLh;; zwX47-Vfy@WTe<EUv$AtYwWu9D3r@iiq&L|iJ2_!jI{Z-^Jj2@E3bqjA-k|w;YYJE} z-uzZgdW{x^0~Lq<ji}j1U#V%D82N{$biKDN@*~|V?D7f{u!aj^Rxvn_kI;lTOk}7Q zifk?4Xk7XgfkX9Z5uYEr)_mitY7LR_ccF5CB9k_Dc0b6*f6DONiqDk*h2Amv3ZNBF zA|0j+7=q3%!Uxom0As36-HD@f?zg4u(hCV)eR=*)avBfTREXjLh9WQ|Br#eb$3#&Z zh0(q=4DV=W*PY}r<>SGI&JOtNE5olWH6j*Al{;=U4e8$(nLi%Fg~>$Ap}ImsJW=?Z zi#*w}*=+u8`kh2+$(g)8d;Ywe2C5(qXW0mwK$fN9weE+8Biq<B*Uu^*L|hAPhP025 zP|Ze%abADK=Mfkd#^_6dvfN@sZr$D2MtTbK1cUzV8Cp30lIzo%{*|>LTDh>Ye1$J~ z!b|IeTwstNW_Z^>CZIJifybGoAF;xYNPUBLElF~p+y&7JA-Y~7)y6^~ckdjw;6jyB z^%5);GqO;@007$vSrC?x0W3iW^yeicnw#RdWbE|+tVjLCq8r}3-aVcG=!zmPW7Y3B z8o1VRqDwCm#Cr5avq(wxr=Fh}tQXy4(0<Egxs+Dn4h2O5P06zL?acuH<VP=7<jQl2 z^7CLzE#D<U2H2kx?z*IB0Y7Ni_=)q+P3f3>$XTrD!`TD53tSYn%=|ZkKFVtUJ9JT) zUmlKcED7_7*sl6!t6^&gW%#?@Wsjq`J9#*Naz8b5bse69!sGsa?sz7=I<q$MBQyf1 ziK!`=-0zmw23Z-Y!lGR`nl|%CVXV@^LE6@v><-qr0NHK<*-|yQe(ff$umbQ$>K^M~ z*r|ibEfo<VsyimZWUisI8%_^r`>mi9>u<*IuP+^dgj65`^sE*Qh&o-X_(4%cyM5IO zaZI$D2+sY!moqN<K>6!4nUL2Tt1m5_74Y}+fal7k#v6vs;katJY3kcc266f#-16&I zi}$<Ja&cKtfq)(}HbhySUGCHN|IuOAgcVSf>Tztu3TU>;<|D?LnVG<dh^x7$u&|OS zJV^A#o7P8<zIhkzEcdej<J=V99`FNu#ko8}#T6OveQb#u%oE)VsGxCB_By;AN?`ge z2*ZgQ<>s0ng<~JSTUOpViUG_pXKYQO;Q7mUF-7N*iqeKEI=19l$c}1DG0_K131TB} z<~ps}YG)aG5>jwWh~#gF(_KD?1(5jsX8j&3c?cnZ=AVw7=3y`z6&CzVaSD5Le2*49 zHIs6aib{X+%4I|S>ybiz>J#U_KUFhQ!ViOOv%Y3>A0@W=435sRJ!Fcze6|EWvubjm zMfJ9SNO%O5XaX+2Qvg2_4UM(aMtl~fwEm#8NF&Ust*y=daQWT@6>n~;M%v5H#$@r( z!9k;N{`;}bDVmoTCwo%vw_rhW7m1Ja-U>1@F{z@+F|SVN#e=T7sZ1aN!66=UuIFXt zZ8jlJq8n#!1bS6@J5F*p)Px<x`GsoPB`-O*2Tmu$g}8EOr@aT9DA?3UGS=!Jj(o7) z6T23}AGH^jq(UtbyP8uMp!S`2n_KhdgE;IagRXz}s)Q{`Id;wMjicg0u<*SS5;yeQ z%`Uv@FHPW!#BSnL9Z`T4mzoE(^X|E!io(r(ja~PEiC)B3dtVToo9b3aZFF&yRIE(y z#ER#I65U<%abXcI3CT&KG%0E6v65-<NWSej`&2@Jcbsf95W}icEAXVbOm)MsDOSYI zKOrPwAGY=FJgDE;JjMZ}iaU`eNJE4-n>>EuVy|AlTx@J?Jfx)^rTy5_s3pw4$GD+V zNf_4+BUmGJLQ|0kzJ>Oj8)R8!0ZY^(t`~Jqr9eMr%RS+BZ9p%oK?afkc-MocV?Dv{ z2>nAMkq`2oQafbygjTO&!yGx8ht^ne{WJbUhr@pY@n9yW)zR&9?)W)>I`Q98X(a-- zR4h8)su~vvJbyp1^T*m$X(+%kZcU}WPH1swOp3JhJt^XF1-fJDnV4ih`<fxa_FzXI z0$Ok-_`Nx6q>&?C`nNmxqt_srghR&nh!0-t-8kEkKYW$Kxh-n;_r_BAJud}<e;UWo zk}p?RTj0}n9|2Y<T9FJDzvQ~{=XvjWf$W$zhpWSaKmkPEF=$|0JG|QApAqkrft&Lg zWCUT@I)%({nk~Rsq`5XR8Q4s6?~Uv5SpBw5;&{xgW!eF{QH{kU`I%UCgyT2O!c7(; z!f}oP>W5;l#K8lPKv9#~b!{>@nSm7?>^ui&^|s0?`vGrt(s^Iz!#@v(#cFP6umPw8 z2YaG`q0cNVuIP89FMXr+lJ742E2l+mgQ%376ZQdu3=Go8h>25fQZ1XMJfm6m9f6#k z($VRMPITUee!j#KSyEA93C=io1{^A(3P!iIk@CvujA(pc*;5bK!|0}DzF|eUk9)2_ zj{_v(^g9?F6p|fbzaYPBTd_w}gD{E9#y$+1%i7Tnw!$)~)f6`MX$NyS(a32C85<eN z+`4tkVBeL-&N*7>x0MUvM;WhWIMBu!fEreKJO-x*wJj>Uu{bV-+!3<<7EqE`tw!{W zb6$tg-?asfgzD(nK7d5TqSh$&?duIA?xAPq?YXhPa0@9Y@vc)I#sNn{v3cQ3I8tfa zUB~`Y+B(W_Y-{T4Lx2DNU3Orm=`%VKi75X`lyzp_K9VXyppVi~2`&|`FgYz;!Nn5A z+=nxs-A%(9_9o4A*YnSki<c$;$Ed>yH2JJs6xfz0)Svlpy$W7c3psiTRpmxIN)>yX z%fu0<uiOrS_$3jf@h7`a1JTcM)@$?;!!^noWIU>+J(o_~OW)c0Md>rzq=^*k@GF;+ zqNQHP*=H{6bc0Ox)bVG%k8#uQ1Nr`pE37XHc!M~|5u~axn7n-@mee&FpxBjL8RPN5 z{(LR<mW!4smDI%;ND2mJQ$Iv6jLAe2Z{F;qz0F})v3qc+M^<rvLmmv?!(aVxTC0pr z$vCdE@1wb}No*0!Syf~|cd?hE9LwaYK>-v~Mj}LrEM`c8l85?~x8c`hP6j%>^uoB( zhuOwY=BFqa)TpU$3?>|>+*=J|l=YB68$Lt}*o1#8-{5O-Axf#;B14hhKQ@RA-QcW8 zTqtlx8&d292%wunzZ5pNQ9nHWSx8Ju$}2u`|CU<12$3qW#7y8Us#kpnPZAC!Nv!z= zM!otxAP5r+!xLPhVWinGeb;@zx|aJ+w^psD{=3Z^`H6QZYbVUSU8&&4O(zS)?al&d zf9;!!(h~Qg;jzOlk)%7ah*CmI$>+_nP@7$q&4Of6H75+3hT0X&?u!R)tS!;ZX?_7m z@fzIQ$*Car3R|-Dz*;MlH#f?k5?+XZU2Q~oTmni-H&?YfT&80L3k<`9g3dU>jAT%i z`>iGG-J3zY4CA<f8nn?FFi1T0J`X$vZnbeaj+~egB&4}-ee3t7T!|d99oC)w;pNxJ zkXxuw|Db#L=~iCV@__y~l}n5|89!Xk_@4$p1VH2CPpqu<T^stgEIM>qSLmNK+gIcY zmAEHPKG`u)O~~WYl?}t}@ZdMvydkaNg_Wb-x5c$a5J9@Lmym(ldl2H-Kta>}?OhJF zkWk=Czu8r~BGq_SDKG)g)0q7jDJgxLPEH_X*JUR<bE+ffmab3t4-mn;gqbAb<*YwC z5Uwq`^zZu)NG?`7;NM%}!JaIe6uDt1%Y_$1se-0elH_`f(0;0Fc2(&Ff+-!>lsf#% z^%#jyv5<<Y*O_GUG-lS=_v))>y4w}?sJGfI9EMEC31S#aSu*s`Q*RYN6uLlXfM)pG zrn8$PO+1dGtCAdJ;~jycy@>HF#NOL~{^3jl_FJ`jYD4tQgL{%(Lg1If3d=;IV#J^? zOZv1O^WY6Y-eU@<ynjBKuS<RyzS%hzsDEYLk-r}jPdI1iY?UX6S6~ZwAPoA9kN@Hr z3FswPS5Y^fYo|W`1NvXj`4P5L>i;r*=)ouYs^FA^@$<(YW~^=zIbuPJ>kR$DRLb1? zVUxPv+$QRK$?x9ir8S`2Z3WQO__r0HYN>P_P?aoLOkD`dY58z-$?ljMd^FfN;GXqA z&NJ4E6QYQZlk+nY^5C7!M1Ek1+bh**Q5C(MTP+8R-g!}fe5&t9>$_h&>gB`S0T%6C z6Tj5153+K(E=+ySOHs&upZkrga!$>jl6h|sOuNv|G;muwjs-4@;lAXxI74*gB<;pe z2i!)#Tyf<8;rOv95(5fL)!A?p=S;CzF9S=fGb3N$z2cf$hXRGr*}Ww7vbL9IWTp$7 z;C}L_{Y*s-u$j=rN#fZ2TzyARxFUq*rY`?qssmpF4RVQRDO-TFNhK(k?iN#NlDT!R zY2h$=Fsv_k0r*k>f1m+Y4?fr|nOiC=DbX}M2b+qfdq@-3gC9;!^)89hR%>KDpKOz= z2EbvmBFn)TMh2&~5Sq|>{C3n5u-nAth#Uq}UF{v`Pzj@a@hl|8Qmx-Y(O~Gu--vt+ z7rgS(xZzJonjo0y!-bxaxulPC2B>9?ccd-jRZRrn<%yVoG5JYKR1@ys0cv`ZBgSJF zm7ntmD!+5)ywo0eje+Zqbk-C+kvOCizCVQy3|-i&&#fQqS;rYUVdM9HwIU&K<&$;a zS%xB0z93>5{(f3G$`R)C@<=7#MvKa%%8i(|uN1!mf-ucCJf^AoKKO%lzbXzv?1Qfn z`J8Rn16lv-WyatG&^%~5!b%bZwG3TvHgQb3mAu5JUA=ogghws0|6dayNy<d_n<aGK z$CA%%)Y2+<q%#f;FS(dTpAy}eHDCE`d|_@lmhb@0NzifSZjz>zh?Ivx%-UnTS+N;u zlq|f~*)MFf0ATw~93~wo;qEa;a8&<e7vJ6rB|TvE&U)uwZ7WAHKA=T`3OCZ92&zrO zM*(o{DXPzc52$PCy)94A0A6Dd;^AIm;<F0VUdrIYNpcM!SLyeufQSeds7Pu&R)r<3 zT#g~vzQ>eMU*hq)S~j;tMbvF2-!3jzozCc%`l3e}ry(|t3VCr^$*IVT%S15!wYD(Q zZ5t12t`FmrT{r6%R0UUK74`!~O_8<!)#hmeh!n%bTb$%z<k0#kyK;iqu;JDvbUhMo zD;}Y_z{;yDM7->{Fx97TQu}gfilhRRg<A~X!_SPmaj}DbOfMc$Kk;WkqEF{-8GBed zl?elz^@7s^M2Uk(?$t5<$A1c8fnZ3j>Z>4fkt)C!xWCS}XUE)!kb@rhS%|qzD=Bau z8c{@sIws;D?kR7ox9Xh>-yVOn6L5f-Jw<*&BpV&lSL$H1?jNGqpslO>q@HbGN4Rhc z&~7QoPvYtw5z$o_&%a^xZp=28SFx4*fk=J)RKWA+r_9XEM!&07B+5g7k<_)X&u=(@ z=)ZQ94(SVd(rT_r0t?rMCO*dEfU!G9d%PCw)+wM&1BtQ0v2F2&;Rs@qACDP-li!>n z>c};IBIwYamM7Osd3U)u@YuEMd?cmkPX6V!;u1nsZHUj}j`;KvgzZB(1a}4cpBlfR zs~eQvO^UbM3&7qLb{WZ}KMs|kbwF(FX|vW3&r|D#Hk)c~PWEP9!V34#_N!$fhlp%6 zNj8PsXLAiyb`>l3glNvev6*9>AR$-*{VrbC2NFbBZNcbvv*AA@6+s!v{q}ka2gAoj zmXS>wL*IT?X3IJHfE7V(P|gDRHW;D1JNxi<W`}hbiy$4fgGGp-{t{g}^<Y|$NbxJ@ z6R|giv6+;RU#b*7jW7<4r2VVdbA3eGU&`;o4jB#3yH(jrzP*(`?xh-x8UE9Q#^O?A zcW|k$8gRWVm>x0e+@%=kvd3PjSZK`ZGA{Qe<u>|;Sr}}DWiMCrEEvuYq9kj~yZ@jM z-p>85J6Q+!2?ZE^bty+|fpDztE9nMz+(7>lTzR^PJ(CGCn_kSEyLsgAmuTB{RoV|r z5;=YS#}C5N6bD4{SQvR4I<yFiCwXCFn*CMJ^BV3)G^?Q@m7aw~-iwHay3@efK@$qP zBDY#%<Si|;6(adnAOXPu1^tD07mpxkYW2|56TEWJFf{~FK;yQTI2#=OWk+EUPUi0; z+LoDxu^{Q+4u9h21(9#~B7x0~KvDvHHf`~+-HHk>8>S|maop?JIX<etDCrge^5*eH z+7yHVTiUd^0Oidd=>l5|C;7`OmcvRY^Q{mKHHoa?kEzrWBh7DLr0Nyx{2Umd=i}3~ zquGySd7Xe!h|^}OS63v*;s*{?frwpd`N<%P4BC@<^Ok_y49B3%uR~3|^${3f6Xp|w z5-?m?PW<DHvKfLW#{Su;XnVVmq$lH}E0*NH;G!AU6>zfb$SS@P?RP|SdVW&}M4TO2 zfuCL@PN@fM!f(W;k!81qc&5~6e$u{T`snOpl{#`dJv}`gi0-by9RB@><Dt0q^(h4% zlq8yZ9%E}~E;!Ht76{rnIq9DSNy=ur`S6YHj`&3U2b1^NPJrQIZ1^e*4~e{TrxiIE ze~k=+ql%pgK&SK++C|E3-!yLkxCVXeurh`}0VBUg4KEihN~i{d2;Td=XeMyl+E`M} zv(VLLFkPVfZ#O{tc|xSBubkP<i8$;uCdI`jo@`_6x0iW!V4C+)LyaYlj-BL>de<Sj zYLCx=i=rp|b`1-e6thEy=mj_J4%sBM#Ky2f@#EtCU4RN!j_;wcPdfBfIh`xuc0qg( z!MA*}i>)6L?V5p(<lq?UaAEswLdx?s!?%Cmg^UxI!{+NlJWxeyS1+4eFr5u+;N~m| z)eWV{wSjsfB`>*ejO*})jN1pnZE5-usRm!lpEH|^W)^4W!o$qlo^@;oQ?6w`I6AhH z*TIeG;onV;Z?oA0%KUQtIr%7iqO1V~>~g1->!74-eC0q`qB;A-H^F}H*KCLBs}Vse z2$ci`1faz5W~{x+K!Zl#4ub@>3;#h$3G^-{#YZ2Qx5w9~xh%z%B&J>%dv7b^okb1v z?f@ICXknncBdDzQ_b%}17x|l8$OLe?91cJAhv?zAqhf0DSoJ7)Dcwl+79iwJr(B3q zUuj%=ZDga0Dlji!CU@atBhm)HAUF8SQ#jZVZk~xBrVXE@D2JMYV^5y~!FEgKX(&-2 z!ir5Q@<n{rZ){^m;njo1jFAeJQ+J5`D<Sh&KOZxiyA*QDTeX4hSpGns$aDZJ8{-v* zfLE_L5aLJSD>nb3%TECtDo^gj#;;->sq2QtA36zBlo#OyPx#JOe|=Ufbl=1ast=IP zJihS{V1e}MozP?Avg}wa8+OjvkLF)GJJ%7T<mQWI;XMsE^S`g@CUAb)?gxScV~!xj zZTxrZK)iFIqsPEmpJv`%mpMO)g%OrDBI+Q3uj}{1gy)qC(aoc?*1{;RCkPMR3sk(m zOGV*rDxScJUhA>T^~eMO`!g|Zc!aUYG8WbSclRhbEoFG?6TY9o>IpTX!C3#Qa886{ zIGX$vb;#XB85&!t5>0p!*rk+Lhg6q6ezt|HOaBxQw?zSVQZvFbFgvchWe{Ln1~z-^ z+hCgP>XpVhg9}6hV*{0pzsR&8rvUM2R?V4?!wKMAVi>`d#r}XE$%-nMr#%f{?h-FZ zYz3?07^Se21b2Q75?KJ=QA1P^R#nv^F}nhRRUgmwyUTKur|qYG2&Zg#V00TV@3O8j zmPG#}^%3j`DRWtgeGvqV;w1C|u|@a>9jPB!rT<h6V#kq1*c&dt6G(}D!F_0l?xT0G z+o7F13UopLcefc5{zI%C`7LjuBsLL!X!IiZ#+RBZs=(5<Y}Q8bg~rF98R^Q)XimGz z7sG|U1O(oGU*U7E4@#Vm!6rKsT38-Q7pEm%W{35%lzPI<{_Kndj3elvbD|DACvaWC z6UO=xE9T{de_FIM0i>7J%r!tS|02G34Py)nzT&ism;QOD(|v4?(#6&_-}>$5yuWnU zTGmd$6n`^fhRViApSabavoa9P^Nf@7iw8)Waox%q=Ywg31x|4i7r~P#IA(^BST#$L z(=-ywS}T^1AHq1O_2s#G%lUdy_t&w{{BWTSi$#%=H;6J$sN<$OEB$ddoup{y!*v4E zo4tdl1^CJg>^a-s>Ciyp<=yiespp+KHr7nD7b=KQ+C@IAdp#UMvi_Tn(;#bKSm2vo z@aGtM?6fxc?Z;;gJ>SIq49kuFq6}CfCG_~@R-Tk%)J+f9eRxW5RW8-pZt#_URebr) z(~nX}*_HlZzWuF4%lNz-6Mn>GGu&Bz+sV~d-B$p6qhI+7JS%?3te;rASTIOV`uLpq zF5(G=MUs87T>{>LdFxIp&S_d}uh&=CrdB_3odDghBt{TtJ=QF1G105YZUw6V<-hQG z2Xca!5cud3j!g}0itnkoaIfF>_D-rP3)~{58f5BS%|J1P<(`ApgxH&?i`SZ_O(zc{ z#ScQ)vZK7b4QkyID|5zK7;OvvO=%H8Ip84k80I4O;b<TIM;VKKfv=G$!c_ofokU<6 ziu-d$y7WQAmxDAR<77?M#-qhK07=2$9sNu7wh!s6uWe;H_Iy=T&EAk-SuC6~+WP4J zQWJXJct{T;u~G+3P{Q|!!F#q&zG>)X?wxrm;fry#wT^0MYa{9PKR6#djVjo*$K5`# zM;Q-_*a=(+xQL+-D}21|$36#%IW}_e-VUtxDXCVmWrBi>h3~^_R|c0ZGDKMi_6?wL zV3=Ti%4KV=@b`I5Jtm*elc8_MGL{^p-GMecw+)(W;R+n*T}8iHMb$zfKww_r3nB#_ zv<#^DgDr;spo7kW&Rf;^Jh$|m3bvVV<X-U-4QHB4)0>bi7z~s@!_KZGm~SiaVLZD! zzGN&ZI?A$&sdo+myG#$QPj<46jAfLDJcHeEP)a_VQMy@xzyW$e(o?0Ez4~mDmfkh> z!lQM{wIRt)Yd{1KTYN*8vaLL0ipsKXR1D6j#0}<Xzbj6v6Ir@8(vlL|-QPJBV_Y3# z`2z;Rz?7k)VKn2Wj*S1|a^`qvj{JFxZblZ}Q@N5)$YkHvACYrfT?(DAnfbY5$6#un z<?xSgc0<rz4`vw`L~?|Sv=Dm4__0qyV{F8JI+WJ8g}LG(OkQfliFUz+37bH(;1ub| zh}P<=d8-R+mK{T~Ilxed+@Fa)7iWr#pI>ttbx60~ka!mqM8fM~IC2`{bn#QlAVtes zFR~N~J)(7#G6-Wb`}4(R4;yNed}uFzcjb{imMORhQ;cEj+zGD_yETe98ZGyq%D%th zVDkxHGf*X6xeA(-(z5oLfGtTps=Rr}d3||iwwABL?#f*l8KO{QFFyLpF52wZH;I1@ zP%7#jduel{b%(%{f&eI~IGkooigi7aQ^^mVqg6g<KT>DOV<ZV)&!2F3byC<`CgH(P z9|oiO-whwLza!*$z(iMGwbN1$!&LE7bn^YVg|^CWpL%{Jm=iQ0SN8}>`0i{^-0e%G z=Qg!C8SH3Ls9VyWt0)ozAPu!dh3mt_85l^~(JJpXP6~qJoqpowSLwEQY%BYQ%G>l_ zIHc=_Jov-XV^FQZVCXk01$ZDZ>Kz#j{d`0vGaWQgeo&=^6>XO$AN#OaB-DpPs8$UP zKk@YjLsBZ#2Hknk*#1jXN!PkTGWIrc{UNt|2iIpRXtM3+Os42lpi2j(j$d59(BW8f z>n;pm(&Q2XnDpA6x82`eT<sWw02n26@!}(AnWtd({mGP_vy+Eu;-^NVXo;ntSq2>d z*ETq!95F2y#oZCA*_dqsyW-|HL!eq@o3?s^hewUte(<Of;)yOUn!2#@66Q)shv#!@ zhTca$(+;=F!jZYrw$lJd=oiF?Kht4Ek5zZTk1$wjyj4|oIp(eQyTq**`%kJ<H;PWY zZz4Rd9gjLROzTcgwTn2+2f*--Dbrr$4biu^K%SpF)M0HRkN*7m+!`(xCoqfpIndBm zdV5`~)a^5WW7?7^BV6V*z2_LY<3I9AaE=^1&S~IU6D@L8cV=$jt6bkz3)`AezrVb- zG))MqDw_Q~(OWA){Qq-a$aMj06xwBJ$7UD?hs>Iq>9Y=HM=@9H0D7Se=sVJL-Rb-H z*W88*FYV7(DEup)tO)k2I%Jp);)!~0Cm)^oPom|HEv2@(0Ite<+Y?$}7jpm8JMs|O zz_B<fq4J5b?fo6PsUqu#ha6ba9$NH91fH{v6g1vE)hQQzBOPDsvRH@WZLr&x7Ci;C zuk3mQ)jl7O^p7V4z~rda9YlLK1JDGxEYhOejHsc{>{z%IvT7~5xi5Hiae@VgkMOkN zhC`oDyHpIcNA+fKWt6V@Uz=RL>$W|HYWsaqhr3*i;d|sr&m&ha7ck&`ipGo2!B5S= z01w$uO44e<TYjt(h<gR4>fPe0rk;I5>eakD3dtM6;LIL%Tk3Pshen53J;(X)jzd4b z6w+}&yQdG}r4Qx#Xx59XD>cZ<ys{DD_L)y}On(>gnT<BLn`*i&s#~)B^N_$&w-ucz zlL?Ydl6IH_aL&9{!Fg?hZ^WTVad!Mk>)J=%Tvoy-|CC->!7C~^#Jf=dtYAT`umnxf z;-oub2*)2Lu)_?2`cZ9)d3Cb~7P^P?nEKnj{#)pv<3Kt07jICMauBWWtST%eww26k zWVySt#%(Z2HyT9Fp~rgv{(X&?7px$cd+6YqGiSbi@;o$DWHlyR=_t?k;Za!<)THn6 zIAC?6gdWgy(7cRrhrH@AOV&<i$vj=<vHf^f#TgM1k>*n)&p<6)Vdk{x=C_}3kZw6Y zm9EX^$5HYDHAev>c0?@(&`<wkNb^HJ-S`aX{Qi0HHguQ-iOH#F+^Fz}nQ*$c7kP&2 z8!8!IJ^VB?dq7EK;R>vrl3n>+-~<3<O8R}CC>F*Qj<Cydz!>*`X3BohVVMsW5tU$m zwHVq13HQ6XY_0WK4*2mUt5rs=Mq1~u-r`ZH{w@I7l%UX$SU-~xrARTXpSQI>M#^oZ zUh%o?Kt+lsD;t|JUl3=f6%%eGa|~24N}Zi-R*3vh(1Sg<W5yf%7w_|D#l;$_4Ji=2 z&pk%ZPn|$ennK%wZ&g)+07o0UFm|gY`R$EggM%`LKWAP&$QYJ<O08dgEts|nl&1B? zCOT>Vn+IbfzpD)I!&R}~Z~OsP3dG`;|MFI<vS5@uE@{7!J+nNep|kASCQ+SHy2TE2 zrnq}Io;7N`6h$mGKN#sanLpbDBVnDkMj0q7iL|Yb?yY%AE4N4M9JZp#=?4*dQ_v%y zZC3>IzN~B+mr1Ws1GLpy`B1?dnvF3q&;<e%0!C2}sg>*JphOWAe#pv(G86*cU4}-Y zJSl~Z3EUPe=ykFHs5*T3)|XVBzDBi@?tC@WxA=nLa_h!1sRQUO58;cGu*to@kKoZs zeS0_CrV1%{rY2@?d7Tx}nH@SZg6X>&)l)cCGS>6DEWXJYVo(D*HxCb7?GN`}!)z8g zn9Wit#WGh)f^B%g8}*Efi`%$N>k;>7(n${B_t>Ed=$Zxt0kz)h)R1mV;ucOC$F0)` zbVX|>d>Enw8sena?tW1LAr&)q17TC$cxg5IHmQn1f8x8nwb#Ejw9G;{cA;k20+b2S z%B2q}Fqfbv?`?@y;f-Z{d&ePW9|$-;eY)s$z|POaTKUWGnH*P`d9yMUsy}$wW$o(s z!W0<o7{aVmsQ6~dJEVn$NClQ=Z>dd5vQ1RyL1+)H?!K;57K~Fx=XBG}y1uG%PW>YP zHbF$)r+7PwrP&_5EuCAN3XsxGWeJFmW(TkCL*&)G^oN_9j;*@hU&8@zjxUL@L3^OH z9k`(`5JtG|2JAf)G}%GdmS>i-SY2KHf?C7@S9m{y)w>zs_CB0b^m+0`tuTH4L2<L_ zRFQ$#Ycw4mv=$;C>Qv=_Kg|ls9c*e`7iP~UexUix?ZfnLSf=xf>}XEO)~4gzF^4e4 z`p^dPqj42&hObRAlJ@QTD{oijLs*};q-a+AQ@LyeML--T3j?qQXRA3v!7<fi&mTO- z*7U-_9Xfx_o{iDyRFzuf50MFgWv!xFbk=Bv1V={tjj`6W*}kn!&7fE9YB0_$|99+@ z_)CwEASklH<pGy->V&>eo)izfvZ@oX{Ct@2%`4KiXBSpw$k=qwym~n6^Kh<q>zy6L z^m+9SnhF<E`e*y;nW~8CRe~5j+3Am-kO{8}%kpMaIURH*@ieKig6tJ;^$&>`S2T?j zJg(gQ#dU64v~(i9r*}BgaY|rmoTs<mxj5Ri-aKPLZ>_i6YSAuZVz%pUsVr>RiH9*X zs>KdAX!-~VhhF!Ez7$Vh^H%TuVl~#lzAAy?$Qx;!;Qnym|0#h)`gZ4gS=-5OGm#i5 z!KybnUvZb`C~l5C(JFjm$=e05S$$1^>T|x;u+BnX-rZL=T5nYo;tk7vRZAY)=dX^Y z&^Plv9zN$COSF_S1Oow3aNN4}o_$mcR*h6=DTH%d_Sm#(FNM2Yjm@`k-g^2V_1XK| z?PV|INAOQw_Oq8g7xaAeh1EHd!!c)WL@<=jrCU!fd9<jbQO1K1=(iO5EuL}}dxVd2 z){})(7b>kj5zNkwx@<)S(YDMLLGDzTApr|~b2|<pjL%-~&}{`l>x)APGmiK3-hH2* zX;^-6Y;KxS&p#IHp&ATT1-IJy6kPu*O(QpwZ9L(`x+82z;sT<;OpJT9Bcmd58O)Ct zn|RRg9wQ%(*~GN2!Q}mRS}iBI3_Ywz8q1rQUmnQOcNn2JYfFzxGB&^7z%Cke(2-Q4 zfm0Ho(`o%ujBOK8C!HT{sXq9?$mXHaBSs+63xK8XC%FpxJp6)FK_ocYd)KVrKdpSh zAP=Jm&^Us<Ya4vOy8v59Y2vB2z9i5_<Gg&Gg4@WuSoRYCAu`qgh@^C&x%md3?RZo; z>u<`>EzFmrg~LxC-87+E5xaEW!~vXK$u$WYLZ`v!(qC}-YMi(7bLGcK>)gj03Zx@# zn##O;AD{3zXnd>r&GV-x1yp@Wm;#4>{MfJJys@B}(szJ}I?_1b#MJX3sS!L#HQPw` z9n+}Q+*$?rU<5J0i!>kG&dNMqRLO8D;s_Xzd;O+wIS(c%A0W(TTqwm;fU7H(imT_m zVr<s8+3v#Pyk%&U%1)U#23(>P*`99a4QXpR+y{}{MRhS8{M0o|zjMjDUC9VGDJkl1 zf;<z$Q!yNUO`*i2^Q}eps<{vIwXTJj|I4s=Z{Qcnh|EjKtI9&8Lm$_LAA4qKBVs_V zud^gBKI0m_V56IVZ~u@Hb@N&8!2IM3Mcr}IL==M7H-8;4&X!)g{mFx1@#_6YRAd&I z@)d))cSUfUbQ6`LPMlk|>@VA!KUXJYyg1%br*=`Nb*#s6syLjQlGVGh*wOAS6pRyx zal2mMJq$8C>^@P|kZT|wH1JGR?_9vK(RjMJqM5Ih9scddCLF&sYhIE%!Af8!2>pPm zdz8SZoVXX}Lh%Fato2zcuCqa6FXjYwh&JrMJMxmfSlJ+x1p_C>Wm9*Uh-B;yhkM0I z$_4sxcRnb?>sG_k0z<a`^(7sP<*EJRL0Wy+vAw-wWvKm5k5P61wg#O+r6W<t^rvDL z;HL+6P3`GKf{i7g1j>PNi`F4O;xxoAfv=$&7udzPQWsUssQc2^@q6-ejJSI|%z}&N z{UrPb@{(4nht+?7qkXPm-kSQnn!S+q=21Al)H7-}7%X;#QTj6hM0W&&4v)Q*!Ox(t z4&@-?=V(4Gh$9aw)SY^gMuNaW*_%>yefkmvGA7>ArcPll82Yg|p1zbHJ`i2Xe|&_; zBf{9Z<gNGMS50^$JYQi9Q{|s}QS$YE6(BK9!*jb|by1X6^zPKamnm=m55yCd>(14( z7<#Qel4B7yub(OxN1X~vCd~-yxbX~6^`eOAbALMTK$&83UCcLKaGHxIrplj?U&TvI zNU*<}nepEJ01<45O*!NAnJ{I%AlSj)`S3xk<0zv5#PsRlXvU6-huL`8d_nnrfR^Qe zHO`P^LQyeR<6ytoQq!eL2Nxs53Lm4`5XaDGS=4AXC*E(f;I^ANHl{i<GV-(KlGZQr zI}iXks_Z*6R2@px{+2H4Cg;FtN=B}iqp0Pe_wC-Ij)U%SC%O9{P-)-j$Tqh8M8JSM zeu&pQHqI0D4t@VRpo4Vc6aYucVDQS~!E7Z%!sS;N_O4Y0voOH&gUn7l2;6<0Z?1x> zuYPaVgyY|G7%Y+O_vgCVhhlFA#6kU1wZPg;V4+z}(#54VoQL5ir<C*^`?*>^cRkT= zzYaVVxb<{?lzbte?tQ#$-e<hB|3#q<I;$*!+Tr&p`_+-8eYs;^THSOyrH9x*&>G+# z%PHR4TuXCqI8_EMIMyBcR!O8f4bwqe-t-Pd{>j#L0>ilP>6>X0kT@Q^?DV;o=>}<< z;E1~=+Ms<-uPsizxLdl>T99-uK5nc|*2NimycxoK-qqcp(>`C?_lY3Zh)j%YL1rPZ zQ|J<7r^(^hH;>b6GdyCf?6hj8bQ?sG=p7oVwJH5ajJ=EG2`Gb5iLxr%4!#aM4mLnb z<?fN^o^}<R2WCq2g|YmjO5UO-(qPBXTrfGYkQ}f4{raY;_q!XFr?rJf)W>e+I5_aF zO2zgW_*^SxD>+J$+|zR9$VtI7kY)-7{FOW~iY`6dUO57uP}P}Zezmo(n3VZSW-k2m zEx$t#b~)rMh?ThDi_!Go?JFsEiqyu3cAM8YPBDEhjkJ~RSvPo`VzwY1k~c}dHFr*H z<_q!VZ)kW)Y4t&(D=^EARyd{$oC=bA4>hppa_t}f>nn4GbxkU~FVC5szFWKyVqTd3 z`|8`dp=$C>k?zCccq-@q7j^#~k9GUTkK<8FNk&EyE*Tl2q^yj}Rx(P+N+g+?*{O_> zWXsBBZ<*Ot$`(Q>B(f<p^ZFj=rFGx;=lytm9>3rBpYK2S!yVUko!9v~&tp7~=kYxJ z<FD~f%i_kz+7jmKSRU^njWO%VlU4{jI_~cKdWaEumDGHjcKf5+FO<2|Gsixf@xidL ztG0>JNs8gUeYVW`xffH<g!EaIUFdgR)+sxm^%lNd(w*-^OQ%L(f+ON`_+%G8c2f|Z znD@AxSX*?{Y%z?X>>*Mvh)olxQ%LtzE@&mjrV_#snb&AmMe#)2<{IE@#T(Kl$WP>f z>y{6T#l~*gr5%V-@X<31(qLD(NNs{&_iX(F{*()zi~LA`k~ui)F}TY7P8_{tL-21+ zOrDWUE*v~e6GoSnULla_;T=P&`Ddq~<|d9COL#o|hThV4`rWsC7JM4H&rHj34Ra%n zNnoY2n^&tV1D;}8WQ0<tV7`Td_fFaMBMfcl)_6W}aDV*(&br~n?JrH~Cz%9p1}@CR z*j1lDw_9W)04GNi=eBAh`HeXr(|}Mh5nsg{9n5;E3bIiu`$rc#p_zm-ui+>V89Oee zsn$By-!;OCw`~`A|5-xo{Lz^wz{FAb{L)j$?!B}8cJ>;X$=i&8{!1uE@*5G#$V7@d zWK%!8%}9TXd}J!W)jl+3Io>Ni@2S8KH4ty>W`5;O7M`tBR$Am(Vc=F}L@l+O?XJN@ zXnI2Yk6p?I74_njzT+qEamd^QxtrHORP!w!`hS1hKQeiCC$|Rf+PN=}`+!1fwYX5- zJ^T&8w1i&KHF>me=;H~%rqa|>0&LWh8_{T>-TT>JESUzL*-qM0FR@@XnN{2%I$M67 zVeY-!MIzEiwo@Nebnkp765jmrB}Td=Y;pNDWH2+m$?-c#5208od%8w_Ar|Rpn1*+y zT*<k9jU%5$gIxMPWuI%p4@24y2LZrZnC|PQGHMP#s(H9G{j!aDW4%HyMgamUqt%7+ z9-3vyPanq4N^Afa9VBR}>uhs$hGNkTY}&Nx#J#6vjHf>o^5lo2zQYXlEbX%Uo)69f zEtsVCeU2W!ba-WDlN&^Qp39t9xpG46TlID<%Z8K<f7QS}B9)iBpWS3oyDbo+PY`m+ z^au>#+kBvMijde4fG#%fm~YF{cnkG;dABjLJ!uF?pmut43U7#pQ5RZC$+C$k;di6~ zujih<rLqTJn-x;P5X0Fs6X3$@j|NWO<A9`7h%WP$?G6u^7)R7MQh(|mN9-|~EOLf} zNooUb*42X82TD$Swlg0!p@)wPg1J4DrFi#aQ3M2HKQGQ`HAowfc1F;Vi;SaR&xhN+ ze+UM-r%*z}iUZCy%v2e9{+7`uCWl+6)Ruzb!pjAnYJ!9GvCcEX<82AvrpqwbDiKUu zws~aM`cj`I!5K;h=CAk3#I0f|;plhI^jDNkzR>5Mt-@8_46G40A(nk5^hBu!kfI0L zPfwcSivk&RSBuP^0D)Dj&%o}nwq56CEK8fvkqyggX^`dr7&1PG?2K{rZ7);YVmIgu z(j2uiCt>p$TC)sVAC<t}j!EIBd(plol!43~7Iz}JzpCfctFIrTTQ01$0A@x&Wix&0 z0I76e<wAaICOawPe4fcuv5SS|zNbKs@>2z50FwSh);8oxGu*+ay91U6svx(R<;TYX zK~TU|P_^A3x`ifT)Zh_Cw&y~X7mHj*Lp9a!m?{w!`Kf00p8{09n`dw@);9ZKZ{y(p z(lb4mW`w{f5|0dhy6Tc};k1bDizc1&*GbP<<h5_tQg@AQC)z`0HBC~~Ug_#=3NuKG zTacO6F0syjRCAU!d;7XN;>&@KjE#B4+DsYJ_slkjZS3{lSY5PXNa4=9S{w%T60e1A z?m#>lhWmFr^!qC^3ArbSrM3I=w9>Q+(~s&^eiTo%`usA_dD+5QhZc@2>Z1fpZ_hw$ zhB!{v%_qBG*k5=mAdhI}y<x$j5YR$|v~xlJhLNd6;mx*}g=-0q#e?WAUexr`WH=AQ zy$uCcdCwv-&Ee+`H}aIr?9C%3+$$>tH6*;C8cPT%1~Y^{_L?{1L8t>;buqhQsW(vO z<MB~xo0+{>ZH@95W5gJ`H^dI<THh7gaBN=;driOA^alD8P<24c^tTCv=xs4k00mth z*TMe3*uNEi$sw_m`cLlf89fZ4Mi$gmA^QoBuc1Hu0Z!wgJCpME9prTtgeAN_L(b0Y zRXL9x7S_V`+&Cc!b1?gEp~Ce3h7{H8=>(njDe3XKIeJTl)rQLyI-mg&1@(@8k^`Zy z4xY7QidpHcrPVvSIv5?vbtx5-aixsu!7>>(;`;sOSx8YG@p-_W4_}!Mw{3^A2BVd> zI=$2K%yfDcqjQ}gWh*#z!#J9wK66#Ljf-=mt(Hu|J@+<w%hu-_b;=T`rP6dON{?z4 z)Y)ZastcS4M|QBAc~yBFR$yxGS1UFL9%7fj^}>%Yk9U!BmT*lJV-v=H3<!!0HJhZw z++aF*iyZY9^#s@_Bz#OvN_x2S%R(%f9TjsKKO;{B#@9<(p!}`v`Raq2j)||HA2Uer z1@GAzo1{a`S}AF<5Bu@BaJjpsS9_EnEnm^T4tKpfV&el<{ysy6TqF2^3UD_z;njzD zaSrgpk#OLf3_pO8YD2|I^J@*iStP1JWKp=a%$Id;o5yP!tDP!N@0mWE7%i^sk3njA z7aLD{jwG&s0VOi=uRXiXdP^^eYZRSVcln-V_F?YPdam)~L*IyYo{a&pE9st?8Pfy@ zQ%jKTf<Mf@6cMa{!Xm59^7H|KPWQrAR!bB@xw851XZ?7bNHG-=ZMFtZBT>KR-clM| zkx0X_DVwIVNAGhW2h^?W+^j9qx6)tXEG@h5wo-3b&HcxuZ>jy9hx1#-gW-*YGxQ%> zcNCdl?Jk;9w-tz!WpaIQ7qJs7z-o}Je4oP!2at&-u)VG;HCwwiaHjYK)Ip}QJq^IH zF{e!S{ZeVJIwvEG4NWq6qsY5&2Mij7Wn9jTC}1fYrV7O<D2)g~-f$S1_q1ngE>L$Q z>%t%7a*8{+>Ee-*&u_)`V^2?t2`?^mRB%S9Zk=&S3_F~7gO^RxP&q?cFNVYHH*`-< ztf}8QH^QIW&C>Oq<?Z8eT-Z^HxspS8JwbBxkoHQ*NIjgA8Jcn@QYu?lF!jVVRI!&P zlJ!1j6zeVg4)q3FQilg8KH2w~&jHp_sw51hb?)zw6emISG6!e=MT3=2bupzGD=F@} zb?N5D@<1a3l;UEc9~%^V8*N&}jJrk4JRvestaMq?_8z~<v8tb@^!$ZvztbcS%A<Ac zBA{vjt?zFOdCEd5SY+z9lbs$EX>xxM2OF#9<E0|-0R;jj4SS77p2#v%FqouBdJx7R zVr)Ck?!!OyT)aK++IGiVO^W<?nx1cxr0A1cH!;$0I)2u^e?0+Jv_-N*08i*a@q0f< zGz%1X6KbF1<Hz_tM=xFsPhpxgWe^|gyfSjnk9Y6lrGTFhs|T9D5wtBvlA62@DdJh1 zyzMaincM+e+=Iwww87`dV=<dr#h}w?lMcYIFj8Q24l0AXMfr81qgUa79PiNq;HATF z-Yd{uS+%*UI5)i8t$b4QZNtfKZ5D3z%-rI!o8<26-@PlcNi>O6Y^ff9uN=<DEqu8C zxPJe|)1Rw)bO)gGHiUyBreFcaS`L@bx8&!9!Unr-tkwgrV1YIm<|MRHzi9hX28cP} zkcCQ*YQ?Yw&p})6Mf%ejXJvLCo@Urz>I%J``worach?F~(`V3i>eqF<A%qiEKl6qA zN&@`(ZN8qbj}o*jdMjgn*PXmJBs5skcc)5I-QnazUmrqSKHK*-AG*VV>98f`)1YP0 z@1zRk49wl?;~tBqT?%{yesZ=GqQfR>V{3c85l<YY!$F|nr7*WZeNr0J3GjEK*5h`@ zUweruBAl&UN%nWX77}gsayS18R~0k97Nq~+p^X&#zwCtP(CAKi+Dsfq_0$AGY*7yt zt?8hCNGPee)tk`Cfs1+-Aerk->PZUJnnh-ju%D3Zz$lU<$PI#~h+n|r&l2OQ9AMp- z2h6f?NRyyl{z%D^2{F4yYOS5}DehIW!K;=PopzV<cBnAAd^_W~)MKn;*LtgVg*i_+ z8&b4(sB)Q}q*<<m=_P0s-`BY=7Z}If{^Is^WEntEgZkYvlz4Eg?wjjNY0x?L;m8_I z<;quj&4Qax7OMc_sIPQgi!R$9CTcgq3QV9qA7)0pnn0q1?(+`S1Jt#tY~9fq1?xrH zLTL;t6x`{H`iF;;nCWGkrW1UwF0wquEcnTqMBryC6etA`Bq%jMm5Y#*eQ<r>_bkWx zM6(rZ&aSghw?u9c%tL;`qdvz!6gWu=@h?3`I*U_e=T$@SEW1INQ_8me0n9{>sks#Z zx$q7$tUrUO`b@>LZulfrA`XXgU$HlDyoEIQgZT8syO{x5AST|ig9HnQQq+F%+&MNV zlWA7_?1uz55dQjxh=O8$5StNTJxhxuYn$KGSv2m5u_=;|fISI&Sn2-STf`({h^ES0 zc_CiaMh~*jo)@<hw5{vevbjtpC*r*st<4)PlAw_b%aRts`JsZ`1WshuJZNV%Ky_#s zg&pG^DUFc1#gt7ORTL)(b1B%Lp;CLIyq(kE*Wh)Ku@X6(<Ern|!+}UxpnO{89|!i8 z_dfXqdQ(kqhe9*v=H3F2UxeBqr1n5*M{`*kQ;W{4hIjj+-{<uWA)mP5rLU{8q~&$X z=Rer+RZ)G(un|TEzyS{vxI@IgwyUPG3uuIlQf*Hdva2?oXctXkY83bzTi8RRnU5vb zfUT76Yikp*y+k@X%p}!DAuHfB6deXB3iJuIT<DrR(R!K%%BjR3vgs|#rcXISmZGx; zX%Jc46P2?uAQm<xa*1h5kZd`Mp&l4xm(xQ4zOTO|+E>!Mx=Z|L99Pr=#=!d9;F<1J zHm7S9yB2l#+O47*P}7N4TLxViSJ&p;AnXZo+1-bmt><fIcICGU;~<(yg5n54LgJWv zV?(H4|5a>Lg~(5HYaDuy*O*rB+NF?ZX1gn%U=+?ekcFPZB*CG%(^mmWrNgJ}%R!ab zye^L;^z5pm0^X*|-Sl`<I9W$9;1hpxvMZFgf>CL#R2A(Ts^M9|*4=i7#!<rO2%{7= z&BoIzQPn3ATOIgztv(Ox!V~G2lUmg-CL8QGK_h4bbK$A-m$F07Kc$f;*QMmtS*n#4 zTd{x1>zTn5ct_a(6-Yux?ve0X5nM^XBo7R{k>0RQU-xRM$1wsXK?0WjAMKvvZbMYy zbe4V~N?6Zz@k47;{#}Hq^Ok=*JIZca0;n!F!B{8-D%@HG)T2dBVJCOQe||Juxz-|{ z2u=Q7#I#F02hM`oC}<gQnST_*q4H95<5{DKs&@d#7qhZ}!*gJ&d(T8`d}0}mafr=e z)cOoi0VhVAvVghr5uKLFr_w^x;(kRDte?#uXxe$p;7|vkvw2(>n3hNpyY!0K&U>*b zqoOIOD3E`nIXddJ&OSjO1K!xn7*7=ye^u+I-B?yx2^Ga1sz~*{xPorF${jkN`t(8& zubVYk^6iagqwW9(>)Oj#<Z+|17n0M}u59hSH4JJA(RL@<c31Kvoc7m`V*fBPIho%T zUv*d+%5P0v$|{yiIj<`jLrI!M0cJ;%5J>U$V<7;Fog-%>nBC;K{1Bt?4buPvym^2t zO{$C=4!)RZJ<>qXw;?z+P$i*1Ou_Kb5O6&-%)I+EAh=62pG-YjfTJ@iQUzi@Xc!Ml z^mY19E?|vBQ}$4E)frd1*FD{}5VN)(?hO@O@L3M#jKbE5AKh^q+2-|BQf*c(Y8S;u z(%o}IAA(^6?MLl0TUQ`LEfv9j*T@thNNZuLrz2ZYokZ}X)%~LjNn<f;PEJnM#G>)Q znQ(iz_VPTWI>7*1KkYm^3M`;7Uuy2sfXGwkPX%thuPbbBq_&Ck7CG#TE4)vH?6e-| z^KRI1dz`Z94ppSWR9r#-?+uUR)iIhLjcbImE=LEgOUU`lDcM`rde{kKgOW{}ZQDFv zKw<QE0R-<VbtU5jO_jemWiVXODh^`L(qeOsx`~W;;CXb|ow&CEu4E>^x(Nkxwmam~ zmlv<OlWGbbA$4tfdQx!@702MmDXlK|WBrb!G1!F1LMb3Oqc~9M8WWW{g2L6@oy=N9 zE4#+HbIK3HSX{f%ES9I*PUA^=c9ZJe_6(6&P*Th`-{dZHm<{veEtOk8$A>x>Ae`&A zyTebUQZNJ-J(%C9;YIJD_R8kkEE4S}uz>b5V&Ww*;z&tE+ot(s3zu&|OP<Th+%uNX zLS%bs*xQSEH1l3NMid@WAUA@rgMekVDNaHUKsRdTSe#e5u9Lio?bu*%xltnxxAsWy z*k^@Au;$b_$vp|!1Cg)eV2b>@IM$0eF&*G`OXpL)?l@@bEvn)Gt$1=d_Fq9+MXtf! z*;<kjZr#Z9oxeBz7TWaEHIvhXw^68l#f|q5l2Tahop0PYe?P9M_t<*pZPk~{E{w>) z+?AYy8)2v+yLRT#J&xyPX<uB~Ab;4U0zeCfR?p?R3mD~Wi*^<18*7^?8i{fg-S#@d z0NMk{{^q2$m+%<$)`y*F5qg!`I}b6J)+U65#-8L;gf1i^y$w*%LnYdlW_7X2&WzFC zWNvV6VG!r-H0vf6agqsUzhDUEzw8YWYtI1v&k}4`$)&Rj9&IMr+$<CDSAnN;x5)I{ zIoFLfKK11~9fwcU`Z?1-2Je&cGsGXsf7cF)3af~MFOCZK8wAV{#NVBED<NUlkXi;s zNz^m9V^c>>205PwUxAI5-48~ciY4fW4U{<sWZ#o}T!Nh%GH?AChR$mBZn>vbN3gRf z-6d+)a<*&PPAPffw>g1YNQm~Q4FN`v7hoYCa!b(uP630op1HTi<~h|W2p4M{KX_ts zG0}n~6#Y5~%$9;ojx>Iw>wkQCk}ndcR^od|$W{)IEkSnHvZsFN=se~{fY&<!I*$hU z_h+L>0BRacRvuf?b^U1{?2+>^B9{T)qO-~tm&)lo8G`-%SkG-mT6|@Af1CGucc$ik ztMY&cSQhM#D5xQft%zW~18j#RJ~>Th%|Qw2hh^ARi;`Np+FEzn7!f-(tQ^%*z@io2 zqY+tsGnun%ljTZZncIew@O;yW4Zr6ykJ_G`i4K11%|AYy*9an%cBx);zu*#xjrcH9 z!$)N+kP{akPYll7Tm%1lzeuOGtujlyByZl<Sr~%KFeQQ=zq9}Z2V8>3$MCT$+)`D@ zLD{^?n8JX$;I~sk9Li;70XO2|U%SNfXQI8qd4GvIX-e~6URD$l0#61h9Uov)6nPr3 z^NKBNr2g{zy9C>Zp|)bDUNdhrzh?aUx@)4*t4vvfJ)=W(a%t+%u{SZEoX^35zpiqZ z@jt)})l1_#>bAg`O@}kMz7Prb&A`?#k~=7o*h;Y&<v&eb)ZGBUv=gYf-75WKPYd^? zUv%BVTIA$B3M<3Kb?j@YRkG;Mgrv@SUHZ`!c|uxNoXk!H${8a;ioDM&JBXKD)lx^S z4iSE*@v$Q}g3_0Ka97sQC$sF|KpKWTzWQQi_}OBMJKmQSDn#iN%CdD>jy~zYf6_}h zra{a!)4Og%e&=k;KKq^8qC}^%=lMCH%pG3MP3;bLBtNZrpF@PO{*hq+%}39ksL_)i z8>^#UwKC7;{D|=lYXkCzBNWcI`*u($+745W7JxOJjMpXIIc%#{=~ANYJY9I^;>98g zm3yZS`#r*=?V9VaBxsg>)GY_AJ?0=~Gg9fubQs?#wjNQKRE*V^^`etnfzz4wPLXw4 z4O-eW<I<+?>DNpgY&ivm^GRqovK##H1Kkneo_tzA^fi&4Zs|R_DZsBI5B4k7$x}q% z$GhY^idCRvo*_x9;w;8+`i?RLT3HG}DZ49ay*pF8^!(1n8S~3db$$s+wt?a9tXKR} zd64niM);lf9Yz5hQIdRyx{C81pk1x6t$dBL3@fRWv{Xu_WK+->FkW2R5S@Y~yZPtm z8318nTf_Tq7v>O-P2NZJhyM(pvyQJ`>lg?NKM~vNV(>w^<l{1>Ham(UJU*ac;2Y?M z^wIN$=5%E`lR3J7KHRqJ6=3c|j%v-@Q|sxZR02V$2+8!_58w)7i11Q|nl1}4YMU0` zMMLnU1QzvnwGR{BDX6kst*&ERl}V4XC<R&w<xFBi=GYi><OPUy5pXb)66dyu`_g;p zv2|SRypr!4C;~;|=TMSS4v?W}qcFF9K*ewklh64c;~Se}DQx-<W6a_|R>vb^9T=d2 zO2nJYfKH9S=7~dl@@D;zjOzZ4*>0%jA6b3#+Asp3I*Ug%$#$IsRU+v$YBPwvX$}tP zdslEfK4Seyh+Ch3TwwW8YUzh=`7_IdUEbvpTd}Mp#+rZ>u9S4j&C^m)CZ7}cEqEXY zSzfQm%hJld)9drCf>D%C*#kA>W8ZGH&x-QC7$nSZI2}$bCF)~9$l*0#k<{<*ZP{?+ zw}--zi+XH|IX6sDbB|~b44k>1T*+8QV#9`y;1I616Bxm3vHHwsJw}fx1<88vD^@_G zo~XDkalEAbloGW|IT*yKdD^`x*)Kdb6w@euD|lYlK6vNZSWx&u@u#8S#JRViaNQJf z-2Tahs8gYwYRMlaBY6<_7w8wXxohJv3f-I0i9>%40EcUxCe?Qd2-emGZ*DlRZhnW2 zTUG#MdEKF`YYpb}K{=tgc)Y|ZOF0>;#ykDreTP6n@l&bYIbpHJ>jGonpybl?_NHF> zk0HPIVoN=hgv?|JDe7Pt(TEqlMcu@)?#i3}EG;A^`oM#=z%p5T^NWFN>yqP2iLuuT z^R@)_{DMy{@>P=cO@lz*q9Iku(s=&TQ6ag}N$)fivb)B1g3WGT5aM%)7?6PM@6sa+ z%@iHCq=kuhN{r+0`h!U*q`p5mjy>Dd8c&0b_s^6$@eXJ20!$f7v)61J6@oAj&1Zr# zBY1J(H1tE~^3t}r@4tRoB6~kQgcAKCe;o!wB3(w%%5q;bH+_3<V@<wuGKcK656@P( zhanHUdyu-;F(}-F3Zz_mejHufr9uY+WhT-9(Xg(bJvzF4>Z`u%!!WneCwmhP=UgpT z;<fXCwhR?Rd8i^^P>UF)^tef+vc8?8VSHq^S-V|KVE<2Og&d6Ra=(+}n*f*o^s7G& z<NmzZONgT&X9o*CC<YALPRqp)g_a#%=GK?*i)NApd?VfHN>Ze~$Y;SQ`N){Ows9x2 zD`C7kT(D)qz_n^5lUT>Ve3$TinC^o*EjTsv65nU*Tm`UR>tW}srO!pPfR;Z&N+b7( zNHWRRajTPj!q9SY@~mg&?FmGwL%bQt&1o&#cH6n+Vo=#MQzX3x;65X$QFIaW_j*H$ zwDb4^$%9E(vS>qEOhe{#KnIZyHU!~CUgfwUKfcU0<-Wvg`$_jv1B30>{UVmKZ3;K0 ziH*v-&XI;g7YPLXlnjoe#RG1^ghYGfVBTq#inBrp2lJ}L#@Pw~6D`C^8m$4xtK7kA z%Fr#|i=~?n+6x6AI|e>N&K)Y)exn}U>h(ht9)M>ALW$4Vxdp&aK5+d(4g;>;cA1;8 zjkg{g@2<J64JJc&eMhMP1fQb!!4t;flPe54M{eJ;<vZD#*~1bmy5iO{@h6PREm@WE zmJuF<k9M^%mv6oRA7duF&k)t4*1QuwSiblkU<?&ex6P6Rz(IX%wJcy_=8y?%-@PGQ z2%v;&j(jkx*at<%XA$ft=zO2(|F#9JIn_lu#d22$NJ8wmMx0Mge>e83<4lQtT26}n zikt!^9)>u5k3-&t_K1F`rTKtL`<3iG#@7P{Cc!Bu1<0NygE*(!p*?=-lE55D)s1+$ zU#1#a#Gqq3l&aFUm#9Xm<T0KYUp0R5#;>EwIgGc+r5|?&8bWgfkgRpCWSPM1#WS*m zC)V~G0mP!>bhvU63}luB?2H&EipC`|FRFJ{x?5Hr8$M`iT*93b0+VftBm$v~k8*kp zd7fmhib^y{ipimA+5WB8P}xaNek`^WvG<VByG#W{eS_h8OHNo`s7SnzeP~`$z6Wba zE!jpRJtxXvbQosLZ{@G>S==5)k7h!|BsOm{%uOj?&pf7}{x%;^#=$tDtO-VDNzJl1 zK4NRt4dJ~|CU*0r>$_)X+RGd)TMsmCPlehZOVTrPh<_dshraZVMCKwWBRD1jD`XlQ zEV%~=!ul>@&8_jeV$m31Mlk%XWiq#%zt_?x0p425-61cV)SG+l{z<K1FU^K99`0~$ z>xa?M`V<-aWicRnr;2Sz8f04aa7Ilp%gb_>eS1k#YjQwI$6@LN^J?u2C77qOd-PJk zB5K^;<r8oiIIhPu@a09H^y(9jmxGf?Xtlb>KIVIWv~A>3sbKWn>bVP~-@#8$UE8x1 zecBA>F>oG;8v#EP=e}8TDOI^9`$vpJKc^+2s}+o9%oO5le!v4~d1LnRg$mRT%^q1m zM}dhj#9{YOp6oLhaaw@->oCxG(S!`ddCe2^-d?`nN5CgYXIt(2kTzxi9X7wW+>uD; z^h(Il2+{6ak`8*9DyJ;^;Ns)&frv&fM}W*u3^e5s&3xTqdiG29C&QT`HubE9=`XAC zNwmR^cR;X@_Gt)30GxEI0@Znq`897qh!=BksT?gd5BB5FgkNjkitzgkZ+fYfEy4zF zgZu^*`r850eMZ{GX9aN*H{z6)BJ6<wM$>^3a3=R>K-oCmbq3&b=2e+DP06UA2r&pu z9f0a<IQ8Lq*Bq(fM-0gcMy<W}768H`LL))h!oVV!yj*1d^DGC%yEmbPE)O#a5j82& zjdOZ^_7k|lk!YKiCoM6ejS$98=LIl|-Qvq9-*N}CYqJA(W$N;)UI*2aCe<fK%twCS zgz+6uyEFLQ*Eh>9&vwO#)|&$?twW!R@5S6k_>eX56MXAZuV3HVn)M77Y3Oik+(7mn zu#+QD>dWtrA$j7qG<wK&WOXtp96}}`KL?(w#jdN^_yaKjR<MgY%oKzzo_O_^$^E0& zz9sk7!-q&ce*p1nA^2o(W3;dhK9T(7)B^9uUE#DC1a`f#ur;&bR;R+7$4r)46MoJM zcU;p3AysH%hCnz@4tTNCb~ISNzz&Q;Dgl-G8KEk&gaHHm{Nk-k9Jt?Ov+@bkl^hL| zn5SQzmp<22MoM@G2G0rO#gQ>C=p5W=gSjkkgQWB9+cUa4Z!IoZ*!q7fi#}n%mTR<T zpJsnWP1tHIkcvm^(%05F%L?h!?UN9#z=h?iU-`U8h^eX51_A&ch#E<X4+LB^AlN!9 zb_O@#dS0bez}u;#KkbwSxe>HwSVMo^2Wofdv>47Vo5|~LehJh#ggT$f&}{MEd+;!V zRSy_R$tnSZt->zb?fV+UzeZXC^No6=QFJ-wa|&&Im=jU9mnb)0_6Q5hUc7CwtjBvL zJDU0^rwaA~ju$cIrnmX+)G646#n~~)lGoN!1XDv;zz^r(Z^9Yxw^t4W@@woDrf-B) zE~u8w#>ZN3648F>)4=1N5ITR`aTdY@O#==x{ryt6eQS+{;dZ#WT?USA+0g3YFz5;B zo4iru*ScBiFv|<1m3-gKOKCxwT7?Z%OvmCt{&Z0|dB)01ap6QUgvBC*cSd*OS_e^w zB`N)>y~NLiTHA~&S{BATk^uhPEX!2(_quM|{_SCxD_HStD7d~5GRUK}AZLr-=4-Mo zA^yN_<VKK{zAHJmJJJ1He7S&2#Jc5xTiM+DT1&D%(kk-FfV;bQa|`{;UUvM*E8emE z_*obkgY))WFO}r;k(A%-IKC2Gy2o*QvP;|f8lW#llha;N$hevXC2G~(x<qAsE^kjF z0KW>g#y#MIJ6}QAT=&YQK7BMtGhc?cY>Ho};D{^zvz_Ong98p@S;{t`MPWa~<yzc@ z`>P{%2nkKm_}nLVpM&mcn|p#~Us3ZuuQ6!>DQs{+1HZv*VpC0A4p1TI0Ez6KEPZCz zt=t5a149UMvR&!UqJdi@5FuEZJM2`^7CpqhsdrD*{`mnmIJf;T|A~5}VR8oqRX?!+ zv8%7xB0s7Fd(PQpY<X7B`3T9+-3m;S6oNBJ(!d2>y0x6tcw<Z_(x&3toH$7*b6ZK* zb!k+Z+z6(wV&j&fz|S`q!}r3Bo#CXkM2;vR1KI@PK(6;)6-t37s746?ctENp6sF7y zIcPR=U&#*1$S!Rt{DeE9+TG$0hppxkwv6XJRFDZdwB|G2mZgi0LVkw{81l603_kxL zhkln1-emt-M~|8W-P~?X{IT;v(}VZoww_+4pwsD`&EAEBbJf*n?5S<<jP_U9h;s!v zZVScuUT8S$k5FM^5f8rWZaDD8gGvq9Tk-zBL#M?w@RyI{caVUJLvtT(S~bs*s!eiT zPWP!i^G?|0oz$y?EzceXjD5v@twxP(6WuwMap{%^-sjdu8poPg&KpQksYTd?>>s_l zzu7Iu61or+!g<Xt+xapF7F-Y5O&50e_AQW@xLzLuwVi46)vj7dMCx?AJ@vs<7A!1~ z&O4{gPJilc0lc!#ZXb6W;(lh`F2HR9DahPi1(hfR6$m>(Bd|WF+(2;r<9ti7LbonU zx3)vf7_ATDr{klNQpp$a1Qqu!DZ@zn6lIq%8vs{mlR?>x50e;A@EAhfUefP#`4W5( ztr)Bl9^7bZJ`Xj6&_#oT`PnubF8R>qkgehenH0BqZ^3gi(L3LsEv}>-Op|u_Xxnii z?2&7rB{R^|By3!uIZayjCa-Fu&!Tk{s9cI%ye`~82vl2ZI?3amU(I{)M3<kI_7EX` zS9WM<W7yhe@p=2{57(}&27GNEj$N7t8;wsphxmR|!2ERv0yD`Xq)lN62T#v1#}!$b z@%P1X0H)QY=k}Yfs$+pLtPp?J^X07v=pid;m>rrz14_uqgUgAx?5n+DDzdL*d(r)D zc)fK$?F<8#B3<gRdXgvx%6qjO-voRw?a!1O?dsdv>AI|xM4tKta2X`)GgIYXJjV#B z->D315T0p-yl#3?W0%UWN><k7B<)*zL5mOsD`!8}{7~gy_3_S^M@#gSC-39~0DQZ2 z75=(nQN2w?4=`<g-)oG!JU$+hN?U7SZLLk%SmrxJ)mr9H2mp{r2&D!zAYGUB4~cVM zt?$ex;VoBA*LAOWzfdt=Iv6>lGO4{Q@0Z+5n52@d^zAv}?GXG&^MBX0->FitQ{<N1 zjbOKyLYq+~)CUvs<l&;mhS_;NR+|{UvB~K2^(nrtGgJ)JD;~QTbE6WbGl1JsVL`KS zLPe})MR)`%7$YdF_XbhCh4~r?B;GlldF)C~a-6pAs1K#dHfj2yburp`uiIyS1yI{O z0*UNh*0PT371XT`1egz$ws4O-cjamJol^b&)Kt4q6F&{br|RwrpZ1ckgFmitG@KL) zz$k=xa*C^Y@KlnCFfoW|f92I35=jOC9!;l^gE{l(oT}SSTS0tZTc@xWUEFQLHGJ0? z-&bbLG+Uc{a#NNUUE+(lyD50HKgeD7KC%7z8+`(S)-9UG^4$b)Wmekx79$M!^xgK^ zIE?_pSig(O1p{8iNs^*vn+${mBhb9NTj)*6nX0B!34S+UNDt`VOxD<`vcU5Y%D<5% z1&c(k5H?NO;XDQV@0<f7vVmpSlWVpQ4xA8Xu<e7b(XZIuHf7Angp6$IUrF>!+8;|% zmczkpiiV56p?QuQt9J?Ka7U`Bghnn2kG#K*;|@IDy|{lan%wF%{T9+vmqkeOwIx(c zV*LQLpP!kwu5825b!MA~7CJ57N>h$M`+7uG@($r9==`;a)0}N<U0BE$#?`MxUP+AG zsO9&;#+{3^?=?XIUxqyDsfXc=D}t@M-Btl7?qCU`Wf>h`_s>ckZqOcRRi5@=>lgR& zj3D{3OQq|F+pY_)(<d)Zv?bbcUu=l~+2sw(@~9))TzF*vV)n5_CT<#cJ+30N&o&Ns zX{Gd*wIlRORjBjS<Kl2XW^XW{1O`K}!&-;DcKO=ncPZ>u>vM{ndX+AhN~OFBZ%Bot zzGF9v&!<glY_u%r9Ou3weF=)o6yI-K@7tj}?>e~l<uT4JK8frEfZ8W^vE5e4+atBQ z%_XlW%4rvE-EiEc8nPQ1#)MBc57F>yYuspw<^-}+R)!LI73xpM$xtq902szx{eH{h zBY&u5#8u1!FEebvlF*W}KG35OgM5+woEinL_|Vho8`(9Kqc=HQ#n&=V0}^wiSg0zb z3S@(&x09d$PFvS}CPb9|;&S<R8a`dK(8#c`uZ}&d%X}=@J1q(xD3nkjF&ikotj>Ft zHzSOXj7~v*{7uKtfe(~&gSoTuOs+n9K;Qp99sv$rYZAzT@=$5gA^o<RUj-)&_4RRT z6{LQO?bdVuv>0^I+57ru00?MYcY7;|So;P%Ghl~CKUx1%%jG?-r^N|dKwaa&Y+|sI z??vesTw91JTF6JDbf6%1{~+WTaU}@pxL2-!Vum_#>-W3_#^gz|8x+~DPqN46kBG#$ z%+)`kp<Y;z4skzpCgfR|ng9K2)cLi2fd0jmzqx5bwj9Gxq2wItyB+jDSv=&J?k=a& zQSF!Y=&h7kYWCsUp)%A#(Gqu#6cL_|+>}Nz2SQk&j;tiUvCwh%It0Lcg)Ww)$2-z5 zXAA=lekvoce_4G(k+<ZvE?Lnrn8Mk;SZv<Mj)OQT>)iE&Qf<X_OXD4Hv$0+Z0TP>c zoW(x81lquLOSeIfU53E>TPi)_Gl$aEm#3D_9DR+Hw2O!TP)Z19cerh=8299v1dpwU z$GJcMTDm^TSBYEca{tbQ+vwKo*9i>z32Ii;yc28+U=ZuoI^tuH|Jt@j!lxZ8?RP%M z9h#!r?#iQr>Tx6|4CThYzKYE$zA&(u%`d<<*<S^Z&j+m1qVD@V=Od1tS^81w&{^-! zYHUnC0`>WDn3=wV`=0r6#0u<Pl_^tNel*ein*e|bbRs-5DxtY2_I5JW>G==1mfWw# zA0|g!SZtn#>m}<>njnpqKr|MJe>IdsMRk7X#ai_k`;}1jd|+=F%(k=dpuAdrdYi-+ zgW>+`?4yMwT;JYDgd2W~_$KQx))^mjx;?(a-`&~Emf=_(7xZi>52acPNO(IjZya`l zVsekJ+5lauM<}#Uet0{v3JKNJBG|WAi|jQ6Zfh5mM5hIu-E)a>e7TD?OOx4UEg}M8 zXF{O&Sr+hCs!U&I^LeJl*YLosfnCL@Dtw4a2id<>s9*j<lz;B?Hjg{IKdMfDFh2f7 zy9#job}%rS%Oi9qm&%GRQ-Mf<l#N^V9{|adVXk5r>S6W-agWFCPozKSj@$4A7Gx{m z)s>m!F=*=h3a}5f&9#axVo;fPsVJv%Rbe4t`UKE!O$k`aBV6N~He|(a!`4HO52U-K zNe2QR=7Hat3!5d9GinSEPRpreS99H98W*@ZOk6VM%YB%~YyKCZ7FjVw;n-p!?gfnV z%*?)1Y%owU<iQjTm#1Vl`7tt>Oeo(!a|%bgyO4<eu0a5tA=V*5K?!fI`=}<JS;?SM zRemZMN87_!{_P$r?%ybeb1Tskz?En9`E1E&FZwB)g@F$6K>1y-c4Gx@zLNxlW)hR4 zx1$P58upQ;&p!77o~qGz&s9^WZ~5+nfNwz^X`l;()w>z>5aatqE>jrbskOg=yR94t z0>9ViFzwz27Xame!Awtl22LM2LzR`~7Us}-`N~7_Cd*`mhywTAFw1G9M^ETXh)RM? z56iw?Yi4|9n1(>+bHks#nNBtDah|~mbHK!c-Pf(p=3;zHtP-mx1s-6pQT>7ff98C! zTi=kDffwf)s#!~31^<A%jy@3-D%dZIX>gKD?mBLZ#VCB0d02iVx=k5y-(;N~D*jUI zUjd9WC07D44uKrN-qxng8V5m{5C|W&8fVMr13rSF!$D^$w;!K(aYAGXz|Xb0;d*N@ z?tNv^38}!3MH3GaQ&O&u472*QgCTMR7;D<eWn-~>$(n=2c*3d*VqB;xKIf#o1#|a` zKY=Rl)r(skp5MzKVh-%sS{MvqL<<v!%<U1>1#UY+tJze;<fu8Yn7T^04&$#DjC5H5 z`BvMX0xz#`x}CNi5oL5+Euh@EZaq^n+Ure$|5WA-jBnaaRu3u}>Epgl|2}5l)X~Pl z1G2O{s^AA==^<l1s{GJT!K2T3_lQqWp&EAPByOWF-7S(xxe0Vae(xLV=OlU_i(0Du zym)Q3@^3r};nVBa>cU+`lm*wt&LyW@PY8IFz4kHOnx4Z^_P~V|q}j)KT1bP!8m2`E zgPAr0Dn-{O)T=;ZlNSma`Hce*yP~#(=iRS#fLV~OVFt&0C<{pYzraxZ^+5meDU?)V ztZO+6tvO2MwQ{d58KJ9F!VC$vpr)A41340FHf}8%@n?xNp>aF;CTgZSA9bp^cNTXL zYtdvOMa5GFEqL}T&;lI)K2x(pm(0NfIvNa~3yXusMw+~m8}2xlZ`<`hdEnM5zgvvV z<7waoIbT=NTG-Ka|FyplrPy@^nQb0}gkK3@T5OFgrK72RLcAfZ<Z*Kt>hSA=THWUW z94Z*u_0WL|=VB^e?GIYr7@yrqV>?OhBLW|~-n;%81rFd28e+wqGqWzIUwQ&JuSZtf zaU>M0$2egNeLcQz6pUtbxWmHG1JjdltOzL7)X->440oYvcTx8SE%NW&h6yY$#{^8; zS<^0Ogt>wsQq<vi8bmB(_@BhG--nVs&`Rc9J?~uuq21U64}UbX?8Y9|$gQS+2OWl9 zVuX2c7{~pLz4jh7IJW_&#TuYK09HOj&T8GIY23pXUk?)gve)bbZmdIRTpa|uCcG5K zx@iYcVloHmxaOLO!;IPEIxIc#BLmr9dm$R_%g;LzC8+NBZ<fO^hbamc{$SX@;IFA^ z9WqtbY^Wy&O_oOQWC=XBwfVa{*qE=pUN3%yd!W3X<13)|GKbx4=510>5)1mwLB|(D z#HSko;<&I06w}_xmTx{5>%ipG)|>0ywMqj8OJ0az^8_z|oGJjhH*&n^l2(BEikjN& z^`$Siz?ZwvM(2Ax*q!5znczIoOi=4(Q~EmCS?f0k!J`5&<NH7hRXQD{{()lsOpoCt zDS0R}Rqi`^*PwwNe?Z7aP82rXLM87spfXfk)vIhTceHW-)Y!VYE@Aw!+%aDpq?VQn zo9=l@LSwMGIvd<vF-=+PE)|`okj~LC%kuAD@Vs9i;%b2`fdw8odpr#Y%^W8sUUWDN zyr1L0!6-Z;1^>B&xT>%C@kFTaGs(@<Y?0m%4^prd59}^r^7ud!v1@QQ_I1B_5cf`c zQnruVd`ra7P_a-{l>nSf_kdoi?VG39v8DyUIA2so>jE`b+kIp4MlnF<XZqc7u0Ue9 znKCc^2BmvHFR`XeSgGATP&fey@vT`9c-jV(%i7@tsVA-;C<A`Mm$#3LAGaYWVxxT> z$SThtUoE^9dMW)<JpdHIrK$&>>MhGjXnZ;i<|A8VJnA5jId}ns%zaE^F9vg3E}rFq z$?ip>SbSD%x#qW3V*V8n5Tr=Lt$aW)dE98f)N#u1QL+F^P)H(ptZYui;Ng6dfUet8 zN<x-^*@t(PVQ$GnFrm9XPNJ&tf~*>&phYwkGHb+TP<Ia+xX7j$R`3`ilTj&&J{u*Z zhyi%NbFl7gv*19;S<gK^eYV&7%N@H${Z@Mtltkzj0Ph}w-qV7vMI7jVQ|&G!2cspx z8iJ=~@%;DkAm06}<6DpCt5*^g#XXLXL{ReKBbeWI`b@~3Mah<I)6KGY<57XT2HEHF zcF@9YU*S%W8vxvJ$cbbK3c52+qR+w{8+nQ~^ynt@lva(h+=Q<}!D0ojuJkKz$W6MQ z#~j4X;_RhAP2omzEdU^kMgdM&c$H!}Z|4O9wOsu=KtZ)FFTEGh0YaMkfj2IZ*$Ejp zdsb@;BL(CV^!jNzRizLKv0~#JkjhV%WfhGNY%3iQrjWXQi?xLx#S4f3!7}?}Y>p9X zirtLq*yhU_wG}f2VHyAj&`Dq_HtkkgNV0FK&uHCTnjNt8RERd3G`6RsK`j(ePwy*f z)ZIrTCG512y14QY4Cd4qppjp9wI6kP*bE67j|f+O<bo3v;i+BaTjI}oXSVVfL#$(e zbsl<Mki?xfh#I^QqP$TH>I)|4)vJyGfXwk<1B40_2Lr$Wd1HJ91&=0?!)R1UP=D;+ zx*<7aFDvp6lCrhK4FM7VzitS=*|h0cVGi7BWJ2B4;w_+=dp2vZ9tyh6*EC!5>Eg41 z63?$+efMZ<H=jR5wY;eJAb^BMs*M4$T=CSnyakeRVVkcX`p~S>k}m<G+SjO@jRQSl z=wWvhRWmd4&IZkhsLJ$@Zq#2_9dq|C1@S35g+u}>H9+KGiH@viLV#haqXa$WWpi|^ z8sNpbqlZR}-RVw&{z9y4MH9_VGRC9eUGnUAkzmIHpkr5yCG|&mJTvtPxPTYCMtxvL zr(jfGv;^?CvY$L@uGv~f#a?Vgm=O)01os*hvi>}5d|D4ozymUPg4&aT%n+;dgV7C_ zhwsidi`RH1zd`fheZua}lNv*Ai*e|z5Y`IEYLgKO_#j=3*ibq0+7k_jXovS=fg33E zCV+w7T65D<`u+a<k8aEXDB1|El}Vu878#aBfC|r71e$_61wdik@yBQH`;16Ueo{nB z3H)W&^@V1y{YRAc3h6#BnJ((n?%TM}QL5&C1xaM<I*w3xKX0L~m^nu##)|5YHu)7( zd$EWVM<-}uHhZ1f4FZAk!pHcY#`0;te?@kes&VnRatJwOpd%Y1VQmRqduxp?bb?2m z%(D_I{O%s9nA=KLu|9QC&pII?NJ#d?@x?6FB;UokNT7PkLqlR#^J?S}GypX-FRf?f zR8nqaw&J7(AQ@+Lfe`ATm{S1?@0Ut8Ng$7}Sad{H<#h+m$>ygg_cL&6r9cp0=f_uh zlV{%jJGBqYCM~GLIUE5`aPU8-MhbO^ygG(AH4oQsBt5uJ_&4*5MaKUwnoR5S@U9z$ zZI4m7X7|&@xdSCL=?ce7cxmO4FvG)6rnc;6B+6*oon5$DeEW+G0vSTMuPC8PE+|8U zL;571$c3_zJOCzF0CE@x;WHGmYB7^<7@UrlZ~X*aI%9ogi_;Hjb!?wdaVTSMQmop` zx_(Ir2*O(4e{c0rHwPvfSR>H`G4DqYL7Tp|Z&S1U&hyLqT3SzwiPjW4;x0qCZoVq! zH&B5t0p^APRnB$}uP}HTbqqE+;%jO=q=91&({%j8U;IyGwoU_)mZc?p!Z0PBIe2lh z+plX9iXBBV)@_3dx$+XT9j!czPf>L+pu6?ZVv_JzXMg?C=RCKGum`1%XW8Rpm(*kb zj$JVP$aJ{vP&r)oL`c-0u(@<OaG91j2x19n=}<IqxQ6)oC0hC*mV!+n9xGT$Sh2Q` zKikER3oirIaX5Q3xsaGO2+z~~KV@7}S0$OAb*0Hqs;iViQk&YQ3gu8k7IH9XY4<k8 zHyW1PSxFO){iXW26~;;$qA+$Hv>NPLZre}oh>a7HXJiohSULy{(Ij%R`)~KfaWe<{ z5j9yY(uTi~RBw)m^<%Sk=-7=Np4m)UBz}#?c^9w#g@OFK=NM{Oc;Z>U_MJO|)G&~} z4^v@5B=dKYi2sQ-84?bEH=s&H2yzteq54o@7p2`fxX<*h4+Tpi_#Ka3&(V?lraTDM z{`|9+h$Uug-g7qg&fNh~#yR%OD!?sBFH1d2$cdB=`(|KRS=JG}IK`jO`qKm+7!BVy zD1RXJ<UfuDEDE+^1|HJ-G1lPftZ7lyovNCCi4#H<HU7&nr66fRx#u(#_ve6YdiA89 zxOuwv#M-A<A)-KY7;bS(=_F>ohkraM$@|G<`TboJ;a4G-#-w|JVhGGW`4+c?|7-;i z{$A{Y8CI`=nGP7GVuuBp)@4S#D8eVv$n=XkAeQ=YN0C|2VL*Op7)VEo=uI0Q7{@AM zd(|%Ipl%T!L}DZdGIxk_(pgc!wr?sOLgO<2?D;U#n=MHzHsL0Gi2CK9uio$d^V_YT z@NcjeW;De2^B)T5AbeD2A6()WuF)wE{e1-m1yX5ri(tR0C{uOHihyuFaEl@#K2iDY z*IcLoSQEbm(FyYBum+#qIz$lm{wm^kokT_a(o@`jEeCzzL!>Hne9cpf8Q2%Fm0r5Z zkN)*1X`p1xmT)BjgewEs{0yfPuViI(PSlT4r~P<EHF?Usr&8xHwU9zaDn96U&&;S< z1PsNKsJGaXZ*?$7>G6PjoULUCm*-W*j<X=hL+MNT7SKxp_|Q8U|LpJhvn8)lbNbPc z5)k~^ff{MfdxAE`@5hS&iM0|PVR7H3`$9WZC~@A*2Tg_M?~^5soO|1UEc03j5dV(x zEAZR1+R0!Dh_niBGJ~@zxMe@uY&RTwWEZ<WPnv2b;tFd;PlEa!k~w89kNjEoUf7@X z&yRaf1*=dr&xYrUhEXe#hW$ICmt#b>#+4dR-(_tjlg{g0C>%dA?BQ{L>J}NDfSl9v zjrR=n4`4_-vEm?V`ht+D0l1>qVy@s;>G&PT@~?%~)TD94rrWKBg)!r$K+31%Z{jvU zxVUc<i*FGB?awhZaCZ#in@+-RN5EF-bD90o)!TCUnD0aY%8!6cmc4J+__a9-^}N>D zJLbVOsw4hXK@aZ+__wE7N+9Nf-Glx{=o|_ASyJN{_G^Y6udX6QOgd=5Z$O<qmS!De z`wsSwQaHyD!Sk~sg9ll@<CnmI@s>0GB{1+O?!Y4dHt|{;paXs+$+UZK)PHu*3L(}u z%{9Aq`|2_r0HcPn*UZO>ip&OhAMaz}wV~y^eL4590#On)&}O@4!UATfe?XjVxIFVI z56JAArM79%*!cF1P#>-SWcP@;iIbwMGd&4$Dp-jbXqNX0N9JM#g0)F`xHEqpDoHLR z+2X02NJ`8K<I6&Zrvz`|y9)pQn`{`RzIdUgbORXjArM9G>ZAT%1WE#XSg=w}as<qK znt+?dSM@y^G`gsV4jw{%ONaIgEl<5{Prr6<ynV=`-l1JS7ekH&GVVSgg<H#l3W6oq z=WJU;K}q!gRCM@bOeEjKk(G*xAb~HA8mIX^uATVX(xC6Nn-?S+7E&c%cJxmC#QtN$ zO!qX(ue^mhb1qG4I{HANoU6$*%7Y-l=vA2I@UDTIyLRnkP*}XtAr9wL1=G6wNL?fm zi9-E+Yw#YUMuo+OEA@{qr$4xJ%6kM2lPM`2H4y}2Hp;S@AnW@N`g;jA9`C7;qbHX` z7pA_)@;%+}v-=ZBg8Q<(jRj2a?+rFY({4<emXMMWG7zS4^8bU{sh$Djz_oDLToQu@ zk+K?BshIxqe!n0p2y#Dy*5{9Fzk}aAq@Ykp<_zW>k?G0{p{D--pU3)rb~F)FvDdo- zo+TPv+~50ug2Vr>H{=YJ+kszq#{*d?!|7MLaBk5+MN9MlAI~kamCkoDdnES$I`WcT zunT!h*Fd5iDFXTy7yVyAQ$D`%Mya`~93WYZmx^WGhp+Gc-eoXG1Zc^&3I$BBd!8FU z$&6V@w=2{Vb3QVdB^mm^zt>hN{6C<9hXztW^yKdb*QXB)zL%Cu`mbZ;@fuEHP@611 zK~xyR9aBE{^EA|fK#)S0_>}ZEk1^;_``-1>R;xdY_VI+TrNLoC3TGeb$3^Vv`?b<v zA0~%qfw@v`nfFby?I*W%Q?~v05&eJptMo^U$@VTfHi_H>d|36Fq(|mOeK;YQ!6(%) zeQl&>7gNak%3M7ecbM~~TSGMSpTgrBSINF=QI{k8#r@Nt_Zv~+B^rL;Ybl+<C~!Y+ zT6U8nAes^s7DlsZYK`_*k_dW*4R9@yg+e+CVO&H%wN-zeQm}liK<NnaSK4y)L4zqC zTwAJVcO}CJ71dq27W?dS12oI*vk+>c$=Ip{?^@06@e|@o8eSP~#8n7(WEku(ioUr^ z1=V#6#puYWw^~qGr?RAL|M9Rr&J%6^*l<YGUZpg}J=nc}7{IXl1r2+2-F5e%=~EC) zT%#^A__9-Yv7n>;Xl&j;UXQ*NMgiGoeW3r1?@Q45c^u^qdVGR$-AT9l4GWD?XD97B z&JIaBV07%}wgQEPdNhNpfAOSY!#m^sMX|b<LB!`uP{^Ogcl>se2UL?%bJvr>nCfs| z9mCf?6rZCTp2L1g1`stV-fZD?%0BvID*sUUtA~GW;+Cx<zlvg%eux{KzuZ3gYgtMj z8FU|+qlzqo!TCcTrWTY>fsA#K!r&1-;+f3+mb{76xog|4abgZfE^pYVf?$HM%9r20 z<Xbk^Lym}X!X>U;;<{G|&sFtG5K@)%`+_Dl!^|uOS68SpsOHp6^BcZT4Q%<0`T600 z-9a?R&|e(FEL_wRx}UaHa)@MsL0nbFKMr#w+UnletIvqUF?8iA9e4;;5+w1tkmVzi z_4K$7FYoO$s>Me_8lYcY`r-9|J(6;o2r--Fg{k*FT&IBg-QM0_UbzD={le=3NaBYo z)7XPz3KRWqWu_AU4wa#l^#VQ4RWFRfP=Dh4pW`=nP|6Nwz@cu4xsbUB&H4jP^(djx z1a|oQAVSnuX|}X6ljgQ~d2U9LFWHcOgI=1vR_}q`KfgLyI5gEeJ*482+uGt4ByxK` zPF##8e1s0($d3qGEDSfYg)8*WXjaZ}3(vgxV*PyQh5ux_CEzX%7ib}BDZQQcvu}#{ z^~Gn>t==OsWD<EY(s)&ZJD)wjXY9QK)shgJUkZ!r^m<H7(eJZV#FF|<>3{<&_wPj7 zr?A=&rohjii+#?!2F-<aS;hTylU!C}pgqJ!2t6~g8=_w~y`2=^T70sWZ!}^5cSw?k z^mP)Lc4HIYkY3>a`D`$&ge@v67Nz6tk)T$#z}G+xXQg}hQQdM47%gg1Sf<o#H}}Tp zTFDzsFX)ZoHp(ozx#S0qy_(2@j{K3QZVB=KIN=b#t%H1vwM}UH+@}BrytuJ?wl*iA zjY^)$Z99R|jqwn3UaCWsL@0M>QHkPQBJ*7$k>aGsExF78Iy0~ueC^}xziS^cI#s!7 z-ZuX5f*?Tr7v12^)++tZ=TN|&YggoBvvo~71ePnj8fcnQ_bpK4F*2L&f_mX3ezX^} zWu%m^0tII9_8&e6KE{)LO-SOx7h6(w*)$^>p1cMh7BSmdc*6<Nr{N>r%+^hiOEmO2 zjqA;@J~!Pv_&W~ywHuN_;O*+ijzQ~${irI;fW|M>r>wf7f+^I*=Bw7?i_utTLjXN) z=j^8j&pJ%|?ujz0wt%SN$uHh}!}?4=MXZyOBoOUTd09QA{I3(6N?a~v7I9i)_+Z8q zf>IDI*<~PgOCOh&P}C)X=cHx7HuT}#qPD@E6HB^YZ1IGuzU0^XeuuN<N02>&q1;2Z zyR0>TZRjnJub-UjGCkk+YuSU)cOz1e0K&rgiBl>td&DOW4PM}MU0rz2eQdo=ynP~I z=aQ3!Cd2?&ou1nN^bJ2h;vvtssk;Po6JxYl3bA%wnq9{3&>tf=rJyDXr$NI5xI+q{ z6l4h6km?Lq9VR%$7@dz^n^gR#N5ETjQ?yiZ2$?EXKKT9m28QhKT;Hkj&t#1+%|IKp z0&w|};>6M^L}v78+5zHwM;xIhjmWY{o@O!^9fPqWt0SdPl>I3H3a<GVLW}7q{Nm!C zBOz!Ns6)!YfI2gP3cerR`>AQXq;t&<AnbFgr6`3Szy9V!!n3j4pIrG8Oq}&b^;7;6 z9Dx;=!gLd<z~ltKgzsZf16Au1J@YkYlkJ60O98UfFMeND@{=Cj15s=nGL@JzSF(_( zG|*GS>YWegRFi2DUo!(aot&OpSgdtPHIz_|K>uJ4)Mv^n@4{GDlkWQJ8L~RhTE9^( zHXy@bW9ygI>vYxx>sR%{u5Mf@R?X4wdo1wJuPR6FL9H0xkiUIr!)l@FH2X+voF4Gp zML3}Vf_U_EE4o}Yh&_{94aEaPke<%#S{A(y<UpifOrP9j6kdP-u^3nPk4jPfKax>D zJ&MOLV&PbvuClWhWPi}hH0u0C<{bvIv<J`LGXFY=k~D<g`<TL>>}RhxwXEV9nC%a) zeKLjKi;yT?&o#8b)Fm9*MJr?8zM;LKBDOL>ky38(Zr3(j1x3aAbh)zVzhrhz>7nfB z1^NBYCE$<EI8pM2r$^O5yXwMZ_Yv2tNCe@v`k=u8NygIxGiHZ=R|hk`rp~`#gZHPH zTR{9$c)ZGTx*|Z_9oqqAzA2NE<lN|xi{!Oqe~Khnj&GmmMuI90Le~dM?dF;TV&>*^ zsu~7x>-%fDRc-l+L1I;>a%1W0q<g)x-oybhkM+vp#Mm$NC&z<G6ct7q8x^zCFOLjS z(n`(VlUL_I6T&)qEdBQZ$J>@+eh)tJwew*~DUIQASz%dME5j<Bmp~z7Beap~CNChK z?13P($T_?=l`||&E58DLQe2g-o;j(Pj_1GX`F9N;B(1rSJNR;df=zx_KmAXR9VkHf zsy~u#lv+e>Ce_Kj{e7hGVRAG+>AUjiui0<EV@eG9!|H`AZyG={ZMbD=`Y@-L&A(9v z^dN$yAPJC>rI3;j5)Hfc$2_nmRUe@jtoMBsl~pP@N2KDrLdXdOYVzM&y1(xDuTaEb z&-y^#NM5a=NRbi__(*Ae1@Z>!AzJ?dcj1M1P!@3?8X%09sfhmi19Hr>g!qVupmhR0 zNcWJm%gjsle;gR}@Ij#&dgam>pjhyyhvCn1Bqvap@)$UfH0R(B{@*Y6__0Sw_T2H4 zNd2JZkcTAfn+Lnuzw<Ltt)sFE@G`hnm%61v_;2?SSc(sJ!Y~jH4Hx_hcEA}{61KD{ zpT7Vs0SFK<%Kvi8w=_N}R1nhF(fnQyf$6oqZNIbte*UZ6K>{4S$*Zk5!JqVh{6`hd zuav2R`cyQ7B29g-e2&(YjLv+ATm2Ubw)CpE{H}zDK5XQ<t+%O0b%^O2yn@%CZGxXz zlO=P}lA*5npO^-njh~-JDJ9=bAFcl9IlaDu`EZjXSq9XXSR+^l0XZ02g3*Y7zS-7K zlxmoKczg5z`SwU@UnUOTz9K4$<{xjL0k3P`TK%9NJSd!2?jNGyuOt4DGq4ku@n&lo zzy9@?@dA-m#2`qx2vJpk^98>@CS-^k|GFDnult6YB;0v4{%ay%Q`K1rP^p;$L5cD| z1SRla?_rEfP+Qy%71hZ%$tVAO?ssZpBY54pt=9>`S@#r0%`|`6J=k1IO$;>Ko!|JM zyQ7G9#~pSji$1FB&nbk>N3SE@dfi}zWWjw7B-_Xv0%Tla#04?>rOadxNA7ghPNF}z z`qyQ3Av()ITKhg|>!$r{WpI}5@ZmDsnUMD-X(qdWhpUn<L@y7*>q53(Cj}TM?VpwX zdUNca2XH@4w*Sxj37AFwm?GRy8?_F~-}?gh6TL2tbL(|mW$b@#o5yQvVg~`L4$A-e zOc1Wt_86YY7q4XMzn@86{qM6fYEK{|RX^>pZTdfX!f_&NepvhN|F!m8__fQz+Harh z*z@<=hYjJGU&pV@25I(wbldgL?e`!2{2p*6Qs82C9pn1D*Z0pBvTkL0tUf{Of+u+X z92lP*Nmh8>(-Y`*u~7ga4S(%Vnf~+rwtj*OjsA=VxM6>_68~Sl{f&h9F}Wk2Fhxq; za^+3B{z!XL<_cK<?OaW%90aUpb)JN6`>=miPSjgFv)*&lE@3X9Spt6_A<QE5tCC8; zVw2{3A$clCa~?PKX?L`ak*mb!k<5cd<ix}(_QZ!3k1_iY?=yYB)9mu=uCCQ?u7x9A zrR0x5u(nsL?^c!p(aA6`b!mT9tL<!&caJ{7Fz?%bjqE&DQiHPYuH=ta;g8N0Cra}B zZDxD=mlwHgMnBrbj%<i6+=&>qxp;cKUM=~-TP8<V5KBvAzL$a(Fns?1@b=#ERR8hg zXo)f-n~c+^feJ;atfP!58IdR?WQWRLoeCvI(n9tY%Fd2Tl)ZQM%HHdo`+OhHX?(t) z-@W&7zmNOZIh=D|@8{mH*X!w)tt6!6P*}dR`Nm&-t4yF$xlRF{$$Z^sgMkt<TkG_p zs_M>%*NT6A(Tl-!?pPqN#?9|%X?F^a;6BWBt(H_<yZ89jaxXor?~9EzjBNga_KA!9 zbQr644VI*5>29F-?K$W>=<Q_ek~A^ckpp7-4sQGpgvKB2EqR(MaX_}Lqq9C;8x@1i zp+4W}|2uRWV9N8sb)gt~S+)T-L$P1r(~ypad8u=w6DHbtAE>We+MqsPP)ihYf1wH2 z!oGbjX8r4{2qyl@n3cGQW0V2MC?hpY>UjNo6L>W_rT+vHsItrick4C4Uhg8F_fHuJ zl!`v2>c*}VwMEI!sFX}CakXKGx&%{9Vy_7s<UbXc>~0+(k`(`@l`&q5CPr;b%*o!K zyS$BVqucmOGc`NARsIADzKgM>3KV#d273U8c0V_QL%R)NIQg-Zl2Q9;%%jo@PpaOm z>(y_<&IGgXAwI&N40AT+gDA&r-M!MYu|H4t+sMPXD;Ecu`a+P9amzyD>WX6c1Cn`} zz!UoVua+1uyW!e9^9~;#(Ps2>se0@5&`<x~FYe+gj$S2=+*0n_rzc|R9YqnTu{(ad zdX?j1USjatKH_r;Z@xyL-RK5FE=avBW%ITA%0R02W&8Et=&eZZyZ=FetVbKl-vop~ zLaVyvPdcNQNx#5Jeqm48h!iFWiw~b_E~;X7JykyD%KK|_ucX|Zqx^!pnwpzgBzDD^ z$<q+NNZx-5d|TOP;khiTh8=2EIl}>;RwqYCecFHi{CO^ad>Grzphj=fi276Hzh;0> ziT!41^A`cOU|x_T%Sf)DeYmhIS^A+KCnx8_tjkuG65}c$5;Mz+1f@ZTyOG@G9Zzq% zfCcW)=${rQh{+~w#`JWud>1k+pZ~3HQ+MIv1Lvk>8F5NPJm^f{z<<XqGp|Shv3eUD zeE-w|^iz0>&lTNUdkOR>Jnk4Xat|bV<S{83%l*U;{qMta^geC8kKk4NpjGIfn1-_g z@So$Ow0{Axx!#w5K+$SJ(Y~1(>i-f{Lk2oow&0fq-}vF<iIrf<zX%!(kLfyiJ^#<g zfMgE>+y}kx@>YhO(;<LNhdL4ncW$Z*Wihl|LDL!EVt|`7e|-o@V180Uohn;YUY<zr z%{Qjc;Yo5A>0&hFUfKT=sQVCm9Y!5-#$4Q?rt?eERUARmqr!3|e|;1GAj}n5zdy}# zyYj!*R|3mX(md*UJn5yt&O<B$4_tyJ9o#R--8w=<8Iw-|zfQjPB{&v<30hhCOYup+ z97H`3x_ET;UxGa&2;@tMKq+BWuKyC4uPLyMy@jDsD^R&yPucguUoyk015`5I9rh=Y z03IKBkb1&fl#-f??d(4U?teujj5+ZtwbL$G?`(|kv%l7R06X_WcKnN1Gk}(cxxfSU z!e`ySM2fZXpdQpoSx64(gR0>~j&1uT703#z2S8wjG~2Hbe?Z`+AUP~oMG6-`{{JE8 z=%jnRy1KeYjZI8UdZXRk+#>QEv@g}A^WMN)yTu5ZKjB8BE`tuVCVJQYi>hsVfU0WD zvSwu?v9yF=VbVZk0yAd@CAk3M>G%^~e-ZV}S)dQU(>nbhk_=3$1Fj~tP(?;N(2u?* z{3v`0(ZJOAYzKh60U<Fj2vpnT3Z{vQJTjx}679dZ^cLaL!GDn1|9VH_uYC3a%+cmS zXOlqTbok%85#ZjGT9hI{y-y@l?r(wr>J7pY16viAj~hG=Ab^Jo1MrsL2CK#G1@NBa z>HWoBxZagK(zm)&?O)(Y0Nfghur*<*zU7z2PZNM;<|*0qUx4VPY0wz{a%3A)D-Y(9 zP4Vl{zt-!;3+2HF>iN&we;LIz1gtkYtcnX{I-Ig*^Xt|QlWFgwP1L9*O`7t5-rK!r z6K?{#HDGa+F1YUeTUE*X)j{Favn~pL(k{4dd+CFXOh^0A53{$N(pZlX*T75z^L@3d zY>gSgsv9;|68X5Xe!mv*z9>`p=3i95Q|yS?zngINnWQI&0s$EGRU_cW)5kw$!Vv|2 zKJ~YPe!U0KawQtUX7oR$6Jvy|7Yd#7&`UbMe1R%rS5kW<F+K3H*WxrE5%P^U{`~Mf z%f?dEzn0rdGET><i@(^tTI{YaT!Z&Y)JiAHkG?g_d8GH<&7QkC$*s4Bc<N&1fBmvw z4v-amE>v|Gah8LwZU()l&3|z~V&X*l;C?B0n!gpH6<Az;QPTHs#X;5V#H^qyPQ<yU zaO%dkm65_Q*1Fw!0<l!p0rmjqu8gw%U{wV~ckKF0!T3NzqDfOP|4n<e4@nGFq(nE) zyuSc;ksN_quspX&L2_!UpyNME^}g)Hb-um_azA-wGHk^XPa7FxTf6_^Vs~RBQ+8`> z>ubmM+VxbP$bD6bGJih7-wXgd_p<EAFVbu>i+>lgjLXVP`tiLw9`pq#PoAW=%5H0M zYzqTE4b1*xH-ucIYHcRTaciJ9{Y75a2{wEawhBb8W6gsP{l!r94>EXo#p@prd9lxl zc%W)d!hf4u%|AFI)+H%{?N3@^{-Nq<tY>&3Sa345_q!H1_s-+}{{N^ncl-+j(iKF` z;$T|NgZtNq8RtP)?6PzOLV;e>=H~K$if8y&60rqu)rkq(C|N<7z<;#b{=KjV9T>w) z<dJJV(Nj+d*5(en4&YUMWS;sJUgc6!KKuoDF9k^2!lVa#h1$A`+%(bC5i#e@0*GP? z0cok)O5(aGT_DHp_4!aicy(?3X8NZUL$?Bw74F+#N&iJ%ReAWnQX`pKh2u)FFyTXV z9>S~r$zlJHXPkUcH@ezA(PeC)SRI+ec<XxQp;L<AF+_wm-muDtOFc;Yb|cU8Lf4X) z!NS5W!dk>HqIbcf2Q@9{PlYs|W$}Ja#qz13GE}^XeCWxEU#icV3Gq^V!p}1(I4p_c z7enyhz(`PBamA8l_E1JP@aF$*Sjib7c!*KglL<T(Hgte!g8b8fU=?IFZYl8mo0<am ze#MS>5sX1JL6(&##9gPwZM2~-Zwryugg1=Z$ilk7=&->-VxZ=aaH5T=#v>FKp3&ep z{A=L>=HWtHr(wN9*DZHZ6<c-|{lao{VM-*|<4Zy*?WwkYMr8HZ2e7U@r2*>)kf3t8 z*VIH`wP`4ZSxgyaABK9-d#dICMIoTN&mmYeAsMA)t8!DAXgJRxG0i$VtBgAW?1e*n z{{q&SC1+`kik&{hX+fJNyZsEoCK0t%l^T&0PN)mpo(d)-a2G8Kf|aJt5>*kq8J0|c z5*HU|*fBgdM%7vHtt22+&bA$d=4?Lgzs)2al4y^9jpT`xRgwRnWF3h*V^ToYB|cXA z5F`n;8&sz?{+?R@X~2owP6%cTekX&fJqC`f=i<7Oetk=+K;Aerm(y^>@%#TlErbOL zz=ESHHtD}u-~|sB9lgr9jIcoAjqhJ92-FV8n(?l3-#n9(7soUBYI(G;bS6ftY*Lab z=DW#*4}XWlax7pAG%nG_49Ddz6E!{>o*fWdSU7tCUbB7J1PN5#z?3(v`16pyYVcfw zwX0#y&DzMN#o=|IvD8#aJ~`HyFa0!sejSAlR|Ud6zeyR%IGQiYMj#5t7rchiTa?$c z|JjP8N64VGaC7+kYlBg#Rci7`iP`Uyr2*dr{NC7yofMHZU=$=QMSLLU8WO9F@;y+0 z%g}B~Bz_wBt$<`_R^=>2Ds;Kws*XS8$e5Xx<J5_{_}4wP-dtRCvaj>o18Yo+gz{dC z6PMn66K;y&;sdyhH;8f*0KgnZa7keQ5@7dN{v%xdT10TH;|o#kH=pdQ9xio79T)vf z9_F;lhZA^dQ?wbfxg<~Qr%ZMva)PLtj381m>Sce&NRMn6UJ+$}3q}ozk?1RK;C)BP z_CKT#YClb+qo?=Rwp2;1zHOuPri_#oZ{XJA)=S|0`7f5;K?@-62R49}4=h{M5LY^Z z<THv9)WQrvhS$9JWQY)MzF8-!Wl)YhqB!5kdrs&Iav=&<@nG#_=o5Orf1@>n<gy8H zBx<3GQ4|k>Ctnf!l{IE~`#-{!Ks6MlpG1be6`ame<q^N7{0!{LUHWJcXxgqiE*IwX zZ|WIc4!<oE2&cnHb;s|6E7d6BbZUz^wSU?#3hHuP6u3f{E#fk<Cfn9PPGmPGA9APu z81*l&$&k<}BvtU7>zU+2-1vkp^NYE|K4nOh`>8Bdh9Cl)zeG7<hRb<qleP1-m-dbF zIa5}AyI%FcLv+;X7(kiB>r0Qjf-R|DdWrRr9iPk^3N^@1aM{_aV5k4@A{c4f9#wAH z6GMU3#)hi=9G@X9V;(gRBG{Wd#dN@g)5R_4!ZARxZH&Q0fxo$zj^8N7L+(*f0rEeT z3rTJL`NY(ZxT3sVw`i!J71eHs`WY?LnFM#P`P~JPHa;wP1Wcc!8SlLH&`gz{Z_g)k z1ckn8im4-03!U^3>Am#7S`R`!BWaZTmMu`kr_pV4GkiNfJ2Iq?7bxMJpy0i?o5O-G z2D`)?Nbh;=%Gps(JWQBlWRVsIBGgX9YQps#K83$x3L_nG_ctd-^p$SEtzCIG+*n)t z)HJX0%a?jA5bt1E7*UW(|0}6RtC2;@mE7f#OHKhvQayk%Z;3uRWcuD}E_v!+ww5&a zh>5UF;7V51*tvN{ohYYkXV>3%;q5BsA|=PkTi5B7%wpbU5n-C)MPxjPC$fKfPUJd4 zT7DBRa9@WtKEegko6dKX%!?{qgN0wAJ47Fscq6rY5MSzHynspoZ(#Qw?{CrsRB;+9 z=BPB6<r%M1<}+qruk9tsE?N;$T~8KSzLBD>vBdgH4Kq9`>&RF%3Z#aNFWQXoKuXjR zjV=2rU(0@EFnC77*vbf?_}>AEB6$#mz=Ziup%K==BpH(=^_HGS1GWFwfDnp^2qO|b z4d3PE3vtUO)+l)&!_Uo>tRg8ui}u}#ryzbkmMqu$3fFcIs&}6+DyN$xX4n(S=!~?L z@raF*My^H;YkK(gW8-&zC1w;Dbueuj6;K(enC*@x61NS4^ST43os6fzJkl8-BRmJ4 zLblyo_3*n2yAw2_@CbhJb7m*r@5C#^UXpuZ>?3AR+4y`72s9v%MyhTGEO5Q&T0Jp$ zLn{JuO6sQd=VZehWdbjD<Lnm&sLnbwe`ZEPhflJ5iSjhgfVhyJx%yKXITeraDoTxH zOM$-Q$ahpVFe|IE!|r^!)-yzJj#3pxVwcaC|El{7wmV%fB(A(4VCP$=xVmD9B<Kt; z-w?5<XJpNPHEJwuLLRYiIEfEv%!pLo<DZM*JtOP+t5fUGj#Sv_ND=)VZzM1#CJ{n> ziGs?91WSTC1R|lGaNo9H1|k<)O(FSBexavHAzV3d_`}bcwoiD!;bM&!)M6X>Md`?r zFS3NsVO4JV6SoJy+kiqolK8zudISvsmF#&S^do<YiXfm{FtQ+_^aBl-KEf-d-qm^n zd`225$_QD5z+vO9n(~i~E&&m~#skFiREEfVR1Gs`#U%l}WuD5LwioVpr-*JGWrdIu zmaCIunpYwGTNTOj|Iuph2!I-`qK<|Ok*a$smYBPr-gm_(xuxK}spI;D5v+N0(d+g5 zqv(_ve~<iBw<F6xhkV2)H~5#P=>QeX%E!d~;MM7E&{0BsHN%e>?%AK|Gm>n0$A-y5 zib-#-cq0J#9|bH9s>qdJvZeMW@F3h6)?m_+34HO!ko{MUgbwP2q@?nKHKQmcEiEmH zS5;M2wY27eE(`PXo}1av(gVo%AJ3f0BYM8*{i;P*M{8aSmqsX5p0nUxL859*2<T9M zhK(2ABs`=<QWjg6P@e$aq%U};BA^Hz20h?|y-{A(>Zb{8fr|@)2@_{cNvuFu&Gu%c z5Wj!QjqY>3Y6u;I*OA}ray|#%^{0I+y=T$%seVQyFjBMGmG~oeBudjDRbzj{l|_V^ z?u<MLADcpQAQJ0v*omGc2;oK2#O}5+Gmy{+wum?L07@+<z21dT8$Cm!M!ugCpYHa% zWfJoPe@TR4$`I~3++-&veP~-yXrBvbh0PFz#vacTVh$Aa1U%KNNRdaL0b{bCLe2`Y z4Uilrs>roM{&n0}{r-v9+kVM#1Y-DvzyZJcCyT&$aynBz0N&{|f1m=qN@R*&ARy63 z(kUiD+xhKfS?O^Qj5@9-SVWOgae&MT{tyE^GQIG}!)NCH1ff8c!att(LTtHoSmfB| zQd=+`NU5Um{(%}KOBTI0Mo2+aZ(_{pK4;IrSd%@1lpl{lAYZpHycBs*_z{wMl{btF zg6FiA?-SO)N)8K9`l2f6OdeDsEZm?6J!BV(Thth0cA47I#WXG!5i+KN!S6v@LAkGa zH_3qVBVh^ikdgR#+N6rwn@dF4@4^whkNb-FkL^BJ$?@_|frL;Labe7nHANe72Hvkk zA~yYC``?v*wQ8PUm2^~%DiCtdqsOG|@a^B5r{QEk8-8@-K7d6Dak3?m!9oaJ)O<gr zEY7fV6R;s?JO@jttI7o4ebX9ynqV9J`2hEG&r7cgA(hc-5;m?)q{7i8jb!SD3E5~l z5hhqK8U>$|<O<-~l}>V2AWs5G3;WBzzxZ1Gi)LV*6VQ~A`)<pd{i?5_x4}cU^NQ|b z1)(w~XAS;kyqO*_%ga$kN4`WUMP{&rs-Z^^Z=-dS0nvVp0sP_har&3&;^l3CQI@a4 z$x4XGD>kHIaY=@nryi*BTEOokL7yo10!dz}2O%M?I=B$U0@Cex?y}LxZ&yPysGaL3 zrlwxMnNT$(#=8L*$PF<taTpu=rRMNSIDYo)EikEmBV7^olUQLu6T4R#3P`|J)8UsL zS5N9P;?}!hGq$(L_i~7^h2C9$3xZ&xQHqENyfz7YZdBifI6zDQ*nq&dKVr`!{3r$9 zQh)0^4b;YS4MT#Io6dKxz99?J?n^l5Scq#J-m4;O7JY5^CYN9dBOp<LZG+MY($Rao zCRc7N_CA~V)p;x|EUejVw`TJ{2sr+JJAw8ODQ<V?NZc0G=gNjEIct&^JXBQ)7^VKA z6CYdP)nd<8OQIR(4MAG19rZ<l!)uZAJhe$tQG09clO8{gbCU^74E;T<1WBxux6~Z~ zJFtIoKe2#~764#xsvWooG1Bkvw_rpmG$u0<euUVpm|2Z#iV=BB+J+RBk1omvE`+%{ z{|c`BK)0OCtzs*|3>>qLCnHkrDOuv9s7Oi4UB*U&E(jruYd|Vaw=dxpzJf=!pc(qT z`s0<aHVwdL00M5!el(bv=A*^IkG3Twr{*Jerr_=uf<OK0jkdGZI0jD2wc$H2kkeli zsP^{ammGv`C>qRY0ZgN@udEPZHH`yU<u233yoq~LNYs@IC@iRF`2<@F19+9gCteWk zQ3grlXSG`FUEV0obZ&&x$3U$JTo2R?cTU~^K)p%0IG@1F0Z2#_8g#(c@)W!#*1I#H zsuZ(6==?nu9`9~p(oc{p2?`As1vx`z+42hmzDQ&EkA`0zLwuJ7OlfItlO$U748)N4 z9)3_4%5Ywg$eIBpW;N-obao|4-Wi#(g3aFSb%m~lXwQD}{=rLR$_pywk(?Bf86lT< zzyiET>pS9`#Z6?fBl38fRj~H_B$nI%pG|`V0pe!z)$fhL0PtP@T={a7hW<|w9yR2l zlunA&AVq5*B(e=u3fh5?bKf4k3@Dzu0Go+74Wu^Gzt&Ko+y5;t;XT28koW6?08cU< z!`g#xW?Z<ezxjR43?+gOFm6DS_In6CRS}8tBjRZgjCp;~^Ll6LVtAQEe)aACUwX<Q zybQ2HDEIb0lH2)vfRL><*HGhy?8JtU-Hg>C#?fD6fub=2P<)e+c}z4pzu73@pk$RZ zp)MP!8=iao;7uUgYU@=j0BwpC)lWz(;9c;0(!@m_sO%*swQkafl-v?Lg!<84vaM_V z?>q^z3j11s2#Sj4an$f?9G`ZAAbxc$@d8hL<e@?6F6oPyHz%NQ`K@{1H^^@TnDIik zk3UJ0C?o&39Ytudjeu#3tATdNlE%u)%Bjt6TgL*(8~x<zdqj4YlOy~|hWp|S6A||n z`1>S|={`LF&7uv7b`<>-EYrb8a4dCZRszIjv=PUmBj?NW4Y1Qrc|w#7pS`NO988sG z=wgoBi7>zeqM=zE;FT+ds3a<hq|t>Ru?b)CHUaN!0}$7E23(_^k{L1Hy;D303kL_c zoVv;j{EaZOB$gY_s3QzAzd*NNQQHaxGTaruIgs=LKc)gE4gZ9Q$F4-z^?zFf2Kf*j zyQZ;;93~QP1!ln(>ey8x5RJpQky&bX7hb~JHy&WwTs}-t5z-)}P|8XfdCWt|>{pMW zSQP*}UEXs3>McN_QrVIqVsvNp@F-}*eW3dMAQ$21;G4#YSsxG?DL%9Dgs0IP=?4Oq zzXPnGL`J4I<9={Au^WPZ0hT!J3a8<>AV8t%;57*X3fJ&jn9d-}cl|NG1U-%z%9k1L zcob+i9w4Fdjg??1NfCpQFbqc--eUh{aPJgP0br%8OM&PDq)`4_g)8nDRJc|WoCwAr z<-Z3r+8b{QH$Jc(^o>B6?G3*@aX4rXUU9x{C=UPLCgPk1S{@NCPt(6zE7E%h#Hb0f z55z|-nP0k|57PAaJsCtOXrjjOhTu4vTAChz9}*z_UcSXFP=enCKQ)#@97n?}fWy-G zPNvr8F*8D(vJ000Fb5JcUyFh}t;>h=-3W>;&x|PQ0;4Qj>o+chvPZx+SJa3~A$-Kl zAdVT@Q(7*<gg_ur87zgmtxRCro0UO)<bwRF<~;Du-hAxPBs|C|HGG=jJZAPFs`B_E zbOS_$k#2wy=;HpQ=SKw)?9ZIWyR!hVLcHqWRizC-cLfI)hFO#5!<L;RaH_XF_x?01 z!d&2Gm<v>iR(?!C0hT%Y1LNK7xytQ+Jbxx;ho3olA8coIyW-J4-s9W%gj18-{vTCF zVi8m4Hx~b^hzTJT5<xUUTy?aO67M{weguj1M2J`*nIuPJ;1>qjhbuXD%gR0X>s59m zYvY4TGYZ+o^R*Tk&7VgLnl9btt+hMqELZkh#rNwY!m!#)13#A#WLV8=2>nY4wvh^a z7;M8HsmQhYem3qg>lrriBJ5~3tM+Z%2UtkRAS2;J?@}h{p8s8RhK<?bM=ua?BcAMk za1EnD`MGgFfUHh;>1OM|o)z4(cU8!V-jeqBaO;j})Rqd<_VWg#n>DIne8X-!tM&>@ z(xMKG+T{q`khdaccjzaiN-VNY5Ou~&!M)k!^>HfJb87YNV0iEHL>{Y*M|>%s1<=Ki z#XOyy_f|_x?IGcVl^S-aCR(}wP&uDkIR6Z7MvP5oe~V53o{GDwK~hT+Yg#*H3ONDI zMX=wK3NTA3;NNCdEvazDpCfYwUl?6xj@Q#lOlO@~5rWIr=1;<5M}_jY))OYic<>ON zxe$)U^0AlM03QlrL~^@6i?@YfrPEk2(Q85F1||}3so?5t@}4ZGo31O)jSdg9&c2U2 zaTPyf$3~OvM$`~;-}B)s8i6YXyUEnOs3MP1hRcqNn8y`zPg49*YXYl=9wSTa*5jT( zR(C2Eu@l`r%p{jlOcY2xK0JhEzWI3~I%@2jjZEOj=BGVv3GRa%Fn^6i&nNKC8(Q4f zecNRrLJ6#B8vD)aY#2t#UHd2F(ukS`PUpxH@~e1SWR#Se37wGDW5%mVA^mMLwj@Ne zs1q1dwF?=hIoL*11C2Q+2#)3o)#zesNfIL3eA=e)$w)87vD_356KxM==wO=N=1kz) zy>5AXJOS6?f@ie92vlt1KN=<#30z!EqK%|>(0wayZ<FUv^jRo>W5j^lfw^`KV*lk_ zU%<RAQ;d7Q8p_!FAwy}kb>aT5wZXn8G|k=iE;+a!yZJmCM}6*VY*QG0@<60oMk*&N zw<%p{Dl&FA7q^DaAD@+xxY%U=5r*I2M;6~*4L^9K!7gUS>9*VJ+-j+w3b{wU$_ktw zu9w`Jb@$|kQqQxyDzlqQx8ofE^nUPg_|}RDINL$y6Ny3^6XZ~MFSmQoRlb2HV)aTO zn$u8%4%(|*ZL&l;XghqQ<AT~3aYmKXY^foAK9CZt-#-{cP#BaX#<XYhM_gosUu^D@ zgAJW=&K9NHuJbu7SsNAmUMk<)x@>-Ew=Fj%%EUMFV<=L2aEsKjX0_V4Pp!s<aoLM4 zYM0I|{i=TSfjxarLJ?`Sc1}cssB!10eCIR*-&1$htA2?z?*0ejQ^xm+gR*!73ej9@ z@fncA#|KvIyGFAcn~S*3qnXdp>^DSuc|L+ig2pOLnXahFA2OCkmi(Gnd`3l%?OTp6 zOIf5bao`g3KZj&9`~3Sas7cW5S9vbhbn&k#gjd&L)-f4XcYt6Wipfb7JzNSttL?qB zilkg*EN5nNd(C*sq_xla!QcDoSifCR^Xjt+6A5`zO(gaVLfr)QB$nQ{db!8nUdcgC zSS@rcI~^DEB|5b`#ji*M91r@$Mfg7Ks3L>-h0oMLd86<Q9_jklZoTg7Hl2v>{UA}i zqIEcje@XG0Ga$_S6iu%pXRCX-mclTRV8!kN5j7|eJy5R^?#Lhl(sscA6M}7w)j*vZ zY?xCMy25dqP!#MxgG#VY%|3omK~78qD4C&(dN>B~WV}NMA^sARMR{yhgK<&YivML5 zaY-FyoCd=rYgWq^t4(C7I>oVB4UjFq#)NBWr67US_xkn{KRrsZw6Jp2wiQ3}B~NEM zn0xKxIC+i~{wW>!pEiH)c;0@880)YjLaYh}#t=?XVn##98if{y*_C5~N3XRPyaU<t z<WGJ`__$4==4W>EWsb&$fDuFjUo*pVfLE^tlJPZ_;^U-W@aXgv+aom<JVxjPK$L^V zyJXAzm(5f+iMf^J1S4xTUP`<@Mf+bsp(DfhVkv>t>Xd-ZW~HG<2s4fF#!CCdv2%$0 z@=^H?CGe&^;$u->Brf+5DVOq+snLta9V19N3Tl1R5=>BgRdTO;h24U*opW<@d$A|Q z#dpjFe-iwC{_+OMrQ)$9e1?Xvyd3~s#^;$8L@*PofC}TKs}jvjK>jHT19NyR?}y?` zVLrW5N&P&&BZOdv5;3fN@hGK_RhIR?0$t6khw(JkI2$ud4N_$Ej@OF-<kt^(tW&F< zw$g+FYHSRw-|Rl$ZTDrWwn2!8vc<dy1niF5{x+x<jTG`eLK|lKaDxbu$~~lCX7J*1 zWm!2M8KXR~m6Mn*zk6MLsi>f<H@=eG3Xj}L%=;@^AhbKH@a-es=weemGX4W%NRI?@ z+vo&@Zv)UGn=jgNfEeM{kYH-@G}YOXT23gkf+*tw`5KKNW28-uWSAeASSt}^I$ksv zBT{$Omn6#RpwCz@tJ*jbGJhw;B|HSR@kn7u5wWQvmB$NvxwaZjHb01=l|d85=BMGe zNut&loF7FgIhemf;^;5?!C)a;{-{X?f!+T!=4mLf=8(6X2%Jra$7Ty=7lMxLUEaN+ zhwKp=Y^-+VI;ID{YsPChc$?VDB9vyLQ9s(pE})x{kckqkJAw@fOIHK3Vt7Qc4PqiJ z&s_i2>!?DWLB=Qx*I8IDZ9W*(gpqY3fj87Epge$0V>{`eqo9XRKng+qfSqI$yE|yj ztI>$fNIW=zcmBTeS99>#$=66BORDa}L?GBDozWC!A!6qYWb~2$+Z@h|Od+kk4M@-t zh@S;*pwzwj%mNuGRYZFeB$u4}5a8-PFpVEc^;HY6MUXxEPa8fTr`%fu4W*Pvo_whf z5!t}6NsXkecfbyv6kbyz&=ZZ?gOSGz`+Xac3ugeTQ!g5$H&_6a*u^^9KF0r~;@m@O zq~7*{-t@LE7@I54Ypx<9f|9{}1fqsLN2SCPenTn*v&ZUuaFP9BmGU-XL4(&Hy^goL zXit&nFTj>%+}DgElH87@u%K{fDPFiub;7Y=4Xx@!@UxVd5UK`gM5l&6A9E$r&wvbq zSvXaqZ}zb)T*<`*r-w8RN6BU-Z+e#-7T{eTW+dz)`~oT#yW%|%=h7cz{^j)x2;GgV znpqA=`To`d?F)q(Z*N~SipYaml6!bX98}H(GGc_N8uSr8{BCj=KX`=Rr|NdlXZ7$9 zA!@jTt|f!Y?NG?fhe#E%bKt^UA1iNq|F8bVhJMnVqLxc;j-w+(C2-r#_iZMo8D4ef znBa;0LqGFNcN*X%^%_P~GQw;z$ypu$+`eteWFMMgwI<wGYPAZ76||jC!B>=dBhcN3 zZU%i(yGtj<uu{lQtotOf=TP^%Z|ie&dARDHd*7_L!?R$~yz`~qz-O07{8{Afmf6ZJ zH)iZ342PcNQ@0<dh(7ScIf&iufcTS?L*nBZkH!=aB-MAxd<e~IzHHq}=jdKPYfyT6 zcgcmZFv@C)c}raQn)2b@&lRm1i}Du~KDu3W#%hl`C0S)rwokmXYB8wTX^>=<T~Sx# zOQ<N-WS~dx@~%^%c6W`#-Ln6{=^_PYHS#ob^Ydg-`rbz<*{I55T(nYY7rU~h-fFKJ zIS#%a@;NSd>mNkI6xR&`3-mg;RofiYUr9J!yURb6odA`0HWuB0C0WElh$3Tf*5bLi zdD*~E+9LRd83lzz+Dh$IUb_biSK(04)Et8fPebB$@_wx!t^BJcD-SJBl?mtFf6}c| zH7ToeY{oRACU8CWJ`3ks<hyTOt~#IIwsKJBgbuzlwPL?{Teo%e#GXP?+o9Oq&Gj9D z73i`(??zgc4aSo#O7A&Hur_rrem$;ZbLJ`86_!U=I;X3x>bS%`J9l>Q|Fr!YYS8<n z{YlXt1wt`R=pUq&x;Q7e|77AuvSM24Va=|x3MnLg@_S<EQUoJD;rtfYuF>o{zx(iT zVua&qBt}~3bcwV1WN<-=`^+v`wt6!|6TFZgi7d`_Y4&uvks~J2w0f!3jpy8}8k@Yw zq!p-l?$@kaay@EopaDFJ>l*#iZOm-%K3!!{6tzf`H<5kl07(p!jU>O-h;m5rE3zvp zW#<O(a8SxFzFO>b)OTDM86M#YF6uD3apM{lMu?KyPTBYH!pWKa21SMokHRXn<#!Xd zso@JA2~j+ejD7b-sWy}^e4Ru^YWZ9aR;!4HcJ4;JU14eTcqy05B(r^|;n2Ij{_)Z* z&UP>Utamv{+xuxS0aOz0xQysRo|O{AG12?p&fF9h6U&`<$n=GubVzcz4+qvAq=*d6 znmd4ZOZ;>><1E>pJ1)*O>2zfo2EQAU%Jb%PIlohUJlAlzMJiXTHFDttv>*a6Uxgv5 zh{^J}(iN=BbMIy;_NK1ItB$#oiz0z9&w1E7j+6@~uTRim(#Uf{U&Pc6Dx%o7HrE?* zWCkc>%D5a4ci1<M_dN6ti>I-9*~#PCxfn!m-&%mPz9w$XlJz=Ad0ZG7C7Aj?8AhX$ z(#^`{X6oiRg|S=5E!xl+k3GEXc~3<m2S>r@(vamuXxe>!hE#f?JnMAQ>hb2juCG4D zlUyCFxhW$wZf@0|PPaK_EB1t!E>gJsOuu~5%antZydRBP@ta!gaQ3)lH!GQmuE4G; zQ<ibB_Hy`2E$@NCq;(=b<$}q^3%f%p4|&W5Pb~$N^_4sPJaUxd_NPLFuzTN@iv%ki zw!b=x=_j4YD-i3j{Z_DUuoBlR&!hZ?ac9`AORsYJKJ}lhrN{V!E?mzz;w1+KvXnTa zKxTd5U95{$&b&!>Q<j1UmH5;<w~~G=TuKVIQ~uCY|4N~a!{VsTq!n$$&WEACH;dn| zHoGqp+KB!vNE{IZ^RYK8*f)}9ls^-O_x{ZR&7{&>)mA><b9HPx?%#`@41V6jwgU-3 z9~AB~ADB;C2@6OQ;9Bo;8D~B3I<I#kMDf;X*j7_jU5j@oKSr=|Y-=m4V$FpSqLg7A z_TP_bnaI}=&H_-8vNeaI*bU5ZaHmJTM=Cvk<YPVYbFEVOYmWtK!H$jRwBJTy-ckX+ z1*g6!KxaNB4(ZI}WWpT=f@*FVtK=JeOU|NJ$e;N!6|ik_t#oG>1l$lUjk&Ly<_zRw zc@9f17`gUKr7uwI;Pm*xdigz)rXl_jKRWJHgi^}oiR?lgD7X|?3W?=@;T{F)F`Q^k z#WU6Gp^lEPawjL2gYMVTqx`ioa9?zCR`J-6dk4G?p9nN_&q46zV$RNrtl2Mnb$Rgy zrC%4$RHE(llaog{T5t{W$f(S|JvKuXtEZ|TJA6@A?y|V~YI%?iA1}XVw2`btLO%2! z(km)dYG2fquXPrTm87zCa#TCzah@zu<Kg5w0J@VveeT5;OcS}p?5auW<40Ov-pvy9 z4oAlCn;A^94XobHY8p1*6j)PazmJ?YT?}Vju+&B*fQckuyH>v5gXyA~zI|WSM_qFk z<<F1N*LSmU{85!T9j-TDk<e4T?oidV<?`{MKeyOXRlXKU^;E|vU0X?lsXA=u-}Dsf zcd~f=NO&B)+H&d+dX~iDZH`!neZ8*j=~a$K+~dsDg~yqdN#=VjfMeQ852opOL+^~4 zO`Gd9ut_d{ztxjVl}f9U>~YYtV7#fPrMZ$^T)8VEz8;w@Qm1Q~>xi`(S6M027>FqA z>+*9Sd;6}QOFZTXy)MCQf5Ep*EdHwedi;ETla#>Uy(A7D^OtfKRz#*v5C5z<qeguX zEkpJ~FZZwn_N!M-?R!nfdTwsUtd5(fWK2%lfYxu5T-)eD%O84&%^oXF!>w!PuRdDr z-ur!6;&z628<JET(&r>3iO+Sdw=c0iy8lJiWQYSS)L{4-uQTB&z?O{9=wsY_^Kwpu zdF7-&Z7#dIT?W-|_J@{ymHoD0j**5sx*A?`9--;^fK{y!aG9jP9x^?1%qv1=LoC6m zAc3&aU0y>e2ae5fF;L^j4xEG5rJ|mZce6L1l}yKRYO0gfA3%q5lGH|hO<iqG?Mu;< za?1u+G_bT6CSJv>1l$mrM(-lK@xj&D(Wdd9K~i!yHBZ4v%R8$wQMr)V6T49UTQPB~ z?%XLW*vy_*to7F}x3-C%2lYFvi{q&=Xd%F+{J6R277Vyj6$Q~Wg<KLhzeP`d_t`c_ zIv15-_Sm9P|JysF9U#Q#w^>YH^q$y#@$;<^Y?;FS&Yiqv-Jd9RHJ)uG^!uU0n!pHB zNotbEx5-6is*XHox8d9sOwJqa_3pI{Z)<n+HjQmCV<BkMr+KKfZIz3<-74G8ad!7k zcK4yXuCPnY|5VU+gvA+}SCNP-vpZK{V)n<&N$yzA5Bir^o7uLK3@{*exMxAXn^R@2 z#UWqFQp_oDX3s0z9z@Hu)EWMP)Tz1t`^)%-ZTVv_9q@iy^!T!`VX3{iePCN@KLwp> zL9u3ck$}Vpcf(g{-GMg!yJNEpPfOzM1Ux<n8ng*ppkd>5-~`g71e3z+SsZ|+t8jx5 ziSvLJ_j%X8qcN}26~S(#6yF1-rqSx)pzRH0SllTXntM8ToB8QU$j#7A_<jWA`5#@z zi(cZX9}a~!|CE-5;uEEo0RSqA8NS?+x>VITUA$9b;?BFt+STjU{_?V5<5J=bNz=ic zDT93!RgT9nQ?A|om>DtozHq8{U7zv#ZLX%0&|@%-g<&C`xZ<Qg{9(Fk>1AKFlz?U4 zdKPh~*lVOe8wmZ``k@5Ecn90ArS3=8wAB)`SB_6jxs~ow;Pij0#s-9!W69}l*Yb`F zTXA!2-IM2~Ev%<8H?mzOu;gV6DPl%pZsuE&!v)7VtU~F8V3$b#wS}kr!!pl+LM>NN zl$8oS%jGW0JB7O?3}-nl_xK9~CqkIM+fXpd7SCs(JP)@V3%#^xl!Gl9>(j23n4UUf z*WF1adKzj1s7E9!H-@RSbZ=ToWR&VTn6~u!OQsz^XGq9w8jyYv+}M?Qt7P}4I-yTP zwBT{_it{p6_mMT93x3pjMMlkDtE~{3Vxq}z<eM8`a_PR;BbR5*qUSPNs3;cpVPUf! zI@E!*LpxUgs~sBtv{)1O{<x*H{RPJn-)$u_^@~;+kE{UGGgp2*VOsQRzma>$@_i$7 zPxRuOSB|Uf`)Y0gw)T(4z!ID(o^NpSm&0Ucr_gjt7l?4RSzv!Q8U#PQY-0QBi|ifr zRx<ZmZrRor?lY|}U-S&xDC#MXpT4k(Dt<R;LM%$@>3NG=o7EDXJvO*)yGt~67t55x zZVo1$DqCQ<T>DrQxB^9t@uEWUx4Fxqh~Yav`}i}?Zvy(GZ%9NpT%Q41Xxo%V&fr*) z@8WB_nOz2c1rEFIJ-9(tQGA&06nEaWQI_mam7I$cTAmNZSFHCdwwlMSgAk63HA5CJ z2uAQELmID5bEbp0OG**XxsDs{HlvrHeCwrq{BR5AF6H6XWuK|MRqmY^7J})YxR%b{ zt*YCs1%iKq64XJc3I|?jli2iG7b!Yyn+<!~#+pA>Ry(aK8a(1Zkdb(393Z-Sr?^0p z_WtwcZmz6XNA~28Cwo&by?s#hTctLcv1O{p%ciu%*p{X2jlIUJ{PyUJ_HkAq77e6G zFqktqqyM?6sMkuto718F{laT8(itQNLpG#fdI1~exEFFk<yJ*Gk`nKFG4JXH#J#Gd zrE<?)5Qfr$kbupsh-42|yy^a%g%&=J^(JjL?&O}$YM(LE&JBU%e2j5gAJ;a6i>IU) zJC{v!CcHAIZ^RY#^*^;=JOPG-o*`#)q08o5X7=atg7s?s7nkz1t>ChGLK_bX$Sd8+ zwBN8po}NEa-Pdak>Qb2Rnq*%5A_tpA{8HQLUSPYaWOAZ#t`}QI<iwe*d<HN417b$c z)UH8cbgp>*m?7EGkW1l1744@cE4tpz2EG9Ya+!Q01C-T`q_(>>vgpxx&gzpMCXYSj z%~DR1n^^QA9o=|}NZ+A3TWY+C`)x0{5waP&)%mua-Detmd;0_JHXatg*98CAlYQh; zaY^gPf1sTau1msPm33A}dYsNi(#ksx0u<AIKb+gne9p=MzgL%X2TKtMdu?O#GsSM< zRoGtviB20KI(1xO7v2Da&=GyK1%niCoF5N%L-S~JRO#!BJD%zIZQs1l;GJ=z{q)eN zv(6fO@E*)tBy`Rc8sLJdxDR923#4^m#}zN=cjH6CJH?j}-+K*wucY12&9WW7Cu_+h zrccre^ia%Vh6X3(wnk$yA_#n}+JG9e(f1D8g7k2R)#Id#^}B2&mCJNfNy+d3a2`GU z6`6@<PP%rEv;yfsKRFqU)Wnck79`mSNY;ChPS}c@4O?+p2G)+!;xR{u%R=>T|G}&T z`me9xyJ=*w4LTKG=j+&!6?_k0?fLmtegW7hf>8B~X3_}AZERnP76}-_kZrAiT={if zUmr9Z{9U1Hd~2gR_ZeYqLs}!1EljJ<3O;_lVFC#I-<45rKvW}(n$cB#c>SLcg&pX9 ziH*0xoz~kn!xYe6-YSeGQk_i~ke3VpV_*ez33S`M6~-`O>}C1omveaiMr#A9D|DP@ z5BL`%xQUqlH*R-%lWiN#PlBx($r*zvSB7zjxB>4U{OGihMk@zi&0qqTSd6O3{;k8U zOt*iRJfW@42cSkjNVOo@&%%3aqxPh?4z(vp)%1k$`}Lr;!d&%aOTQrrsSXsT>x6V@ z;!t26@N=3EARKx_u8mOlnx^kV^a+HzY9{F$)Rn{U4Zc+|<Rg^4XXvO5o$;C7#9>h{ z=%lc{DDy`88K6MgSAf8hnfR!4gzD1qV0RkdJ3yMlA^a8tk4{)O*I#RDd`sRh16oY0 zd9a%mM(MO}2_Nuh0uH^^C^^1qD{IN&c$pbjT+*)ZK1_#7=0@swyEV*Z!Hgp8A66E| z?}I?x5^U()KR_}Zihf8|!6AF1FY+vXsw>QWcU(sfRj^W6EDD8D#w7eG<5kkFR3-{r zW{$%C28MSwS;iUc=Mgx_ZbKAK2QkOVU1?BG5BQwO%7D2EOb(2yy1sFIiqEg2O7dn0 z_)JEpxnZA~$6b`t^J-$O+X9sPGH7fKV@og(q*x_nt_Va?Nk%LXdIeYztG{h8O7$W@ z@=a&?T2=de#w$CKLnKaMJt|K>uMmUnZ8MD>z7$5tmi0r=kL=vgoU6w`B$@WB$g)+A zT-)467ycdoXPi>_f#D3YnP1!Ee~a`W-hrfQ^0#tZHm8qx(?OzNCs|LB)&aW}oAm!T zagqtF4G~z_bomv?IQ`&gusG&6s8hf^bT*nUSRlp>w8}Gmq`8<J2DHFJrClt1HES=) ze_glI2h9a~JF6Nq^BDTnt|DTFB-&sQ%9Zx}-rI;|S&{8Ea*D9wCGOE?uO6zcz~B!n zgXi&iv(Y*kJPi(q269IWUhT155jjFaV$1|$^7gslV7{)(BW<npfBbiVACk~Wa5aSS zFa65OSLlnt@HBObzRg0o{9b@x4GyFEZ#Ln6s|nvjYQkyvn(@!2GeyCJ@!Qf&9|5w^ z=1>d<%-TtlA@~zzu#xQa{p3Xrf@u^^?u8DIMvN(cz8Su3kKe4ILHVy^V9u+slx|Mr z{7qZy|29y68{bnll6K5SY9M8gG>;x289=5>6y8*B?51S|QH@bAhrO1&WcezJga&2s z4S)({|8iGb@Cgj!2m_MQNs}Hx<m8u4h>pW~5}=HtX;6Gg-UU<^NzqYO0A=KKD4>US zZZ8LZND)7TR)Ms4y$)_}BjJ4lyo`APUS{tD^$-uU?;FGUzozy^fU)~7-`lW$mj&^v zSNs*RewIeyhjf5Lb?jQnv3tS#;g1QSleOJxbOCS+wmW)|#2CTt^z+J%&M_l0&8q%w z1GlQ8W7juk=qivyFq$fY#V~Vt++_Y6H<;D>!-c|j_#J7;hT+OwRwj%PVrC*L1~>L$ z_#o1gU<{ob2>gch*@ZW>!WijRTMSeNg9U+eG@8O;hXL|>7Oxmb(m+=B?ryz@lvAMf z@xSgh;aCZ=7DyZ{OV^X<p|&nVtb^|*zjR!j#NQ9H%h$k_Z>Az4ccCgmISf-nC}xnE zfBw%hqbL&?8B(_?FXS1>K}MQsZTrzz_klNfdjHG92UJB%{!je=n^u;0HlnK{LZ?XN z5Uq@V&OelYMdh2eL;3-KGSEt7PvCZ7JvH+*q>#T)_d#B?547~44@{qioNwFIR3ET3 z0h6P8nf(=0T9Zzz51t)gU@G(6yEBYyr}W$dn~wKy4B|K)*r!>==}h4;1EsVQpt&<# zoB}qY4gqGJ{g^Px;z5|l7PSIlu7^<X8Pva&)zjClpv}>J#jl(qC-i_xLQFqAJ|O*E zRE)<;bM<{HW>>qG6o*b@rB}B7-?2pxIoWo)wD$BY!CR{j120OsV6cB2#Lx^MP9pGP zq7eiF0D(8^ZJVYNIY}vCvO;hAQJ7acZt#s^&?hKcG8DRZd3c)b;F5^#`*{w9Y!x?> z`<HDqy-qrz8B}}AvJG)bx?9(I_&^(?udlY>l(Z`P!1WA_jdGRx*>dQl?=yKVe>QA+ zNX5%q&++4{T&aZFz$s4;?9Eph_0dN;O-x7>5sl+d+#Jshe-1**1cxkK487jAX?l?P zmw?HGJF$jy6lGz@uAWknT-UhN>UI`6s(rhqpZf{iH>#4K&-C+J?RS%BAfdRn*}vRb z5F5tj`Sm%D;4F}MGc7bu5u)D%39Z;HFp}0OW&L0*pQSgb-$b-TJGNHcjc&j5OnHwt z*U_u2eiAEZat6f2Xj_=q>D^@7#R{Dbjt}243wFD{4P%eY96%6{I2v%&^auuWaQe`B z9xHq(31tFgB-z1k49B`YGa_6XX|3O6bE?Q?%E6$#PXE4B*l~yAA!+Q#>e4+siY$vo zi|9;WA~I9=|6OLF8|8vqS?@VLxjJ>d)Df<=D_N&~yOYIjsAQ{(%EP;dn%7*lUmdsY zy<XOW)X(6IH`OLEt9Yl0oFOEqPPaedf|B?qa%y0)W^`L?u}5=HewzsGzMoyRnrzUy zm$oce?^eZFNi()DxY2KYU(H2Cc0T-e3LmXA%te&%)We${bT|gMK%;syqr5=riH~u7 zFvX?gd2A19PJrT9+D@-{PdEont~_^}ONld<-j;R(!V}9T<BTYFWxANcWNy8M^(l<s znzB`WoYX?=)JtnOg>eUK@(eJ<F>l&dHp>D*VEPisvz+%-5zZCtf^!ACEju{~LkOmM zfMR<&!??{`58o#zanscTR70*mezqMKz+stsYEJJ=TGw-%ZMdM~8K$=!H5GhW%d2s* zn?+Qzi0|ieWP(BJ%b!e8C<$3o8*Fq-l5V!X#C;>*OnYr?>nbPfLaR%6&8^ks9-RB! zJ)7zR2XFrDj)Ui<U7e4w#2c18Rrnsyb#b-z=X9o5ez_;Yabq}G=-)YwcGq5u#e+{9 z1CmlHgGH?<pE-nbMDi%ft2|l5(hBZOn#kw3Y<ahbV<oM$bguLXHBbIZG}h%MzgVBu z!crxB#-4Og)azNtwu|lrTW1??JWSVIUzu9QcF-@v7vlJnV1+Lr>71wJ`}1Y&vJX#U zKS_V5r7Bw2pJt7Wi@dTvyZcnxrzcB`D;^U06A@EUVS3CH`D0I}(39&Cusi4Hhq4Bn znyvLEV|urA5Y1lc>|3nuuA0bSeX_Lv{be<!_{2Ly*X~xk%HFBsZHwM~dFLq<INXhn zV_T}cJT6!OnA?p`$AWMP>2lrM9D3T0OyZ#7oK6Kg<C@n)kj5bjhH?NQ{cx!D&Q`x6 zzuIazf%`bN!LY>IBU|*wSm)%@*b$Ejp6wZ{-^NmQniNf@mcY6AN3Xi93tBs_v-Qk| zEoZ-Lym+};R1i1+xW`x8!)<M~J9IW;3N8=zOm*waZyTDoj&vU?#6=m5B|j4{EOeVp zhf(GL%g1og-XVA`$iOEkdm%v)Pg8rb__eK|0<MqbUXY&qe6&?f__}9$*K(*$lgn-o zh6&rU!jrB&w{W}cgVS6d=d|`&&^SG#0)u}Gb|-Pf+!-6;jS$KW9vdkhvz7m5bm=st ztUI?F-bw@{6K2FZm*MJehwfWi$DOLCGYgAsyF7dP8B~(jxeAv3Qr-8sP9MUZyxRUl zUuxMQjKUf>>#(zBEleM$w6w;8JKANBeaUj4N>GO`rJyHh>#Byw!-=C&MM;fCL6U`q z{2O?!v$Jg;9yYZDbk;`>A3(r)MYEgd3VlU(6-kX<<eYcJvT|}>#&I{QNREi~+)Z^& zYBO>i?%7fLFjf2pntb2^)|#wq>eI?n!huZA)$X-{u%f-LqmxpX+cmgl6Rh6mx4N%# zZqHz|a<Ak|rP5#Zvu?5n3Dr5>)sO4~Z57H~!D=CO6f?Y^lxKctV{a67c=Bnc%kvdf z`PFRs#e=nC0|EuTx$ipd+spFAT-JU_t%o8GG#w5a*&Ph@Y{^f{%Er^PY1B}n6f(1& zlYRBK!3EaYsw6f~!+dgKwQKwClGGR7bhLd8-0Qa;%i6m%ch|{ve>md0R?iL8?d0aV zIkjiqgEo)ntxJDT+rn_AlfH!XTCK(TRI4P~fCkZvUB_~(*BZ*Cc4KFfJ(f=0zwXD~ z5!am#hin9luds4%n9w80e#+ije73($MWSf4mb8p)_t38#RgmbCmd8!a$n|XFcDL?m za9^E(_QN!HVZ_Kfw-gVQX=!__BdtwVzVl!cvX(|`%eZJ>;`-~r+SKl>^*E#d;pf5; zgOdA>IC+@>+Jec_9%YZ4*Vo8rGmCT?3Rl;yy#?PaT2EtZrLl{byQxxLKPS<jC~S%s zLk<;E%sL0f8zy+w!yl~%eT~B*oUOdyT#Ux`V$}SNsx0)myIdB!z3#;oWJo&}?YXU6 za6Esq1E*!UUhGm$GwD*jqpv$ya$`Y=X;_SfzN&#&eL{aQD(^$6m#T+kmFa703v#eJ zu)*&<GLNr`jTPs%rW=UzkQQ?ta=|eya!WSubIw(qpRZsr@#@Cjuv)Xokfij{zzxoW zdFeT%zq+_IsRQ^*_G=YRWsXKfsQK@sOycmcG-)yL<}4jgx<Q3=?<(>NTVLauK3dz| zkWx6~b;N0?e0s8yOMmwRJhs0bp%jml2X4+*ib;pb&vWbBUT~c9;r^^!9V#yUc+W85 zu(Hh)^b)uc9(7M8jg^EIt}ACwcYm0{z8iRP`AbnVPGK=Pb&}$leUL_b>dIiH$8=fG zmtc1$oO5UIfPo*&I9m}nhwO4+eHR^eeRfEbHfi0L*+F-q?`&UpR2<yQH0{R#?7#qk zP<R;#|G-@>_jq(i>*}ZRo+br%HtQfr@YWSJ54?B*@p3zTQ<g{&sKZB@fP%#~p0)lR z(y5*kNk_U1mm-hgo^hvO*>9{2SeNvd=Yd3~iVQ0YKpn0U&X2ko2o<BK`xV1CQsM*| zW1at-HQ#W{pQk(pac4Vl5N|OS+F|9UR~5LlS*~+AIIb09tu^Pjjk_cY=39Q*IvqPK zl{RM5+$hDxv2VE}4kwa7;G5kf<<})qi;LNDtLvEf+d^ES<El&5O7M}zbwLSCOl#kc z+x;)UL)>RnD7$@g6L|w+52{@l<Lvl-tTc%T+@`#;+dy(x%qyNiZM^1Sguo^A=e6~% z8_wxEbhDj5G2WP2zSwcw0YaE-YpczLwt9{$BXPYp<v(y&xyI?%RVIbI7kDyJ6?KPF zXk7}7CYM@1!v3ebhyA2h&b*pVEbTRn^mwadtKZ^0mV7$BteJi801Jun&W%&?n&Xp_ z4&6vkPZyrfg1!grMj#xE$0`G5gk5)pu(nMTn%j3MMtUmLl0?g=HW&2t+q92MPAhb; zPs;TSM?Gmh{6MIwZ}+_6WqZ)C${SX`mOqhZmDsnsT`6(fQp>axAHVlK3|=_xsU)%o zwa$HZp9=@5NZ!je>sN~pZ}mlRh!|d6>XH+5RnuXV)m|FMC0a_K%pZMTW-ZzQyH{W{ zxSeXg<cfOM@VC~))D@H>qtSAYgNKGokdj^4@K802{;n>!DjbXT$-!a6(rnzAXA$i& z7uSw(kACDB0I?V$WH1$+Yq&n)NSB6vf1c#WBAYNuJPw#O3U=<WeiX`Db;Pk2q^-V~ zS`jM}4OO1wo$6jQZ}b;-8GLQhTNaSIJ|6V$x|Q`(SLCFZg>_DB77jLsf9$5#6c3+? z#g-pB>+WpTVlwHr0}5Zaz?QFpEr+;qZ101Bw{iGXAF8jA9i_?$??wFV4^)NSBkNJx z?#WskpIIqv#8l^`hdB19zSQbxn=iY&(zNM}-<FB}{QBiPCDadF>sVWkLtI~mc@c5? zipmZ>KVc2_(`=rI+x7ohXAjTHddAb%<9Lsk3cEVi!!5PAIDH8_EE4BETj+@O?`vzx zKKfR7wWPcBqO^^E&ee||O`+G}q@@8t?A$nfeOiU4y#R-4>}gE*dnny*_mZ#Yi^YwH z-OW1yAJ@_<%kOW&d0szjcy%*=Ms}!E`oON1<KmXYJ{<^kgF*k)I1p18H-2^p=MnxZ zwygnM)BOs`M(<j$n>=VM8tTg1;VKFjo!{l<33D`G`r^d0v#VfXHLuFaW$AP8p}uax zl|hF->!3uBe<~cGq>4;{=0oDh{|v&)&<z7W2Lh;Ew7t?71>xkqd%O<ogP3=pnJ*s; z=@k>qN6Au!L^iK>&3>H1EQaRcDOvV-S>Xm^K$H`xZ!;nW1YI#DkP;W>n{=Uo%Opp` zs|gK#%B?=i382o=dUs>DAL&9>m`LLirXJ&*_qfhf6}dVrE#<4wu$HCmPNjV$u&y_p zdtGtuv*k9ax2wiEsERVFner(uYw4sLlhXNaNQQ#(p44o&8B=!feDaVpLh6A~D1=SU z5H`sKUI{EmZFZ25h5^|ry3a)n8?@cBc^YW>N*rPz6r>hD+Du1IeySIrk8ZwCRXCH} zrXjfe(V?`XXcaxa_|f`$rK?=deAdJi+^PMEn}$jDA@-ij9CwwsbEC(%DKXq^QK{ma zIBG|Pp4^Fo?deG2#ZnikEdEjJgM3&!Pb+~IHth5@SI>LDbdz@dvDbsadS%Sv4TIFo z$D-X(=B}QeA9o2uq&Z!G?_Q1qkip^Pw46A6sKRVvbnY|~s#x_sn?pjCbd|^<2vtO_ z+8FihX5Q))_Y(pYCR(0cm9?cfX?E;T9<I~I5w4&;jq6T1zw_n#Qr*%loV{M#-5Obx zO*8L2@KD&oFlW4Z@xE1dr#+mBAW=r!_;Q@s3E3!cnj&RW+g-9|u6J7q<G1n96VTW{ zvwTYe@*<Lb-jzWYgQuiD2B~_!i($>yTpX&cOU$f;bXP5l+!kq5PYl@gFs19UEx4CU zAvqCeR+sY_guvaqQu0SlrrovlolZNJKhj@15Vyh;6f*6VecxmGCyRv@jr;6EdKdeP z1&=(9xm?E{+Ea`+W(!L>M{!?~vTIrlT!isw4LAJtE+jsIgC@rWE|ffO?hxvqtHKRx zl@4LYg{OzOSK9sV!_8~i+u#t|6YgKDT>TY+=EB;{_t@ir=Er-4Zob+Gw=1r(MnTDi zbAMoG8<a!pE>3(B->m{!e_Q!w?9AiL_iMchTHfo6;wbF8c=u}9RBch%<<+0@Z0RNC zJl}T;KM7&ObsnM&l~t+hm^8l7=LUPWWIbpfVFj9oHF2_mh=abp{xjDxdxZzuhD-8p ztuK%hI)65O`HC+UY{67Q#&hrhbe_XFvNmf4q@(b^QIVNNcOX6XBTkoI>iDEvX1P4o zyGT!s+Ob*vwX&t%uOb(DI6TykBb5))c1wo!lRrdO=NL*j9g=;rL6n_FK6>8|Tl>MX z?MV_Y2HPIy?$()XFr+9>3y0PXEv+mRRBtqz{+qt^m1BcrE+x@#4v2*GuBo^mcU|p$ z)LUJ++(=cb$P;oB&Rc>DlkANQuOoiV(u~@Y0}MnT`diH&ykBEG_&CD%RPp?6#xwS2 z#5`L<CeY9I=e?d@x$cK$N0%ngTd$?pm!@hR_LE*E1eIdDC-?fjr4sfNm*|oLV@t^D zM8&1r5O=bs@nU$roF|mM5b~kg_N~y^sGhdni+#EqsEf?NZdwR;__M+c>cQPRHryLw z1Fq3}{d?@ul?j&#%2erDyFJbamF9wG+nT*oU3)At&6=cR`tt=txe-UuER|H~gycB2 zsZwbx7MGkq&rd&7kEEGbIrh-KXuzwz<catMV*%&X%D{Z{{UXPq*V9?0diIVvKLc1o zQ|f+BZ#y}C7C99@fL{&jym>A!J@-pK>XkuGDs25|flqYEkI_L<a;wr4QR8tvV;i_B z%-UTH@7@orEUlE4J}u)=Z`Y%F3obiZ#`@+SDD(?d82N7quZFzCElIbCBaQ!&Kwi4X zEB&E&W-4?sOml28J#1}gs!6z;87H;GmAc|-migw8wY&3xUny?2-QjZ)4GWwp8aq?) zNPyGTac#9IY|*;s>^hF6pbDF`c;AV8<q`yd4?(k}ZhVryxfcv#usR#>MzT`_!HfC{ zn!hjBaG2T5dPr{~XMg7f(6COKLM5!@R<##ywU)LNyv4}7iKpHcR#%Gpn_>2(D1Kpe zRoeA@&fE<5ry`GudK`P#%`cZN!sM()Z@3EOTTi%@2r}zyw@WoJs6}$(3r||O^|9%w zZ%I33_q@t37^^n#7MjO(t#?iJ(B@AS#q0ow?ChFJD?JNc=K#w$|A$=uhn##ZNhCM! z$B@BH)iVp<TB)#=GCyxB+>j@3(BqSVg4bC=tnHdpdKnHk-suv^q2+}7zq<SGs3x=R zQ3tUgqlh3#6BUuJ(wh)egb}4nmm*R`sv^BaMkxvb6_8F41*8i|kuD%0T|ki<BE9z# z2+2EN5)|f+-nqZuUF)s){6n(7d^u<Lz0W@T>@y1@nc8fV8#k?P>gBQPh~%9=!h5#b z`Pe}(Hc79l&WG$2QC8U;I?r=l;$*3#tVEQvKYsKHW>z|c^iv!RwsK@)=de0^V`uB$ zv&UvH)@BD_pP5inzQI11^SnK>e6M-&s#fzweW#R^i4OSd)QP#z8=k0`<hIDQLV0E5 z7l+7fqSIwTgdYj?uk9iC7>MwXzcmcHqI;@x`~)Z`*i}7#VV6)mZ5?XiV^X)@e1o8} z?|!(4y5Ig|>GH*~R%_kL-tX*3@-)5cwbGAl^yk4h%JeF;6YAyjKX{j{FF!=CMy&XH zP|aAUA=9YYr)MY1)}qiHaQ9ah33tk8VQ$OPv>9b{y)Q>FgGdx}A1-gk!pg>0_7RVn zt2>(?oSQ9<IzixjkZGhX!=_-*_^Omzp6xMGloWZ6lQF8M=)Yfv$<<u_rsbLsGjN?t zc(a0*Lcfrr%FDFjg?|gepSYgCwsvO%Kc9&^QH8G!3fe`fL{T>HKT#=(!j+)Ml8^_S ztnjX1SM%|LJ?oA7h^chAakORMUF(4;<x?WhsysaV*H*llGTdynODE%JTl)4?&fq`I z1XTNttoFd*H{LQNb`0p<oWH*RHv}i<3)j-RA@uhOp&eAXZaE@Hohj5MD7!=};_DxW zrZTiK)w2ULcq4607f%HZ$TaobpASQ;Bag0=cQ4y2jxDVUbku#7*wrJ}ZDFkF0Jh3g z^@_yqcC;Pr%B=aEVYVSR<EmR0sdfA&f>YzQ+6sT3Xna-Tlls#o?mbNxeSIq)xE<ZQ zr*vbqU?~Z?TsK>WTblt*X6X@n_%_zH{?R>|`fsf+tzz(tSI~-D2Esk(vN_y00<F=? zc<jK-{U_6R=DQE)&8DEKoTK2a*t1zrPfjnOk?Y>Gd8wKE=c2ovdKf&X^1lRCufABp zMa}w_t=FWhNU_2gYcH^q3&mfHzq*^ai@jF}h>*~6HI&~=>JQD#M3q-@0A%`{(O(6V zQ|5^JioMf@^b{x_YP6mDD&?v7u_%LebX9q6nPmVzZ77IEj^<-4QHYFEY-@*)a_{_^ z<Ec+g?j;3ymth9+45EPsLCs>`8til}e$Q<0sFmSAgTE!RP&Uvj8BkC%S2bdVv)e5+ zP43x8tmj;%C6nmE++{#xP3Gp$2ki!|gvU)n+Q9BZOsu-j%3UcIxYTLOm;fF<ur=8I zq01Q3feF+^XE&2-BGbe(e?uDFJPn-1z++jQ#dosD!Knb}tLc<xYj|fVDwE<&@#=-u zt|>zn{f!*h#tSsn-St~$Y#&FJXy}Y@){WS17;C?^`!xDIP44+81PxtwAo7iW7(0E7 zpW6KQ_Eu+=fT#zvEg{4hRjV5%&yd{yzJ0f3lZ`%g`C#8Q;?GnmTSboFLGQX!={<60 zzh$5O#e(VH4pHgk<Zk{In6u$(f&*UMePFss!Vy#IggWTC-T^;T?7lcO`(UQ*#^OY6 z4x_5{suyzKl_p7$qC#Tdk0wdwl2y-P^Mi0o&fR)@bW<6drx2Vqcd-RV1|bFjrc!o= z4V)JEyL5=)f)eTM1}59(O#5D1&1iHnUH-QI6t#iCAN53QN%wqu$jY<=$Be**-TUR? zCmLcTok9va2IP0@ync9}$(#qIGNThgY$fzU0ZL`APTaW+QknW-;Z;<wt^fMIT*w8C zn>1zy_ukegN*ZGxT>WTftVwdE*lzAp*h5xNRFH`D?^6W>ffKF`BYW_|*m-$4KeIbF z>&|+W7~W=e=6cyII_RNfK8o6NwWd$9P%4#r2#&=eAD;0T@*j|{N_QyF?I@PQb{KA? zzges>P1it-EX#%56!*M-_Kd<AV0{+Z1xWo5;uHb;G(?tknZ=M!f5$xo=7(D+Z}5TV zSVCBZKB_>lDludvR`QSmzL2NF@^mRLGaNhjazxsFRmBfU=P+3N^o`Zne09=gMXQq- zL=eu=FUt{yZ>&zb6eEPy7^**g{itTCqiMLPEw3iet<0MIZ_XJ$fE4Z%A#32KAMlr* zuyKEtufMu888Kc^lT`{Cm3fRZJnQ|+EZaKcj7BUA&armYU}(PHfL=-e-t9fsnKe%2 zZ{yp6$>(!$`Q63`n0!I<)Q{5{Ny1$B-dhyL(p}$?)JzLh=%d<tsIL!-s=Dlv)NIQJ zdJx0mD_V@JI|wT`0=*huiUhG>ZB~b;-I!RlXCtqiwk)=_vOS5ZVnxwr=#?bSiRMg6 zPXF$N%3&)W4-l-pRImAPHJw){2x#eJ3w;-$Od&sRthomy+9Hx*(iKJqb4Z6NUOxv2 z-~OCB`Lgl$$%v2PZc?77MzU?^0IlcK-}m<$vGtdiui7%!4e(yPc=0@&!qI2OP#9c( zl^m!$4d1#FdrSILlavA7Za1mY!!`E8;JF?`f?;S82v^dGN#+>EqN~*8(&`wZ)xZ=~ zn(<v>4|u5$I9%j2WUwon@v_;WoQ?tWyQkObATd}4hZ9JdSr1^j6nPMwZAhVI(lO0( zF7QgMgL0@tCgNntQ6%@7J8gS!$$sq60E!YDPbkBggD79Rdqe0?16%j0rB%=Dw2P;K z|GgMG5&Uw(!sE6SQ^Ya>q|Vw;;`6{5H8!ig!U9t|XwId!w?yRGqH8hZwJQL`+;P*l z#H`CSAV{Pjc+?B09VG2dU1g7>HswCvZGNJ~lI?P4O|wbbG9N*8g#mLjlWsvjRVfDg z=bw2VhKTE6G6Xb2@=iSQXEL8q8Cn}0b=5`cHp?ZJ7*GMii`=~zhy_$z$f4zeLC#I* z@hj>N%;6D$MG-EYq@ER=ngEJ6LpFshnopgiFnXTymMj+>ks?%Kz;xMFs#HO<n(<E{ zz~)}yKdDOu`}_^qXFd1*YZl}seXCs)a~mc)zSqGcU+xYL`Hr@=c2^OBsU_F16LUFF zU)m3HfDL10!XFq4K;34wlL*e?@&-VnhKBk+QlcaaA_<OB^>K_}6X}d^h#`OtV|gus zy6@e_GGzQ-@DIZA@9_t5^_ke}03X!EoS;NR3?;C^&ul3G#V5E3Dn@$-sMt5l7G<_u zWphjMraTqquv}BQu_ae*fRfor1q8b@#qY=DL7tkK-+Lc{U<MQ^?ES8~>8_tash8@w z+F0kug)<`VC$N32IL84KIF5s<V%(|JT#jRUX_X<Sp~)K}Q!)8&;I1GMYmfoZ(p+Jy z``rwoPoktQWcN)wgHN&G<Ct0Pha1Eb7ZzQy{4wq4y&*vh)BjgN6Z!Lt8zQ_TtJn}Y zI?sj45qA(vfJ^ucL6o<Y>M|bSR&sRN)qNaW)vOHs9PG-|c^ZH}pe`F(`b1Y&aZLcV ztCRst3KWD%<O-+}<E>-l2+l^GIO-2Un+HUV?gFU@UI!@v83{-}x)MF{MfUi-H>Mql z)o~qZx?wZ@1ZIQN<v<A<WwIXc@Y10Mek1Ly<VRjmt<ZGnZ5wEZa2$l3=Z!B>0EUJT zYK;;BFK_EQlWL6~L#Bf6H1LV*c{T?mMQm<GTQ7Aj9gaCo?3D^il63&-Vp7jIk$nK~ ze(Zq#T@(hDtOx-(6bHC(^8+jRp+FLpULG%qjof7l%%55{REXyasG2MvV@eER)-Hi@ zbDkyJR(<koJp&V%CsuPT9R{zXy6U54J`oI)%=k(fWT3(bDt0y(s8|xA*2n@_pQvh$ zc4MGM{&$=-$pD7oJBOgznxJ|d323&9p+m%!_L@92+jHV<Fqn`4vGl?LnysU*K1zmY z2G9R|Hlg@ecMj(s0a9t)69XzefttvOLw1)?S9$;dJFa3%Y=q{8qkgT=R)?<i4KfS0 zU77B^@!|1dov6DyN!0B0a_32L2N@Ir`OUPG-#)D}A{QboYTZz>mJDu;k^NX=LIz67 z@0Zg8lE#qLg1(~9fO1}z<FWe<5O-IcBq-C}|67MT&5HmqZ=Lqxn<rGL07Of#b9f2T zEmOAlt!TXas6OjN*xSNket9+pEhZ-7#J`aR14c%K)PPpUhai^HL!rlZiz+7*mjUKZ zw;Wm*1eKn+wA8e{*Fc5k+kF}-s3XGh?U};@r&Q>`l%}9}GAUWoM!@<LTAr?9d8)gz zE|e!nWU1KZ)-BFexsX_fT|@?x?*k#Fn%!^Fu`-BV<2`<N2O9GS4KVNDzn5$9^787r zS+i1BO3m)1`5T0Z(Z1hAo0NVt0oBzXA%+KN_LBjIQ_47jrc#W67^f~UKupNuu9l5E z3Nb;|TnD1v4lhsYTeh;8+WoA}!s*WV%kB+G7_6fp-KgdeJWwu#4oN%?3#k0V*bQ>T zQM1G9k6iw55v0Yh_1ZjeYZ2eeBFA}w<~Mx~lk|cj;K7MZYIZ~APY`F~oB^tIgrZU{ z@aaqL{6<9nga!PI2Iv9|3IlY#xj)+m01UP48E82Dfv3p+QDr*@q}_tsLN=o5UKSN; zIbaUh<B(C>LqW>}&@zMrGvfM~uwDLvvfxf0<bJ&h_km9tp)<{(E^<95Bm0C3RDs2P zE!p#CyPsNFWPP}d4rDqK4pkFt0ry^oG)et3Tiw0H?-iI5z}hC;FAXWhX@fa2YnH%H zs1sIcoCaW(_5rH(Y}Wvv9Maw4!&9zZNQcnFUff`NUGs&)64Oh$khRa(tI6w50NU{W zsFale{ESp!R817rpCp}w{i`(s&hft^x)7&Y{RCou)Z{in(sbS99Sy+^m*RkGPWP1Y zS#{<n^N$Lrei@Q<Ch+aPj1MqMf+}ezWQ;VSP>H8ON#F_)%^dP6A@aTV0G5tVv{lIf zW!O3YJbv(XGGJXKok15d+=z#e^uFT3)>N7vRT+q2Vl>w)arC&9<WFdf4BVFkq%b4n z^)WJ#AD&-Q{=3BjD78O^0C2PwJk|{Wm3#ctO~7~T%}6pk|8oTaNT->MGu;u2U#t%b zAf9fK@c?q!p1&->q4E|0>dy1z?;>RAPyr*5(!~G3CPK5B5@&0sLXc|h^`Y5v=jTs> z=n2eb`HR^QoEFzF@yP)zbi~P=9eDJ|;wnmjszYi1s?@I^fS*fT(+MO}6%K?}$TDJ0 zjv2wZv2c+M>edJ%G%ZLa(u<2JXh8tVj$(Y}3F^|>QLc{&YM~C)!tpj6=pXw;4hT7; zma0D##a8#~P#kRWGd>Wa4xWlb-4w@<0ZBce@f@5k0^^Rdf?*qV6QLZ60v_8^ODtq< z*XV!m8@tc2z#7iBG2uBmb)#?2enR0mC@DA7>3<)yUeRQ|;_b2!NXfeT^oki~G6!BL zpNC?Y#!RLoXi&}zeDA1^5xniYu&aaxQ}~7cmiHIY_3)+8Y6C69m1?^+9seY;3aIh) zAe-H6c`!Op&(@aQt$t7DK1wCSC(1^udubutv7=D^(6JU!nl4OT$N9#se)`Q!pl>CY zKm9|e;+YhI1E0bH8tPt>dDFkIvx*(0L*|HG$FSK>w(%yAZtYuyERGqwI+SuqF!VGT zB-(><p4m~ai|8C=clQpkv5aD-EBzL-W?UN$!jZ!T>#0SR7gx?P)A5}<UOclN);#{s zUrc9QE(9|7x;uC7e3v9DBt#1gVH5W;h?ZB6&sIF8uk7cL%dpLacPF5Whs>4lJZuD1 zu9fe9y3V@a$rBwb_r?n^b}$fTVIb{w>A1>$An(78DqX%Wa}k_eljVF_-j_MEf5p0_ zZ0?2CTxBOD*k|>~4A;Om;hZgup{aPaVYW*+toe&Y%w|_kyQ`2MS~02yTHwS;cVNDL zTHey)kA~ZJ_11oE)EDM1zD5xu6Sst%zS5+3r0>p@3;Pk(uH(QnPw+@U&@U#H)7!48 ziOn}WwL>S2c-Nzf<6*%ehkqkWpt&X7h<rQy%C51wIQQOw;4v~m&`KdDIedfSU@ZV! zi0TsmJe~98`<e=Ud_f8I7vG$rbRN){JD8%!b>aE!H_9{KrdntA(;GOTO^Uh*@(PH; zc^!&t$Qf1lA^kUl-D@)atgs~+Lh}&uE6w|Cj})Ylv5Cl%k*A!V#oC_%yFF3q2%!x3 z$_R9JN3_9GNFsBYTnN{rNn*4tK|YOJY_jX`+j#^1Z5MiKrYPlR(P1#zAIIMev6dc+ zb(vQYn|PK}F@zeyUsgNfFJ1&$yNM|)aPS9MyGROCT4!`EWhJUud>-E#mQl#bTjYM3 z!Pnv{AW=m5O_b|7cZ}h*mC2G1Q|8_zKJoNsfsg}4uhn7;@!{}izgAmyJwj(3P{p~= zt9u5kRInafQxPq0Ur~gg%0;iz3@3;o!U0%E4m*#=`d-9dt6FuQS*ou{PKp&POgE$l zR?X6Mh#<aPyNqcRid{scGfJls=*1kmq;oM}!B6+@p*qK4Q?#_~BWrcxQ6uM3Kq8<m zOZ!wr(M&sbaJ62RJ%5c6<~0riYRybD2gW%TINaRXeP-as91p#Be(#$UrR4fhaE6dP z4}M4Ms}m}}Vs0UbYA4Le`us~fUC25>f!rdnazg1s@mJxkUr9ABuQSVOl$j~;i(`A3 zcF-GU38gugWbVwEv3erz)k(dIMZv|HUDxcy*3)*~Sdwf;#st&3(;+x_(U*@wfl*u} znf%2g*qn5<_Y3-pPWoc*>zKd}O+l)cr)1&;$P7`%Z08C`B-upwZcNVZzhKWTcyA|r zi#{-(MF>7{?jJe`R>6Hsi7cpZ;nr77gd5{0O^@b@3Y`(;Q+1OY0PGenyU~ajvlu-a zODpa9YW5o+$}h!8>TEWo;DpwyX6Hd{U}eTgVxEew7oVZ?$;sZ8djoo^eRB_NDJbb0 z&rE6W57^;#o3dvGA%*ViX1#TCF3@YC;+Z|YrsNBYKm)cqp%;@xi9WUW++wJ2#m;<$ zP*bMs$gJXpD?KNLylTOX2zL*Oy_qROTO!xx*t)V)!+a<+=g+f<f7+)`211rYwC@k@ zZHLb3p7PFcj?DL%uSd_)_*Nz-@%`R`E05xiMWAVpshD|5?soFopgMZ%_qlYKgF|@P zS5$xf^)oj~WsY)?-!T7Ejuv)^$hsX~V-#=UJar5s(ML0MH`c~jZk+*KZIJ2j_u{Cq z&hPsq_N^GbJ7k8zMmD*g&4En;EFmOUY$^2|t#5}|Hl{c@a7CRXaEzQx-cXwHo8pCw z%KN>8mBqQP+gGO8eY?yNVr1e2q#Q<Z&S?-c`$5@*kJ)qik8t=n)^16;l)XW`spG|> zI$|Q$f5M{I{63bVArK_^CdDML%#iJIWZCP4D$Jq2HD(G7PT$-3mADg7;QVKKpY1di zs$i<Gx{I>!-g#}$#%u~VXHx$7AZHT9K7Eiu&as^sesgocr@B)!Q{S+u)98D%V2gc| zUoqMR0~s?y%LdusqThgJ*wqEXWgAAfz0709XiMiiB`cp+HWR#<==FRdUfpZRs6T|` zuS&^-5CK|y7gD&d;AVWL@Iv!^yE4zMA4WH(X6~(dcfOb@YzYujrGE(Rlb?B@Ov`2R z69=Pw1{T-hE%<zWIe|f-tAq?#mcyLSjvspc1{is7f33C`Gt4%!F82zKvrC`WcTm-K z#5{{s_#<kE7cJQo>R{e%gEzX7b$03sSM&!`CaD#QjSFwfUKV^WOS)rkO{<^Mu#5F* z&%!mf_x52iEExsMtvE$ZGXPMe4E9vW>e4_K1-ta_3~|xxcDQ&QNjQVjE9!*bHO}sa zbozC6`9(t)&U1F%4-m9UlJ<9;D|5rVF_ow%-vHKL2IM{mSSXwTPU5Rm985Q!>z4>! zcmC{M^6(z7ml`N7cwTsJw|rbSKrWO|KYb6b)&GodH-36~b}=7mBbMg8;f?;r^ZZMf z>^$VyXJ<Epe2Pl#l-a)a&<y+Vzy}dG&<vCd6sMs^wUC7|qJ!l2sc?Klg_Zq2;<LCJ zauHjPlap@FgRnmOm^{1H;JD|$f(9PCs3ET7AO?}|FSVVdSn0!+kACc%Pt2)&>~Fxo zR(P5c#Jy@3F3>7UM!{=6ua9-v)5CUvmLvL}`+&M-v!178o%&<N`!cMQ=LFpCTbeR^ zSz}@I?ril7nde~F?@i51H)-D{mjmmxMsTgjJk&`<T|KRnPHcYhsa*%mhN@Y5*=nHO z{IrW{!D8JIIz*kmVOb>_oIIC4=sf35Uzw2!JGk7l{s&vsz%UEF0lqI3{gxfq)VF6S zl-N-1b*Rh~qv`=xX?LO2iXx|(1E5uHZC6Nrp@*KRFAI~Xka4;}k#t!2pOE#1q_FPT zY^ZgRk8R&d)u>97G+yJz#}AnYG9^Y9KRG~Mky{k|F(U?hq1fkW*U}$ii;L)Ln*|>{ zI4Gl4Qs{_!*eY<_R#wNpt@_J&Ppo<wzV{tm?`yWD`psfX&GdTf9x`H0T*SUfOjn;B zo_?BDiq})JZdX_|O_Pr6mr)5yz^L%6M)(JND*D`3f;=e|dYmxb&wVL1V_=;(@~B67 zfE6p{PBPg`3$_V$_Z9`8I_Qj>UAQq~K25P_g_#-QiJNt6V5cvU;Po^uDgEq5TMmdJ zct~uqLB)BnRNfbVYT3>ijiG0%IW1;=zF<-+%;%ChMoNI~swAl&T*5(UN!(H-t@)Tg zfw>CA##}BRP7x_I&TWT(pzI?#ja51#Au!Ks_6hwkSZQw(6>8L>4uk=(FdPrXYZ{Yz zg1`*~;m2ly$a+^cAEi)caX)nqH^ot7Ej82QjjrQq`rV%{=B$lJi~(2_s^<<7s#ubD z9Yw7;`yq#M4NkEPQlEQV>?_C2`40FS+))r48>FecV;{uSYvu(`O;Z+QTkFxa=#h#x z<#S92jyelet(;D;snFuHa;JQ({M!1Fb4D;Q1~DmoT4W_anU-xhFTC4zbZtC#wmhu5 zv{N$B@qK)7B~O#K5OzNohwp$gGcGC|_9(Q-Pfp&5ZkKW8M>Me59IS4Ib52>y>d2z` zX!J@1z4yDCW@|(1&Fhs_7`(cK<C$4JO*G8cm#1zF)rIOrxf($6symxPa{w7hw%F;N z#}Zzmr`-<t^j4w*?>diqKMVRY3u3dV@=kNUy<ykgb+rY0{M1(D-Pr07qNrz*HBh#F zxV&6uI%{Cv5astwGW9;B$4?%V<7_9XsBGaU&#m{G+xwjYEn^%Gi46s)SGe#r?;k0i zj+RIOXh#6c5y7i@=-64125Pf7)|sG22D}Pt&%K(;;|5GO7eb+9BW5S;hCi75uxmxr zD|sv>3yL?C608NVP^}bDerV7qXhfp)SIH3>39k*5tBCu=r;F&U2N%&1=CM@rv2I-V z#`Y+Q?tMyekTbo!*rmohc%+%qpB{O{z@hphx<?CnNJ(m`sx{ClZ%-n%Y2Jqzs67q& z_{rJ!{MdbaR*wEYhiMt`t+e-zrIa^p!cN9ZWYvNwDp3Y2(m_KXeS|LB@vhj?q<ZBT zee`tov784oK7ix9A8UXJ6RK%e(|+w$UVo;PxpckUsd9h{MjeY;7CbKUy4bGDH}`Yg zqT0!`)?V*88ul;H$I>b>;GQ>XMdyeW-yP$re3Y~r_4Vy<Q>0qg5M3yOK37Ve(7w>V z?K))@Ca|o_<;s;Mq|_h;AX7_BDF5|CD9Agu@<z#pC^Q*9AZZlgZ5b5E+>I4IQy{G= zel`F!c8eAi`wq4HwQ4Qs{<!D{eDyjFc<Z|7P38Xplw7b@ZRO383(;+G0xe#C035dn zhF35=v6JK%e~t~v`Vy#u1*zf<`(rL!F%OYDwmryk&d|xt5X#v7{Z4`(GyV&$o&*6r z5^sVez_N8Ov!hi{i&*z~?!-cJEax`jwm1P$*D_um+APcbE4{b8y%-8bGUCGVi=T_1 zlbS&gLEr{?uY~LbLA$N+|NTfZe2@dJPoqwtThM>DW%PrbC1Cj0u-YB}g!CX&)5;6h zQo4BNKYq061fr8b4RSb<YDd2J&;5ls0a=#|IrUgBB%t#KSUPS2rlAmgqr>5JVe7-c zM`(u^0~GccgOuR=v@Ga0lppLqN%KdqpMaRy*CXqY4HEx-|9<b7^?Yx>A`xNZOr6}* zEB1Ry+VPXYiNmQtQke+QHRg!V`QCCA`boLpeK}ge&6f4Q5C|D?^c~3j=TG3QxW#R- zfc!DxYe-hs+I17RKHMVCTZGGt8`{RuRAf^)oRrDG6_PkS;OnBHqUmO1-oGD!fX^rg zl*YMzTXrnTf{%VH!LDfm8{zQdGM#PI`~fjEHeuhvLQ{uLfhDns*!Y3OY86i~{7~jo z>a9At1&OVL60*cP9w1qT;|G`GY=NbY?MWdu`_ejUlVLJoGf3;GHXG?I=@tV1E2_27 zo=Y(QUw3=n(JCL@G6l#4L3@%LTIvj&#bUo0b?q`_KO=#<TIkkqHuNNL{4=z<(%Z!V zwUYV80MJ))(EdrJ#uq;|-?7v3TVE&bGnzd7cSAs=r)<xl9-2j0%IEAWbz7N!WBlQ9 zn&P{(?tBOPuUU64vV8%z#{Lo4b|qXy$^gF{86`3tYqVwU7T^ZfZtsE&x7^h5QxHHd zzl%v#dNCvDuw=N7*g6QTa^fawx4mx%33^~elh?MVKT(aGV=6^*AulU~csr)L^L;~k zw9Kr>U3yzuRAv#JQiA)o{>)1k+Ux0o(uE`EfKvO3pFR7;ZE_XYA^JV7wp~X5%8$5f zWS}60^&NWPT_9f{{1EHHNOQBW4bRuCDkMnueHhsciHOtIaRRd%0Cf-e_o#S5MF)uw zZDlPKDVn#vuJQ_eb7Cpx$NdaHH;G2vKpqv3BRJI+4->okZ@z0J0`$AVC)@tl7!uWt zITZpX8q}i1TnHpB_=$q)bq?B$N#>&aD{1~lKV|wLS&avo_*mU<+Z3cc3z%GSI^mjs z0!#yeGH>NVIwS8kZ6;NSDjQ7k%0~9`2F_^&XMLkSLlHp>bX-&?Wy_6`|Ek-YPp+vz z`gjZMbas-&e!wcVBO|l_8vpmM*#s=Zp{lx^7n7h%=)Z@zh8yslD~WnYJL$>5w)c-I zgJE25KPIJ#e>v2Xe24+B<wA;+o;z=w){Ym_j!TXF+n#O}^DUgo0o51@T<IXNOpIRG zHetC580J)47O|3d+gF<s^PQt{w*cUcz;ST7a!Y)_cZl$sEcj-aRGab>7>IDnL_mqX zRG=gcZS7yT(nW>Us~y4l;K76agk4QlUmu@}rj723=lW5MS<wFdx;Xhih{F#4O$`W% z5=OFM2PEQ`;E`}vF@rE22beAh35#si+IDC&&*L`V=3SltLZt81x-WB>fNCOj!sE7% z@U6j63mg!AEi+Nzp9E{cKmyE!L9o{L_BrJio|30P!CGOi;N7k8{XGX|SfF4n6$EPs z+VqJVJ|s9f%fRsS9kqM6!uJyrLECDr;1Zb-3H*^-LO=9P{tZ!s_~_Z%#>^(e;=mf8 zhbryq--ENAXoJuu=Ev|gx#-PYL{pyY)Y|pO9Dj8?090IRa=_-SzmWWmlVD68Mc|W# z(ucOj*<Ry7ev@sc0!WP>H;usG0jjbGk^*i^+2qQ5VZ@Cq((83lH5L|X$ngspNCF>2 zkb+FGhYj0(_s1PDAXVf7m=cmiC$|;8tqk6ZXA2kP--@OSCvI_EToYEd24|B;a_~K3 zpMZyML$)w%eOU(70|Ng<pT3b>H}nSIY3t*56t8x(2QVeIXLbMPjgCKIGXZX+yI!CK zaYlb$J$R;PkKPEhsvkl#sb*hG+wKQC=|G0$-Q2L=UD(EtMfx`76^<WN;yv~=%zi)- zX9vw0)H6GGy@qB6_9zImFfziJe|S>+o29J9n9J5x;tp`jH&9Pg;uQ=3jtg;6X&eOr zAA5Bhqd_k<z=9Y1s(%3SLw~nRDU|U7s;@4`rjXBNOt@zK`%n#uKr%bq9SK);{Ys+1 zG+q$^Zi~lYl`+<ywcUum0_)Ic7c{Q^d!gFlRSYRKJD{v^Le;iF7Nk-^{2o7|{ZB?| z2X-j3f>BjXS$J-n0WgvvOJ-69Ma-L7JGReY17DHDbp1QhzxZ(N56Gix|BFX$q2-5e zfBEsta7CbDImuJkw?6zC0R=&H+)CT#C(xFB6TWSjKaPXFY3~$hYwKq}{{EE<$SznY zfRZ6gg-6?ih!PNsj9qHZ`u^%KJ|sg*?JXStD)#obt*fW|<@W&jugZTUZN&XmhPKPu zB?y)}OIfbl`y@8+pd!lOTTmZj(eZ|G&&w~sfWA@@fvnVHpbXvZLPxjKrCl8)9_oNn z?sPOVI_A{>;>C+Mq>4DXNvIyf^8le_=;tC&1otsS_{9!CwMp4~j$0=<cmyocjZgi1 zqJtjsP*Gft1gO0_r-;}VY%D<weWY%E$ggQdK=l%YYKnzy^0!4{Xbb=Q%!|nX?|g%r zXgnyk*eqe(JsPPoQMc3b<QAmAWB=C=@1R760I04oM}29$QB%DikweJtf1}v$YBoUi zRs#Mu_xJ0Qer}_|UK<!wQ=Lr#rfB(Y>x6NIz=)*iNwRJAZ9m~<`*}zT>cDo%*<Mne zA(4k(q$=Hj?-zRgTqsq{32A0f%6?1pz0*t|i)Nbk(_F4Fhs}b_DqT<xbeezHcDsn9 z0gejVkLaPfx@DzshmgLRqx@&-8))I{+qaZuyho7I9I5Uj7ji|*P?R!Rg3$Q+J6W!2 z^v5>$bscg2%%p1I_TDW;muz60_xcH;!)1+XVw;8XzQj`xjn1;w8~-JZ-c?4OFmiu0 zk4_W?kchJ>#ysy?U}k2vs$xEJq*lt&9p8;ZaK1yz{G+wF8U-=09s8@iHj$&8ML^H8 zwQ5&?sNQ#^|N3DGgp1E+nN+{EbF0fYT}@oex`%Bz>DeQ?B-&bKKO3~KlM2^)`c66q z)oUi=zPf<CZZw~sJfi%0Kwhd0U)21feQ5~QD{X@|Oryf%R+KjooT@GBnbQlkOZi0z z6s*_!+w*qm<bfLI2K?(M8~w<sR^6yB4hL+wF9wxjHX?{u3SJgY_E4({dKZqLI?Phm z057ho(jq*;gyU&aC6*)c;g`Os-A1<0-BcQeYnsY`nVYep$$zzcnFTg%gp>E4+=I6Y z`_e_2=Uf9`Q&<v-af*DKd3h>W!n5H6);4o=)f6`%b*fZ>@T3Nd)c%~+fvw@qem=kW zaZS=Wb}pxywIc%GYtmX)HUJ^Sk6&2fnq*Qn=C-LCGf*k>E9zdo)Y5y(hB)YZEQvJf zxdc#M!tv?19i<m$ge(k$3HbSAPzImo>ajI$SKUJiPl7P8tdyIX=9RDsSbw!#OSjti zoR*YlyD*?*))qR#alw>VONE!P$*$PfBWv9r2NE*QfNj(}lz3y0?JVd(P1|!icwn6J zgY;JECn}NnL9$?5MJag7QP}u9oFnpL@<e@Ekw;HOnKmm9%RwLRZaIz#HpixwJs4pq ziwc>r6=eW?tPildECo}q3DRk|##zcn+}1R=5~UVY>C#MqsGO*lZ%A%E6m|D0eo&Tx zZzrIYWkXq!V$U-IZVxc5hqGC+Ir_Sm>g%rpSr^XY^*&F!52GwvOHbu0kFWBFrQz>e zHfMzmwGU*vVsA~XD6cR)FD%6tb=UA={g=?q@Vj0g^AlrX8bPc}*Wuem>%T#g`2ggS z)9kqcr{KFAQ>O-2;7$=w`I1M>0c`$-ji8QHy>UEX>Xh+rh3*uBC|w(0_K!<<S3f<E zjOHZZAh}THh5*EVq^AZUX@3^~^1|{1c-|FDYl3(l9fqey#x!Fk6}vi!;`wZe)ox0B zIXl`F3-Geuz>P^)s&$0Hoz@Gy;aSpHjPmKTm@n-MN#k=bV<&7^#6$keBmt6*I}mG* zwNc9`>ovjRW=;!cvoB$<vcSw#^D&v!rYSlxS-r9iG8TG7DOKq8q<$M}TXzW;OhaJ4 znK{lWlOI1Va_0&G$pgdiYqg%U&5jo7iUf74#M)})EJVPQF0V%t2zR{!zx+7Ra2VEi z^IIz6iF*V7kp_!fBfQ~+B^QB|91F12Y_^Hj|Ad&vxO}a9SONUpQ5r)6Xu~&g%4y?Y zEpa#LbgmHOQal2$6Uw4f^Pfm2{X$tu{6H8cXeE4=n*bc^0^C@m#$bUpr&d>jjupYF z^GrQWl5Ujif}<6Xi3cY4cHvbYH+U0pd)0t%Xcf_%|L@r(qHqb|bGRk51L00l1?&W< z_AJ1-O<=3$MQ^_(5^UcMTz*O?rlG9um4_mMHK&K+ZkKA#EU?b-&uI{zNDt$yQUXhc zVP;QrLkOB0j6rI2K6L<kSH(vpSvX$x`1*TTcS5cRVIHc5GL6P2b6m`+DN7<K{P=Dj z3C{?;bI_wq!jlDlJcp*kq%fY}KP`bkh3Ih+yl}ip;~>|U2*2Q+M9I+tW+ND|O!Ftk z_y0*m8}Mm$foZ@={Lg%W1Ftkl=5Z?xEM>_kvrQK0V^18Z;h)}xzr)OOhCmP+0lZ|L zMB$%!&P&4=2wYSfhMQS1@%%@Y=l_bb5dG^%Y;($Ftpx6W=lqGDNX$QJu1hwWnP@eN z3O7!K7sn6e&;Q>L@&6^~w?zS%ARQAvq7gH}nQJ(ju>6lL?9Dk0o;;Z0_=C{mh8^JF N<x5Jk85fNH{6CSAEzJM` diff --git a/contracts/src/v0.8/ccip/docs/multi-chain-overview.drawio b/contracts/src/v0.8/ccip/docs/multi-chain-overview.drawio index 5743bf5182e..785edfc2f55 100644 --- a/contracts/src/v0.8/ccip/docs/multi-chain-overview.drawio +++ b/contracts/src/v0.8/ccip/docs/multi-chain-overview.drawio @@ -1,6 +1,6 @@ -<mxfile host="app.diagrams.net" modified="2024-06-18T09:41:15.719Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" etag="VX1ypz7fLI3pwnHRlB4Z" version="24.5.4" type="device"> +<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" version="24.7.13"> <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1"> - <mxGraphModel dx="6839" dy="4034" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <mxGraphModel dx="3728" dy="2314" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" /> @@ -1340,7 +1340,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-9" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Router&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="100" y="1300" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-10" value="Multi&lt;br&gt;OnRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-10" value="OnRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-20" y="1460" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-11" value="" style="rounded=1;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=none;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;startArrow=block;startFill=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;curved=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="woXJvjXyPqNF8OMwea0D-10" target="woXJvjXyPqNF8OMwea0D-48" edge="1"> @@ -1356,7 +1356,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-12" value="Optimism" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="20" y="1700" width="70" height="30" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-13" value="Multi&lt;br&gt;OffRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-13" value="&lt;div&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;OffRamp&lt;/span&gt;&lt;br&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="110" y="1785" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-14" value="" style="html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=classic;endFill=1;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;rounded=1;strokeColor=#242424;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="woXJvjXyPqNF8OMwea0D-13" target="woXJvjXyPqNF8OMwea0D-46" edge="1"> @@ -1376,10 +1376,10 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-17" value="Router" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="460" y="1330" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-18" value="Multi&lt;div&gt;OnRamp&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-18" value="&lt;span style=&quot;background-color: initial;&quot;&gt;OnRamp&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="390" y="1460" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-19" value="Multi&lt;div&gt;OnRamp&amp;nbsp;- New&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-19" value="&lt;span style=&quot;background-color: initial;&quot;&gt;OnRamp&amp;nbsp;- New&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="545" y="1460" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-20" value="" style="rounded=1;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;dashed=1;dashPattern=1 4;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="woXJvjXyPqNF8OMwea0D-17" target="woXJvjXyPqNF8OMwea0D-19" edge="1"> @@ -1388,7 +1388,7 @@ <mxPoint x="530" y="1470" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-22" value="Multi&lt;div&gt;OffRamp - New&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-22" value="&lt;span style=&quot;background-color: initial;&quot;&gt;OffRamp - New&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="713" y="1785" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-24" value="" style="html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=classic;endFill=1;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;rounded=1;strokeColor=#242424;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="woXJvjXyPqNF8OMwea0D-22" target="woXJvjXyPqNF8OMwea0D-46" edge="1"> @@ -1426,7 +1426,7 @@ <mxGeometry x="40" y="1540" width="90" height="20" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-34" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;Relay&amp;nbsp;roots&lt;br&gt;&amp;amp; prices&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=13;rotation=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="160" y="1705" width="100" height="20" as="geometry" /> + <mxGeometry x="160" y="1711.5" width="100" height="20" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-35" value="" style="endArrow=classic;html=1;rounded=0;fontSize=13;fontColor=#660000;strokeWidth=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=1;endSize=8;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="woXJvjXyPqNF8OMwea0D-48" target="woXJvjXyPqNF8OMwea0D-13" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> @@ -1496,7 +1496,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-53" value="Solana" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-369" y="1695" width="70" height="30" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-54" value="Multi&lt;br&gt;OffRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-54" value="OffRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-188" y="1785" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-55" value="Router" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1617,8 +1617,8 @@ <mxPoint x="-57.99999999999977" y="1470" as="sourcePoint" /> <mxPoint x="-60" y="1350" as="targetPoint" /> <Array as="points"> - <mxPoint x="10" y="1450" /> - <mxPoint x="10" y="1360" /> + <mxPoint x="20" y="1450" /> + <mxPoint x="20" y="1360" /> <mxPoint x="-70" y="1360" /> </Array> </mxGeometry> @@ -1667,10 +1667,10 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-143" value="Mint or release" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="215" y="1975" width="90" height="20" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-161" value="Multi&lt;br&gt;OnRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-161" value="OnRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-1088" y="1650" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-162" value="Multi&lt;br&gt;OffRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-162" value="OffRamp" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-1087" y="1875" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-163" value="Router" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1789,7 +1789,7 @@ <mxGeometry x="-1030" y="2040" width="67" height="20" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-191" value="Write merkle root" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="-1110" y="1845" width="72" height="30" as="geometry" /> + <mxGeometry x="-1102" y="1835" width="72" height="30" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-192" value="Read merkle root&lt;br&gt;&amp;amp; execute msgs" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-920" y="1830" width="100" height="30" as="geometry" /> @@ -1810,7 +1810,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-221" value="Multi chain" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-420" y="1190" width="180" height="30" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-223" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-223" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-359" y="1745" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-240" value="&lt;font style=&quot;font-size: 112px;&quot;&gt;OCR3&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1862,7 +1862,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-282" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;RMN&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=18;glass=0;strokeWidth=1;shadow=0;strokeColor=#242424;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="410" y="1806.5" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-283" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-283" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="410" y="1761.5" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-284" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;TokenAdminRegistry&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1880,7 +1880,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-290" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;RMN&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=18;glass=0;strokeWidth=1;shadow=0;strokeColor=#242424;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="633.5" y="1315" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-291" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-291" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="633.5" y="1270" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-292" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;TokenAdminRegistry&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1908,7 +1908,7 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-302" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;RMN&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=18;glass=0;strokeWidth=1;shadow=0;strokeColor=#242424;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-366" y="1455" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-303" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="woXJvjXyPqNF8OMwea0D-303" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-366" y="1410" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-304" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;TokenAdminRegistry&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -1926,11 +1926,8 @@ <mxPoint x="-101" y="1489.97" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-311" value="getPrices&lt;div&gt;getPool&lt;br&gt;&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="-92" y="1445" width="75" height="30" as="geometry" /> - </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-312" value="&lt;div&gt;isCursed&lt;div&gt;getNonce&lt;/div&gt;&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="-92" y="1490" width="75" height="20" as="geometry" /> + <mxCell id="woXJvjXyPqNF8OMwea0D-311" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;processMessageArgs&lt;/font&gt;&lt;div style=&quot;font-size: 11px; line-height: 180%;&quot;&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;onOutboundMessage&lt;/font&gt;&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="-90" y="1420" width="85" height="40" as="geometry" /> </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-313" value="Old ramp is configured, don&#39;t send to the new one yet" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="382.5" y="1380" width="128.5" height="30" as="geometry" /> @@ -1987,12 +1984,6 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-323" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;Read events&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=13;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="330" y="1542" width="100" height="20" as="geometry" /> - </mxCell> - <mxCell id="woXJvjXyPqNF8OMwea0D-324" value="&lt;font style=&quot;font-size: 12px;&quot;&gt;Read events&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=13;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> - <mxGeometry x="637.25" y="1542" width="83.5" height="20" as="geometry" /> - </mxCell> <mxCell id="woXJvjXyPqNF8OMwea0D-328" value="COMMIT DON&lt;div&gt;BLUE&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="230" y="1630" width="130" height="30" as="geometry" /> </mxCell> @@ -2030,10 +2021,10 @@ <mxCell id="woXJvjXyPqNF8OMwea0D-343" value="EXEC DON&lt;div&gt;GREEN&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="821" y="1630" width="115" height="30" as="geometry" /> </mxCell> - <mxCell id="LKB6LAdQHVU2I6fmtLf7-1" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="LKB6LAdQHVU2I6fmtLf7-1" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="540" y="1761.5" width="120" height="40" as="geometry" /> </mxCell> - <mxCell id="LKB6LAdQHVU2I6fmtLf7-2" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;PriceRegistry&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxCell id="LKB6LAdQHVU2I6fmtLf7-2" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;FeeQuoter&lt;br&gt;&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="765" y="1270" width="120" height="40" as="geometry" /> </mxCell> <mxCell id="LKB6LAdQHVU2I6fmtLf7-5" value="&lt;span style=&quot;font-size: 13px;&quot;&gt;Shared&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> @@ -2051,9 +2042,21 @@ <mxCell id="LKB6LAdQHVU2I6fmtLf7-10" value="&lt;span style=&quot;font-size: 13px;&quot;&gt;External&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-287.5" y="1315" width="77.5" height="40" as="geometry" /> </mxCell> - <mxCell id="LndgSB7H6BAqNtGT-OBd-0" value="&lt;font style=&quot;font-size: 112px;&quot;&gt;OCR2&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> + <mxCell id="LndgSB7H6BAqNtGT-OBd-0" value="&lt;font style=&quot;font-size: 112px;&quot;&gt;OCR2&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxGeometry x="-1175" y="-160" width="569" height="190" as="geometry" /> </mxCell> + <mxCell id="lUZlNMkhEWmQk4-FoNXM-0" value="Read events" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=13;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="330" y="1540" width="90" height="20" as="geometry" /> + </mxCell> + <mxCell id="lUZlNMkhEWmQk4-FoNXM-1" value="Read events" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=13;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="635" y="1540" width="90" height="20" as="geometry" /> + </mxCell> + <mxCell id="lUZlNMkhEWmQk4-FoNXM-2" value="&lt;div style=&quot;font-size: 11px; line-height: 120%;&quot;&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11px; line-height: 120%;&quot;&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;getIncremented-&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11px; line-height: 120%;&quot;&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;OutboundNonce&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11px; line-height: 120%;&quot;&gt;&lt;font style=&quot;font-size: 11px;&quot;&gt;getPool&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 11px; line-height: 120%;&quot;&gt;&lt;div style=&quot;line-height: 120%;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="-105" y="1480" width="85" height="53" as="geometry" /> + </mxCell> + <mxCell id="2QNqtgelfZp8qdsyauz8-0" value="All chains are senders and receivers, to keep this readable the top chains only send and the bottom chains only receive" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1;fontSize=17;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> + <mxGeometry x="-144.5" y="1192" width="1165" height="30" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> diff --git a/contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol b/contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol similarity index 98% rename from contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol rename to contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol index 621c3686cfa..dac7317e418 100644 --- a/contracts/src/v0.8/ccip/capability/interfaces/ICapabilitiesRegistry.sol +++ b/contracts/src/v0.8/ccip/interfaces/ICapabilitiesRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; +pragma solidity ^0.8.0; interface ICapabilitiesRegistry { struct NodeInfo { diff --git a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol index fdea4538b6e..84d430410b2 100644 --- a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol +++ b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol @@ -1,22 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; import {IPriceRegistry} from "./IPriceRegistry.sol"; interface IFeeQuoter is IPriceRegistry { - /// @notice Token price data feed configuration - struct TokenPriceFeedConfig { - address dataFeedAddress; // ──╮ AggregatorV3Interface contract (0 - feed is unset) - uint8 tokenDecimals; // ──────╯ Decimals of the token that the feed represents - } - - /// @notice Returns the token price data feed configuration - /// @param token The token to retrieve the feed config for - /// @return tokenPriceFeedConfig The token price data feed config (if feed address is 0, the feed config is disabled) - function getTokenPriceFeedConfig(address token) external view returns (TokenPriceFeedConfig memory); - /// @notice Validates the ccip message & returns the fee /// @param destChainSelector The destination chain selector. /// @param message The message to get quote for. @@ -27,28 +16,31 @@ interface IFeeQuoter is IPriceRegistry { ) external view returns (uint256 feeTokenAmount); /// @notice Converts the extraArgs to the latest version and returns the converted message fee in juels + /// @notice Validates pool return data /// @param destChainSelector destination chain selector to process /// @param feeToken Fee token address used to pay for message fees /// @param feeTokenAmount Fee token amount /// @param extraArgs Message extra args that were passed in by the client + /// @param onRampTokenTransfers Token amounts with populated pool return data + /// @param sourceTokenAmounts Token amounts originally sent in a Client.EVM2AnyMessage message /// @return msgFeeJuels message fee in juels /// @return isOutOfOrderExecution true if the message should be executed out of order /// @return convertedExtraArgs extra args converted to the latest family-specific args version + /// @return destExecDataPerToken Destination chain execution data function processMessageArgs( uint64 destChainSelector, address feeToken, uint256 feeTokenAmount, - bytes memory extraArgs - ) external view returns (uint256 msgFeeJuels, bool isOutOfOrderExecution, bytes memory convertedExtraArgs); - - /// @notice Validates pool return data - /// @param destChainSelector Destination chain selector to which the token amounts are sent to - /// @param rampTokenAmounts Token amounts with populated pool return data - /// @param sourceTokenAmounts Token amounts originally sent in a Client.EVM2AnyMessage message - /// @return destExecData Destination chain execution data - function processPoolReturnData( - uint64 destChainSelector, - Internal.RampTokenAmount[] memory rampTokenAmounts, + bytes memory extraArgs, + Internal.EVM2AnyTokenTransfer[] calldata onRampTokenTransfers, Client.EVMTokenAmount[] calldata sourceTokenAmounts - ) external view returns (bytes[] memory); + ) + external + view + returns ( + uint256 msgFeeJuels, + bool isOutOfOrderExecution, + bytes memory convertedExtraArgs, + bytes[] memory destExecDataPerToken + ); } diff --git a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol index 757ef09b0c5..583a2e890b7 100644 --- a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol +++ b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; -import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; interface IPriceRegistry { @@ -60,39 +59,4 @@ interface IPriceRegistry { /// @notice Get the list of fee tokens. /// @return feeTokens The tokens set as fee tokens. function getFeeTokens() external view returns (address[] memory); - - /// @notice Validates the ccip message & returns the fee - /// @param destChainSelector The destination chain selector. - /// @param message The message to get quote for. - /// @return feeTokenAmount The amount of fee token needed for the fee, in smallest denomination of the fee token. - function getValidatedFee( - uint64 destChainSelector, - Client.EVM2AnyMessage calldata message - ) external view returns (uint256 feeTokenAmount); - - /// @notice Converts the extraArgs to the latest version and returns the converted message fee in juels - /// @param destChainSelector destination chain selector to process - /// @param feeToken Fee token address used to pay for message fees - /// @param feeTokenAmount Fee token amount - /// @param extraArgs Message extra args that were passed in by the client - /// @return msgFeeJuels message fee in juels - /// @return isOutOfOrderExecution true if the message should be executed out of order - /// @return convertedExtraArgs extra args converted to the latest family-specific args version - function processMessageArgs( - uint64 destChainSelector, - address feeToken, - uint256 feeTokenAmount, - bytes memory extraArgs - ) external view returns (uint256 msgFeeJuels, bool isOutOfOrderExecution, bytes memory convertedExtraArgs); - - /// @notice Validates pool return data - /// @param destChainSelector Destination chain selector to which the token amounts are sent to - /// @param rampTokenAmounts Token amounts with populated pool return data - /// @param sourceTokenAmounts Token amounts originally sent in a Client.EVM2AnyMessage message - /// @return destExecData Destination chain execution data - function processPoolReturnData( - uint64 destChainSelector, - Internal.RampTokenAmount[] memory rampTokenAmounts, - Client.EVMTokenAmount[] calldata sourceTokenAmounts - ) external view returns (bytes[] memory); } diff --git a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol b/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol index 9af3de6cab6..0a66af76efb 100644 --- a/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol +++ b/contracts/src/v0.8/ccip/interfaces/IRMNV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {Internal} from "../libraries/Internal.sol"; @@ -11,12 +11,29 @@ interface IRMNV2 { bytes32 s; } - function verify(Internal.MerkleRoot[] memory merkleRoots, Signature[] memory signatures) external view; + /// @notice Verifies signatures of RMN nodes, on dest lane updates as provided in the CommitReport + /// @param offRampAddress is not inferred by msg.sender, in case the call is made through ARMProxy + /// @param merkleRoots must be well formed, and is a representation of the CommitReport received from the oracles + /// @param signatures rmnNodes ECDSA sigs, only r & s, must be sorted in ascending order by signer address + /// @param rawVs rmnNodes ECDSA sigs, part v bitmap + /// @dev Will revert if verification fails + function verify( + address offRampAddress, + Internal.MerkleRoot[] memory merkleRoots, + Signature[] memory signatures, + uint256 rawVs + ) external view; + + /// @notice gets the current set of cursed subjects + /// @return subjects the list of cursed subjects + function getCursedSubjects() external view returns (bytes16[] memory subjects); /// @notice If there is an active global or legacy curse, this function returns true. + /// @return bool true if there is an active global curse function isCursed() external view returns (bool); /// @notice If there is an active global curse, or an active curse for `subject`, this function returns true. /// @param subject To check whether a particular chain is cursed, set to bytes16(uint128(chainSelector)). + /// @return bool true if the provided subject is cured *or* if there is an active global curse function isCursed(bytes16 subject) external view returns (bool); } diff --git a/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol b/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol index 9805a41bbdc..27913b597d7 100644 --- a/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol +++ b/contracts/src/v0.8/ccip/interfaces/IRouterClient.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {Client} from "../libraries/Client.sol"; diff --git a/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol b/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol new file mode 100644 index 00000000000..96902fa4d46 --- /dev/null +++ b/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {CCIPHome} from "../../capability/CCIPHome.sol"; + +import {OffRamp} from "../../offRamp/OffRamp.sol"; +import {RMNRemote} from "../../rmn/RMNRemote.sol"; + +/// @dev this file exposes structs that are otherwise internal to the CCIP codebase +/// doing this allows those structs to be encoded and decoded with type safety in offchain code +/// and tests because generated wrappers are available +interface ICCIPEncodingUtils { + /// @dev the RMN Report struct is used in integration / E2E tests + function exposeRmnReport(bytes32 rmnReportVersion, RMNRemote.Report memory rmnReport) external; + + /// @dev the OCR3Config Config struct is used in integration / E2E tests + function exposeOCR3Config(CCIPHome.OCR3Config[] calldata config) external view returns (bytes memory); + + /// @dev used to encode commit reports for onchain transmission. + function exposeCommitReport(OffRamp.CommitReport memory commitReport) external view returns (bytes memory); +} diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol index 58ae6279b80..90b36adb7b7 100644 --- a/contracts/src/v0.8/ccip/libraries/Internal.sol +++ b/contracts/src/v0.8/ccip/libraries/Internal.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {MerkleMultiProof} from "../libraries/MerkleMultiProof.sol"; import {Client} from "./Client.sol"; @@ -140,11 +140,12 @@ library Internal { uint256 public constant ANY_2_EVM_MESSAGE_FIXED_BYTES = 32 * 14; /// @dev Each token transfer adds 1 RampTokenAmount - /// RampTokenAmount has 5 fields, 3 of which are bytes type, 1 uint256 and 1 uint32. + /// RampTokenAmount has 5 fields, 2 of which are bytes type, 1 Address, 1 uint256 and 1 uint32. /// Each bytes type takes 1 slot for length, 1 slot for data and 1 slot for the offset. + /// address /// uint256 amount takes 1 slot. /// uint32 destGasAmount takes 1 slot. - uint256 public constant ANY_2_EVM_MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * ((3 * 3) + 2); + uint256 public constant ANY_2_EVM_MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * ((2 * 3) + 3); bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256("EVM2EVMMessageHashV2"); @@ -187,30 +188,25 @@ library Internal { /// OnRamp hash(EVM2AnyMessage) != Any2EVMRampMessage.messageId /// OnRamp hash(EVM2AnyMessage) != OffRamp hash(Any2EVMRampMessage) /// @param original OffRamp message to hash - /// @param onRamp OnRamp to hash the message with - used to compute the metadataHash + /// @param metadataHash Hash preimage to ensure global uniqueness /// @return hashedMessage hashed message as a keccak256 - function _hash(Any2EVMRampMessage memory original, bytes memory onRamp) internal pure returns (bytes32) { + function _hash(Any2EVMRampMessage memory original, bytes32 metadataHash) internal pure returns (bytes32) { // 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 the RMN maintainers. return keccak256( abi.encode( MerkleMultiProof.LEAF_DOMAIN_SEPARATOR, - // Implicit metadata hash - keccak256( - abi.encode( - ANY_2_EVM_MESSAGE_HASH, original.header.sourceChainSelector, original.header.destChainSelector, onRamp - ) - ), + metadataHash, keccak256( abi.encode( original.header.messageId, - original.sender, original.receiver, original.header.sequenceNumber, original.gasLimit, original.header.nonce ) ), + keccak256(original.sender), keccak256(original.data), keccak256(abi.encode(original.tokenAmounts)) ) @@ -227,13 +223,13 @@ library Internal { keccak256( abi.encode( original.sender, - original.receiver, original.header.sequenceNumber, original.header.nonce, original.feeToken, original.feeTokenAmount ) ), + keccak256(original.receiver), keccak256(original.data), keccak256(abi.encode(original.tokenAmounts)), keccak256(original.extraArgs) @@ -282,12 +278,21 @@ library Internal { Execution } - /// @notice Family-agnostic token amounts used for both OnRamp & OffRamp messages - struct RampTokenAmount { - // The source pool address, abi encoded. This value is trusted as it was obtained through the onRamp. It can be + /// @notice Family-agnostic header for OnRamp & OffRamp messages. + /// The messageId is not expected to match hash(message), since it may originate from another ramp family + struct RampMessageHeader { + bytes32 messageId; // Unique identifier for the message, generated with the source chain's encoding scheme (i.e. not necessarily abi.encoded) + uint64 sourceChainSelector; // ──╮ the chain selector of the source chain, note: not chainId + uint64 destChainSelector; // | the chain selector of the destination chain, note: not chainId + uint64 sequenceNumber; // │ sequence number, not unique across lanes + uint64 nonce; // ────────────────╯ nonce for this lane for this sender, not unique across senders/lanes + } + + struct EVM2AnyTokenTransfer { + // The source pool EVM address. This value is trusted as it was obtained through the onRamp. It can be // relied upon by the destination pool to validate the source pool. - bytes sourcePoolAddress; - // The address of the destination token, abi encoded in the case of EVM chains + address sourcePoolAddress; + // The EVM address of the destination token // This value is UNTRUSTED as any pool owner can return whatever value they want. bytes destTokenAddress; // Optional pool data to be transferred to the destination chain. Be default this is capped at @@ -296,18 +301,22 @@ library Internal { bytes extraData; uint256 amount; // Amount of tokens. // Destination chain specific execution data encoded in bytes - //(for EVM destination it consists of the amount of gas available for the releaseOrMint and transfer calls on the offRamp + // for an EVM destination, it consists of the amount of gas available for the releaseOrMint + // and transfer calls made by the offRamp bytes destExecData; } - /// @notice Family-agnostic header for OnRamp & OffRamp messages. - /// The messageId is not expected to match hash(message), since it may originate from another ramp family - struct RampMessageHeader { - bytes32 messageId; // Unique identifier for the message, generated with the source chain's encoding scheme (i.e. not necessarily abi.encoded) - uint64 sourceChainSelector; // ──╮ the chain selector of the source chain, note: not chainId - uint64 destChainSelector; // | the chain selector of the destination chain, note: not chainId - uint64 sequenceNumber; // │ sequence number, not unique across lanes - uint64 nonce; // ────────────────╯ nonce for this lane for this sender, not unique across senders/lanes + struct Any2EVMTokenTransfer { + // The source pool EVM address encoded to bytes. This value is trusted as it is obtained through the onRamp. It can be + // relied upon by the destination pool to validate the source pool. + bytes sourcePoolAddress; + address destTokenAddress; // ───╮ Address of destination token + uint32 destGasAmount; //────────╯ The amount of gas available for the releaseOrMint and transfer calls on the offRamp. + // Optional pool data to be transferred to the destination chain. Be default this is capped at + // CCIP_LOCK_OR_BURN_V1_RET_BYTES bytes. If more data is required, the TokenTransferFeeConfig.destBytesOverhead + // has to be set for the specific token. + bytes extraData; + uint256 amount; // Amount of tokens. } /// @notice Family-agnostic message routed to an OffRamp @@ -319,7 +328,7 @@ library Internal { bytes data; // arbitrary data payload supplied by the message sender address receiver; // receiver address on the destination chain uint256 gasLimit; // user supplied maximum gas amount available for dest chain execution - RampTokenAmount[] tokenAmounts; // array of tokens and amounts to transfer + Any2EVMTokenTransfer[] tokenAmounts; // array of tokens and amounts to transfer } /// @notice Family-agnostic message emitted from the OnRamp @@ -333,7 +342,8 @@ library Internal { bytes extraArgs; // destination-chain specific extra args, such as the gasLimit for EVM chains address feeToken; // fee token uint256 feeTokenAmount; // fee token amount - RampTokenAmount[] tokenAmounts; // array of tokens and amounts to transfer + uint256 feeValueJuels; // fee amount in Juels + EVM2AnyTokenTransfer[] tokenAmounts; // array of tokens and amounts to transfer } // bytes4(keccak256("CCIP ChainFamilySelector EVM")) @@ -341,11 +351,13 @@ library Internal { /// @dev Struct to hold a merkle root and an interval for a source chain so that an array of these can be passed in the CommitReport. /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. + /// @dev ineffiecient struct packing intentionally chosen to maintain order of specificity. Not a storage struct so impact is minimal. + // solhint-disable-next-line gas-struct-packing struct MerkleRoot { - uint64 sourceChainSelector; // ──╮ Remote source chain selector that the Merkle Root is scoped to - uint64 minSeqNr; // | Minimum sequence number, inclusive + uint64 sourceChainSelector; // Remote source chain selector that the Merkle Root is scoped to + bytes onRampAddress; // Generic onramp address, to support arbitrary sources; for EVM, use abi.encode + uint64 minSeqNr; // ─────────────╮ Minimum sequence number, inclusive uint64 maxSeqNr; // ─────────────╯ Maximum sequence number, inclusive bytes32 merkleRoot; // Merkle root covering the interval & source chain messages - bytes onRampAddress; // Generic onramp address, to support arbitrary sources; for EVM, use abi.encode } } diff --git a/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol b/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol index fed8a1165bb..95f52bdc528 100644 --- a/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol +++ b/contracts/src/v0.8/ccip/libraries/MerkleMultiProof.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; library MerkleMultiProof { /// @notice Leaf domain separator, should be used as the first 32 bytes of a leaf's preimage. diff --git a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol index 40ac3ca213e..84914749e01 100644 --- a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol +++ b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; /// @notice Implements Token Bucket rate limiting. /// @dev uint128 is safe for rate limiter state. diff --git a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol index c9fff4d6248..2e698cd230f 100644 --- a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol +++ b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; @@ -28,7 +28,8 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { TOO_MANY_TRANSMITTERS, TOO_MANY_SIGNERS, F_TOO_HIGH, - REPEATED_ORACLE_ADDRESS + REPEATED_ORACLE_ADDRESS, + NO_TRANSMITTERS } error InvalidConfig(InvalidConfigErrorType errorType); @@ -74,6 +75,7 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { /// @notice OCR configuration for a single OCR plugin within a DON. struct OCRConfig { ConfigInfo configInfo; // latest OCR config + // NOTE: len(signers) can be different from len(transmitters). There is no index relationship between the two arrays address[] signers; // addresses oracles use to sign the reports address[] transmitters; // addresses oracles use to transmit the reports } @@ -123,6 +125,9 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { /// NOTE: The OCR3 config must be sanity-checked against the home-chain registry configuration, to ensure /// home-chain and remote-chain parity! /// @param ocrConfigArgs OCR config update args. + /// @dev precondition number of transmitters should match the expected F/fChain relationship. + /// For transmitters, the function only validates that len(transmitters) > 0 && len(transmitters) <= MAX_NUM_ORACLES + /// && len(transmitters) <= len(signers) [if sig verification is enabled] function setOCR3Configs(OCRConfigArgs[] memory ocrConfigArgs) external onlyOwner { for (uint256 i; i < ocrConfigArgs.length; ++i) { _setOCR3Config(ocrConfigArgs[i]); @@ -147,6 +152,7 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { address[] memory transmitters = ocrConfigArgs.transmitters; if (transmitters.length > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_TRANSMITTERS); + if (transmitters.length == 0) revert InvalidConfig(InvalidConfigErrorType.NO_TRANSMITTERS); _clearOracleRoles(ocrPluginType, ocrConfig.transmitters); @@ -157,6 +163,9 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { if (signers.length > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_SIGNERS); if (signers.length <= 3 * ocrConfigArgs.F) revert InvalidConfig(InvalidConfigErrorType.F_TOO_HIGH); + // NOTE: Transmitters cannot exceed signers. Transmitters do not have to be >= 3F + 1 because they can match >= 3fChain + 1, where fChain <= F. + // fChain is not represented in MultiOCR3Base - so we skip this check. + if (signers.length < transmitters.length) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_TRANSMITTERS); configInfo.n = uint8(signers.length); ocrConfig.signers = signers; diff --git a/contracts/src/v0.8/ccip/ocr/OCR2Base.sol b/contracts/src/v0.8/ccip/ocr/OCR2Base.sol index 52a6df2f3a2..74c8e479173 100644 --- a/contracts/src/v0.8/ccip/ocr/OCR2Base.sol +++ b/contracts/src/v0.8/ccip/ocr/OCR2Base.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {OCR2Abstract} from "./OCR2Abstract.sol"; diff --git a/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol b/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol index a79df8d589a..8bada2c378e 100644 --- a/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol +++ b/contracts/src/v0.8/ccip/ocr/OCR2BaseNoChecks.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {OCR2Abstract} from "./OCR2Abstract.sol"; diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol index 10bde4c251e..5fcddb486e9 100644 --- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol @@ -40,7 +40,11 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { error UnexpectedTokenData(); error ManualExecutionNotYetEnabled(uint64 sourceChainSelector); error ManualExecutionGasLimitMismatch(); - error InvalidManualExecutionGasLimit(uint64 sourceChainSelector, uint256 index, uint256 newLimit); + error InvalidManualExecutionGasLimit(uint64 sourceChainSelector, bytes32 messageId, uint256 newLimit); + error InvalidManualExecutionTokenGasOverride( + bytes32 messageId, uint256 tokenIndex, uint256 oldLimit, uint256 tokenGasOverride + ); + error ManualExecutionGasAmountCountMismatch(bytes32 messageId, uint64 sequenceNumber); error RootNotCommitted(uint64 sourceChainSelector); error RootAlreadyCommitted(uint64 sourceChainSelector, bytes32 merkleRoot); error InvalidRoot(); @@ -53,11 +57,14 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { error NotACompatiblePool(address notPool); error InvalidDataLength(uint256 expected, uint256 got); error InvalidNewState(uint64 sourceChainSelector, uint64 sequenceNumber, Internal.MessageExecutionState newState); - error InvalidStaticConfig(uint64 sourceChainSelector); error StaleCommitReport(); error InvalidInterval(uint64 sourceChainSelector, uint64 min, uint64 max); error ZeroAddressNotAllowed(); error InvalidMessageDestChainSelector(uint64 messageDestChainSelector); + error SourceChainSelectorMismatch(uint64 reportSourceChainSelector, uint64 messageSourceChainSelector); + error SignatureVerificationDisabled(); + error CommitOnRampMismatch(bytes reportOnRamp, bytes configOnRamp); + error InvalidOnRampUpdate(uint64 sourceChainSelector); /// @dev Atlas depends on this event, if changing, please notify Atlas. event StaticConfigSet(StaticConfig staticConfig); @@ -77,11 +84,11 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { event SkippedAlreadyExecutedMessage(uint64 sourceChainSelector, uint64 sequenceNumber); event AlreadyAttempted(uint64 sourceChainSelector, uint64 sequenceNumber); /// @dev RMN depends on this event, if changing, please notify the RMN maintainers. - event CommitReportAccepted(CommitReport report); + event CommitReportAccepted(Internal.MerkleRoot[] merkleRoots, Internal.PriceUpdates priceUpdates); event RootRemoved(bytes32 root); event SkippedReportExecution(uint64 sourceChainSelector); - /// @notice Struct that contains the static configuration + /// @dev Struct that contains the static configuration /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. /// @dev not sure why solhint complains about this, seems like a buggy detector /// https://github.com/protofire/solhint/issues/597 @@ -93,7 +100,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { address nonceManager; // Nonce manager address } - /// @notice Per-chain source config (defining a lane from a Source Chain -> Dest OffRamp) + /// @dev Per-chain source config (defining a lane from a Source Chain -> Dest OffRamp) struct SourceChainConfig { IRouter router; // ──────────╮ Local router to use for messages coming from this source chain bool isEnabled; // | Flag whether the source chain is enabled or not @@ -101,7 +108,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { bytes onRamp; // OnRamp address on the source chain } - /// @notice Same as SourceChainConfig but with source chain selector so that an array of these + /// @dev Same as SourceChainConfig but with source chain selector so that an array of these /// can be passed in the constructor and the applySourceChainConfigUpdates function. struct SourceChainConfigArgs { IRouter router; // ────────────────╮ Local router to use for messages coming from this source chain @@ -110,26 +117,33 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { bytes onRamp; // OnRamp address on the source chain } - /// @notice Dynamic offRamp config + /// @dev Dynamic offRamp config /// @dev Since DynamicConfig is part of DynamicConfigSet event, if changing it, we should update the ABI on Atlas struct DynamicConfig { address feeQuoter; // ──────────────────────────────╮ FeeQuoter address on the local chain - uint32 permissionLessExecutionThresholdSeconds; // │ Waiting time before manual execution is enabled - uint32 maxTokenTransferGas; // │ Maximum amount of gas passed on to token `transfer` call - uint32 maxPoolReleaseOrMintGas; // ─────────────────╯ Maximum amount of gas passed on to token pool when calling releaseOrMint - address messageValidator; // Optional message validator to validate incoming messages (zero address = no validator) + uint32 permissionLessExecutionThresholdSeconds; //──╯ Waiting time before manual execution is enabled + address messageInterceptor; // Optional message interceptor to validate incoming messages (zero address = no interceptor) } - /// @notice Report that is committed by the observing DON at the committing phase + /// @dev Report that is committed by the observing DON at the committing phase /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. struct CommitReport { Internal.PriceUpdates priceUpdates; // Collection of gas and price updates to commit Internal.MerkleRoot[] merkleRoots; // Collection of merkle roots per source chain to commit IRMNV2.Signature[] rmnSignatures; // RMN signatures on the merkle roots + uint256 rmnRawVs; // Raw v values of the RMN signatures + } + + struct GasLimitOverride { + // A value of zero in both fields signifies no override and allows the corresponding field to be overridden as valid + uint256 receiverExecutionGasLimit; // Overrides EVM2EVMMessage.gasLimit. + uint32[] tokenGasOverrides; // Overrides EVM2EVMMessage.sourceTokenData.destGasAmount, length must be same as tokenAmounts. } // STATIC CONFIG string public constant override typeAndVersion = "OffRamp 1.6.0-dev"; + /// @dev Hash of encoded address(0) used for empty address checks + bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0))); /// @dev ChainSelector of this chain uint64 internal immutable i_chainSelector; /// @dev The RMN verification contract @@ -144,7 +158,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @notice SourceChainConfig per chain /// (forms lane configurations from sourceChainSelector => StaticConfig.chainSelector) - mapping(uint64 sourceChainSelector => SourceChainConfig sourceChainConfig) internal s_sourceChainConfigs; + mapping(uint64 sourceChainSelector => SourceChainConfig sourceChainConfig) private s_sourceChainConfigs; // STATE /// @dev A mapping of sequence numbers (per source chain) to execution state using a bitmap with each execution @@ -185,7 +199,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } // ================================================================ - // │ Messaging │ + // │ Execution │ // ================================================================ // The size of the execution state in bits @@ -193,10 +207,6 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { // The mask for the execution state bits uint256 private constant MESSAGE_EXECUTION_STATE_MASK = (1 << MESSAGE_EXECUTION_STATE_BIT_WIDTH) - 1; - // ================================================================ - // │ Execution │ - // ================================================================ - /// @notice Returns the current execution state of a message based on its sequenceNumber. /// @param sourceChainSelector The source chain to get the execution state for /// @param sequenceNumber The sequence number of the message to get the execution state for. @@ -255,7 +265,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// The reports do not have to contain all the messages (they can be omitted). Multiple reports can be passed in simultaneously. function manuallyExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory gasLimitOverrides + GasLimitOverride[][] memory gasLimitOverrides ) external { // We do this here because the other _execute path is already covered by MultiOCR3Base. _whenChainNotForked(); @@ -267,15 +277,35 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { Internal.ExecutionReportSingleChain memory report = reports[reportIndex]; uint256 numMsgs = report.messages.length; - uint256[] memory msgGasLimitOverrides = gasLimitOverrides[reportIndex]; + GasLimitOverride[] memory msgGasLimitOverrides = gasLimitOverrides[reportIndex]; if (numMsgs != msgGasLimitOverrides.length) revert ManualExecutionGasLimitMismatch(); for (uint256 msgIndex = 0; msgIndex < numMsgs; ++msgIndex) { - uint256 newLimit = msgGasLimitOverrides[msgIndex]; + uint256 newLimit = msgGasLimitOverrides[msgIndex].receiverExecutionGasLimit; // Checks to ensure message cannot be executed with less gas than specified. + Internal.Any2EVMRampMessage memory message = report.messages[msgIndex]; if (newLimit != 0) { - if (newLimit < report.messages[msgIndex].gasLimit) { - revert InvalidManualExecutionGasLimit(report.sourceChainSelector, msgIndex, newLimit); + if (newLimit < message.gasLimit) { + revert InvalidManualExecutionGasLimit(report.sourceChainSelector, message.header.messageId, newLimit); + } + } + if (message.tokenAmounts.length != msgGasLimitOverrides[msgIndex].tokenGasOverrides.length) { + revert ManualExecutionGasAmountCountMismatch(message.header.messageId, message.header.sequenceNumber); + } + + // The gas limit can not be lowered as that could cause the message to fail. If manual execution is done + // from an UNTOUCHED state and we would allow lower gas limit, anyone could grief by executing the message with + // lower gas limit than the DON would have used. This results in the message being marked FAILURE and the DON + // would not attempt it with the correct gas limit. + for (uint256 tokenIndex = 0; tokenIndex < message.tokenAmounts.length; ++tokenIndex) { + uint256 tokenGasOverride = msgGasLimitOverrides[msgIndex].tokenGasOverrides[tokenIndex]; + if (tokenGasOverride != 0) { + uint256 destGasAmount = message.tokenAmounts[tokenIndex].destGasAmount; + if (tokenGasOverride < destGasAmount) { + revert InvalidManualExecutionTokenGasOverride( + message.header.messageId, tokenIndex, destGasAmount, tokenGasOverride + ); + } } } } @@ -288,7 +318,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// and expects the exec plugin type to be configured with no signatures. /// @param report serialized execution report function execute(bytes32[3] calldata reportContext, bytes calldata report) external { - _batchExecute(abi.decode(report, (Internal.ExecutionReportSingleChain[])), new uint256[][](0)); + _batchExecute(abi.decode(report, (Internal.ExecutionReportSingleChain[])), new GasLimitOverride[][](0)); bytes32[] memory emptySigs = new bytes32[](0); _transmit(uint8(Internal.OCRPluginType.Execution), reportContext, report, emptySigs, emptySigs, bytes32("")); @@ -303,30 +333,30 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @dev If called from manual execution, each inner array's length has to match the number of messages. function _batchExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory manualExecGasLimits + GasLimitOverride[][] memory manualExecGasOverrides ) internal { if (reports.length == 0) revert EmptyReport(); - bool areManualGasLimitsEmpty = manualExecGasLimits.length == 0; + bool areManualGasLimitsEmpty = manualExecGasOverrides.length == 0; // Cache array for gas savings in the loop's condition - uint256[] memory emptyGasLimits = new uint256[](0); + GasLimitOverride[] memory emptyGasLimits = new GasLimitOverride[](0); for (uint256 i = 0; i < reports.length; ++i) { - _executeSingleReport(reports[i], areManualGasLimitsEmpty ? emptyGasLimits : manualExecGasLimits[i]); + _executeSingleReport(reports[i], areManualGasLimitsEmpty ? emptyGasLimits : manualExecGasOverrides[i]); } } /// @notice Executes a report, executing each message in order. /// @param report The execution report containing the messages and proofs. - /// @param manualExecGasLimits An array of gas limits to use for manual execution. + /// @param manualExecGasExecOverrides An array of gas limits to use for manual execution. /// @dev If called from the DON, this array is always empty. /// @dev If called from manual execution, this array is always same length as messages. function _executeSingleReport( Internal.ExecutionReportSingleChain memory report, - uint256[] memory manualExecGasLimits + GasLimitOverride[] memory manualExecGasExecOverrides ) internal { uint64 sourceChainSelector = report.sourceChainSelector; - bool manualExecution = manualExecGasLimits.length != 0; + bool manualExecution = manualExecGasExecOverrides.length != 0; if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) { if (manualExecution) { // For manual execution we don't want to silently fail so we revert @@ -353,12 +383,28 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { if (message.header.destChainSelector != i_chainSelector) { revert InvalidMessageDestChainSelector(message.header.destChainSelector); } + // If the message source chain selector does not match the report's source chain selector and + // the root has not been committed for the report source chain selector, this will be caught by the root verification. + // This acts as an extra check. + if (message.header.sourceChainSelector != sourceChainSelector) { + revert SourceChainSelectorMismatch(sourceChainSelector, message.header.sourceChainSelector); + } // We do this hash here instead of in _verify to avoid two separate loops // over the same data, which increases gas cost. // Hashing all of the message fields ensures that the message being executed is correct and not tampered with. // Including the known OnRamp ensures that the message originates from the correct on ramp version - hashedLeaves[i] = Internal._hash(message, onRamp); + hashedLeaves[i] = Internal._hash( + message, + keccak256( + abi.encode( + Internal.ANY_2_EVM_MESSAGE_HASH, + message.header.sourceChainSelector, + message.header.destChainSelector, + keccak256(onRamp) + ) + ) + ); } // SECURITY CRITICAL CHECK @@ -388,8 +434,9 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { emit SkippedAlreadyExecutedMessage(sourceChainSelector, message.header.sequenceNumber); continue; } - + uint32[] memory tokenGasOverrides; if (manualExecution) { + tokenGasOverrides = manualExecGasExecOverrides[i].tokenGasOverrides; bool isOldCommitReport = (block.timestamp - timestampCommitted) > s_dynamicConfig.permissionLessExecutionThresholdSeconds; // Manually execution is fine if we previously failed or if the commit report is just too old @@ -399,8 +446,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } // Manual execution gas limit can override gas limit specified in the message. Value of 0 indicates no override. - if (manualExecGasLimits[i] != 0) { - message.gasLimit = manualExecGasLimits[i]; + if (manualExecGasExecOverrides[i].receiverExecutionGasLimit != 0) { + message.gasLimit = manualExecGasExecOverrides[i].receiverExecutionGasLimit; } } else { // DON can only execute a message once @@ -437,7 +484,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } _setExecutionState(sourceChainSelector, message.header.sequenceNumber, Internal.MessageExecutionState.IN_PROGRESS); - (Internal.MessageExecutionState newState, bytes memory returnData) = _trialExecute(message, offchainTokenData); + (Internal.MessageExecutionState newState, bytes memory returnData) = + _trialExecute(message, offchainTokenData, tokenGasOverrides); _setExecutionState(sourceChainSelector, message.header.sequenceNumber, newState); // Since it's hard to estimate whether manual execution will succeed, we @@ -482,9 +530,10 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @return errData Revert data in bytes if CCIP receiver reverted during execution. function _trialExecute( Internal.Any2EVMRampMessage memory message, - bytes[] memory offchainTokenData + bytes[] memory offchainTokenData, + uint32[] memory tokenGasOverrides ) internal returns (Internal.MessageExecutionState executionState, bytes memory) { - try this.executeSingleMessage(message, offchainTokenData) {} + try this.executeSingleMessage(message, offchainTokenData, tokenGasOverrides) {} catch (bytes memory err) { // return the message execution state as FAILURE and the revert data // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES @@ -503,13 +552,19 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// (for example smart contract wallets) without an associated message. function executeSingleMessage( Internal.Any2EVMRampMessage memory message, - bytes[] calldata offchainTokenData + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides ) external { if (msg.sender != address(this)) revert CanOnlySelfCall(); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); if (message.tokenAmounts.length > 0) { destTokenAmounts = _releaseOrMintTokens( - message.tokenAmounts, message.sender, message.receiver, message.header.sourceChainSelector, offchainTokenData + message.tokenAmounts, + message.sender, + message.receiver, + message.header.sourceChainSelector, + offchainTokenData, + tokenGasOverrides ); } @@ -521,9 +576,9 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { destTokenAmounts: destTokenAmounts }); - address messageValidator = s_dynamicConfig.messageValidator; - if (messageValidator != address(0)) { - try IMessageInterceptor(messageValidator).onInboundMessage(any2EvmMessage) {} + address messageInterceptor = s_dynamicConfig.messageInterceptor; + if (messageInterceptor != address(0)) { + try IMessageInterceptor(messageInterceptor).onInboundMessage(any2EvmMessage) {} catch (bytes memory err) { revert IMessageInterceptor.MessageValidationError(err); } @@ -550,6 +605,158 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { if (!success) revert ReceiverError(returnData); } + // ================================================================ + // │ Tokens and pools │ + // ================================================================ + + /// @notice Uses a pool to release or mint a token to a receiver address, with balance checks before and after the + /// transfer. This is done to ensure the exact number of tokens the pool claims to release are actually transferred. + /// @dev The local token address is validated through the TokenAdminRegistry. If, due to some misconfiguration, the + /// token is unknown to the registry, the offRamp will revert. The tx, and the tokens, can be retrieved by + /// registering the token on this chain, and re-trying the msg. + /// @param sourceTokenAmount Amount and source data of the token to be released/minted. + /// @param originalSender The message sender on the source chain. + /// @param receiver The address that will receive the tokens. + /// @param sourceChainSelector The remote source chain selector + /// @param offchainTokenData Data fetched offchain by the DON. + /// @return destTokenAmount local token address with amount + function _releaseOrMintSingleToken( + Internal.Any2EVMTokenTransfer memory sourceTokenAmount, + bytes memory originalSender, + address receiver, + uint64 sourceChainSelector, + bytes memory offchainTokenData + ) internal returns (Client.EVMTokenAmount memory destTokenAmount) { + // We need to safely decode the token address from the sourceTokenData, as it could be wrong, + // in which case it doesn't have to be a valid EVM address. + // We assume this destTokenAddress has already been fully validated by a (trusted) OnRamp. + address localToken = sourceTokenAmount.destTokenAddress; + // We check with the token admin registry if the token has a pool on this chain. + address localPoolAddress = ITokenAdminRegistry(i_tokenAdminRegistry).getPool(localToken); + // This will call the supportsInterface through the ERC165Checker, and not directly on the pool address. + // This is done to prevent a pool from reverting the entire transaction if it doesn't support the interface. + // The call gets a max or 30k gas per instance, of which there are three. This means gas estimations should + // account for 90k gas overhead due to the interface check. + if (localPoolAddress == address(0) || !localPoolAddress.supportsInterface(Pool.CCIP_POOL_V1)) { + revert NotACompatiblePool(localPoolAddress); + } + + // We retrieve the local token balance of the receiver before the pool call. + (uint256 balancePre, uint256 gasLeft) = _getBalanceOfReceiver(receiver, localToken, sourceTokenAmount.destGasAmount); + + // We determined that the pool address is a valid EVM address, but that does not mean the code at this + // address is a (compatible) pool contract. _callWithExactGasSafeReturnData will check if the location + // contains a contract. If it doesn't it reverts with a known error, which we catch gracefully. + // We call the pool with exact gas to increase resistance against malicious tokens or token pools. + // We protect against return data bombs by capping the return data size at MAX_RET_BYTES. + (bool success, bytes memory returnData, uint256 gasUsedReleaseOrMint) = CallWithExactGas + ._callWithExactGasSafeReturnData( + abi.encodeCall( + IPoolV1.releaseOrMint, + Pool.ReleaseOrMintInV1({ + originalSender: originalSender, + receiver: receiver, + amount: sourceTokenAmount.amount, + localToken: localToken, + remoteChainSelector: sourceChainSelector, + sourcePoolAddress: sourceTokenAmount.sourcePoolAddress, + sourcePoolData: sourceTokenAmount.extraData, + offchainTokenData: offchainTokenData + }) + ), + localPoolAddress, + gasLeft, + Internal.GAS_FOR_CALL_EXACT_CHECK, + Internal.MAX_RET_BYTES + ); + + // Wrap and rethrow the error so we can catch it lower in the stack + if (!success) revert TokenHandlingError(returnData); + + // If the call was successful, the returnData should be the local token address. + if (returnData.length != Pool.CCIP_POOL_V1_RET_BYTES) { + revert InvalidDataLength(Pool.CCIP_POOL_V1_RET_BYTES, returnData.length); + } + + uint256 localAmount = abi.decode(returnData, (uint256)); + // We don't need to do balance checks if the pool is the receiver, as they would always fail in the case + // of a lockRelease pool. + if (receiver != localPoolAddress) { + (uint256 balancePost,) = _getBalanceOfReceiver(receiver, localToken, gasLeft - gasUsedReleaseOrMint); + + // First we check if the subtraction would result in an underflow to ensure we revert with a clear error + if (balancePost < balancePre || balancePost - balancePre != localAmount) { + revert ReleaseOrMintBalanceMismatch(localAmount, balancePre, balancePost); + } + } + + return Client.EVMTokenAmount({token: localToken, amount: localAmount}); + } + + /// @notice Retrieves the balance of a receiver address for a given token. + /// @param receiver The address to check the balance of. + /// @param token The token address. + /// @param gasLimit The gas limit to use for the call. + /// @return balance The balance of the receiver. + /// @return gasLeft The gas left after the call. + function _getBalanceOfReceiver( + address receiver, + address token, + uint256 gasLimit + ) internal returns (uint256 balance, uint256 gasLeft) { + (bool success, bytes memory returnData, uint256 gasUsed) = CallWithExactGas._callWithExactGasSafeReturnData( + abi.encodeCall(IERC20.balanceOf, (receiver)), + token, + gasLimit, + Internal.GAS_FOR_CALL_EXACT_CHECK, + Internal.MAX_RET_BYTES + ); + if (!success) revert TokenHandlingError(returnData); + + // If the call was successful, the returnData should contain only the balance. + if (returnData.length != Internal.MAX_BALANCE_OF_RET_BYTES) { + revert InvalidDataLength(Internal.MAX_BALANCE_OF_RET_BYTES, returnData.length); + } + + // Return the decoded balance, which cannot fail as we checked the length, and the gas that is left + // after this call. + return (abi.decode(returnData, (uint256)), gasLimit - gasUsed); + } + + /// @notice Uses pools to release or mint a number of different tokens to a receiver address. + /// @param sourceTokenAmounts List of token amounts with source data of the tokens to be released/minted. + /// @param originalSender The message sender on the source chain. + /// @param receiver The address that will receive the tokens. + /// @param sourceChainSelector The remote source chain selector. + /// @param offchainTokenData Array of token data fetched offchain by the DON. + /// @return destTokenAmounts local token addresses with amounts + /// @dev This function wraps the token pool call in a try catch block to gracefully handle + /// any non-rate limiting errors that may occur. If we encounter a rate limiting related error + /// we bubble it up. If we encounter a non-rate limiting error we wrap it in a TokenHandlingError. + function _releaseOrMintTokens( + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts, + bytes memory originalSender, + address receiver, + uint64 sourceChainSelector, + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides + ) internal returns (Client.EVMTokenAmount[] memory destTokenAmounts) { + destTokenAmounts = new Client.EVMTokenAmount[](sourceTokenAmounts.length); + bool isTokenGasOverridesEmpty = tokenGasOverrides.length == 0; + for (uint256 i = 0; i < sourceTokenAmounts.length; ++i) { + if (!isTokenGasOverridesEmpty) { + if (tokenGasOverrides[i] != 0) { + sourceTokenAmounts[i].destGasAmount = tokenGasOverrides[i]; + } + } + destTokenAmounts[i] = _releaseOrMintSingleToken( + sourceTokenAmounts[i], originalSender, receiver, sourceChainSelector, offchainTokenData[i] + ); + } + + return destTokenAmounts; + } + // ================================================================ // │ Commit │ // ================================================================ @@ -572,13 +779,13 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { bytes calldata report, bytes32[] calldata rs, bytes32[] calldata ss, - bytes32 rawVs // signatures + bytes32 rawVs ) external { CommitReport memory commitReport = abi.decode(report, (CommitReport)); // Verify RMN signatures if (commitReport.merkleRoots.length > 0) { - i_rmn.verify(commitReport.merkleRoots, commitReport.rmnSignatures); + i_rmn.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures, commitReport.rmnRawVs); } // Check if the report contains price updates @@ -610,6 +817,10 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector); + if (keccak256(root.onRampAddress) != keccak256(sourceChainConfig.onRamp)) { + revert CommitOnRampMismatch(root.onRampAddress, sourceChainConfig.onRamp); + } + if (sourceChainConfig.minSeqNr != root.minSeqNr || root.minSeqNr > root.maxSeqNr) { revert InvalidInterval(root.sourceChainSelector, root.minSeqNr, root.maxSeqNr); } @@ -627,7 +838,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { s_roots[root.sourceChainSelector][merkleRoot] = block.timestamp; } - emit CommitReportAccepted(commitReport); + emit CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); _transmit(uint8(Internal.OCRPluginType.Commit), reportContext, report, rs, ss, rawVs); } @@ -666,6 +877,10 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @inheritdoc MultiOCR3Base function _afterOCR3ConfigSet(uint8 ocrPluginType) internal override { if (ocrPluginType == uint8(Internal.OCRPluginType.Commit)) { + // Signature verification must be enabled for commit plugin + if (!s_ocrConfigs[ocrPluginType].configInfo.isSignatureVerificationEnabled) { + revert SignatureVerificationDisabled(); + } // When the OCR config changes, we reset the sequence number // since it is scoped per config digest. // Note that s_minSeqNr/roots do not need to be reset as the roots persist @@ -726,24 +941,27 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } SourceChainConfig storage currentConfig = s_sourceChainConfigs[sourceChainSelector]; - bytes memory currentOnRamp = currentConfig.onRamp; bytes memory newOnRamp = sourceConfigUpdate.onRamp; - // OnRamp can never be zero - if it is, then the source chain has been added for the first time - if (currentOnRamp.length == 0) { - if (newOnRamp.length == 0) { - revert ZeroAddressNotAllowed(); - } - - currentConfig.onRamp = newOnRamp; + if (currentConfig.onRamp.length == 0) { currentConfig.minSeqNr = 1; emit SourceChainSelectorAdded(sourceChainSelector); - } else if (keccak256(currentOnRamp) != keccak256(newOnRamp)) { - revert InvalidStaticConfig(sourceChainSelector); + } else if (currentConfig.minSeqNr != 1) { + // OnRamp updates should only happens due to a misconfiguration + // If an OnRamp is misconfigured not reports should have been committed and no messages should have been executed + // This is enforced byt the onRamp address check in the commit function + revert InvalidOnRampUpdate(sourceChainSelector); + } + + // OnRamp can never be zero - if it is, then the source chain has been added for the first time + if (newOnRamp.length == 0 || keccak256(newOnRamp) == EMPTY_ENCODED_ADDRESS_HASH) { + revert ZeroAddressNotAllowed(); } + currentConfig.onRamp = newOnRamp; currentConfig.isEnabled = sourceConfigUpdate.isEnabled; currentConfig.router = sourceConfigUpdate.router; + emit SourceChainConfigSet(sourceChainSelector, currentConfig); } } @@ -779,155 +997,10 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } // ================================================================ - // │ Tokens and pools │ - // ================================================================ - - /// @notice Uses a pool to release or mint a token to a receiver address, with balance checks before and after the - /// transfer. This is done to ensure the exact number of tokens the pool claims to release are actually transferred. - /// @dev The local token address is validated through the TokenAdminRegistry. If, due to some misconfiguration, the - /// token is unknown to the registry, the offRamp will revert. The tx, and the tokens, can be retrieved by - /// registering the token on this chain, and re-trying the msg. - /// @param sourceTokenAmount Amount and source data of the token to be released/minted. - /// @param originalSender The message sender on the source chain. - /// @param receiver The address that will receive the tokens. - /// @param sourceChainSelector The remote source chain selector - /// @param offchainTokenData Data fetched offchain by the DON. - /// @return destTokenAmount local token address with amount - function _releaseOrMintSingleToken( - Internal.RampTokenAmount memory sourceTokenAmount, - bytes memory originalSender, - address receiver, - uint64 sourceChainSelector, - bytes memory offchainTokenData - ) internal returns (Client.EVMTokenAmount memory destTokenAmount) { - // We need to safely decode the token address from the sourceTokenData, as it could be wrong, - // in which case it doesn't have to be a valid EVM address. - address localToken = Internal._validateEVMAddress(sourceTokenAmount.destTokenAddress); - // We check with the token admin registry if the token has a pool on this chain. - address localPoolAddress = ITokenAdminRegistry(i_tokenAdminRegistry).getPool(localToken); - // This will call the supportsInterface through the ERC165Checker, and not directly on the pool address. - // This is done to prevent a pool from reverting the entire transaction if it doesn't support the interface. - // The call gets a max or 30k gas per instance, of which there are three. This means gas estimations should - // account for 90k gas overhead due to the interface check. - if (localPoolAddress == address(0) || !localPoolAddress.supportsInterface(Pool.CCIP_POOL_V1)) { - revert NotACompatiblePool(localPoolAddress); - } - - // We retrieve the local token balance of the receiver before the pool call. - (uint256 balancePre, uint256 gasLeft) = - _getBalanceOfReceiver(receiver, localToken, s_dynamicConfig.maxPoolReleaseOrMintGas); - - // We determined that the pool address is a valid EVM address, but that does not mean the code at this - // address is a (compatible) pool contract. _callWithExactGasSafeReturnData will check if the location - // contains a contract. If it doesn't it reverts with a known error, which we catch gracefully. - // We call the pool with exact gas to increase resistance against malicious tokens or token pools. - // We protect against return data bombs by capping the return data size at MAX_RET_BYTES. - (bool success, bytes memory returnData, uint256 gasUsedReleaseOrMint) = CallWithExactGas - ._callWithExactGasSafeReturnData( - abi.encodeCall( - IPoolV1.releaseOrMint, - Pool.ReleaseOrMintInV1({ - originalSender: originalSender, - receiver: receiver, - amount: sourceTokenAmount.amount, - localToken: localToken, - remoteChainSelector: sourceChainSelector, - sourcePoolAddress: sourceTokenAmount.sourcePoolAddress, - sourcePoolData: sourceTokenAmount.extraData, - offchainTokenData: offchainTokenData - }) - ), - localPoolAddress, - gasLeft, - Internal.GAS_FOR_CALL_EXACT_CHECK, - Internal.MAX_RET_BYTES - ); - - // Wrap and rethrow the error so we can catch it lower in the stack - if (!success) revert TokenHandlingError(returnData); - - // If the call was successful, the returnData should be the local token address. - if (returnData.length != Pool.CCIP_POOL_V1_RET_BYTES) { - revert InvalidDataLength(Pool.CCIP_POOL_V1_RET_BYTES, returnData.length); - } - - uint256 localAmount = abi.decode(returnData, (uint256)); - // We don't need to do balance checks if the pool is the receiver, as they would always fail in the case - // of a lockRelease pool. - if (receiver != localPoolAddress) { - (uint256 balancePost,) = _getBalanceOfReceiver(receiver, localToken, gasLeft - gasUsedReleaseOrMint); - - // First we check if the subtraction would result in an underflow to ensure we revert with a clear error - if (balancePost < balancePre || balancePost - balancePre != localAmount) { - revert ReleaseOrMintBalanceMismatch(localAmount, balancePre, balancePost); - } - } - - return Client.EVMTokenAmount({token: localToken, amount: localAmount}); - } - - /// @notice Retrieves the balance of a receiver address for a given token. - /// @param receiver The address to check the balance of. - /// @param token The token address. - /// @param gasLimit The gas limit to use for the call. - /// @return balance The balance of the receiver. - /// @return gasLeft The gas left after the call. - function _getBalanceOfReceiver( - address receiver, - address token, - uint256 gasLimit - ) internal returns (uint256 balance, uint256 gasLeft) { - (bool success, bytes memory returnData, uint256 gasUsed) = CallWithExactGas._callWithExactGasSafeReturnData( - abi.encodeCall(IERC20.balanceOf, (receiver)), - token, - gasLimit, - Internal.GAS_FOR_CALL_EXACT_CHECK, - Internal.MAX_RET_BYTES - ); - if (!success) revert TokenHandlingError(returnData); - - // If the call was successful, the returnData should contain only the balance. - if (returnData.length != Internal.MAX_BALANCE_OF_RET_BYTES) { - revert InvalidDataLength(Internal.MAX_BALANCE_OF_RET_BYTES, returnData.length); - } - - // Return the decoded balance, which cannot fail as we checked the length, and the gas that is left - // after this call. - return (abi.decode(returnData, (uint256)), gasLimit - gasUsed); - } - - /// @notice Uses pools to release or mint a number of different tokens to a receiver address. - /// @param sourceTokenAmounts List of token amounts with source data of the tokens to be released/minted. - /// @param originalSender The message sender on the source chain. - /// @param receiver The address that will receive the tokens. - /// @param sourceChainSelector The remote source chain selector. - /// @param offchainTokenData Array of token data fetched offchain by the DON. - /// @return destTokenAmounts local token addresses with amounts - /// @dev This function wraps the token pool call in a try catch block to gracefully handle - /// any non-rate limiting errors that may occur. If we encounter a rate limiting related error - /// we bubble it up. If we encounter a non-rate limiting error we wrap it in a TokenHandlingError. - function _releaseOrMintTokens( - Internal.RampTokenAmount[] memory sourceTokenAmounts, - bytes memory originalSender, - address receiver, - uint64 sourceChainSelector, - bytes[] calldata offchainTokenData - ) internal returns (Client.EVMTokenAmount[] memory destTokenAmounts) { - destTokenAmounts = new Client.EVMTokenAmount[](sourceTokenAmounts.length); - for (uint256 i = 0; i < sourceTokenAmounts.length; ++i) { - destTokenAmounts[i] = _releaseOrMintSingleToken( - sourceTokenAmounts[i], originalSender, receiver, sourceChainSelector, offchainTokenData[i] - ); - } - - return destTokenAmounts; - } - - // ================================================================ - // │ Access and RMN │ + // │ Access │ // ================================================================ - /// @notice Reverts as this contract should not access CCIP messages + /// @notice Reverts as this contract should not be able to receive CCIP messages function ccipReceive(Client.Any2EVMMessage calldata) external pure { // solhint-disable-next-line revert(); diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol index cc449feaed6..959d831a396 100644 --- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol @@ -40,12 +40,12 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { error OnlyCallableByOwnerOrAllowlistAdmin(); error SenderNotAllowed(address sender); error InvalidAllowListRequest(uint64 destChainSelector); + error ReentrancyGuardReentrantCall(); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); event DestChainConfigSet( uint64 indexed destChainSelector, uint64 sequenceNumber, IRouter router, bool allowListEnabled ); - event FeePaid(address indexed feeToken, uint256 feeValueJuels); event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount); /// RMN depends on this event, if changing, please notify the RMN maintainers. event CCIPMessageSent(uint64 indexed destChainSelector, Internal.EVM2AnyRampMessage message); @@ -67,7 +67,8 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { // solhint-disable-next-line gas-struct-packing struct DynamicConfig { address feeQuoter; // FeeQuoter address - address messageValidator; // Optional message validator to validate outbound messages (zero address = no validator) + bool reentrancyGuardEntered; // Reentrancy protection + address messageInterceptor; // Optional message interceptor to validate outbound messages (zero address = no interceptor) address feeAggregator; // Fee aggregator address address allowListAdmin; // authorized admin to add or remove allowed senders } @@ -108,20 +109,20 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { // STATIC CONFIG string public constant override typeAndVersion = "OnRamp 1.6.0-dev"; /// @dev The chain ID of the source chain that this contract is deployed to - uint64 internal immutable i_chainSelector; + uint64 private immutable i_chainSelector; /// @dev The rmn contract - IRMNV2 internal immutable i_rmn; + IRMNV2 private immutable i_rmn; /// @dev The address of the nonce manager - address internal immutable i_nonceManager; + address private immutable i_nonceManager; /// @dev The address of the token admin registry - address internal immutable i_tokenAdminRegistry; + address private immutable i_tokenAdminRegistry; // DYNAMIC CONFIG /// @dev The dynamic config for the onRamp - DynamicConfig internal s_dynamicConfig; + DynamicConfig private s_dynamicConfig; /// @dev The destination chain specific configs - mapping(uint64 destChainSelector => DestChainConfig destChainConfig) internal s_destChainConfigs; + mapping(uint64 destChainSelector => DestChainConfig destChainConfig) private s_destChainConfigs; constructor( StaticConfig memory staticConfig, @@ -162,6 +163,12 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { uint256 feeTokenAmount, address originalSender ) external returns (bytes32) { + // We rely on a reentrancy guard here due to the untrusted calls performed to the pools + // This enables some optimizations by not following the CEI pattern + if (s_dynamicConfig.reentrancyGuardEntered) revert ReentrancyGuardReentrantCall(); + + s_dynamicConfig.reentrancyGuardEntered = true; + DestChainConfig storage destChainConfig = s_destChainConfigs[destChainSelector]; // NOTE: assumes the message has already been validated through the getFee call @@ -179,19 +186,12 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { { // scoped to reduce stack usage - address messageValidator = s_dynamicConfig.messageValidator; - if (messageValidator != address(0)) { - IMessageInterceptor(messageValidator).onOutboundMessage(destChainSelector, message); + address messageInterceptor = s_dynamicConfig.messageInterceptor; + if (messageInterceptor != address(0)) { + IMessageInterceptor(messageInterceptor).onOutboundMessage(destChainSelector, message); } } - // Convert message fee to juels and retrieve converted args - (uint256 msgFeeJuels, bool isOutOfOrderExecution, bytes memory convertedExtraArgs) = IFeeQuoter( - s_dynamicConfig.feeQuoter - ).processMessageArgs(destChainSelector, message.feeToken, feeTokenAmount, message.extraArgs); - - emit FeePaid(message.feeToken, msgFeeJuels); - Internal.EVM2AnyRampMessage memory newMessage = Internal.EVM2AnyRampMessage({ header: Internal.RampMessageHeader({ // Should be generated after the message is complete @@ -202,32 +202,42 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { sequenceNumber: ++destChainConfig.sequenceNumber, // Only bump nonce for messages that specify allowOutOfOrderExecution == false. Otherwise, we // may block ordered message nonces, which is not what we want. - nonce: isOutOfOrderExecution - ? 0 - : INonceManager(i_nonceManager).getIncrementedOutboundNonce(destChainSelector, originalSender) + nonce: 0 }), sender: originalSender, data: message.data, - extraArgs: convertedExtraArgs, + extraArgs: "", receiver: message.receiver, feeToken: message.feeToken, feeTokenAmount: feeTokenAmount, + feeValueJuels: 0, // calculated later // Should be populated via lock / burn pool calls - tokenAmounts: new Internal.RampTokenAmount[](message.tokenAmounts.length) + tokenAmounts: new Internal.EVM2AnyTokenTransfer[](message.tokenAmounts.length) }); // Lock / burn the tokens as last step. TokenPools may not always be trusted. - // There should be no state changes after external call to TokenPools. + Client.EVMTokenAmount[] memory tokenAmounts = message.tokenAmounts; for (uint256 i = 0; i < message.tokenAmounts.length; ++i) { newMessage.tokenAmounts[i] = - _lockOrBurnSingleToken(message.tokenAmounts[i], destChainSelector, message.receiver, originalSender); + _lockOrBurnSingleToken(tokenAmounts[i], destChainSelector, message.receiver, originalSender); } + // Convert message fee to juels and retrieve converted args // Validate pool return data after it is populated (view function - no state changes) - bytes[] memory destExecDataPerToken = IFeeQuoter(s_dynamicConfig.feeQuoter).processPoolReturnData( - destChainSelector, newMessage.tokenAmounts, message.tokenAmounts + bool isOutOfOrderExecution; + bytes memory convertedExtraArgs; + bytes[] memory destExecDataPerToken; + (newMessage.feeValueJuels, isOutOfOrderExecution, convertedExtraArgs, destExecDataPerToken) = IFeeQuoter( + s_dynamicConfig.feeQuoter + ).processMessageArgs( + destChainSelector, message.feeToken, feeTokenAmount, message.extraArgs, newMessage.tokenAmounts, tokenAmounts ); + newMessage.header.nonce = isOutOfOrderExecution + ? 0 + : INonceManager(i_nonceManager).getIncrementedOutboundNonce(destChainSelector, originalSender); + newMessage.extraArgs = convertedExtraArgs; + for (uint256 i = 0; i < newMessage.tokenAmounts.length; ++i) { newMessage.tokenAmounts[i].destExecData = destExecDataPerToken[i]; } @@ -244,6 +254,9 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { // This must happen after any pool events as some tokens (e.g. USDC) emit events that we expect to precede this // event in the offchain code. emit CCIPMessageSent(destChainSelector, newMessage); + + s_dynamicConfig.reentrancyGuardEntered = false; + return newMessage.header.messageId; } @@ -252,13 +265,13 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { /// @param destChainSelector Target destination chain selector of the message /// @param receiver Message receiver /// @param originalSender Message sender - /// @return rampTokenAmount Ramp token and amount data + /// @return evm2AnyTokenTransfer EVM2Any token and amount data function _lockOrBurnSingleToken( Client.EVMTokenAmount memory tokenAndAmount, uint64 destChainSelector, bytes memory receiver, address originalSender - ) internal returns (Internal.RampTokenAmount memory) { + ) internal returns (Internal.EVM2AnyTokenTransfer memory) { if (tokenAndAmount.amount == 0) revert CannotSendZeroTokens(); IPoolV1 sourcePool = getPoolBySourceToken(destChainSelector, IERC20(tokenAndAmount.token)); @@ -280,8 +293,8 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { ); // NOTE: pool data validations are outsourced to the FeeQuoter to handle family-specific logic handling - return Internal.RampTokenAmount({ - sourcePoolAddress: abi.encode(sourcePool), + return Internal.EVM2AnyTokenTransfer({ + sourcePoolAddress: address(sourcePool), destTokenAddress: poolReturnData.destTokenAddress, extraData: poolReturnData.destPoolData, amount: tokenAndAmount.amount, @@ -326,7 +339,10 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { /// @notice Internal version of setDynamicConfig to allow for reuse in the constructor. function _setDynamicConfig(DynamicConfig memory dynamicConfig) internal { - if (dynamicConfig.feeQuoter == address(0) || dynamicConfig.feeAggregator == address(0)) revert InvalidConfig(); + if ( + dynamicConfig.feeQuoter == address(0) || dynamicConfig.feeAggregator == address(0) + || dynamicConfig.reentrancyGuardEntered + ) revert InvalidConfig(); s_dynamicConfig = dynamicConfig; @@ -408,17 +424,19 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator { DestChainConfig storage destChainConfig = s_destChainConfigs[allowListConfigArgs.destChainSelector]; destChainConfig.allowListEnabled = allowListConfigArgs.allowListEnabled; - if (allowListConfigArgs.allowListEnabled) { - for (uint256 j = 0; j < allowListConfigArgs.addedAllowlistedSenders.length; ++j) { - address toAdd = allowListConfigArgs.addedAllowlistedSenders[j]; - if (toAdd == address(0)) { - revert InvalidAllowListRequest(allowListConfigArgs.destChainSelector); + if (allowListConfigArgs.addedAllowlistedSenders.length > 0) { + if (allowListConfigArgs.allowListEnabled) { + for (uint256 j = 0; j < allowListConfigArgs.addedAllowlistedSenders.length; ++j) { + address toAdd = allowListConfigArgs.addedAllowlistedSenders[j]; + if (toAdd == address(0)) { + revert InvalidAllowListRequest(allowListConfigArgs.destChainSelector); + } + destChainConfig.allowedSendersList.add(toAdd); } - destChainConfig.allowedSendersList.add(toAdd); - } - if (allowListConfigArgs.addedAllowlistedSenders.length > 0) { emit AllowListSendersAdded(allowListConfigArgs.destChainSelector, allowListConfigArgs.addedAllowlistedSenders); + } else { + revert InvalidAllowListRequest(allowListConfigArgs.destChainSelector); } } diff --git a/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol b/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol index bc5adb0b2dd..43326681e51 100644 --- a/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol +++ b/contracts/src/v0.8/ccip/pools/LegacyPoolWrapper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {IPoolPriorTo1_5} from "../interfaces/IPoolPriorTo1_5.sol"; diff --git a/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol index 49cdeafcbcd..5fbd71bb2c0 100644 --- a/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.24; import {ILiquidityContainer} from "../../../liquiditymanager/interfaces/ILiquidityContainer.sol"; import {ITokenMessenger} from "../USDC/ITokenMessenger.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {Pool} from "../../libraries/Pool.sol"; import {TokenPool} from "../TokenPool.sol"; import {USDCTokenPool} from "../USDC/USDCTokenPool.sol"; @@ -33,6 +34,9 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { error LanePausedForCCTPMigration(uint64 remoteChainSelector); error TokenLockingNotAllowedAfterMigration(uint64 remoteChainSelector); + /// bytes4(keccak256("NO_CTTP_USE_LOCK_RELEASE")) + bytes4 public constant LOCK_RELEASE_FLAG = 0xd43c7897; + /// @notice The address of the liquidity provider for a specific chain. /// External liquidity is not required when there is one canonical token deployed to a chain, /// and CCIP is facilitating mint/burn on all the other chains, in which case the invariant @@ -75,9 +79,16 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { function releaseOrMint( Pool.ReleaseOrMintInV1 calldata releaseOrMintIn ) public virtual override returns (Pool.ReleaseOrMintOutV1 memory) { - if (!shouldUseLockRelease(releaseOrMintIn.remoteChainSelector)) { + // Use CCTP Burn/Mint mechanism for chains which have it enabled. The LOCK_RELEASE_FLAG is used in sourcePoolData to + // discern this, since the source-chain will not be a hybrid-pool but a standard burn-mint. In the event of a + // stuck message after a migration has occured, and the message was not executed properly before the migration + // began, and locked tokens were not released until now, the message will already have been committed to with this + // flag so it is safe to release the tokens. The source USDC pool is trusted to send messages with the correct + // flag as well. + if (bytes4(releaseOrMintIn.sourcePoolData) != LOCK_RELEASE_FLAG) { return super.releaseOrMint(releaseOrMintIn); } + return _lockReleaseIncomingMessage(releaseOrMintIn); } @@ -87,8 +98,21 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { ) internal virtual returns (Pool.ReleaseOrMintOutV1 memory) { _validateReleaseOrMint(releaseOrMintIn); + // Circle requires a supply-lock to prevent incoming messages once the migration process begins. + // This prevents new outgoing messages once the migration has begun to ensure any the procedure runs as expected + if (s_proposedUSDCMigrationChain == releaseOrMintIn.remoteChainSelector) { + revert LanePausedForCCTPMigration(s_proposedUSDCMigrationChain); + } + // Decrease internal tracking of locked tokens to ensure accurate accounting for burnLockedUSDC() migration - s_lockedTokensByChainSelector[releaseOrMintIn.remoteChainSelector] -= releaseOrMintIn.amount; + // If the chain has already been migrated, then this mapping would be zero, and the operation would underflow. + // This branch ensures that we're subtracting from the correct mapping. It is also safe to subtract from the + // excluded tokens mapping, as this function would only be invoked in the event of a stuck tx after a migration + if (s_lockedTokensByChainSelector[releaseOrMintIn.remoteChainSelector] == 0) { + s_tokensExcludedFromBurn[releaseOrMintIn.remoteChainSelector] -= releaseOrMintIn.amount; + } else { + s_lockedTokensByChainSelector[releaseOrMintIn.remoteChainSelector] -= releaseOrMintIn.amount; + } // Release to the offRamp, which forwards it to the recipient getToken().safeTransfer(releaseOrMintIn.receiver, releaseOrMintIn.amount); @@ -109,7 +133,10 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { emit Locked(msg.sender, lockOrBurnIn.amount); - return Pool.LockOrBurnOutV1({destTokenAddress: getRemoteToken(lockOrBurnIn.remoteChainSelector), destPoolData: ""}); + return Pool.LockOrBurnOutV1({ + destTokenAddress: getRemoteToken(lockOrBurnIn.remoteChainSelector), + destPoolData: abi.encode(LOCK_RELEASE_FLAG) + }); } // ================================================================ @@ -135,7 +162,10 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { /// @notice Adds liquidity to the pool for a specific chain. The tokens should be approved first. /// @dev Liquidity is expected to be added on a per chain basis. Parties are expected to provide liquidity for their /// own chain which implements non canonical USDC and liquidity is not shared across lanes. - /// @param amount The amount of liquidity to provide. + /// @dev Once liquidity is added, it is locked in the pool until it is removed by an incoming message on the + /// lock release mechanism. This is a hard requirement by Circle to ensure parity with the destination chain + /// supply is maintained. + /// @param amount The amount of tokens to provide as liquidity. /// @param remoteChainSelector The chain for which liquidity is provided to. Necessary to ensure there's accurate /// parity between locked USDC in this contract and the circulating supply on the remote chain function provideLiquidity(uint64 remoteChainSelector, uint256 amount) external { @@ -154,32 +184,49 @@ contract HybridLockReleaseUSDCTokenPool is USDCTokenPool, USDCBridgeMigrator { /// @dev The function should only be called if non canonical USDC on the remote chain has been burned and is not being /// withdrawn on this chain, otherwise a mismatch may occur between locked token balance and remote circulating supply /// which may block a potential future migration of the chain to CCTP. - function withdrawLiquidity(uint64 remoteChainSelector, uint256 amount) external { - if (s_liquidityProvider[remoteChainSelector] != msg.sender) revert TokenPool.Unauthorized(msg.sender); + function withdrawLiquidity(uint64 remoteChainSelector, uint256 amount) external onlyOwner { + // Circle requires a supply-lock to prevent outgoing messages once the migration process begins. + // This prevents new outgoing messages once the migration has begun to ensure any the procedure runs as expected + if (remoteChainSelector == s_proposedUSDCMigrationChain) { + revert LanePausedForCCTPMigration(remoteChainSelector); + } s_lockedTokensByChainSelector[remoteChainSelector] -= amount; i_token.safeTransfer(msg.sender, amount); + emit ILiquidityContainer.LiquidityRemoved(msg.sender, amount); } /// @notice This function can be used to transfer liquidity from an older version of the pool to this pool. To do so - /// this pool will have to be set as the liquidity provider in the older version of the pool. This allows it to transfer the - /// funds in the old pool to the new pool. + /// this pool must be the owner of the old pool. Since the pool uses two-step ownership transfer, the old pool must + /// first propose the ownership transfer, and then this pool must accept it. This function can only be called after + /// the ownership transfer has been proposed, as it will accept it and then make the call to withdrawLiquidity /// @dev When upgrading a LockRelease pool, this function can be called at the same time as the pool is changed in the /// TokenAdminRegistry. This allows for a smooth transition of both liquidity and transactions to the new pool. /// Alternatively, when no multicall is available, a portion of the funds can be transferred to the new pool before /// changing which pool CCIP uses, to ensure both pools can operate. Then the pool should be changed in the /// TokenAdminRegistry, which will activate the new pool. All new transactions will use the new pool and its - /// liquidity. Finally, the remaining liquidity can be transferred to the new pool using this function one more time. + /// liquidity. /// @param from The address of the old pool. - /// @param amount The amount of liquidity to transfer. - function transferLiquidity(address from, uint64 remoteChainSelector, uint256 amount) external onlyOwner { - HybridLockReleaseUSDCTokenPool(from).withdrawLiquidity(remoteChainSelector, amount); + /// @param remoteChainSelector The chain for which liquidity is being transferred. + function transferLiquidity(address from, uint64 remoteChainSelector) external onlyOwner { + // Prevent Liquidity Transfers when a migration is pending. This prevents requiring the new pool to manage + // token exclusions for edge-case messages and ensures that the migration is completed before any new liquidity + // is added to the pool. + if (HybridLockReleaseUSDCTokenPool(from).getCurrentProposedCCTPChainMigration() == remoteChainSelector) { + revert LanePausedForCCTPMigration(remoteChainSelector); + } - s_lockedTokensByChainSelector[remoteChainSelector] += amount; + OwnerIsCreator(from).acceptOwnership(); + + // Withdraw all available liquidity from the old pool. + uint256 withdrawAmount = HybridLockReleaseUSDCTokenPool(from).getLockedTokensForChain(remoteChainSelector); + HybridLockReleaseUSDCTokenPool(from).withdrawLiquidity(remoteChainSelector, withdrawAmount); + + s_lockedTokensByChainSelector[remoteChainSelector] += withdrawAmount; - emit LiquidityTransferred(from, remoteChainSelector, amount); + emit LiquidityTransferred(from, remoteChainSelector, withdrawAmount); } // ================================================================ diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol index 827787f4cf2..98616cd79fc 100644 --- a/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol +++ b/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol @@ -8,8 +8,8 @@ import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contra import {Router} from "../../Router.sol"; /// @notice Allows migration of a lane in a token pool from Lock/Release to CCTP supported Burn/Mint. Contract -/// functionality is based on hard requirements defined by Circle to allow future CCTP compatibility -/// @dev Once a migration for a lane has occured, it can never be reversed, and CCTP will be the mechanism forever. This makes the assumption that Circle will continue to support that lane indefinitely. +/// functionality is based on hard requirements defined by Circle to allow for future CCTP compatibility +/// https://github.com/circlefin/stablecoin-evm/blob/master/doc/bridged_USDC_standard.md abstract contract USDCBridgeMigrator is OwnerIsCreator { using EnumerableSet for EnumerableSet.UintSet; @@ -17,6 +17,9 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { event CCTPMigrationExecuted(uint64 remoteChainSelector, uint256 USDCBurned); event CCTPMigrationCancelled(uint64 existingProposalSelector); event CircleMigratorAddressSet(address migratorAddress); + event TokensExcludedFromBurn( + uint64 indexed remoteChainSelector, uint256 amount, uint256 burnableAmountAfterExclusion + ); error onlyCircle(); error ExistingMigrationProposal(); @@ -31,6 +34,7 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { uint64 internal s_proposedUSDCMigrationChain; mapping(uint64 chainSelector => uint256 lockedBalance) internal s_lockedTokensByChainSelector; + mapping(uint64 remoteChainSelector => uint256 excludedTokens) internal s_tokensExcludedFromBurn; mapping(uint64 chainSelector => bool shouldUseLockRelease) internal s_shouldUseLockRelease; @@ -50,7 +54,10 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { if (s_proposedUSDCMigrationChain == 0) revert ExistingMigrationProposal(); uint64 burnChainSelector = s_proposedUSDCMigrationChain; - uint256 tokensToBurn = s_lockedTokensByChainSelector[burnChainSelector]; + + // Burnable tokens is the total locked minus the amount excluded from burn + uint256 tokensToBurn = + s_lockedTokensByChainSelector[burnChainSelector] - s_tokensExcludedFromBurn[burnChainSelector]; // Even though USDC is a trusted call, ensure CEI by updating state first delete s_lockedTokensByChainSelector[burnChainSelector]; @@ -70,8 +77,8 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { /// @notice Propose a destination chain to migrate from lock/release mechanism to CCTP enabled burn/mint /// through a Circle controlled burn. /// @param remoteChainSelector the CCIP specific selector for the remote chain currently using a - /// non-canonical form of USDC which they wish to update to canonical. Function will revert if the chain - /// selector is zero, or if a migration has already occured for the specified selector. + /// non-canonical form of USDC which they wish to update to canonical. Function will revert if an existing migration + /// proposal is already in progress. /// @dev This function can only be called by the owner function proposeCCTPMigration(uint64 remoteChainSelector) external onlyOwner { // Prevent overwriting existing migration proposals until the current one is finished @@ -83,12 +90,17 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { } /// @notice Cancel an existing proposal to migrate a lane to CCTP. + /// @notice This function will revert if no proposal is currently in progress. function cancelExistingCCTPMigrationProposal() external onlyOwner { if (s_proposedUSDCMigrationChain == 0) revert NoExistingMigrationProposal(); uint64 currentProposalChainSelector = s_proposedUSDCMigrationChain; delete s_proposedUSDCMigrationChain; + // If a migration is cancelled, the tokens excluded from burn should be reset, and must be manually + // re-excluded if the proposal is re-proposed in the future + delete s_tokensExcludedFromBurn[currentProposalChainSelector]; + emit CCTPMigrationCancelled(currentProposalChainSelector); } @@ -116,4 +128,27 @@ abstract contract USDCBridgeMigrator is OwnerIsCreator { function getLockedTokensForChain(uint64 remoteChainSelector) public view returns (uint256) { return s_lockedTokensByChainSelector[remoteChainSelector]; } + + /// @notice Exclude tokens to be burned in a CCTP-migration because the amount are locked in an undelivered message. + /// @dev When a message is sitting in manual execution from the L/R chain, those tokens need to be excluded from + /// being burned in a CCTP-migration otherwise the message will never be able to be delivered due to it not having + /// an attestation on the source-chain to mint. In that instance it should use provided liquidity that was designated + /// @dev This function should ONLY be called on the home chain, where tokens are locked, NOT on the remote chain + /// and strict scrutiny should be applied to ensure that the amount of tokens excluded is accurate. + function excludeTokensFromBurn(uint64 remoteChainSelector, uint256 amount) external onlyOwner { + s_tokensExcludedFromBurn[remoteChainSelector] += amount; + + uint256 burnableAmountAfterExclusion = + s_lockedTokensByChainSelector[remoteChainSelector] - s_tokensExcludedFromBurn[remoteChainSelector]; + + emit TokensExcludedFromBurn(remoteChainSelector, amount, burnableAmountAfterExclusion); + } + + /// @notice Get the amount of tokens excluded from being burned in a CCTP-migration + /// @dev The sum of locked tokens and excluded tokens should equal the supply of the token on the remote chain + /// @param remoteChainSelector The chain for which the excluded tokens are being queried + /// @return uint256 amount of tokens excluded from being burned in a CCTP-migration + function getExcludedTokensByChain(uint64 remoteChainSelector) public view returns (uint256) { + return s_tokensExcludedFromBurn[remoteChainSelector]; + } } diff --git a/contracts/src/v0.8/ccip/rmn/RMNHome.sol b/contracts/src/v0.8/ccip/rmn/RMNHome.sol index 0d3d7d98036..d13385aed83 100644 --- a/contracts/src/v0.8/ccip/rmn/RMNHome.sol +++ b/contracts/src/v0.8/ccip/rmn/RMNHome.sol @@ -1,164 +1,391 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; - -import "@openzeppelin/contracts/access/Ownable2Step.sol"; +pragma solidity 0.8.24; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; + /// @notice Stores the home configuration for RMN, that is referenced by CCIP oracles, RMN nodes, and the RMNRemote /// contracts. -contract RMNHome is Ownable2Step, ITypeAndVersion { - /// @dev temp placeholder to exclude this contract from coverage - function test() public {} +/// @dev This contract is a state machine with the following states: +/// - Init: The initial state of the contract, no config has been set, or all configs have been revoked. +/// [0, 0] +/// +/// - Candidate: A new config has been set, but it has not been promoted yet, or all active configs have been revoked. +/// [0, 1] +/// +/// - Active: A non-zero config has been promoted and is active, there is no candidate configured. +/// [1, 0] +/// +/// - ActiveAndCandidate: A non-zero config has been promoted and is active, and a new config has been set as candidate. +/// [1, 1] +/// +/// The following state transitions are allowed: +/// - Init -> Candidate: setCandidate() +/// - Candidate -> Active: promoteCandidateAndRevokeActive() +/// - Candidate -> Candidate: setCandidate() +/// - Candidate -> Init: revokeCandidate() +/// - Active -> ActiveAndCandidate: setCandidate() +/// - Active -> Init: promoteCandidateAndRevokeActive() +/// - ActiveAndCandidate -> Active: promoteCandidateAndRevokeActive() +/// - ActiveAndCandidate -> Active: revokeCandidate() +/// - ActiveAndCandidate -> ActiveAndCandidate: setCandidate() +/// +/// This means the following calls are not allowed at the following states: +/// - Init: promoteCandidateAndRevokeActive(), as there is no config to promote. +/// - Init: revokeCandidate(), as there is no config to revoke +/// - Active: revokeCandidate(), as there is no candidate to revoke +/// Note that we explicitly do allow promoteCandidateAndRevokeActive() to be called when there is an active config but +/// no candidate config. This is the only way to remove the active config. The alternative would be to set some unusable +/// config as candidate and promote that, but fully clearing it is cleaner. +/// +/// ┌─────────────┐ setCandidate ┌─────────────┐ +/// │ ├───────────────────►│ │ setCandidate +/// │ Init │ revokeCandidate │ Candidate │◄───────────┐ +/// │ [0,0] │◄───────────────────┤ [0,1] │────────────┘ +/// │ │ ┌─────────────────┤ │ +/// └─────────────┘ │ promote- └─────────────┘ +/// ▲ │ Candidate +/// promote- │ │ +/// Candidate │ │ +/// │ │ +/// ┌──────────┴──┐ │ promote- ┌─────────────┐ +/// │ │◄─┘ Candidate OR │ Active & │ setCandidate +/// │ Active │ revokeCandidate │ Candidate │◄───────────┐ +/// │ [1,0] │◄───────────────────┤ [1,1] │────────────┘ +/// │ ├───────────────────►│ │ +/// └─────────────┘ setSecondary └─────────────┘ +/// +contract RMNHome is OwnerIsCreator, ITypeAndVersion { + event ConfigSet(bytes32 indexed configDigest, uint32 version, StaticConfig staticConfig, DynamicConfig dynamicConfig); + event ActiveConfigRevoked(bytes32 indexed configDigest); + event CandidateConfigRevoked(bytes32 indexed configDigest); + event DynamicConfigSet(bytes32 indexed configDigest, DynamicConfig dynamicConfig); + event ConfigPromoted(bytes32 indexed configDigest); - string public constant override typeAndVersion = "RMNHome 1.6.0-dev"; - uint256 public constant CONFIG_RING_BUFFER_SIZE = 2; + error OutOfBoundsNodesLength(); + error DuplicatePeerId(); + error DuplicateOffchainPublicKey(); + error DuplicateSourceChain(); + error OutOfBoundsObserverNodeIndex(); + error MinObserversTooHigh(); + error ConfigDigestMismatch(bytes32 expectedConfigDigest, bytes32 gotConfigDigest); + error DigestNotFound(bytes32 configDigest); + error RevokingZeroDigestNotAllowed(); + error NoOpStateTransitionNotAllowed(); struct Node { - string peerId; // used for p2p communication, base58 encoded - bytes32 offchainPublicKey; // observations are signed with this public key, and are only verified offchain + bytes32 peerId; // Used for p2p communication. + bytes32 offchainPublicKey; // Observations are signed with this public key, and are only verified offchain. } struct SourceChain { - uint64 chainSelector; - uint64[] observerNodeIndices; // indices into Config.nodes, strictly increasing - uint64 minObservers; // required to agree on an observation for this source chain + uint64 chainSelector; // ─────╮ The Source chain selector. + uint64 minObservers; // ──────╯ Required number of observers to agree on an observation for this source chain. + // ObserverNodesBitmap & (1<<i) == (1<<i) iff StaticConfig.nodes[i] is an observer for this source chain. + uint256 observerNodesBitmap; } - struct Config { + struct StaticConfig { // No sorting requirement for nodes, but ensure that SourceChain.observerNodeIndices in the home chain config & - // Signer.nodeIndex in the remote chain configs are appropriately updated when changing this field + // Signer.nodeIndex in the remote chain configs are appropriately updated when changing this field. Node[] nodes; - // Should be in ascending order of chainSelector + bytes offchainConfig; // Offchain configuration for RMN nodes. + } + + struct DynamicConfig { + // No sorting requirement for source chains, it is most gas efficient to append new source chains to the right. SourceChain[] sourceChains; + bytes offchainConfig; // Offchain configuration for RMN nodes. } + /// @notice The main struct stored in the contract, containing the static and dynamic parts of the config as well as + /// the version and the digest of the config. struct VersionedConfig { uint32 version; - Config config; - } - - function _configDigest(VersionedConfig memory versionedConfig) internal pure returns (bytes32) { - uint256 h = uint256(keccak256(abi.encode(versionedConfig))); - uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00 - uint256 prefix = 0x000b << (256 - 16); // 0x000b00..00 - return bytes32((prefix & prefixMask) | (h & ~prefixMask)); - } - - // if we were to have VersionedConfig instead of Config in the ring buffer, we couldn't assign directly to it in - // setConfig without via-ir - uint32[CONFIG_RING_BUFFER_SIZE] s_configCounts; // s_configCounts[i] == 0 iff s_configs[i] is unusable - Config[CONFIG_RING_BUFFER_SIZE] s_configs; - uint256 s_latestConfigIndex; - bytes32 s_latestConfigDigest; - - /// @param revokePastConfigs if one wants to revoke all past configs, because some past config is faulty - function setConfig(Config calldata newConfig, bool revokePastConfigs) external onlyOwner { - // sanity checks - { - // no peerId or offchainPublicKey is duplicated - for (uint256 i = 0; i < newConfig.nodes.length; ++i) { - for (uint256 j = i + 1; j < newConfig.nodes.length; ++j) { - if (keccak256(abi.encode(newConfig.nodes[i].peerId)) == keccak256(abi.encode(newConfig.nodes[j].peerId))) { - revert DuplicatePeerId(); - } - if (newConfig.nodes[i].offchainPublicKey == newConfig.nodes[j].offchainPublicKey) { - revert DuplicateOffchainPublicKey(); - } - } - } + bytes32 configDigest; + StaticConfig staticConfig; + DynamicConfig dynamicConfig; + } - for (uint256 i = 0; i < newConfig.sourceChains.length; ++i) { - // source chains are in strictly increasing order of chain selectors - if (i > 0 && !(newConfig.sourceChains[i - 1].chainSelector < newConfig.sourceChains[i].chainSelector)) { - revert OutOfOrderSourceChains(); - } + string public constant override typeAndVersion = "RMNHome 1.6.0-dev"; - // all observerNodeIndices are valid - for (uint256 j = 0; j < newConfig.sourceChains[i].observerNodeIndices.length; ++j) { - if ( - j > 0 - && !(newConfig.sourceChains[i].observerNodeIndices[j - 1] < newConfig.sourceChains[i].observerNodeIndices[j]) - ) { - revert OutOfOrderObserverNodeIndices(); - } - if (!(newConfig.sourceChains[i].observerNodeIndices[j] < newConfig.nodes.length)) { - revert OutOfBoundsObserverNodeIndex(); - } - } + /// @notice Used for encoding the config digest prefix, unique per Home contract implementation. + uint256 private constant PREFIX = 0x000b << (256 - 16); // 0x000b00..00 + /// @notice Used for encoding the config digest prefix + uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00 + /// @notice The max number of configs that can be active at the same time. + uint256 private constant MAX_CONCURRENT_CONFIGS = 2; + /// @notice Helper to identify the zero config digest with less casting. + bytes32 private constant ZERO_DIGEST = bytes32(uint256(0)); + // @notice To ensure that observerNodesBitmap can be bit-encoded into a uint256. + uint256 private constant MAX_NODES = 256; - // minObservers are tenable - if (!(newConfig.sourceChains[i].minObservers <= newConfig.sourceChains[i].observerNodeIndices.length)) { - revert MinObserversTooHigh(); - } - } - } + /// @notice This array holds the configs. + /// @dev Value i in this array is valid iff s_configs[i].configDigest != 0. + VersionedConfig[MAX_CONCURRENT_CONFIGS] private s_configs; - uint256 oldConfigIndex = s_latestConfigIndex; - uint32 oldConfigCount = s_configCounts[oldConfigIndex]; - uint256 newConfigIndex = (oldConfigIndex + 1) % CONFIG_RING_BUFFER_SIZE; + /// @notice The latest version set, incremented by one for each new config. + uint32 private s_currentVersion = 0; + /// @notice The index of the active config. Used to determine which config is active. Adding the configs to a list + /// with two items and using this index to determine which one is active is a gas efficient way to handle this. Having + /// a set place for the active config would mean we have to copy the candidate config to the active config when it is + /// promoted, which would be more expensive. This index allows us to flip the configs around using `XOR 1`, which + /// flips 0 to 1 and 1 to 0. + uint32 private s_activeConfigIndex = 0; + + // ================================================================ + // │ Getters │ + // ================================================================ + + /// @notice Returns the current active and candidate config digests. + /// @dev Can be bytes32(0) if no config has been set yet or it has been revoked. + /// @return activeConfigDigest The digest of the active config. + /// @return candidateConfigDigest The digest of the candidate config. + function getConfigDigests() external view returns (bytes32 activeConfigDigest, bytes32 candidateConfigDigest) { + return (s_configs[_getActiveIndex()].configDigest, s_configs[_getCandidateIndex()].configDigest); + } + + /// @notice Returns the active config digest + function getActiveDigest() external view returns (bytes32) { + return s_configs[_getActiveIndex()].configDigest; + } - for (uint256 i = 0; i < CONFIG_RING_BUFFER_SIZE; ++i) { - if ((i == newConfigIndex || revokePastConfigs) && s_configCounts[i] > 0) { - emit ConfigRevoked(_configDigest(VersionedConfig({version: s_configCounts[i], config: s_configs[i]}))); - delete s_configCounts[i]; + /// @notice Returns the candidate config digest + function getCandidateDigest() public view returns (bytes32) { + return s_configs[_getCandidateIndex()].configDigest; + } + + /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes. Use + /// in case one of the configs is too large to be returnable by one of the other getters. + /// @param configDigest The digest of the config to fetch. + /// @return versionedConfig The config and its version. + /// @return ok True if the config was found, false otherwise. + function getConfig(bytes32 configDigest) external view returns (VersionedConfig memory versionedConfig, bool ok) { + for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) { + // We never want to return true for a zero digest, even if the caller is asking for it, as this can expose old + // config state that is invalid. + if (s_configs[i].configDigest == configDigest && configDigest != ZERO_DIGEST) { + return (s_configs[i], true); } } - - uint32 newConfigCount = oldConfigCount + 1; - VersionedConfig memory newVersionedConfig = VersionedConfig({version: newConfigCount, config: newConfig}); - bytes32 newConfigDigest = _configDigest(newVersionedConfig); - s_configs[newConfigIndex] = newConfig; - s_configCounts[newConfigIndex] = newConfigCount; - s_latestConfigIndex = newConfigIndex; - s_latestConfigDigest = newConfigDigest; - emit ConfigSet(newConfigDigest, newVersionedConfig); + return (versionedConfig, false); } - /// @return configDigest will be zero in case no config has been set - function getLatestConfigDigestAndVersionedConfig() + function getAllConfigs() external view - returns (bytes32 configDigest, VersionedConfig memory) + returns (VersionedConfig memory activeConfig, VersionedConfig memory candidateConfig) { - return ( - s_latestConfigDigest, - VersionedConfig({version: s_configCounts[s_latestConfigIndex], config: s_configs[s_latestConfigIndex]}) - ); + VersionedConfig memory storedActiveConfig = s_configs[_getActiveIndex()]; + if (storedActiveConfig.configDigest != ZERO_DIGEST) { + activeConfig = storedActiveConfig; + } + + VersionedConfig memory storedCandidateConfig = s_configs[_getCandidateIndex()]; + if (storedCandidateConfig.configDigest != ZERO_DIGEST) { + candidateConfig = storedCandidateConfig; + } + + return (activeConfig, candidateConfig); } - /// @notice The offchain code can use this to fetch an old config which might still be in use by some remotes - /// @dev Only to be called by offchain code, efficiency is not a concern - function getConfig(bytes32 configDigest) external view returns (VersionedConfig memory versionedConfig, bool ok) { - for (uint256 i = 0; i < CONFIG_RING_BUFFER_SIZE; ++i) { - if (s_configCounts[i] == 0) { - // unset config - continue; + // ================================================================ + // │ State transitions │ + // ================================================================ + + /// @notice Sets a new config as the candidate config. Does not influence the active config. + /// @param staticConfig The static part of the config. + /// @param dynamicConfig The dynamic part of the config. + /// @param digestToOverwrite The digest of the config to overwrite, or ZERO_DIGEST if no config is to be overwritten. + /// This is done to prevent accidental overwrites. + /// @return newConfigDigest The digest of the new config. + function setCandidate( + StaticConfig calldata staticConfig, + DynamicConfig calldata dynamicConfig, + bytes32 digestToOverwrite + ) external onlyOwner returns (bytes32 newConfigDigest) { + _validateStaticAndDynamicConfig(staticConfig, dynamicConfig); + + bytes32 existingDigest = getCandidateDigest(); + + if (existingDigest != digestToOverwrite) { + revert ConfigDigestMismatch(existingDigest, digestToOverwrite); + } + + // are we going to overwrite a config? If so, emit an event. + if (existingDigest != ZERO_DIGEST) { + emit CandidateConfigRevoked(digestToOverwrite); + } + + uint32 newVersion = ++s_currentVersion; + newConfigDigest = _calculateConfigDigest(abi.encode(staticConfig), newVersion); + + VersionedConfig storage existingConfig = s_configs[_getCandidateIndex()]; + existingConfig.configDigest = newConfigDigest; + existingConfig.version = newVersion; + existingConfig.staticConfig = staticConfig; + existingConfig.dynamicConfig = dynamicConfig; + + emit ConfigSet(newConfigDigest, newVersion, staticConfig, dynamicConfig); + + return newConfigDigest; + } + + /// @notice Revokes a specific config by digest. This is used when the candidate config turns out to be incorrect to + /// remove it without it ever having to be promoted. It's also possible to revoke the candidate config by setting a + /// newer candidate config using `setCandidate`. + /// @param configDigest The digest of the config to revoke. This is done to prevent accidental revokes. + function revokeCandidate(bytes32 configDigest) external onlyOwner { + if (configDigest == ZERO_DIGEST) { + revert RevokingZeroDigestNotAllowed(); + } + + uint256 candidateConfigIndex = _getCandidateIndex(); + if (s_configs[candidateConfigIndex].configDigest != configDigest) { + revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, configDigest); + } + + emit CandidateConfigRevoked(configDigest); + // Delete only the digest, as that's what's used to determine if a config is active. This means the actual + // config stays in storage which should significantly reduce the gas cost of overwriting that storage space in + // the future. + delete s_configs[candidateConfigIndex].configDigest; + } + + /// @notice Promotes the candidate config to the active config and revokes the active config. + /// @param digestToPromote The digest of the config to promote. + /// @param digestToRevoke The digest of the config to revoke. + /// @dev No config is changed in storage, the only storage changes that happen are + /// - The activeConfigIndex is flipped. + /// - The digest of the old active config is deleted. + function promoteCandidateAndRevokeActive(bytes32 digestToPromote, bytes32 digestToRevoke) external onlyOwner { + if (digestToPromote == ZERO_DIGEST && digestToRevoke == ZERO_DIGEST) { + revert NoOpStateTransitionNotAllowed(); + } + + uint256 candidateConfigIndex = _getCandidateIndex(); + if (s_configs[candidateConfigIndex].configDigest != digestToPromote) { + revert ConfigDigestMismatch(s_configs[candidateConfigIndex].configDigest, digestToPromote); + } + + VersionedConfig storage activeConfig = s_configs[_getActiveIndex()]; + if (activeConfig.configDigest != digestToRevoke) { + revert ConfigDigestMismatch(activeConfig.configDigest, digestToRevoke); + } + + delete activeConfig.configDigest; + + s_activeConfigIndex ^= 1; + if (digestToRevoke != ZERO_DIGEST) { + emit ActiveConfigRevoked(digestToRevoke); + } + emit ConfigPromoted(digestToPromote); + } + + /// @notice Sets the dynamic config for a specific config. + /// @param newDynamicConfig The new dynamic config. + /// @param currentDigest The digest of the config to update. + /// @dev This does not update the config digest as only the static config is part of the digest. + function setDynamicConfig(DynamicConfig calldata newDynamicConfig, bytes32 currentDigest) external onlyOwner { + for (uint256 i = 0; i < MAX_CONCURRENT_CONFIGS; ++i) { + if (s_configs[i].configDigest == currentDigest && currentDigest != ZERO_DIGEST) { + _validateDynamicConfig(newDynamicConfig, s_configs[i].staticConfig.nodes.length); + // Since the static config doesn't change we don't have to update the digest or version. + s_configs[i].dynamicConfig = newDynamicConfig; + + emit DynamicConfigSet(currentDigest, newDynamicConfig); + return; } - VersionedConfig memory vc = VersionedConfig({version: s_configCounts[i], config: s_configs[i]}); - if (_configDigest(vc) == configDigest) { - versionedConfig = vc; - ok = true; - break; + } + + revert DigestNotFound(currentDigest); + } + + /// @notice Calculates the config digest for a given plugin key, static config, and version. + /// @param staticConfig The static part of the config. + /// @param version The version of the config. + /// @return The calculated config digest. + function _calculateConfigDigest(bytes memory staticConfig, uint32 version) internal view returns (bytes32) { + return bytes32( + (PREFIX & PREFIX_MASK) + | ( + uint256( + keccak256(bytes.concat(abi.encode(bytes32("EVM"), block.chainid, address(this), version), staticConfig)) + ) & ~PREFIX_MASK + ) + ); + } + + function _getActiveIndex() private view returns (uint32) { + return s_activeConfigIndex; + } + + function _getCandidateIndex() private view returns (uint32) { + return s_activeConfigIndex ^ 1; + } + + // ================================================================ + // │ Validation │ + // ================================================================ + + /// @notice Validates the static and dynamic config. Reverts when the config is invalid. + /// @param staticConfig The static part of the config. + /// @param dynamicConfig The dynamic part of the config. + function _validateStaticAndDynamicConfig( + StaticConfig memory staticConfig, + DynamicConfig memory dynamicConfig + ) internal pure { + // Ensure that observerNodesBitmap can be bit-encoded into a uint256. + if (staticConfig.nodes.length > MAX_NODES) { + revert OutOfBoundsNodesLength(); + } + + // Ensure no peerId or offchainPublicKey is duplicated. + for (uint256 i = 0; i < staticConfig.nodes.length; ++i) { + for (uint256 j = i + 1; j < staticConfig.nodes.length; ++j) { + if (staticConfig.nodes[i].peerId == staticConfig.nodes[j].peerId) { + revert DuplicatePeerId(); + } + if (staticConfig.nodes[i].offchainPublicKey == staticConfig.nodes[j].offchainPublicKey) { + revert DuplicateOffchainPublicKey(); + } } } + + _validateDynamicConfig(dynamicConfig, staticConfig.nodes.length); } - /// - /// Events - /// + /// @notice Validates the dynamic config. Reverts when the config is invalid. + /// @param dynamicConfig The dynamic part of the config. + /// @param numberOfNodes The number of nodes in the static config. + function _validateDynamicConfig(DynamicConfig memory dynamicConfig, uint256 numberOfNodes) internal pure { + uint256 numberOfSourceChains = dynamicConfig.sourceChains.length; + for (uint256 i = 0; i < numberOfSourceChains; ++i) { + SourceChain memory currentSourceChain = dynamicConfig.sourceChains[i]; + // Ensure the source chain is unique. + for (uint256 j = i + 1; j < numberOfSourceChains; ++j) { + if (currentSourceChain.chainSelector == dynamicConfig.sourceChains[j].chainSelector) { + revert DuplicateSourceChain(); + } + } - event ConfigSet(bytes32 configDigest, VersionedConfig versionedConfig); - event ConfigRevoked(bytes32 configDigest); + // all observer node indices are valid + uint256 bitmap = currentSourceChain.observerNodesBitmap; + // Check if there are any bits set for indexes outside of the expected range. + if (bitmap & (type(uint256).max >> (256 - numberOfNodes)) != bitmap) { + revert OutOfBoundsObserverNodeIndex(); + } - /// - /// Errors - /// + uint256 observersCount = 0; + for (; bitmap != 0; ++observersCount) { + bitmap &= bitmap - 1; + } - error DuplicatePeerId(); - error DuplicateOffchainPublicKey(); - error OutOfOrderSourceChains(); - error OutOfOrderObserverNodeIndices(); - error OutOfBoundsObserverNodeIndex(); - error MinObserversTooHigh(); + // minObservers are tenable + if (currentSourceChain.minObservers > observersCount) { + revert MinObserversTooHigh(); + } + } + } } diff --git a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol index 3ebbf4af801..88fdd205771 100644 --- a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol +++ b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol @@ -1,168 +1,247 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; +pragma solidity 0.8.24; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; import {IRMNV2} from "../interfaces/IRMNV2.sol"; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {EnumerableSet} from "../../shared/enumerable/EnumerableSetWithBytes16.sol"; import {Internal} from "../libraries/Internal.sol"; -bytes32 constant RMN_V1_6_ANY2EVM_REPORT = keccak256("RMN_V1_6_ANY2EVM_REPORT"); +/// @dev An active curse on this subject will cause isCursed() to return true. Use this subject if there is an issue with a +/// remote chain, for which there exists a legacy lane contract deployed on the same chain as this RMN contract is +/// deployed, relying on isCursed(). +bytes16 constant LEGACY_CURSE_SUBJECT = 0x01000000000000000000000000000000; + +/// @dev An active curse on this subject will cause isCursed() and isCursed(bytes16) to return true. Use this subject for +/// issues affecting all of CCIP chains, or pertaining to the chain that this contract is deployed on, instead of using +/// the local chain selector as a subject. +bytes16 constant GLOBAL_CURSE_SUBJECT = 0x01000000000000000000000000000001; -/// @dev XXX DO NOT USE THIS CONTRACT, NOT PRODUCTION READY XXX /// @notice This contract supports verification of RMN reports for any Any2EVM OffRamp. contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 { - /// @dev temp placeholder to exclude this contract from coverage - function test() public {} - - string public constant override typeAndVersion = "RMNRemote 1.6.0-dev"; + using EnumerableSet for EnumerableSet.Bytes16Set; - uint64 internal immutable i_chainSelector; + error AlreadyCursed(bytes16 subject); + error ConfigNotSet(); + error DuplicateOnchainPublicKey(); + error InvalidSignature(); + error InvalidSignerOrder(); + error MinSignersTooHigh(); + error NotCursed(bytes16 subject); + error OutOfOrderSignatures(); + error ThresholdNotMet(); + error UnexpectedSigner(); + error ZeroValueNotAllowed(); - constructor(uint64 chainSelector) { - i_chainSelector = chainSelector; - } + event ConfigSet(uint32 indexed version, Config config); + event Cursed(bytes16[] subjects); + event Uncursed(bytes16[] subjects); + /// @dev the configuration of an RMN signer struct Signer { - address onchainPublicKey; // for signing reports - uint64 nodeIndex; // maps to nodes in home chain config, should be strictly increasing + address onchainPublicKey; // ────╮ For signing reports + uint64 nodeIndex; // ────────────╯ Maps to nodes in home chain config, should be strictly increasing } + /// @dev the contract config + /// @dev note: minSigners can be set to 0 to disable verification for chains without RMN support struct Config { - bytes32 rmnHomeContractConfigDigest; - Signer[] signers; - uint64 minSigners; + bytes32 rmnHomeContractConfigDigest; // Digest of the RMNHome contract config + Signer[] signers; // List of signers + uint64 minSigners; // Threshold for the number of signers required to verify a report } - struct VersionedConfig { - uint32 version; - Config config; + /// @dev part of the payload that RMN nodes sign: keccak256(abi.encode(RMN_V1_6_ANY2EVM_REPORT, report)) + /// @dev this struct is only ever abi-encoded and hashed; it is never stored + struct Report { + uint256 destChainId; // To guard against chain selector misconfiguration + uint64 destChainSelector; // ────────────╮ The chain selector of the destination chain + address rmnRemoteContractAddress; // ─────╯ The address of this contract + address offrampAddress; // The address of the offramp on the same chain as this contract + bytes32 rmnHomeContractConfigDigest; // The digest of the RMNHome contract config + Internal.MerkleRoot[] merkleRoots; // The dest lane updates } - Config s_config; - uint32 s_configCount; - - mapping(address signer => bool exists) s_signers; // for more gas efficient verify - - function setConfig(Config calldata newConfig) external onlyOwner { - // sanity checks - { - // signers are in ascending order of nodeIndex - for (uint256 i = 1; i < newConfig.signers.length; ++i) { - if (!(newConfig.signers[i - 1].nodeIndex < newConfig.signers[i].nodeIndex)) { - revert InvalidSignerOrder(); - } - } - - // minSigners is tenable - if (!(newConfig.minSigners <= newConfig.signers.length)) { - revert MinSignersTooHigh(); - } - } + /// @dev this is included in the preimage of the digest that RMN nodes sign + bytes32 private constant RMN_V1_6_ANY2EVM_REPORT = keccak256("RMN_V1_6_ANY2EVM_REPORT"); - // clear the old signers - { - Config storage oldConfig = s_config; - while (oldConfig.signers.length > 0) { - delete s_signers[oldConfig.signers[oldConfig.signers.length - 1].onchainPublicKey]; - oldConfig.signers.pop(); - } - } + string public constant override typeAndVersion = "RMNRemote 1.6.0-dev"; + uint64 internal immutable i_localChainSelector; - // set the new signers - { - for (uint256 i = 0; i < newConfig.signers.length; ++i) { - if (s_signers[newConfig.signers[i].onchainPublicKey]) { - revert DuplicateOnchainPublicKey(); - } - s_signers[newConfig.signers[i].onchainPublicKey] = true; - } - } + Config private s_config; + uint32 private s_configCount; - s_config = newConfig; - uint32 newConfigCount = ++s_configCount; - emit ConfigSet(VersionedConfig({version: newConfigCount, config: newConfig})); - } + EnumerableSet.Bytes16Set private s_cursedSubjects; + mapping(address signer => bool exists) private s_signers; // for more gas efficient verify - function getVersionedConfig() external view returns (VersionedConfig memory) { - return VersionedConfig({version: s_configCount, config: s_config}); + /// @param localChainSelector the chain selector of the chain this contract is deployed to + constructor(uint64 localChainSelector) { + if (localChainSelector == 0) revert ZeroValueNotAllowed(); + i_localChainSelector = localChainSelector; } - struct Report { - uint256 destChainId; // to guard against chain selector misconfiguration - uint64 destChainSelector; - address rmnRemoteContractAddress; - address offrampAddress; - bytes32 rmnHomeContractConfigDigest; - Internal.MerkleRoot[] destLaneUpdates; - } - - /// @notice Verifies signatures of RMN nodes, on dest lane updates as provided in the CommitReport - /// @param destLaneUpdates must be well formed, and is a representation of the CommitReport received from the oracles - /// @param signatures must be sorted in ascending order by signer address - /// @dev Will revert if verification fails. Needs to be called by the OffRamp for which the signatures are produced, - /// otherwise verification will fail. - function verify(Internal.MerkleRoot[] memory destLaneUpdates, Signature[] memory signatures) external view { - return; // XXX temporary workaround to fix integration tests while we wait to productionize this contract - + // ================================================================ + // │ Verification │ + // ================================================================ + + /// @inheritdoc IRMNV2 + function verify( + address offrampAddress, + Internal.MerkleRoot[] calldata merkleRoots, + Signature[] calldata signatures, + uint256 rawVs + ) external view { if (s_configCount == 0) { revert ConfigNotSet(); } + if (signatures.length < s_config.minSigners) revert ThresholdNotMet(); - bytes32 signedHash = keccak256( + bytes32 digest = keccak256( abi.encode( RMN_V1_6_ANY2EVM_REPORT, Report({ destChainId: block.chainid, - destChainSelector: i_chainSelector, + destChainSelector: i_localChainSelector, rmnRemoteContractAddress: address(this), - offrampAddress: msg.sender, + offrampAddress: offrampAddress, rmnHomeContractConfigDigest: s_config.rmnHomeContractConfigDigest, - destLaneUpdates: destLaneUpdates + merkleRoots: merkleRoots }) ) ); - uint256 numSigners = 0; - address prevAddress = address(0); + address prevAddress; + address signerAddress; for (uint256 i = 0; i < signatures.length; ++i) { - Signature memory sig = signatures[i]; - address signerAddress = ecrecover(signedHash, 27, sig.r, sig.s); + // The v value is bit-encoded into rawVs + signerAddress = ecrecover(digest, 27 + uint8(rawVs & 0x01 << i), signatures[i].r, signatures[i].s); if (signerAddress == address(0)) revert InvalidSignature(); - if (!(prevAddress < signerAddress)) revert OutOfOrderSignatures(); + if (prevAddress >= signerAddress) revert OutOfOrderSignatures(); if (!s_signers[signerAddress]) revert UnexpectedSigner(); prevAddress = signerAddress; - ++numSigners; } - if (numSigners < s_config.minSigners) revert ThresholdNotMet(); } - /// @notice If there is an active global or legacy curse, this function returns true. - function isCursed() external view returns (bool) { - return false; // XXX temporary workaround + // ================================================================ + // │ Config │ + // ================================================================ + + /// @notice Sets the configuration of the contract + /// @param newConfig the new configuration + /// @dev setting config is atomic; we delete all pre-existing config and set everything from scratch + function setConfig(Config calldata newConfig) external onlyOwner { + // signers are in ascending order of nodeIndex + for (uint256 i = 1; i < newConfig.signers.length; ++i) { + if (!(newConfig.signers[i - 1].nodeIndex < newConfig.signers[i].nodeIndex)) { + revert InvalidSignerOrder(); + } + } + + // minSigners is tenable + if (!(newConfig.minSigners <= newConfig.signers.length)) { + revert MinSignersTooHigh(); + } + + // clear the old signers + for (uint256 i = s_config.signers.length; i > 0; --i) { + delete s_signers[s_config.signers[i - 1].onchainPublicKey]; + } + + // set the new signers + for (uint256 i = 0; i < newConfig.signers.length; ++i) { + if (s_signers[newConfig.signers[i].onchainPublicKey]) { + revert DuplicateOnchainPublicKey(); + } + s_signers[newConfig.signers[i].onchainPublicKey] = true; + } + + s_config = newConfig; + uint32 newConfigCount = ++s_configCount; + emit ConfigSet(newConfigCount, newConfig); } - /// @notice If there is an active global curse, or an active curse for `subject`, this function returns true. - /// @param subject To check whether a particular chain is cursed, set to bytes16(uint128(chainSelector)). - function isCursed(bytes16 subject) external view returns (bool) { - return false; // XXX temporary workaround + /// @notice Returns the current configuration of the contract and a version number + /// @return version the current configs version + /// @return config the current config + function getVersionedConfig() external view returns (uint32 version, Config memory config) { + return (s_configCount, s_config); } - /// - /// Events - /// + /// @notice Returns the chain selector configured at deployment time + /// @return localChainSelector the chain selector (not the chain ID) + function getLocalChainSelector() external view returns (uint64 localChainSelector) { + return i_localChainSelector; + } - event ConfigSet(VersionedConfig versionedConfig); + /// @notice Returns the 32 byte header used in computing the report digest + /// @return digestHeader the digest header + function getReportDigestHeader() external pure returns (bytes32 digestHeader) { + return RMN_V1_6_ANY2EVM_REPORT; + } - /// - /// Errors - /// + // ================================================================ + // │ Cursing │ + // ================================================================ - error InvalidSignature(); - error OutOfOrderSignatures(); - error UnexpectedSigner(); - error ThresholdNotMet(); - error ConfigNotSet(); - error InvalidSignerOrder(); - error MinSignersTooHigh(); - error DuplicateOnchainPublicKey(); + /// @notice Curse a single subject + /// @param subject the subject to curse + function curse(bytes16 subject) external { + bytes16[] memory subjects = new bytes16[](1); + subjects[0] = subject; + curse(subjects); + } + + /// @notice Curse an array of subjects + /// @param subjects the subjects to curse + /// @dev reverts if any of the subjects are already cursed or if there is a duplicate + function curse(bytes16[] memory subjects) public onlyOwner { + for (uint256 i = 0; i < subjects.length; ++i) { + if (!s_cursedSubjects.add(subjects[i])) { + revert AlreadyCursed(subjects[i]); + } + } + emit Cursed(subjects); + } + + /// @notice Uncurse a single subject + /// @param subject the subject to uncurse + function uncurse(bytes16 subject) external { + bytes16[] memory subjects = new bytes16[](1); + subjects[0] = subject; + uncurse(subjects); + } + + /// @notice Uncurse an array of subjects + /// @param subjects the subjects to uncurse + /// @dev reverts if any of the subjects are not cursed or if there is a duplicate + function uncurse(bytes16[] memory subjects) public onlyOwner { + for (uint256 i = 0; i < subjects.length; ++i) { + if (!s_cursedSubjects.remove(subjects[i])) { + revert NotCursed(subjects[i]); + } + } + emit Uncursed(subjects); + } + + /// @inheritdoc IRMNV2 + function getCursedSubjects() external view returns (bytes16[] memory subjects) { + return s_cursedSubjects.values(); + } + + /// @inheritdoc IRMNV2 + function isCursed() external view returns (bool) { + if (s_cursedSubjects.length() == 0) { + return false; + } + return s_cursedSubjects.contains(LEGACY_CURSE_SUBJECT) || s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT); + } + + /// @inheritdoc IRMNV2 + function isCursed(bytes16 subject) external view returns (bool) { + if (s_cursedSubjects.length() == 0) { + return false; + } + return s_cursedSubjects.contains(subject) || s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT); + } } diff --git a/contracts/src/v0.8/ccip/test/BaseTest.t.sol b/contracts/src/v0.8/ccip/test/BaseTest.t.sol index e8003cab15b..f6cd83672e8 100644 --- a/contracts/src/v0.8/ccip/test/BaseTest.t.sol +++ b/contracts/src/v0.8/ccip/test/BaseTest.t.sol @@ -73,6 +73,9 @@ contract BaseTest is Test { MockRMN internal s_mockRMN; IRMNV2 internal s_mockRMNRemote; + // nonce for pseudo-random number generation, not to be exposed to test suites + uint256 private randNonce; + function setUp() public virtual { // BaseTest.setUp is often called multiple times from tests' setUp due to inheritance. if (s_baseTestInitialized) return; @@ -128,4 +131,19 @@ contract BaseTest is Test { return priceUpdates; } + + /// @dev returns a pseudo-random bytes32 + function _randomBytes32() internal returns (bytes32) { + return keccak256(abi.encodePacked(++randNonce)); + } + + /// @dev returns a pseudo-random number + function _randomNum() internal returns (uint256) { + return uint256(_randomBytes32()); + } + + /// @dev returns a pseudo-random address + function _randomAddress() internal returns (address) { + return address(uint160(_randomNum())); + } } diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol index 8c61ba5d217..f25bdaa5d4a 100644 --- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol +++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol @@ -390,12 +390,14 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -421,13 +423,13 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain3), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain3), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_3, messagesChain3[0].header.sequenceNumber, messagesChain3[0].header.messageId, - Internal._hash(messagesChain3[0], ON_RAMP_ADDRESS_3), + _hashMessage(messagesChain3[0], ON_RAMP_ADDRESS_3), Internal.MessageExecutionState.SUCCESS, "" ); @@ -497,19 +499,19 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messagesMultiRamp[0].header.nonce++; - messagesMultiRamp[0].header.messageId = Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); + messagesMultiRamp[0].header.messageId = _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp[0].header.sequenceNumber, messagesMultiRamp[0].header.messageId, - Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), + _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -520,17 +522,17 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { messagesMultiRamp[0].header.nonce++; messagesMultiRamp[0].header.sequenceNumber++; - messagesMultiRamp[0].header.messageId = Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); + messagesMultiRamp[0].header.messageId = _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp[0].header.sequenceNumber, messagesMultiRamp[0].header.messageId, - Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), + _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -553,19 +555,19 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { bytes memory newSender = abi.encode(address(1234567)); messagesMultiRamp[0].sender = newSender; - messagesMultiRamp[0].header.messageId = Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); + messagesMultiRamp[0].header.messageId = _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1); // new sender nonce in new offramp should go from 0 -> 1 assertEq(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, newSender), 0); vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp[0].header.sequenceNumber, messagesMultiRamp[0].header.messageId, - Internal._hash(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), + _hashMessage(messagesMultiRamp[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -579,7 +581,7 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { address newSender = address(1234567); messages[0].sender = abi.encode(newSender); messages[0].header.nonce = 2; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); uint64 startNonce = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); @@ -587,7 +589,9 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { // it waits for previous offramp to execute vm.expectEmit(); emit NonceManager.SkippedIncorrectNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].header.nonce, messages[0].sender); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertEq(startNonce, s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); Internal.EVM2EVMMessage[] memory messagesSingleLane = @@ -607,16 +611,18 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { ); messages[0].header.nonce = 2; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); // new offramp is able to execute vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); diff --git a/contracts/src/v0.8/ccip/test/attacks/onRamp/MultiOnRampTokenPoolReentrancy.t.sol b/contracts/src/v0.8/ccip/test/attacks/onRamp/MultiOnRampTokenPoolReentrancy.t.sol index 5161aba8837..4700d7edea2 100644 --- a/contracts/src/v0.8/ccip/test/attacks/onRamp/MultiOnRampTokenPoolReentrancy.t.sol +++ b/contracts/src/v0.8/ccip/test/attacks/onRamp/MultiOnRampTokenPoolReentrancy.t.sol @@ -64,8 +64,7 @@ contract MultiOnRampTokenPoolReentrancy is OnRampSetup { /// Any user -> Facade -> 1st call to ccipSend -> pool’s lockOrBurn —> /// (reenter)-> Facade -> 2nd call to ccipSend /// In this case, Facade's second call would produce an EVM2Any msg with a lower sequence number. - /// The issue was fixed by moving state updates and event construction to before TokenPool calls. - /// This test is kept to verify message sequence expectations are not broken. + /// The issue was fixed by implementing a reentrancy guard in OnRamp. function test_OnRampTokenPoolReentrancy_Success() public { uint256 amount = 1; @@ -81,14 +80,6 @@ contract MultiOnRampTokenPoolReentrancy is OnRampSetup { feeToken: address(s_feeToken) }); - Client.EVM2AnyMessage memory message2 = Client.EVM2AnyMessage({ - receiver: abi.encode(i_receiver), - data: abi.encodePacked(uint256(2)), // message 2 contains data 2 - tokenAmounts: tokenAmounts, - extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})), - feeToken: address(s_feeToken) - }); - uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message1); assertGt(expectedFee, 0); @@ -97,20 +88,7 @@ contract MultiOnRampTokenPoolReentrancy is OnRampSetup { // Internal.EVM2EVMMessage memory msgEvent1 = _messageToEvent(message1, 2, 2, expectedFee, address(s_facadeClient)); // Internal.EVM2EVMMessage memory msgEvent2 = _messageToEvent(message2, 1, 1, expectedFee, address(s_facadeClient)); - // vm.expectEmit(); - // emit CCIPSendRequested(msgEvent2); - // vm.expectEmit(); - // emit CCIPSendRequested(msgEvent1); - - // After issue is fixed, sequence now increments as expected - Internal.EVM2AnyRampMessage memory msgEvent1 = _messageToEvent(message1, 1, 1, expectedFee, address(s_facadeClient)); - Internal.EVM2AnyRampMessage memory msgEvent2 = _messageToEvent(message2, 2, 2, expectedFee, address(s_facadeClient)); - - vm.expectEmit(); - emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, msgEvent2); - vm.expectEmit(); - emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, msgEvent1); - + vm.expectRevert(OnRamp.ReentrancyGuardReentrantCall.selector); s_facadeClient.send(amount); } } diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol deleted file mode 100644 index 721f5d34637..00000000000 --- a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol +++ /dev/null @@ -1,1443 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; - -import {SortedSetValidationUtil} from "../../../shared/util/SortedSetValidationUtil.sol"; -import {CCIPConfig} from "../../capability/CCIPConfig.sol"; -import {ICapabilitiesRegistry} from "../../capability/interfaces/ICapabilitiesRegistry.sol"; -import {CCIPConfigTypes} from "../../capability/libraries/CCIPConfigTypes.sol"; -import {Internal} from "../../libraries/Internal.sol"; -import {CCIPConfigHelper} from "../helpers/CCIPConfigHelper.sol"; -import {Test} from "forge-std/Test.sol"; - -contract CCIPConfigSetup is Test { - address public constant OWNER = 0x82ae2B4F57CA5C1CBF8f744ADbD3697aD1a35AFe; - address public constant CAPABILITIES_REGISTRY = 0x272aF4BF7FBFc4944Ed59F914Cd864DfD912D55e; - - CCIPConfigHelper public s_ccipCC; - - function setUp() public { - changePrank(OWNER); - s_ccipCC = new CCIPConfigHelper(CAPABILITIES_REGISTRY); - } - - function _makeBytes32Array(uint256 length, uint256 seed) internal pure returns (bytes32[] memory arr) { - arr = new bytes32[](length); - for (uint256 i = 0; i < length; i++) { - arr[i] = keccak256(abi.encode(i, 1, seed)); - } - return arr; - } - - function _makeBytesArray(uint256 length, uint256 seed) internal pure returns (bytes[] memory arr) { - arr = new bytes[](length); - for (uint256 i = 0; i < length; i++) { - arr[i] = abi.encodePacked(keccak256(abi.encode(i, 1, seed))); - } - return arr; - } - - function _subset(bytes32[] memory arr, uint256 start, uint256 end) internal pure returns (bytes32[] memory) { - bytes32[] memory subset = new bytes32[](end - start); - for (uint256 i = start; i < end; i++) { - subset[i - start] = arr[i]; - } - return subset; - } - - //TODO: Use OZ's Arrays.sort when we upgrade to OZ v5 - function _sort(bytes32[] memory arr, int256 left, int256 right) private pure { - int256 i = left; - int256 j = right; - if (i == j) return; - bytes32 pivot = arr[uint256(left + (right - left) / 2)]; - while (i <= j) { - while (arr[uint256(i)] < pivot) i++; - while (pivot < arr[uint256(j)]) j--; - if (i <= j) { - (arr[uint256(i)], arr[uint256(j)]) = (arr[uint256(j)], arr[uint256(i)]); - i++; - j--; - } - } - if (left < j) _sort(arr, left, j); - if (i < right) _sort(arr, i, right); - } - - function _addChainConfig( - uint256 numNodes - ) internal returns (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) { - p2pIds = _makeBytes32Array(numNodes, 0); - _sort(p2pIds, 0, int256(numNodes - 1)); - signers = _makeBytesArray(numNodes, 10); - transmitters = _makeBytesArray(numNodes, 20); - for (uint256 i = 0; i < numNodes; i++) { - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, p2pIds[i]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 1, - signer: bytes32(signers[i]), - p2pId: p2pIds[i], - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - } - // Add chain selector for chain 1. - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](1); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: p2pIds, fChain: 1, config: bytes("config1")}) - }); - - vm.expectEmit(); - emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig); - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - - return (p2pIds, signers, transmitters); - } - - function test_getCapabilityConfiguration_Success() public view { - bytes memory capConfig = s_ccipCC.getCapabilityConfiguration(42 /* doesn't matter, not used */ ); - assertEq(capConfig.length, 0, "capability config length must be 0"); - } -} - -contract CCIPConfig_constructor is Test { - // Successes. - - function test_constructor_Success() public { - address capabilitiesRegistry = makeAddr("capabilitiesRegistry"); - CCIPConfigHelper ccipCC = new CCIPConfigHelper(capabilitiesRegistry); - assertEq(address(ccipCC.getCapabilityRegistry()), capabilitiesRegistry); - assertEq(ccipCC.typeAndVersion(), "CCIPConfig 1.6.0-dev"); - } - - // Reverts. - - function test_constructor_ZeroAddressNotAllowed_Revert() public { - vm.expectRevert(CCIPConfig.ZeroAddressNotAllowed.selector); - new CCIPConfigHelper(address(0)); - } -} - -contract CCIPConfig_chainConfig is CCIPConfigSetup { - // Successes. - function test_applyChainConfigUpdates_addChainConfigs_Success() public { - bytes32[] memory chainReaders = new bytes32[](1); - chainReaders[0] = keccak256(abi.encode(1)); - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) - }); - adds[1] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 2, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) - }); - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 1, - signer: bytes32(uint256(1)), - p2pId: chainReaders[0], - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - vm.expectEmit(); - emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig); - vm.expectEmit(); - emit CCIPConfig.ChainConfigSet(2, adds[1].chainConfig); - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - - CCIPConfigTypes.ChainConfigInfo[] memory configs = s_ccipCC.getAllChainConfigs(0, 2); - assertEq(configs.length, 2, "chain configs length must be 2"); - assertEq(configs[0].chainSelector, 1, "chain selector must match"); - assertEq(configs[1].chainSelector, 2, "chain selector must match"); - } - - function test_getPaginatedCCIPConfigs_Success() public { - bytes32[] memory chainReaders = new bytes32[](1); - chainReaders[0] = keccak256(abi.encode(1)); - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) - }); - adds[1] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 2, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) - }); - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 1, - signer: bytes32(uint256(1)), - p2pId: chainReaders[0], - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - - CCIPConfigTypes.ChainConfigInfo[] memory configs = s_ccipCC.getAllChainConfigs(0, 2); - assertEq(configs.length, 2, "chain configs length must be 2"); - assertEq(configs[0].chainSelector, 1, "chain selector must match"); - assertEq(configs[1].chainSelector, 2, "chain selector must match"); - - configs = s_ccipCC.getAllChainConfigs(0, 1); - assertEq(configs.length, 1, "chain configs length must be 1"); - assertEq(configs[0].chainSelector, 1, "chain selector must match"); - - configs = s_ccipCC.getAllChainConfigs(0, 10); - assertEq(configs.length, 2, "chain configs length must be 2"); - assertEq(configs[0].chainSelector, 1, "chain selector must match"); - assertEq(configs[1].chainSelector, 2, "chain selector must match"); - - configs = s_ccipCC.getAllChainConfigs(1, 1); - assertEq(configs.length, 1, "chain configs length must be 1"); - - configs = s_ccipCC.getAllChainConfigs(1, 2); - assertEq(configs.length, 0, "chain configs length must be 0"); - } - - function test_applyChainConfigUpdates_removeChainConfigs_Success() public { - bytes32[] memory chainReaders = new bytes32[](1); - chainReaders[0] = keccak256(abi.encode(1)); - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) - }); - adds[1] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 2, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) - }); - - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 1, - signer: bytes32(uint256(1)), - p2pId: chainReaders[0], - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - - vm.expectEmit(); - emit CCIPConfig.ChainConfigSet(1, adds[0].chainConfig); - vm.expectEmit(); - emit CCIPConfig.ChainConfigSet(2, adds[1].chainConfig); - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - - uint64[] memory removes = new uint64[](1); - removes[0] = uint64(1); - - vm.expectEmit(); - emit CCIPConfig.ChainConfigRemoved(1); - s_ccipCC.applyChainConfigUpdates(removes, new CCIPConfigTypes.ChainConfigInfo[](0)); - } - - // Reverts. - - function test_applyChainConfigUpdates_selectorNotFound_Reverts() public { - uint64[] memory removes = new uint64[](1); - removes[0] = uint64(1); - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 1)); - s_ccipCC.applyChainConfigUpdates(removes, new CCIPConfigTypes.ChainConfigInfo[](0)); - } - - function test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() public { - bytes32[] memory chainReaders = new bytes32[](1); - chainReaders[0] = keccak256(abi.encode(1)); - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](1); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: abi.encode(1, 2, 3)}) - }); - - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 0, - signer: bytes32(0), - p2pId: bytes32(uint256(0)), - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NodeNotInRegistry.selector, chainReaders[0])); - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - } - - function test__applyChainConfigUpdates_FChainNotPositive_Reverts() public { - bytes32[] memory chainReaders = new bytes32[](1); - chainReaders[0] = keccak256(abi.encode(1)); - CCIPConfigTypes.ChainConfigInfo[] memory adds = new CCIPConfigTypes.ChainConfigInfo[](2); - adds[0] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 1, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) - }); - adds[1] = CCIPConfigTypes.ChainConfigInfo({ - chainSelector: 2, - chainConfig: CCIPConfigTypes.ChainConfig({readers: chainReaders, fChain: 0, config: bytes("config2")}) // bad fChain - }); - - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 1, - signer: bytes32(uint256(1)), - p2pId: chainReaders[0], - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - - vm.expectRevert(CCIPConfig.FChainMustBePositive.selector); - s_ccipCC.applyChainConfigUpdates(new uint64[](0), adds); - } -} - -contract CCIPConfig_validateConfig is CCIPConfigSetup { - function _getCorrectOCR3Config() internal returns (CCIPConfigTypes.OCR3Config memory) { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - - return CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("offchainConfig") - }); - } - - // Successes. - - function test__validateConfig_Success() public { - s_ccipCC.validateConfig(_getCorrectOCR3Config()); - } - - // Reverts. - - function test__validateConfig_ChainSelectorNotSet_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.chainSelector = 0; // invalid - - vm.expectRevert(CCIPConfig.ChainSelectorNotSet.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.offrampAddress = ""; // invalid - - vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.offrampAddress = abi.encode(address(0)); // invalid - - vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_ChainSelectorNotFound_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.chainSelector = 2; // not set - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 2)); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_NotEnoughTransmitters_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - uint256 numberOfTransmitters = 3; - - // 32 > 31 (max num oracles) - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(31); - - // truncate transmitters to < 3 * fChain + 1 - // since fChain is 1 in this case, we need to truncate to 3 transmitters. - assembly { - mstore(transmitters, numberOfTransmitters) - } - - config.transmitters = transmitters; - config.p2pIds = p2pIds; - config.signers = signers; - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, numberOfTransmitters, 4)); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_TooManySigners_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.signers = new bytes[](257); - - vm.expectRevert(CCIPConfig.TooManySigners.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_FMustBePositive_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.F = 0; // not positive - - vm.expectRevert(CCIPConfig.FMustBePositive.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_FTooHigh_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.F = 2; // too high - - vm.expectRevert(CCIPConfig.FTooHigh.selector); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_P2PIdsLengthNotMatching_Reverts() public { - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - - uint256 expectedNumberOfP2pIds = config.signers.length; - uint256 wrongNumberOfP2pIds = expectedNumberOfP2pIds - 1; - config.p2pIds = new bytes32[](wrongNumberOfP2pIds); // Not enough - - vm.expectRevert( - abi.encodeWithSelector( - CCIPConfig.P2PIdsLengthNotMatching.selector, wrongNumberOfP2pIds, expectedNumberOfP2pIds, expectedNumberOfP2pIds - ) - ); - s_ccipCC.validateConfig(config); - } - - function test__validateConfig_NodeNotInRegistry_Reverts() public { - (bytes32[] memory p2pIds,,) = _addChainConfig(4); - bytes32 nonExistentP2PId = keccak256("notInRegistry"); - p2pIds[0] = nonExistentP2PId; - - vm.mockCall( - CAPABILITIES_REGISTRY, - abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, nonExistentP2PId), - abi.encode( - ICapabilitiesRegistry.NodeInfo({ - nodeOperatorId: 0, - signer: bytes32(0), - p2pId: bytes32(uint256(0)), - hashedCapabilityIds: new bytes32[](0), - configCount: uint32(1), - workflowDONId: uint32(1), - capabilitiesDONIds: new uint256[](0) - }) - ) - ); - CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config(); - config.p2pIds = p2pIds; - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NodeNotInRegistry.selector, nonExistentP2PId)); - s_ccipCC.validateConfig(config); - } -} - -contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup { - // Successful cases. - - function test__stateFromConfigLength_Success() public view { - uint256 configLen = 0; - CCIPConfigTypes.ConfigState state = s_ccipCC.stateFromConfigLength(configLen); - assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Init)); - - configLen = 1; - state = s_ccipCC.stateFromConfigLength(configLen); - assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Running)); - - configLen = 2; - state = s_ccipCC.stateFromConfigLength(configLen); - assertEq(uint256(state), uint256(CCIPConfigTypes.ConfigState.Staging)); - } - - function test__validateConfigStateTransition_Success() public view { - s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Init, CCIPConfigTypes.ConfigState.Running); - - s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Running, CCIPConfigTypes.ConfigState.Staging); - - s_ccipCC.validateConfigStateTransition(CCIPConfigTypes.ConfigState.Staging, CCIPConfigTypes.ConfigState.Running); - } - - function test__computeConfigDigest_Success() public view { - // config digest must change upon: - // - ocr config change (e.g plugin type, chain selector, etc.) - // - don id change - // - config count change - bytes32[] memory p2pIds = _makeBytes32Array(4, 0); - bytes[] memory signers = _makeBytesArray(2, 10); - bytes[] memory transmitters = _makeBytesArray(2, 20); - CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("offchainConfig") - }); - uint32 donId = 1; - uint32 configCount = 1; - - bytes32 configDigest1 = s_ccipCC.computeConfigDigest(donId, configCount, config); - - donId = 2; - bytes32 configDigest2 = s_ccipCC.computeConfigDigest(donId, configCount, config); - - donId = 1; - configCount = 2; - bytes32 configDigest3 = s_ccipCC.computeConfigDigest(donId, configCount, config); - - configCount = 1; - config.pluginType = Internal.OCRPluginType.Execution; - bytes32 configDigest4 = s_ccipCC.computeConfigDigest(donId, configCount, config); - - assertNotEq(configDigest1, configDigest2, "config digests 1 and 2 must not match"); - assertNotEq(configDigest1, configDigest3, "config digests 1 and 3 must not match"); - assertNotEq(configDigest1, configDigest4, "config digests 1 and 4 must not match"); - - assertNotEq(configDigest2, configDigest3, "config digests 2 and 3 must not match"); - assertNotEq(configDigest2, configDigest4, "config digests 2 and 4 must not match"); - } - - function test_Fuzz__groupByPluginType_Success(uint256 numCommitCfgs, uint256 numExecCfgs) public view { - numCommitCfgs = bound(numCommitCfgs, 0, 2); - numExecCfgs = bound(numExecCfgs, 0, 2); - - bytes32[] memory p2pIds = _makeBytes32Array(4, 0); - bytes[] memory signers = _makeBytesArray(4, 10); - bytes[] memory transmitters = _makeBytesArray(4, 20); - CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](numCommitCfgs + numExecCfgs); - for (uint256 i = 0; i < numCommitCfgs; i++) { - cfgs[i] = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: abi.encode("commit", i) - }); - } - for (uint256 i = 0; i < numExecCfgs; i++) { - cfgs[numCommitCfgs + i] = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Execution, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: abi.encode("exec", numCommitCfgs + i) - }); - } - (CCIPConfigTypes.OCR3Config[] memory commitCfgs, CCIPConfigTypes.OCR3Config[] memory execCfgs) = - s_ccipCC.groupByPluginType(cfgs); - - assertEq(commitCfgs.length, numCommitCfgs, "commitCfgs length must match"); - assertEq(execCfgs.length, numExecCfgs, "execCfgs length must match"); - for (uint256 i = 0; i < commitCfgs.length; i++) { - assertEq(uint8(commitCfgs[i].pluginType), uint8(Internal.OCRPluginType.Commit), "plugin type must be commit"); - assertEq(commitCfgs[i].offchainConfig, abi.encode("commit", i), "offchain config must match"); - } - for (uint256 i = 0; i < execCfgs.length; i++) { - assertEq(uint8(execCfgs[i].pluginType), uint8(Internal.OCRPluginType.Execution), "plugin type must be execution"); - assertEq(execCfgs[i].offchainConfig, abi.encode("exec", numCommitCfgs + i), "offchain config must match"); - } - } - - function test__computeNewConfigWithMeta_InitToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0); - CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](1); - newConfig[0] = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Init; - CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Running; - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta = - s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState); - assertEq(newConfigWithMeta.length, 1, "new config with meta length must be 1"); - assertEq(newConfigWithMeta[0].configCount, uint64(1), "config count must be 1"); - assertEq(uint8(newConfigWithMeta[0].config.pluginType), uint8(newConfig[0].pluginType), "plugin type must match"); - assertEq(newConfigWithMeta[0].config.offchainConfig, newConfig[0].offchainConfig, "offchain config must match"); - assertEq( - newConfigWithMeta[0].configDigest, - s_ccipCC.computeConfigDigest(donId, 1, newConfig[0]), - "config digest must match" - ); - - // This ensures that the test case is using correct inputs. - s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta); - } - - function test__computeNewConfigWithMeta_RunningToStaging_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - - CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](2); - // existing blue config first. - newConfig[0] = blueConfig; - // green config next. - newConfig[1] = greenConfig; - - CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Running; - CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Staging; - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta = - s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState); - assertEq(newConfigWithMeta.length, 2, "new config with meta length must be 2"); - - assertEq(newConfigWithMeta[0].configCount, uint64(1), "config count of blue must be 1"); - assertEq( - uint8(newConfigWithMeta[0].config.pluginType), uint8(blueConfig.pluginType), "plugin type of blue must match" - ); - assertEq( - newConfigWithMeta[0].config.offchainConfig, blueConfig.offchainConfig, "offchain config of blue must match" - ); - assertEq( - newConfigWithMeta[0].configDigest, - s_ccipCC.computeConfigDigest(donId, 1, blueConfig), - "config digest of blue must match" - ); - - assertEq(newConfigWithMeta[1].configCount, uint64(2), "config count of green must be 2"); - assertEq( - uint8(newConfigWithMeta[1].config.pluginType), uint8(greenConfig.pluginType), "plugin type of green must match" - ); - assertEq( - newConfigWithMeta[1].config.offchainConfig, greenConfig.offchainConfig, "offchain config of green must match" - ); - assertEq( - newConfigWithMeta[1].configDigest, - s_ccipCC.computeConfigDigest(donId, 2, greenConfig), - "config digest of green must match" - ); - - // This ensures that the test case is using correct inputs. - s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta); - } - - function test__computeNewConfigWithMeta_StagingToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](1); - newConfig[0] = greenConfig; - - CCIPConfigTypes.ConfigState currentState = CCIPConfigTypes.ConfigState.Staging; - CCIPConfigTypes.ConfigState newState = CCIPConfigTypes.ConfigState.Running; - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta = - s_ccipCC.computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState); - - assertEq(newConfigWithMeta.length, 1, "new config with meta length must be 1"); - assertEq(newConfigWithMeta[0].configCount, uint64(2), "config count must be 2"); - assertEq(uint8(newConfigWithMeta[0].config.pluginType), uint8(greenConfig.pluginType), "plugin type must match"); - assertEq(newConfigWithMeta[0].config.offchainConfig, greenConfig.offchainConfig, "offchain config must match"); - assertEq( - newConfigWithMeta[0].configDigest, s_ccipCC.computeConfigDigest(donId, 2, greenConfig), "config digest must match" - ); - - // This ensures that the test case is using correct inputs. - s_ccipCC.validateConfigTransition(currentConfig, newConfigWithMeta); - } - - function test__validateConfigTransition_InitToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0); - - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_RunningToStaging_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_StagingToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - // Reverts. - - function test_Fuzz__stateFromConfigLength_Reverts(uint256 configLen) public { - vm.assume(configLen > 2); - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigLength.selector, configLen)); - s_ccipCC.stateFromConfigLength(configLen); - } - - function test__groupByPluginType_threeCommitConfigs_Reverts() public { - bytes32[] memory p2pIds = _makeBytes32Array(4, 0); - bytes[] memory signers = _makeBytesArray(4, 10); - bytes[] memory transmitters = _makeBytesArray(4, 20); - CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](3); - for (uint256 i = 0; i < 3; i++) { - cfgs[i] = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: abi.encode("commit", i) - }); - } - vm.expectRevert(); - s_ccipCC.groupByPluginType(cfgs); - } - - function test__groupByPluginType_threeExecutionConfigs_Reverts() public { - bytes32[] memory p2pIds = _makeBytes32Array(4, 0); - bytes[] memory signers = _makeBytesArray(4, 10); - bytes[] memory transmitters = _makeBytesArray(4, 20); - CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](3); - for (uint256 i = 0; i < 3; i++) { - cfgs[i] = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Execution, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: abi.encode("exec", i) - }); - } - vm.expectRevert(); - s_ccipCC.groupByPluginType(cfgs); - } - - function test__groupByPluginType_TooManyOCR3Configs_Reverts() public { - CCIPConfigTypes.OCR3Config[] memory cfgs = new CCIPConfigTypes.OCR3Config[](5); - vm.expectRevert(CCIPConfig.TooManyOCR3Configs.selector); - s_ccipCC.groupByPluginType(cfgs); - } - - function test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 0, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](0); - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.WrongConfigCount.selector, 0, 1)); - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 3, blueConfig) // wrong config digest (due to diff config count) - }); - newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - - vm.expectRevert( - abi.encodeWithSelector( - CCIPConfig.WrongConfigDigestBlueGreen.selector, - s_ccipCC.computeConfigDigest(donId, 3, blueConfig), - s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - ) - ); - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - newConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 3, // wrong config count - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 3, greenConfig) - }); - - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.WrongConfigCount.selector, 3, 2)); - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: _makeBytes32Array(4, 0), - signers: _makeBytesArray(4, 10), - transmitters: _makeBytesArray(4, 20), - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](2); - currentConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 1, - config: blueConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 1, blueConfig) - }); - currentConfig[1] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - }); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - newConfig[0] = CCIPConfigTypes.OCR3ConfigWithMeta({ - configCount: 2, - config: greenConfig, - configDigest: s_ccipCC.computeConfigDigest(donId, 3, greenConfig) // wrong config digest - }); - - vm.expectRevert( - abi.encodeWithSelector( - CCIPConfig.WrongConfigDigest.selector, - s_ccipCC.computeConfigDigest(donId, 3, greenConfig), - s_ccipCC.computeConfigDigest(donId, 2, greenConfig) - ) - ); - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } - - function test__validateConfigTransition_NonExistentConfigTransition_Reverts() public { - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](3); - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfig = new CCIPConfigTypes.OCR3ConfigWithMeta[](1); - vm.expectRevert(CCIPConfig.NonExistentConfigTransition.selector); - s_ccipCC.validateConfigTransition(currentConfig, newConfig); - } -} - -contract CCIPConfig_updatePluginConfig is CCIPConfigSetup { - // Successes. - - function test__updatePluginConfig_InitToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1); - configs[0] = blueConfig; - - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, configs); - - // should see the updated config in the contract state. - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedConfig.length, 1, "don config length must be 1"); - assertEq(storedConfig[0].configCount, uint64(1), "config count must be 1"); - assertEq(uint256(storedConfig[0].config.pluginType), uint256(blueConfig.pluginType), "plugin type must match"); - } - - function test__updatePluginConfig_RunningToStaging_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - // add blue config. - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config[] memory startConfigs = new CCIPConfigTypes.OCR3Config[](1); - startConfigs[0] = blueConfig; - - // add blue AND green config to indicate an update. - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - CCIPConfigTypes.OCR3Config[] memory blueAndGreen = new CCIPConfigTypes.OCR3Config[](2); - blueAndGreen[0] = blueConfig; - blueAndGreen[1] = greenConfig; - - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, blueAndGreen); - - // should see the updated config in the contract state. - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedConfig.length, 2, "don config length must be 2"); - // 0 index is blue config, 1 index is green config. - assertEq(storedConfig[1].configCount, uint64(2), "config count must be 2"); - assertEq( - uint256(storedConfig[0].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must match" - ); - assertEq( - uint256(storedConfig[1].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must match" - ); - assertEq(storedConfig[0].config.offchainConfig, bytes("commit"), "blue offchain config must match"); - assertEq(storedConfig[1].config.offchainConfig, bytes("commit-new"), "green offchain config must match"); - } - - function test__updatePluginConfig_StagingToRunning_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - // add blue config. - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config[] memory startConfigs = new CCIPConfigTypes.OCR3Config[](1); - startConfigs[0] = blueConfig; - - // add blue AND green config to indicate an update. - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, startConfigs); - CCIPConfigTypes.OCR3Config memory greenConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit-new") - }); - CCIPConfigTypes.OCR3Config[] memory blueAndGreen = new CCIPConfigTypes.OCR3Config[](2); - blueAndGreen[0] = blueConfig; - blueAndGreen[1] = greenConfig; - - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, blueAndGreen); - - // should see the updated config in the contract state. - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfig = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedConfig.length, 2, "don config length must be 2"); - // 0 index is blue config, 1 index is green config. - assertEq(storedConfig[1].configCount, uint64(2), "config count must be 2"); - assertEq( - uint256(storedConfig[0].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must match" - ); - assertEq( - uint256(storedConfig[1].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must match" - ); - assertEq(storedConfig[0].config.offchainConfig, bytes("commit"), "blue offchain config must match"); - assertEq(storedConfig[1].config.offchainConfig, bytes("commit-new"), "green offchain config must match"); - - // promote green to blue. - CCIPConfigTypes.OCR3Config[] memory promote = new CCIPConfigTypes.OCR3Config[](1); - promote[0] = greenConfig; - - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, promote); - - // should see the updated config in the contract state. - storedConfig = s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedConfig.length, 1, "don config length must be 1"); - assertEq(storedConfig[0].configCount, uint64(2), "config count must be 2"); - assertEq( - uint256(storedConfig[0].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must match" - ); - assertEq(storedConfig[0].config.offchainConfig, bytes("commit-new"), "green offchain config must match"); - } - - // Reverts. - function test__updatePluginConfig_InvalidConfigLength_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](3); - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigLength.selector, uint256(3))); - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, newConfig); - } - - function test__updatePluginConfig_InvalidConfigStateTransition_Reverts() public { - uint32 donId = 1; - CCIPConfigTypes.OCR3Config[] memory newConfig = new CCIPConfigTypes.OCR3Config[](2); - // 0 -> 2 is an invalid state transition. - vm.expectRevert(abi.encodeWithSelector(CCIPConfig.InvalidConfigStateTransition.selector, 0, 2)); - s_ccipCC.updatePluginConfig(donId, Internal.OCRPluginType.Commit, newConfig); - } -} - -contract CCIPConfig_beforeCapabilityConfigSet is CCIPConfigSetup { - // Successes. - function test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() public { - changePrank(CAPABILITIES_REGISTRY); - - CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](0); - bytes memory encodedConfigs = abi.encode(configs); - s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encodedConfigs, 1, 1); - } - - function test_beforeCapabilityConfigSet_CommitConfigOnly_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - changePrank(CAPABILITIES_REGISTRY); - - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1); - configs[0] = blueConfig; - - bytes memory encoded = abi.encode(configs); - s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfigs = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedConfigs.length, 1, "config length must be 1"); - assertEq(storedConfigs[0].configCount, uint64(1), "config count must be 1"); - assertEq( - uint256(storedConfigs[0].config.pluginType), uint256(Internal.OCRPluginType.Commit), "plugin type must be commit" - ); - } - - function test_beforeCapabilityConfigSet_ExecConfigOnly_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - changePrank(CAPABILITIES_REGISTRY); - - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Execution, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("exec") - }); - CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](1); - configs[0] = blueConfig; - - bytes memory encoded = abi.encode(configs); - s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedConfigs = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Execution); - assertEq(storedConfigs.length, 1, "config length must be 1"); - assertEq(storedConfigs[0].configCount, uint64(1), "config count must be 1"); - assertEq( - uint256(storedConfigs[0].config.pluginType), - uint256(Internal.OCRPluginType.Execution), - "plugin type must be execution" - ); - } - - function test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() public { - (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4); - changePrank(CAPABILITIES_REGISTRY); - - uint32 donId = 1; - CCIPConfigTypes.OCR3Config memory blueCommitConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Commit, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("commit") - }); - CCIPConfigTypes.OCR3Config memory blueExecConfig = CCIPConfigTypes.OCR3Config({ - pluginType: Internal.OCRPluginType.Execution, - offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))), - chainSelector: 1, - p2pIds: p2pIds, - signers: signers, - transmitters: transmitters, - F: 1, - offchainConfigVersion: 30, - offchainConfig: bytes("exec") - }); - CCIPConfigTypes.OCR3Config[] memory configs = new CCIPConfigTypes.OCR3Config[](2); - configs[0] = blueExecConfig; - configs[1] = blueCommitConfig; - - bytes memory encoded = abi.encode(configs); - s_ccipCC.beforeCapabilityConfigSet(new bytes32[](0), encoded, 1, donId); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedExecConfigs = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Execution); - assertEq(storedExecConfigs.length, 1, "config length must be 1"); - assertEq(storedExecConfigs[0].configCount, uint64(1), "config count must be 1"); - assertEq( - uint256(storedExecConfigs[0].config.pluginType), - uint256(Internal.OCRPluginType.Execution), - "plugin type must be execution" - ); - - CCIPConfigTypes.OCR3ConfigWithMeta[] memory storedCommitConfigs = - s_ccipCC.getOCRConfig(donId, Internal.OCRPluginType.Commit); - assertEq(storedCommitConfigs.length, 1, "config length must be 1"); - assertEq(storedCommitConfigs[0].configCount, uint64(1), "config count must be 1"); - assertEq( - uint256(storedCommitConfigs[0].config.pluginType), - uint256(Internal.OCRPluginType.Commit), - "plugin type must be commit" - ); - } - - // Reverts. - - function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() public { - bytes32[] memory nodes = new bytes32[](0); - bytes memory config = bytes(""); - uint64 configCount = 1; - uint32 donId = 1; - vm.expectRevert(CCIPConfig.OnlyCapabilitiesRegistryCanCall.selector); - s_ccipCC.beforeCapabilityConfigSet(nodes, config, configCount, donId); - } -} diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol new file mode 100644 index 00000000000..f4784b0d0fc --- /dev/null +++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome.t.sol @@ -0,0 +1,955 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {ICapabilityConfiguration} from "../../../keystone/interfaces/ICapabilityConfiguration.sol"; +import {ICapabilitiesRegistry} from "../../interfaces/ICapabilitiesRegistry.sol"; + +import {CCIPHome} from "../../capability/CCIPHome.sol"; +import {Internal} from "../../libraries/Internal.sol"; +import {CCIPHomeHelper} from "../helpers/CCIPHomeHelper.sol"; +import {Test} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; + +import {IERC165} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol"; + +contract CCIPHomeTest is Test { + // address internal constant OWNER = address(0x0000000123123123123); + bytes32 internal constant ZERO_DIGEST = bytes32(uint256(0)); + address internal constant CAPABILITIES_REGISTRY = address(0x0000000123123123123); + Internal.OCRPluginType internal constant DEFAULT_PLUGIN_TYPE = Internal.OCRPluginType.Commit; + uint32 internal constant DEFAULT_DON_ID = 78978987; + + CCIPHomeHelper public s_ccipHome; + + uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00 + uint256 private constant PREFIX = 0x000a << (256 - 16); // 0x000b00..00 + + uint64 private constant DEFAULT_CHAIN_SELECTOR = 9381579735; + + function setUp() public virtual { + s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), _getBaseChainConfigs()); + + ICapabilitiesRegistry.NodeInfo memory nodeInfo = ICapabilitiesRegistry.NodeInfo({ + p2pId: keccak256("p2pId"), + signer: keccak256("signer"), + nodeOperatorId: 1, + configCount: 1, + workflowDONId: 1, + hashedCapabilityIds: new bytes32[](0), + capabilitiesDONIds: new uint256[](0) + }); + + vm.mockCall( + CAPABILITIES_REGISTRY, abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector), abi.encode(nodeInfo) + ); + + vm.startPrank(address(s_ccipHome)); + } + + function _getBaseChainConfigs() internal pure returns (CCIPHome.ChainConfigArgs[] memory) { + CCIPHome.ChainConfigArgs[] memory configs = new CCIPHome.ChainConfigArgs[](1); + CCIPHome.ChainConfig memory chainConfig = + CCIPHome.ChainConfig({readers: new bytes32[](0), fChain: 1, config: abi.encode("chainConfig")}); + configs[0] = CCIPHome.ChainConfigArgs({chainSelector: DEFAULT_CHAIN_SELECTOR, chainConfig: chainConfig}); + + return configs; + } + + function _getConfigDigest( + uint32 donId, + Internal.OCRPluginType pluginType, + bytes memory config, + uint32 version + ) internal view returns (bytes32) { + return bytes32( + (PREFIX & PREFIX_MASK) + | ( + uint256( + keccak256( + bytes.concat( + abi.encode(bytes32("EVM"), block.chainid, address(s_ccipHome), donId, pluginType, version), config + ) + ) + ) & ~PREFIX_MASK + ) + ); + } + + function _getBaseConfig(Internal.OCRPluginType pluginType) internal pure returns (CCIPHome.OCR3Config memory) { + CCIPHome.OCR3Node[] memory nodes = new CCIPHome.OCR3Node[](4); + for (uint256 i = 0; i < nodes.length; i++) { + nodes[i] = CCIPHome.OCR3Node({ + p2pId: keccak256(abi.encode("p2pId", i)), + signerKey: abi.encode("signerKey"), + transmitterKey: abi.encode("transmitterKey") + }); + } + + return CCIPHome.OCR3Config({ + pluginType: pluginType, + chainSelector: DEFAULT_CHAIN_SELECTOR, + FRoleDON: 1, + offchainConfigVersion: 98765, + offrampAddress: abi.encode("offrampAddress"), + rmnHomeAddress: abi.encode("rmnHomeAddress"), + nodes: nodes, + offchainConfig: abi.encode("offchainConfig") + }); + } +} + +contract CCIPHome_constructor is CCIPHomeTest { + function test_constructor_success() public { + CCIPHome ccipHome = new CCIPHome(CAPABILITIES_REGISTRY); + + assertEq(address(ccipHome.getCapabilityRegistry()), CAPABILITIES_REGISTRY); + } + + function test_supportsInterface_success() public view { + assertTrue(s_ccipHome.supportsInterface(type(IERC165).interfaceId)); + assertTrue(s_ccipHome.supportsInterface(type(ICapabilityConfiguration).interfaceId)); + } + + function test_getCapabilityConfiguration_success() public view { + bytes memory config = s_ccipHome.getCapabilityConfiguration(DEFAULT_DON_ID); + assertEq(config.length, 0); + } + + function test_constructor_CapabilitiesRegistryAddressZero_reverts() public { + vm.expectRevert(CCIPHome.ZeroAddressNotAllowed.selector); + new CCIPHome(address(0)); + } +} + +contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTest { + function setUp() public virtual override { + super.setUp(); + vm.stopPrank(); + vm.startPrank(address(CAPABILITIES_REGISTRY)); + } + + function test_beforeCapabilityConfigSet_success() public { + // first set a config + bytes memory callData = abi.encodeCall( + CCIPHome.setCandidate, + (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST) + ); + + vm.expectCall(address(s_ccipHome), callData); + + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + + // Then revoke the config + bytes32 candidateDigest = s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertNotEq(candidateDigest, ZERO_DIGEST); + + callData = abi.encodeCall(CCIPHome.revokeCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, candidateDigest)); + + vm.expectCall(address(s_ccipHome), callData); + + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + + // Then set a new config + callData = abi.encodeCall( + CCIPHome.setCandidate, + (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST) + ); + + vm.expectCall(address(s_ccipHome), callData); + + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + + // Then promote the new config + + bytes32 newCandidateDigest = s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertNotEq(newCandidateDigest, ZERO_DIGEST); + + callData = abi.encodeCall( + CCIPHome.promoteCandidateAndRevokeActive, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, newCandidateDigest, ZERO_DIGEST) + ); + + vm.expectCall(address(s_ccipHome), callData); + + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + + bytes32 activeDigest = s_ccipHome.getActiveDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, newCandidateDigest); + } + + function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() public { + bytes memory callData = abi.encodeCall( + CCIPHome.setCandidate, + (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST) + ); + + vm.stopPrank(); + + vm.expectRevert(CCIPHome.OnlyCapabilitiesRegistryCanCall.selector); + + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + } + + function test_beforeCapabilityConfigSet_InvalidSelector_reverts() public { + bytes memory callData = abi.encodeCall(CCIPHome.getConfigDigests, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE)); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidSelector.selector, CCIPHome.getConfigDigests.selector)); + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + } + + function test_beforeCapabilityConfigSet_DONIdMismatch_reverts() public { + uint32 wrongDonId = DEFAULT_DON_ID + 1; + + bytes memory callData = abi.encodeCall( + CCIPHome.setCandidate, + (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST) + ); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.DONIdMismatch.selector, DEFAULT_DON_ID, wrongDonId)); + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, wrongDonId); + } + + function test_beforeCapabilityConfigSet_InnerCallReverts_reverts() public { + bytes memory callData = abi.encodeCall(CCIPHome.revokeCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST)); + + vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector); + s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID); + } +} + +contract CCIPHome_getConfigDigests is CCIPHomeTest { + function test_getConfigDigests_success() public { + (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, ZERO_DIGEST); + assertEq(candidateDigest, ZERO_DIGEST); + + CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit); + bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, ZERO_DIGEST); + assertEq(candidateDigest, firstDigest); + + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstDigest, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, firstDigest); + assertEq(candidateDigest, ZERO_DIGEST); + + bytes32 secondDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, firstDigest); + assertEq(candidateDigest, secondDigest); + + assertEq(activeDigest, s_ccipHome.getActiveDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE)); + assertEq(candidateDigest, s_ccipHome.getCandidateDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE)); + } +} + +contract CCIPHome_getAllConfigs is CCIPHomeTest { + function test_getAllConfigs_success() public { + CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit); + bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + (CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) = + s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeConfig.configDigest, ZERO_DIGEST); + assertEq(candidateConfig.configDigest, firstDigest); + + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, firstDigest, ZERO_DIGEST); + + (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeConfig.configDigest, firstDigest); + assertEq(candidateConfig.configDigest, ZERO_DIGEST); + + bytes32 secondDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeConfig.configDigest, firstDigest); + assertEq(candidateConfig.configDigest, secondDigest); + + (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID + 1, DEFAULT_PLUGIN_TYPE); + assertEq(activeConfig.configDigest, ZERO_DIGEST); + assertEq(candidateConfig.configDigest, ZERO_DIGEST); + + (activeConfig, candidateConfig) = s_ccipHome.getAllConfigs(DEFAULT_DON_ID, Internal.OCRPluginType.Execution); + assertEq(activeConfig.configDigest, ZERO_DIGEST); + assertEq(candidateConfig.configDigest, ZERO_DIGEST); + } +} + +contract CCIPHome_setCandidate is CCIPHomeTest { + function test_setCandidate_success() public { + CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit); + CCIPHome.VersionedConfig memory versionedConfig = + CCIPHome.VersionedConfig({version: 1, config: config, configDigest: ZERO_DIGEST}); + + versionedConfig.configDigest = + _getConfigDigest(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, abi.encode(versionedConfig.config), versionedConfig.version); + + vm.expectEmit(); + emit CCIPHome.ConfigSet(versionedConfig.configDigest, versionedConfig.version, versionedConfig.config); + + s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, versionedConfig.config, ZERO_DIGEST); + + (CCIPHome.VersionedConfig memory storedVersionedConfig, bool ok) = + s_ccipHome.getConfig(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, versionedConfig.configDigest); + assertTrue(ok); + assertEq(storedVersionedConfig.version, versionedConfig.version); + assertEq(storedVersionedConfig.configDigest, versionedConfig.configDigest); + assertEq(keccak256(abi.encode(storedVersionedConfig.config)), keccak256(abi.encode(versionedConfig.config))); + } + + function test_setCandidate_ConfigDigestMismatch_reverts() public { + CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit); + + bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, digest, ZERO_DIGEST)); + s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + + vm.expectEmit(); + emit CCIPHome.CandidateConfigRevoked(digest); + + s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, digest); + } + + function test_setCandidate_CanOnlySelfCall_reverts() public { + vm.stopPrank(); + + vm.expectRevert(CCIPHome.CanOnlySelfCall.selector); + s_ccipHome.setCandidate( + DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST + ); + } +} + +contract CCIPHome_revokeCandidate is CCIPHomeTest { + // Sets two configs + function setUp() public virtual override { + super.setUp(); + CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit); + bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, digest, ZERO_DIGEST); + + config.offrampAddress = abi.encode("new_offrampAddress"); + s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST); + } + + function test_revokeCandidate_success() public { + (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = + s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + + vm.expectEmit(); + emit CCIPHome.CandidateConfigRevoked(priorCandidateDigest); + + s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest); + + (CCIPHome.VersionedConfig memory storedVersionedConfig, bool ok) = + s_ccipHome.getConfig(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest); + assertFalse(ok); + // Ensure no old data is returned, even though it's still in storage + assertEq(storedVersionedConfig.version, 0); + assertEq(storedVersionedConfig.config.chainSelector, 0); + assertEq(storedVersionedConfig.config.FRoleDON, 0); + + // Asser the active digest is unaffected but the candidate digest is set to zero + (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + assertEq(activeDigest, priorActiveDigest); + assertEq(candidateDigest, ZERO_DIGEST); + assertTrue(candidateDigest != priorCandidateDigest); + } + + function test_revokeCandidate_ConfigDigestMismatch_reverts() public { + (, bytes32 priorCandidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + + bytes32 wrongDigest = keccak256("wrong_digest"); + vm.expectRevert(abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorCandidateDigest, wrongDigest)); + s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, wrongDigest); + } + + function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public { + vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector); + s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST); + } + + function test_revokeCandidate_CanOnlySelfCall_reverts() public { + vm.startPrank(address(0)); + + vm.expectRevert(CCIPHome.CanOnlySelfCall.selector); + s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, keccak256("configDigest")); + } +} + +contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTest { + function test_promoteCandidateAndRevokeActive_multiplePlugins_success() public { + promoteCandidateAndRevokeActive(Internal.OCRPluginType.Commit); + promoteCandidateAndRevokeActive(Internal.OCRPluginType.Execution); + + // check that the two plugins have only active configs and no candidates. + (bytes32 activeDigest, bytes32 candidateDigest) = + s_ccipHome.getConfigDigests(DEFAULT_DON_ID, Internal.OCRPluginType.Commit); + assertTrue(activeDigest != ZERO_DIGEST); + assertEq(candidateDigest, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, Internal.OCRPluginType.Execution); + assertTrue(activeDigest != ZERO_DIGEST); + assertEq(candidateDigest, ZERO_DIGEST); + } + + function promoteCandidateAndRevokeActive(Internal.OCRPluginType pluginType) public { + CCIPHome.OCR3Config memory config = _getBaseConfig(pluginType); + bytes32 firstConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, pluginType, config, ZERO_DIGEST); + + vm.expectEmit(); + emit CCIPHome.ConfigPromoted(firstConfigToPromote); + + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, pluginType, firstConfigToPromote, ZERO_DIGEST); + + // Assert the active digest is updated and the candidate digest is set to zero + (bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, pluginType); + assertEq(activeDigest, firstConfigToPromote); + assertEq(candidateDigest, ZERO_DIGEST); + + // Set a new candidate to promote over a non-zero active config. + config.offchainConfig = abi.encode("new_offchainConfig_config"); + bytes32 secondConfigToPromote = s_ccipHome.setCandidate(DEFAULT_DON_ID, pluginType, config, ZERO_DIGEST); + + vm.expectEmit(); + emit CCIPHome.ActiveConfigRevoked(firstConfigToPromote); + + vm.expectEmit(); + emit CCIPHome.ConfigPromoted(secondConfigToPromote); + + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, pluginType, secondConfigToPromote, firstConfigToPromote); + + (CCIPHome.VersionedConfig memory activeConfig, CCIPHome.VersionedConfig memory candidateConfig) = + s_ccipHome.getAllConfigs(DEFAULT_DON_ID, pluginType); + assertEq(activeConfig.configDigest, secondConfigToPromote); + assertEq(candidateConfig.configDigest, ZERO_DIGEST); + assertEq(keccak256(abi.encode(activeConfig.config)), keccak256(abi.encode(config))); + } + + function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() public { + vm.expectRevert(CCIPHome.NoOpStateTransitionNotAllowed.selector); + s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST, ZERO_DIGEST); + } + + function test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() public { + (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = + s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE); + bytes32 wrongActiveDigest = keccak256("wrongActiveDigest"); + bytes32 wrongCandidateDigest = keccak256("wrongCandidateDigest"); + + vm.expectRevert( + abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongCandidateDigest) + ); + s_ccipHome.promoteCandidateAndRevokeActive( + DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, wrongCandidateDigest, wrongActiveDigest + ); + + vm.expectRevert( + abi.encodeWithSelector(CCIPHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongActiveDigest) + ); + + s_ccipHome.promoteCandidateAndRevokeActive( + DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, priorCandidateDigest, wrongActiveDigest + ); + } + + function test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() public { + vm.stopPrank(); + + vm.expectRevert(CCIPHome.CanOnlySelfCall.selector); + s_ccipHome.promoteCandidateAndRevokeActive( + DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, keccak256("toPromote"), keccak256("ToRevoke") + ); + } +} + +contract CCIPHome__validateConfig is CCIPHomeTest { + function setUp() public virtual override { + s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY); + } + + function _addChainConfig(uint256 numNodes) internal returns (CCIPHome.OCR3Node[] memory nodes) { + return _addChainConfig(numNodes, 1); + } + + function _makeBytes32Array(uint256 length, uint256 seed) internal pure returns (bytes32[] memory arr) { + arr = new bytes32[](length); + for (uint256 i = 0; i < length; i++) { + arr[i] = keccak256(abi.encode(i, 1, seed)); + } + return arr; + } + + function _makeBytesArray(uint256 length, uint256 seed) internal pure returns (bytes[] memory arr) { + arr = new bytes[](length); + for (uint256 i = 0; i < length; i++) { + arr[i] = abi.encode(keccak256(abi.encode(i, 1, seed))); + } + return arr; + } + + function _addChainConfig(uint256 numNodes, uint8 fChain) internal returns (CCIPHome.OCR3Node[] memory nodes) { + bytes32[] memory p2pIds = _makeBytes32Array(numNodes, 0); + bytes[] memory signers = _makeBytesArray(numNodes, 10); + bytes[] memory transmitters = _makeBytesArray(numNodes, 20); + + nodes = new CCIPHome.OCR3Node[](numNodes); + + for (uint256 i = 0; i < numNodes; i++) { + nodes[i] = CCIPHome.OCR3Node({p2pId: p2pIds[i], signerKey: signers[i], transmitterKey: transmitters[i]}); + + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, p2pIds[i]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 1, + signer: bytes32(signers[i]), + p2pId: p2pIds[i], + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + } + // Add chain selector for chain 1. + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](1); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: p2pIds, fChain: fChain, config: bytes("config1")}) + }); + + vm.expectEmit(); + emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + + return nodes; + } + + function _getCorrectOCR3Config(uint8 numNodes, uint8 FRoleDON) internal returns (CCIPHome.OCR3Config memory) { + CCIPHome.OCR3Node[] memory nodes = _addChainConfig(numNodes); + + return CCIPHome.OCR3Config({ + pluginType: Internal.OCRPluginType.Commit, + offrampAddress: abi.encode(keccak256(abi.encode("offramp"))), + rmnHomeAddress: abi.encode(keccak256(abi.encode("rmnHome"))), + chainSelector: 1, + nodes: nodes, + FRoleDON: FRoleDON, + offchainConfigVersion: 30, + offchainConfig: bytes("offchainConfig") + }); + } + + function _getCorrectOCR3Config() internal returns (CCIPHome.OCR3Config memory) { + return _getCorrectOCR3Config(4, 1); + } + + // Successes. + + function test__validateConfig_Success() public { + s_ccipHome.validateConfig(_getCorrectOCR3Config()); + } + + function test__validateConfigLessTransmittersThanSigners_Success() public { + // fChain is 1, so there should be at least 4 transmitters. + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(5, 1); + config.nodes[1].transmitterKey = bytes(""); + + s_ccipHome.validateConfig(config); + } + + function test__validateConfigSmallerFChain_Success() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(11, 3); + + // Set fChain to 2 + _addChainConfig(4, 2); + + s_ccipHome.validateConfig(config); + } + + // Reverts + + function test__validateConfig_ChainSelectorNotSet_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.chainSelector = 0; // invalid + + vm.expectRevert(CCIPHome.ChainSelectorNotSet.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.offrampAddress = ""; // invalid + + vm.expectRevert(CCIPHome.OfframpAddressCannotBeZero.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.offrampAddress = abi.encode(address(0)); // invalid + + vm.expectRevert(CCIPHome.OfframpAddressCannotBeZero.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.rmnHomeAddress = ""; // invalid + + vm.expectRevert(CCIPHome.RMNHomeAddressCannotBeZero.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.rmnHomeAddress = abi.encode(address(0)); // invalid + + vm.expectRevert(CCIPHome.RMNHomeAddressCannotBeZero.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_ChainSelectorNotFound_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.chainSelector = 2; // not set + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.ChainSelectorNotFound.selector, 2)); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_NotEnoughTransmitters_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + uint256 numberOfTransmitters = 3; + + // 32 > 31 (max num oracles) + CCIPHome.OCR3Node[] memory nodes = _addChainConfig(31); + + // truncate transmitters to < 3 * fChain + 1 + // since fChain is 1 in this case, we need to truncate to 3 transmitters. + for (uint256 i = numberOfTransmitters; i < nodes.length; ++i) { + nodes[i].transmitterKey = bytes(""); + } + + config.nodes = nodes; + vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, numberOfTransmitters, 4)); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.nodes[0].transmitterKey = bytes(""); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, 3, 4)); + s_ccipHome.validateConfig(config); + + // Zero out remaining transmitters to verify error changes + for (uint256 i = 1; i < config.nodes.length; ++i) { + config.nodes[i].transmitterKey = bytes(""); + } + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.NotEnoughTransmitters.selector, 0, 4)); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_TooManySigners_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.nodes = new CCIPHome.OCR3Node[](257); + + vm.expectRevert(CCIPHome.TooManySigners.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_FChainTooHigh_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.FRoleDON = 2; // too low + + // Set fChain to 3 + _addChainConfig(4, 3); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.FChainTooHigh.selector, 3, 2)); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_FMustBePositive_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.FRoleDON = 0; // not positive + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.FChainTooHigh.selector, 1, 0)); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_FTooHigh_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.FRoleDON = 2; // too high + + vm.expectRevert(CCIPHome.FTooHigh.selector); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_ZeroP2PId_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.nodes[1].p2pId = bytes32(0); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidNode.selector, config.nodes[1])); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_ZeroSignerKey_Reverts() public { + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.nodes[2].signerKey = bytes(""); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidNode.selector, config.nodes[2])); + s_ccipHome.validateConfig(config); + } + + function test__validateConfig_NodeNotInRegistry_Reverts() public { + CCIPHome.OCR3Node[] memory nodes = _addChainConfig(4); + bytes32 nonExistentP2PId = keccak256("notInRegistry"); + nodes[0].p2pId = nonExistentP2PId; + + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, nonExistentP2PId), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 0, + signer: bytes32(0), + p2pId: bytes32(uint256(0)), + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(); + config.nodes = nodes; + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.NodeNotInRegistry.selector, nonExistentP2PId)); + s_ccipHome.validateConfig(config); + } +} + +contract CCIPHome_applyChainConfigUpdates is CCIPHomeTest { + function setUp() public virtual override { + s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY); + } + + function test_applyChainConfigUpdates_addChainConfigs_Success() public { + bytes32[] memory chainReaders = new bytes32[](1); + chainReaders[0] = keccak256(abi.encode(1)); + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) + }); + adds[1] = CCIPHome.ChainConfigArgs({ + chainSelector: 2, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) + }); + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 1, + signer: bytes32(uint256(1)), + p2pId: chainReaders[0], + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + vm.expectEmit(); + emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig); + vm.expectEmit(); + emit CCIPHome.ChainConfigSet(2, adds[1].chainConfig); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + + CCIPHome.ChainConfigArgs[] memory configs = s_ccipHome.getAllChainConfigs(0, 2); + assertEq(configs.length, 2, "chain configs length must be 2"); + assertEq(configs[0].chainSelector, 1, "chain selector must match"); + assertEq(configs[1].chainSelector, 2, "chain selector must match"); + assertEq(s_ccipHome.getNumChainConfigurations(), 2, "total chain configs must be 2"); + } + + function test_getPaginatedCCIPHomes_Success() public { + bytes32[] memory chainReaders = new bytes32[](1); + chainReaders[0] = keccak256(abi.encode(1)); + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) + }); + adds[1] = CCIPHome.ChainConfigArgs({ + chainSelector: 2, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) + }); + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 1, + signer: bytes32(uint256(1)), + p2pId: chainReaders[0], + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + + CCIPHome.ChainConfigArgs[] memory configs = s_ccipHome.getAllChainConfigs(0, 2); + assertEq(configs.length, 2, "chain configs length must be 2"); + assertEq(configs[0].chainSelector, 1, "chain selector must match"); + assertEq(configs[1].chainSelector, 2, "chain selector must match"); + + configs = s_ccipHome.getAllChainConfigs(0, 1); + assertEq(configs.length, 1, "chain configs length must be 1"); + assertEq(configs[0].chainSelector, 1, "chain selector must match"); + + configs = s_ccipHome.getAllChainConfigs(0, 10); + assertEq(configs.length, 2, "chain configs length must be 2"); + assertEq(configs[0].chainSelector, 1, "chain selector must match"); + assertEq(configs[1].chainSelector, 2, "chain selector must match"); + + configs = s_ccipHome.getAllChainConfigs(1, 1); + assertEq(configs.length, 1, "chain configs length must be 1"); + + configs = s_ccipHome.getAllChainConfigs(1, 2); + assertEq(configs.length, 0, "chain configs length must be 0"); + } + + function test_applyChainConfigUpdates_removeChainConfigs_Success() public { + bytes32[] memory chainReaders = new bytes32[](1); + chainReaders[0] = keccak256(abi.encode(1)); + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) + }); + adds[1] = CCIPHome.ChainConfigArgs({ + chainSelector: 2, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config2")}) + }); + + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 1, + signer: bytes32(uint256(1)), + p2pId: chainReaders[0], + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + + vm.expectEmit(); + emit CCIPHome.ChainConfigSet(1, adds[0].chainConfig); + vm.expectEmit(); + emit CCIPHome.ChainConfigSet(2, adds[1].chainConfig); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + + assertEq(s_ccipHome.getNumChainConfigurations(), 2, "total chain configs must be 2"); + + uint64[] memory removes = new uint64[](1); + removes[0] = uint64(1); + + vm.expectEmit(); + emit CCIPHome.ChainConfigRemoved(1); + s_ccipHome.applyChainConfigUpdates(removes, new CCIPHome.ChainConfigArgs[](0)); + + assertEq(s_ccipHome.getNumChainConfigurations(), 1, "total chain configs must be 1"); + } + + // Reverts. + + function test_applyChainConfigUpdates_selectorNotFound_Reverts() public { + uint64[] memory removes = new uint64[](1); + removes[0] = uint64(1); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.ChainSelectorNotFound.selector, 1)); + s_ccipHome.applyChainConfigUpdates(removes, new CCIPHome.ChainConfigArgs[](0)); + } + + function test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() public { + bytes32[] memory chainReaders = new bytes32[](1); + chainReaders[0] = keccak256(abi.encode(1)); + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](1); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: abi.encode(1, 2, 3)}) + }); + + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 0, + signer: bytes32(0), + p2pId: bytes32(uint256(0)), + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + + vm.expectRevert(abi.encodeWithSelector(CCIPHome.NodeNotInRegistry.selector, chainReaders[0])); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + } + + function test__applyChainConfigUpdates_FChainNotPositive_Reverts() public { + bytes32[] memory chainReaders = new bytes32[](1); + chainReaders[0] = keccak256(abi.encode(1)); + CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2); + adds[0] = CCIPHome.ChainConfigArgs({ + chainSelector: 1, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 1, config: bytes("config1")}) + }); + adds[1] = CCIPHome.ChainConfigArgs({ + chainSelector: 2, + chainConfig: CCIPHome.ChainConfig({readers: chainReaders, fChain: 0, config: bytes("config2")}) // bad fChain + }); + + vm.mockCall( + CAPABILITIES_REGISTRY, + abi.encodeWithSelector(ICapabilitiesRegistry.getNode.selector, chainReaders[0]), + abi.encode( + ICapabilitiesRegistry.NodeInfo({ + nodeOperatorId: 1, + signer: bytes32(uint256(1)), + p2pId: chainReaders[0], + hashedCapabilityIds: new bytes32[](0), + configCount: uint32(1), + workflowDONId: uint32(1), + capabilitiesDONIds: new uint256[](0) + }) + ) + ); + + vm.expectRevert(CCIPHome.FChainMustBePositive.selector); + s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds); + } +} diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol similarity index 85% rename from contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol rename to contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol index 39a80808a3e..59f727c2512 100644 --- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol +++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; +import {IRMN} from "../../interfaces/IRMN.sol"; + import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol"; import {NonceManager} from "../../NonceManager.sol"; import {IRMNV2} from "../../interfaces/IRMNV2.sol"; @@ -139,10 +141,10 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { // Scoped to commit to reduce stack pressure { bytes32[] memory hashedMessages1 = new bytes32[](2); - hashedMessages1[0] = messages1[0]._hash(abi.encode(address(s_onRamp))); - hashedMessages1[1] = messages1[1]._hash(abi.encode(address(s_onRamp))); + hashedMessages1[0] = _hashMessage(messages1[0], abi.encode(address(s_onRamp))); + hashedMessages1[1] = _hashMessage(messages1[1], abi.encode(address(s_onRamp))); bytes32[] memory hashedMessages2 = new bytes32[](1); - hashedMessages2[0] = messages2[0]._hash(abi.encode(address(s_onRamp2))); + hashedMessages2[0] = _hashMessage(messages2[0], abi.encode(address(s_onRamp2))); merkleRoots[0] = MerkleHelper.getMerkleRoot(hashedMessages1); merkleRoots[1] = MerkleHelper.getMerkleRoot(hashedMessages2); @@ -153,21 +155,25 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](2); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR, + onRampAddress: abi.encode(address(s_onRamp)), minSeqNr: messages1[0].header.sequenceNumber, maxSeqNr: messages1[1].header.sequenceNumber, - merkleRoot: merkleRoots[0], - onRampAddress: abi.encode(address(s_onRamp)) + merkleRoot: merkleRoots[0] }); roots[1] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR + 1, + onRampAddress: abi.encode(address(s_onRamp2)), minSeqNr: messages2[0].header.sequenceNumber, maxSeqNr: messages2[0].header.sequenceNumber, - merkleRoot: merkleRoots[1], - onRampAddress: abi.encode(address(s_onRamp)) + merkleRoot: merkleRoots[1] }); - OffRamp.CommitReport memory report = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: rmnSignatures}); + OffRamp.CommitReport memory report = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: rmnSignatures, + rmnRawVs: 0 + }); vm.resumeGasMetering(); _commit(report, ++s_latestSequenceNumber); @@ -209,7 +215,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { SOURCE_CHAIN_SELECTOR, messages1[0].header.sequenceNumber, messages1[0].header.messageId, - messages1[0]._hash(abi.encode(address(s_onRamp))), + _hashMessage(messages1[0], abi.encode(address(s_onRamp))), Internal.MessageExecutionState.SUCCESS, "" ); @@ -218,7 +224,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { SOURCE_CHAIN_SELECTOR, messages1[1].header.sequenceNumber, messages1[1].header.messageId, - messages1[1]._hash(abi.encode(address(s_onRamp))), + _hashMessage(messages1[1], abi.encode(address(s_onRamp))), Internal.MessageExecutionState.SUCCESS, "" ); @@ -227,7 +233,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { SOURCE_CHAIN_SELECTOR + 1, messages2[0].header.sequenceNumber, messages2[0].header.messageId, - messages2[0]._hash(abi.encode(address(s_onRamp2))), + _hashMessage(messages2[0], abi.encode(address(s_onRamp2))), Internal.MessageExecutionState.SUCCESS, "" ); @@ -245,6 +251,8 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { IERC20(s_sourceTokens[0]).approve(address(router), i_tokenAmount0 + router.getFee(DEST_CHAIN_SELECTOR, message)); IERC20(s_sourceTokens[1]).approve(address(router), i_tokenAmount1); + uint256 feeAmount = router.getFee(DEST_CHAIN_SELECTOR, message); + message.receiver = abi.encode(address(s_receiver)); Internal.EVM2AnyRampMessage memory msgEvent = _messageToEvent( message, @@ -252,7 +260,8 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { DEST_CHAIN_SELECTOR, expectedSeqNum, nonce, - router.getFee(DEST_CHAIN_SELECTOR, message), + feeAmount, + feeAmount, OWNER, metadataHash, tokenAdminRegistry @@ -265,6 +274,19 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { router.ccipSend(DEST_CHAIN_SELECTOR, message); vm.pauseGasMetering(); + Internal.Any2EVMTokenTransfer[] memory any2EVMTokenTransfer = + new Internal.Any2EVMTokenTransfer[](message.tokenAmounts.length); + + for (uint256 i = 0; i < msgEvent.tokenAmounts.length; ++i) { + any2EVMTokenTransfer[i] = Internal.Any2EVMTokenTransfer({ + sourcePoolAddress: abi.encode(msgEvent.tokenAmounts[i].sourcePoolAddress), + destTokenAddress: abi.decode(msgEvent.tokenAmounts[i].destTokenAddress, (address)), + extraData: msgEvent.tokenAmounts[i].extraData, + amount: msgEvent.tokenAmounts[i].amount, + destGasAmount: abi.decode(msgEvent.tokenAmounts[i].destExecData, (uint32)) + }); + } + return Internal.Any2EVMRampMessage({ header: Internal.RampMessageHeader({ messageId: msgEvent.header.messageId, @@ -277,7 +299,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { data: msgEvent.data, receiver: abi.decode(msgEvent.receiver, (address)), gasLimit: s_feeQuoter.parseEVMExtraArgsFromBytes(msgEvent.extraArgs, DEST_CHAIN_SELECTOR).gasLimit, - tokenAmounts: msgEvent.tokenAmounts + tokenAmounts: any2EVMTokenTransfer }); } } diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol index f6dc8c25bf5..41720898dd2 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol @@ -172,8 +172,8 @@ contract FeeQuoter_getTokenPrice is FeeQuoterSetup { function test_GetTokenPriceFromFeed_Success() public { uint256 originalTimestampValue = block.timestamp; - // Below staleness threshold - vm.warp(originalTimestampValue + 1 hours); + // Above staleness threshold + vm.warp(originalTimestampValue + s_feeQuoter.getStaticConfig().stalenessThreshold + 1); address sourceToken = _initialiseSingleTokenPriceFeed(); Internal.TimestampedPackedUint224 memory tokenPriceAnswer = s_feeQuoter.getTokenPrice(sourceToken); @@ -349,6 +349,13 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup { function test_TokenNotSupportedFeed_Revert() public { address sourceToken = _initialiseSingleTokenPriceFeed(); MockV3Aggregator(s_dataFeedByToken[sourceToken]).updateAnswer(0); + Internal.PriceUpdates memory priceUpdates = Internal.PriceUpdates({ + tokenPriceUpdates: new Internal.TokenPriceUpdate[](1), + gasPriceUpdates: new Internal.GasPriceUpdate[](0) + }); + priceUpdates.tokenPriceUpdates[0] = Internal.TokenPriceUpdate({sourceToken: sourceToken, usdPerToken: 0}); + + s_feeQuoter.updatePrices(priceUpdates); vm.expectRevert(abi.encodeWithSelector(FeeQuoter.TokenNotSupported.selector, sourceToken)); s_feeQuoter.getValidatedTokenPrice(sourceToken); @@ -1728,24 +1735,28 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { super.setUp(); } - function test_WithLinkTokenAmount_Success() public view { + function test_processMessageArgs_WithLinkTokenAmount_Success() public view { ( uint256 msgFeeJuels, /* bool isOutOfOrderExecution */ , /* bytes memory convertedExtraArgs */ + , + /* destExecDataPerToken */ ) = s_feeQuoter.processMessageArgs( DEST_CHAIN_SELECTOR, // LINK s_sourceTokens[0], MAX_MSG_FEES_JUELS, - "" + "", + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) ); assertEq(msgFeeJuels, MAX_MSG_FEES_JUELS); } - function test_WithConvertedTokenAmount_Success() public view { + function test_processMessageArgs_WithConvertedTokenAmount_Success() public view { address feeToken = s_sourceTokens[1]; uint256 feeTokenAmount = 10_000 gwei; uint256 expectedConvertedAmount = s_feeQuoter.convertTokenAmount(feeToken, feeTokenAmount, s_sourceTokens[0]); @@ -1755,32 +1766,57 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { /* bool isOutOfOrderExecution */ , /* bytes memory convertedExtraArgs */ - ) = s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, feeToken, feeTokenAmount, ""); + , + /* destExecDataPerToken */ + ) = s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + feeToken, + feeTokenAmount, + "", + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); assertEq(msgFeeJuels, expectedConvertedAmount); } - function test_WithEmptyEVMExtraArgs_Success() public view { + function test_processMessageArgs_WithEmptyEVMExtraArgs_Success() public view { ( /* uint256 msgFeeJuels */ , bool isOutOfOrderExecution, - bytes memory convertedExtraArgs - ) = s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, s_sourceTokens[0], 0, ""); + bytes memory convertedExtraArgs, + /* destExecDataPerToken */ + ) = s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + 0, + "", + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); assertEq(isOutOfOrderExecution, false); assertEq(convertedExtraArgs, Client._argsToBytes(s_feeQuoter.parseEVMExtraArgsFromBytes("", DEST_CHAIN_SELECTOR))); } - function test_WithEVMExtraArgsV1_Success() public view { + function test_processMessageArgs_WithEVMExtraArgsV1_Success() public view { bytes memory extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 1000})); ( /* uint256 msgFeeJuels */ , bool isOutOfOrderExecution, - bytes memory convertedExtraArgs - ) = s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, s_sourceTokens[0], 0, extraArgs); + bytes memory convertedExtraArgs, + /* destExecDataPerToken */ + ) = s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + 0, + extraArgs, + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); assertEq(isOutOfOrderExecution, false); assertEq( @@ -1788,15 +1824,23 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { ); } - function test_WitEVMExtraArgsV2_Success() public view { + function test_processMessageArgs_WitEVMExtraArgsV2_Success() public view { bytes memory extraArgs = Client._argsToBytes(Client.EVMExtraArgsV2({gasLimit: 0, allowOutOfOrderExecution: true})); ( /* uint256 msgFeeJuels */ , bool isOutOfOrderExecution, - bytes memory convertedExtraArgs - ) = s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, s_sourceTokens[0], 0, extraArgs); + bytes memory convertedExtraArgs, + /* destExecDataPerToken */ + ) = s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + 0, + extraArgs, + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); assertEq(isOutOfOrderExecution, true); assertEq( @@ -1806,21 +1850,35 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { // Reverts - function test_MessageFeeTooHigh_Revert() public { + function test_processMessageArgs_MessageFeeTooHigh_Revert() public { vm.expectRevert( abi.encodeWithSelector(FeeQuoter.MessageFeeTooHigh.selector, MAX_MSG_FEES_JUELS + 1, MAX_MSG_FEES_JUELS) ); - s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS + 1, ""); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + MAX_MSG_FEES_JUELS + 1, + "", + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); } - function test_InvalidExtraArgs_Revert() public { + function test_processMessageArgs_InvalidExtraArgs_Revert() public { vm.expectRevert(FeeQuoter.InvalidExtraArgsTag.selector); - s_feeQuoter.processMessageArgs(DEST_CHAIN_SELECTOR, s_sourceTokens[0], 0, "abcde"); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + 0, + "abcde", + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) + ); } - function test_MalformedEVMExtraArgs_Revert() public { + function test_processMessageArgs_MalformedEVMExtraArgs_Revert() public { // abi.decode error vm.expectRevert(); @@ -1828,22 +1886,22 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { DEST_CHAIN_SELECTOR, s_sourceTokens[0], 0, - abi.encodeWithSelector(Client.EVM_EXTRA_ARGS_V2_TAG, Client.EVMExtraArgsV1({gasLimit: 100})) + abi.encodeWithSelector(Client.EVM_EXTRA_ARGS_V2_TAG, Client.EVMExtraArgsV1({gasLimit: 100})), + new Internal.EVM2AnyTokenTransfer[](0), + new Client.EVMTokenAmount[](0) ); } -} -contract FeeQuoter_validatePoolReturnData is FeeQuoterFeeSetup { - function test_ProcessPoolReturnData_Success() public view { + function test_processMessageArgs_WithCorrectPoolReturnData_Success() public view { Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](2); sourceTokenAmounts[0].amount = 1e18; sourceTokenAmounts[0].token = s_sourceTokens[0]; sourceTokenAmounts[1].amount = 1e18; sourceTokenAmounts[1].token = CUSTOM_TOKEN_2; - Internal.RampTokenAmount[] memory rampTokenAmounts = new Internal.RampTokenAmount[](2); - rampTokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); - rampTokenAmounts[1] = _getSourceTokenData(sourceTokenAmounts[1], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); + Internal.EVM2AnyTokenTransfer[] memory tokenAmounts = new Internal.EVM2AnyTokenTransfer[](2); + tokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); + tokenAmounts[1] = _getSourceTokenData(sourceTokenAmounts[1], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); bytes[] memory expectedDestExecData = new bytes[](2); expectedDestExecData[0] = abi.encode( s_feeQuoterTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].tokenTransferFeeConfig.destGasOverhead @@ -1851,51 +1909,64 @@ contract FeeQuoter_validatePoolReturnData is FeeQuoterFeeSetup { expectedDestExecData[1] = abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD); //expected return data should be abi.encoded default as isEnabled is false // No revert - successful - bytes[] memory destExecData = - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + ( /* msgFeeJuels */ , /* isOutOfOrderExecution */, /* convertedExtraArgs */, bytes[] memory destExecData) = + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); for (uint256 i = 0; i < destExecData.length; ++i) { assertEq(destExecData[i], expectedDestExecData[i]); } } - function test_TokenAmountArraysMismatching_Revert() public { + function test_processMessageArgs_TokenAmountArraysMismatching_Revert() public { Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](2); sourceTokenAmounts[0].amount = 1e18; sourceTokenAmounts[0].token = s_sourceTokens[0]; - Internal.RampTokenAmount[] memory rampTokenAmounts = new Internal.RampTokenAmount[](1); - rampTokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); + Internal.EVM2AnyTokenTransfer[] memory tokenAmounts = new Internal.EVM2AnyTokenTransfer[](1); + tokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); // Revert due to index out of bounds access vm.expectRevert(); - s_feeQuoter.processPoolReturnData( - DEST_CHAIN_SELECTOR, new Internal.RampTokenAmount[](1), new Client.EVMTokenAmount[](0) + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, + s_sourceTokens[0], + MAX_MSG_FEES_JUELS, + "", + new Internal.EVM2AnyTokenTransfer[](1), + new Client.EVMTokenAmount[](0) ); } - function test_SourceTokenDataTooLarge_Revert() public { + function test_processMessageArgs_SourceTokenDataTooLarge_Revert() public { address sourceETH = s_sourceTokens[1]; Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](1); sourceTokenAmounts[0].amount = 1000; sourceTokenAmounts[0].token = sourceETH; - Internal.RampTokenAmount[] memory rampTokenAmounts = new Internal.RampTokenAmount[](1); - rampTokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); + Internal.EVM2AnyTokenTransfer[] memory tokenAmounts = new Internal.EVM2AnyTokenTransfer[](1); + tokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); // No data set, should succeed - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); // Set max data length, should succeed - rampTokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES); - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + tokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); // Set data to max length +1, should revert - rampTokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + 1); + tokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + 1); vm.expectRevert(abi.encodeWithSelector(FeeQuoter.SourceTokenDataTooLarge.selector, sourceETH)); - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); // Set token config to allow larger data FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(1, 1); @@ -1913,28 +1984,34 @@ contract FeeQuoter_validatePoolReturnData is FeeQuoterFeeSetup { tokenTransferFeeConfigArgs, new FeeQuoter.TokenTransferFeeConfigRemoveArgs[](0) ); - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); // Set the token data larger than the configured token data, should revert - rampTokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + 32 + 1); + tokenAmounts[0].extraData = new bytes(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + 32 + 1); vm.expectRevert(abi.encodeWithSelector(FeeQuoter.SourceTokenDataTooLarge.selector, sourceETH)); - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); } - function test_InvalidEVMAddressDestToken_Revert() public { + function test_processMessageArgs_InvalidEVMAddressDestToken_Revert() public { bytes memory nonEvmAddress = abi.encode(type(uint208).max); Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](1); sourceTokenAmounts[0].amount = 1e18; sourceTokenAmounts[0].token = s_sourceTokens[0]; - Internal.RampTokenAmount[] memory rampTokenAmounts = new Internal.RampTokenAmount[](1); - rampTokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); - rampTokenAmounts[0].destTokenAddress = nonEvmAddress; + Internal.EVM2AnyTokenTransfer[] memory tokenAmounts = new Internal.EVM2AnyTokenTransfer[](1); + tokenAmounts[0] = _getSourceTokenData(sourceTokenAmounts[0], s_tokenAdminRegistry, DEST_CHAIN_SELECTOR); + tokenAmounts[0].destTokenAddress = nonEvmAddress; vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, nonEvmAddress)); - s_feeQuoter.processPoolReturnData(DEST_CHAIN_SELECTOR, rampTokenAmounts, sourceTokenAmounts); + s_feeQuoter.processMessageArgs( + DEST_CHAIN_SELECTOR, s_sourceTokens[0], MAX_MSG_FEES_JUELS, "", tokenAmounts, sourceTokenAmounts + ); } } @@ -2071,11 +2148,11 @@ contract FeeQuoter_KeystoneSetup is FeeQuoterSetup { FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeeds = new FeeQuoter.TokenPriceFeedUpdate[](2); tokenPriceFeeds[0] = FeeQuoter.TokenPriceFeedUpdate({ sourceToken: onReportTestToken1, - feedConfig: IFeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 18}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 18}) }); tokenPriceFeeds[1] = FeeQuoter.TokenPriceFeedUpdate({ sourceToken: onReportTestToken2, - feedConfig: IFeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 20}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0x0), tokenDecimals: 20}) }); s_feeQuoter.setReportPermissions(permissions); s_feeQuoter.updateTokenPriceFeeds(tokenPriceFeeds); diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol index 124980bc81a..d630c55c0d7 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol @@ -122,7 +122,7 @@ contract FeeQuoterSetup is TokenSetup { minFeeUSDCents: 1_00, // 1 USD maxFeeUSDCents: 1000_00, // 1,000 USD deciBps: 2_5, // 2.5 bps, or 0.025% - destGasOverhead: 40_000, + destGasOverhead: 100_000, destBytesOverhead: 32, isEnabled: true }) @@ -135,7 +135,7 @@ contract FeeQuoterSetup is TokenSetup { minFeeUSDCents: 2_00, // 1 USD maxFeeUSDCents: 2000_00, // 1,000 USD deciBps: 10_0, // 10 bps, or 0.1% - destGasOverhead: 1, + destGasOverhead: 95_000, destBytesOverhead: 200, isEnabled: true }) @@ -210,7 +210,7 @@ contract FeeQuoterSetup is TokenSetup { ) internal pure returns (FeeQuoter.TokenPriceFeedUpdate memory) { return FeeQuoter.TokenPriceFeedUpdate({ sourceToken: sourceToken, - feedConfig: IFeeQuoter.TokenPriceFeedConfig({dataFeedAddress: dataFeedAddress, tokenDecimals: tokenDecimals}) + feedConfig: FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: dataFeedAddress, tokenDecimals: tokenDecimals}) }); } @@ -262,16 +262,16 @@ contract FeeQuoterSetup is TokenSetup { } function _assertTokenPriceFeedConfigEquality( - IFeeQuoter.TokenPriceFeedConfig memory config1, - IFeeQuoter.TokenPriceFeedConfig memory config2 + FeeQuoter.TokenPriceFeedConfig memory config1, + FeeQuoter.TokenPriceFeedConfig memory config2 ) internal pure virtual { assertEq(config1.dataFeedAddress, config2.dataFeedAddress); assertEq(config1.tokenDecimals, config2.tokenDecimals); } - function _assertTokenPriceFeedConfigUnconfigured(IFeeQuoter.TokenPriceFeedConfig memory config) internal pure virtual { + function _assertTokenPriceFeedConfigUnconfigured(FeeQuoter.TokenPriceFeedConfig memory config) internal pure virtual { _assertTokenPriceFeedConfigEquality( - config, IFeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0), tokenDecimals: 0}) + config, FeeQuoter.TokenPriceFeedConfig({dataFeedAddress: address(0), tokenDecimals: 0}) ); } @@ -367,6 +367,7 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup { uint64 seqNum, uint64 nonce, uint256 feeTokenAmount, + uint256 feeValueJuels, address originalSender, bytes32 metadataHash, TokenAdminRegistry tokenAdminRegistry @@ -388,7 +389,8 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup { extraArgs: Client._argsToBytes(extraArgs), feeToken: message.feeToken, feeTokenAmount: feeTokenAmount, - tokenAmounts: new Internal.RampTokenAmount[](message.tokenAmounts.length) + feeValueJuels: feeValueJuels, + tokenAmounts: new Internal.EVM2AnyTokenTransfer[](message.tokenAmounts.length) }); for (uint256 i = 0; i < message.tokenAmounts.length; ++i) { @@ -404,7 +406,7 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup { Client.EVMTokenAmount memory tokenAmount, TokenAdminRegistry tokenAdminRegistry, uint64 destChainSelector - ) internal view returns (Internal.RampTokenAmount memory) { + ) internal view returns (Internal.EVM2AnyTokenTransfer memory) { address destToken = s_destTokenBySourceToken[tokenAmount.token]; uint32 expectedDestGasAmount; @@ -413,8 +415,8 @@ contract FeeQuoterFeeSetup is FeeQuoterSetup { expectedDestGasAmount = tokenTransferFeeConfig.isEnabled ? tokenTransferFeeConfig.destGasOverhead : DEFAULT_TOKEN_DEST_GAS_OVERHEAD; - return Internal.RampTokenAmount({ - sourcePoolAddress: abi.encode(tokenAdminRegistry.getTokenConfig(tokenAmount.token).tokenPool), + return Internal.EVM2AnyTokenTransfer({ + sourcePoolAddress: tokenAdminRegistry.getTokenConfig(tokenAmount.token).tokenPool, destTokenAddress: abi.encode(destToken), extraData: "", amount: tokenAmount.amount, diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol deleted file mode 100644 index efade5190b0..00000000000 --- a/contracts/src/v0.8/ccip/test/helpers/CCIPConfigHelper.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; - -import {CCIPConfig} from "../../capability/CCIPConfig.sol"; -import {CCIPConfigTypes} from "../../capability/libraries/CCIPConfigTypes.sol"; -import {Internal} from "../../libraries/Internal.sol"; - -contract CCIPConfigHelper is CCIPConfig { - constructor(address capabilitiesRegistry) CCIPConfig(capabilitiesRegistry) {} - - function stateFromConfigLength(uint256 configLength) public pure returns (CCIPConfigTypes.ConfigState) { - return _stateFromConfigLength(configLength); - } - - function validateConfigStateTransition( - CCIPConfigTypes.ConfigState currentState, - CCIPConfigTypes.ConfigState newState - ) public pure { - _validateConfigStateTransition(currentState, newState); - } - - function validateConfigTransition( - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig, - CCIPConfigTypes.OCR3ConfigWithMeta[] memory newConfigWithMeta - ) public pure { - _validateConfigTransition(currentConfig, newConfigWithMeta); - } - - function computeNewConfigWithMeta( - uint32 donId, - CCIPConfigTypes.OCR3ConfigWithMeta[] memory currentConfig, - CCIPConfigTypes.OCR3Config[] memory newConfig, - CCIPConfigTypes.ConfigState currentState, - CCIPConfigTypes.ConfigState newState - ) public view returns (CCIPConfigTypes.OCR3ConfigWithMeta[] memory) { - return _computeNewConfigWithMeta(donId, currentConfig, newConfig, currentState, newState); - } - - function groupByPluginType( - CCIPConfigTypes.OCR3Config[] memory ocr3Configs - ) - public - pure - returns (CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs) - { - return _groupByPluginType(ocr3Configs); - } - - function computeConfigDigest( - uint32 donId, - uint64 configCount, - CCIPConfigTypes.OCR3Config memory ocr3Config - ) public pure returns (bytes32) { - return _computeConfigDigest(donId, configCount, ocr3Config); - } - - function validateConfig(CCIPConfigTypes.OCR3Config memory cfg) public view { - _validateConfig(cfg); - } - - function updatePluginConfig( - uint32 donId, - Internal.OCRPluginType pluginType, - CCIPConfigTypes.OCR3Config[] memory newConfig - ) public { - _updatePluginConfig(donId, pluginType, newConfig); - } -} diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol new file mode 100644 index 00000000000..8e460b791e4 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {CCIPHome} from "../../capability/CCIPHome.sol"; + +contract CCIPHomeHelper is CCIPHome { + constructor(address capabilitiesRegistry) CCIPHome(capabilitiesRegistry) {} + + function validateConfig(OCR3Config memory cfg) external view { + return _validateConfig(cfg); + } + + function ensureInRegistry(bytes32[] memory p2pIds) external view { + return _ensureInRegistry(p2pIds); + } +} diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol index be3aa9f4b32..7f44a8abf76 100644 --- a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol +++ b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol @@ -70,9 +70,10 @@ contract CCIPReaderTester { emit ExecutionStateChanged(sourceChainSelector, sequenceNumber, messageId, state, returnData); } - event CommitReportAccepted(OffRamp.CommitReport report); + /// @dev !! must mirror OffRamp.sol's CommitReportAccepted event !! + event CommitReportAccepted(Internal.MerkleRoot[] merkleRoots, Internal.PriceUpdates priceUpdates); function emitCommitReportAccepted(OffRamp.CommitReport memory report) external { - emit CommitReportAccepted(report); + emit CommitReportAccepted(report.merkleRoots, report.priceUpdates); } } diff --git a/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol index 73e764ae038..7290e915099 100644 --- a/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol +++ b/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; diff --git a/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol b/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol index d56cf8949a3..c3bd4a5e911 100644 --- a/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol +++ b/contracts/src/v0.8/ccip/test/helpers/MessageHasher.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {Client} from "../../libraries/Client.sol"; import {Internal} from "../../libraries/Internal.sol"; @@ -9,43 +9,59 @@ import {Internal} from "../../libraries/Internal.sol"; /// @dev This is only deployed in tests and is not part of the production contracts. contract MessageHasher { function hash(Internal.Any2EVMRampMessage memory message, bytes memory onRamp) public pure returns (bytes32) { - return Internal._hash(message, onRamp); + return Internal._hash( + message, + keccak256( + abi.encode( + Internal.ANY_2_EVM_MESSAGE_HASH, + message.header.sourceChainSelector, + message.header.destChainSelector, + keccak256(onRamp) + ) + ) + ); } - function encodeTokenAmountsHashPreimage( - Internal.RampTokenAmount[] memory rampTokenAmounts + function encodeAny2EVMTokenAmountsHashPreimage( + Internal.Any2EVMTokenTransfer[] memory tokenAmounts ) public pure returns (bytes memory) { - return abi.encode(rampTokenAmounts); + return abi.encode(tokenAmounts); + } + + function encodeEVM2AnyTokenAmountsHashPreimage( + Internal.EVM2AnyTokenTransfer[] memory tokenAmount + ) public pure returns (bytes memory) { + return abi.encode(tokenAmount); } function encodeMetadataHashPreimage( bytes32 any2EVMMessageHash, uint64 sourceChainSelector, uint64 destChainSelector, - bytes memory onRamp + bytes32 onRampHash ) public pure returns (bytes memory) { - return abi.encode(any2EVMMessageHash, sourceChainSelector, destChainSelector, onRamp); + return abi.encode(any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash); } function encodeFixedSizeFieldsHashPreimage( bytes32 messageId, - bytes memory sender, address receiver, uint64 sequenceNumber, uint256 gasLimit, uint64 nonce ) public pure returns (bytes memory) { - return abi.encode(messageId, sender, receiver, sequenceNumber, gasLimit, nonce); + return abi.encode(messageId, receiver, sequenceNumber, gasLimit, nonce); } function encodeFinalHashPreimage( bytes32 leafDomainSeparator, - bytes32 implicitMetadataHash, + bytes32 metaDataHash, bytes32 fixedSizeFieldsHash, + bytes32 senderHash, bytes32 dataHash, bytes32 tokenAmountsHash ) public pure returns (bytes memory) { - return abi.encode(leafDomainSeparator, implicitMetadataHash, fixedSizeFieldsHash, dataHash, tokenAmountsHash); + return abi.encode(leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash); } function encodeEVMExtraArgsV1(Client.EVMExtraArgsV1 memory extraArgs) public pure returns (bytes memory) { diff --git a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol index e5cf6332d9d..0e9352a9ef9 100644 --- a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol @@ -28,7 +28,7 @@ contract OffRampHelper is OffRamp, IgnoreContractSize { } function releaseOrMintSingleToken( - Internal.RampTokenAmount calldata sourceTokenAmount, + Internal.Any2EVMTokenTransfer calldata sourceTokenAmount, bytes calldata originalSender, address receiver, uint64 sourceChainSelector, @@ -39,32 +39,36 @@ contract OffRampHelper is OffRamp, IgnoreContractSize { } function releaseOrMintTokens( - Internal.RampTokenAmount[] calldata sourceTokenAmounts, + Internal.Any2EVMTokenTransfer[] calldata sourceTokenAmounts, bytes calldata originalSender, address receiver, uint64 sourceChainSelector, - bytes[] calldata offchainTokenData + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides ) external returns (Client.EVMTokenAmount[] memory) { - return _releaseOrMintTokens(sourceTokenAmounts, originalSender, receiver, sourceChainSelector, offchainTokenData); + return _releaseOrMintTokens( + sourceTokenAmounts, originalSender, receiver, sourceChainSelector, offchainTokenData, tokenGasOverrides + ); } function trialExecute( Internal.Any2EVMRampMessage memory message, - bytes[] memory offchainTokenData + bytes[] memory offchainTokenData, + uint32[] memory tokenGasOverrides ) external returns (Internal.MessageExecutionState, bytes memory) { - return _trialExecute(message, offchainTokenData); + return _trialExecute(message, offchainTokenData, tokenGasOverrides); } function executeSingleReport( Internal.ExecutionReportSingleChain memory rep, - uint256[] memory manualExecGasLimits + GasLimitOverride[] memory manualExecGasExecOverrides ) external { - _executeSingleReport(rep, manualExecGasLimits); + _executeSingleReport(rep, manualExecGasExecOverrides); } function batchExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory manualExecGasLimits + GasLimitOverride[][] memory manualExecGasLimits ) external { _batchExecute(reports, manualExecGasLimits); } diff --git a/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol b/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol index 73962fb91f0..2e50124ab4c 100644 --- a/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol +++ b/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {Internal} from "../../libraries/Internal.sol"; import {OffRamp} from "../../offRamp/OffRamp.sol"; diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol index 667fbc13e51..c8eee488084 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -24,10 +24,11 @@ contract ReentrancyAbuserMultiRamp is CCIPReceiver { function _ccipReceive(Client.Any2EVMMessage memory) internal override { // Use original message gas limits in manual execution uint256 numMsgs = s_payload.messages.length; - uint256[][] memory gasOverrides = new uint256[][](1); - gasOverrides[0] = new uint256[](numMsgs); + OffRamp.GasLimitOverride[][] memory gasOverrides = new OffRamp.GasLimitOverride[][](1); + gasOverrides[0] = new OffRamp.GasLimitOverride[](numMsgs); for (uint256 i = 0; i < numMsgs; ++i) { - gasOverrides[0][i] = 0; + gasOverrides[0][i].receiverExecutionGasLimit = 0; + gasOverrides[0][i].tokenGasOverrides = new uint32[](s_payload.messages[i].tokenAmounts.length); } Internal.ExecutionReportSingleChain[] memory batchPayload = new Internal.ExecutionReportSingleChain[](1); diff --git a/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol b/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol index 444e488b3c4..44de2787c67 100644 --- a/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol +++ b/contracts/src/v0.8/ccip/test/legacy/BurnMintTokenPool1_2.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +// SPDX-License-Identifier: BUSL +pragma solidity ^0.8.20; import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; import {IPoolPriorTo1_5} from "../../interfaces/IPoolPriorTo1_5.sol"; diff --git a/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol b/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol index 050cd6d4579..88a17408868 100644 --- a/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol +++ b/contracts/src/v0.8/ccip/test/mocks/MockRouter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.4; import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; import {IRouter} from "../../interfaces/IRouter.sol"; @@ -45,8 +45,19 @@ contract MockCCIPRouter is IRouter, IRouterClient { uint256 gasLimit, address receiver ) internal returns (bool success, bytes memory retData, uint256 gasUsed) { - // Only send through the router if the receiver is a contract and implements the IAny2EVMMessageReceiver interface. - if (receiver.code.length == 0 || !receiver.supportsInterface(type(IAny2EVMMessageReceiver).interfaceId)) { + // There are three cases in which we skip calling the receiver: + // 1. If the message data is empty AND the gas limit is 0. + // This indicates a message that only transfers tokens. It is valid to only send tokens to a contract + // that supports the IAny2EVMMessageReceiver interface, but without this first check we would call the + // receiver without any gas, which would revert the transaction. + // 2. If the receiver is not a contract. + // 3. If the receiver is a contract but it does not support the IAny2EVMMessageReceiver interface. + // + // The ordering of these checks is important, as the first check is the cheapest to execute. + if ( + (message.data.length == 0 && gasLimit == 0) || receiver.code.length == 0 + || !receiver.supportsInterface(type(IAny2EVMMessageReceiver).interfaceId) + ) { return (true, "", 0); } diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol index 8867d1b1278..2783608e68e 100644 --- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol +++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol @@ -373,6 +373,48 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { _assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig); } + function test_SetConfigWithSignersMismatchingTransmitters_Success() public { + uint8 F = 2; + + _assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0)); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: 0, + configDigest: _getBasicConfigDigest(F, s_validSigners, s_partialTransmitters), + F: F, + isSignatureVerificationEnabled: true, + signers: s_validSigners, + transmitters: s_partialTransmitters + }); + + vm.expectEmit(); + emit MultiOCR3Base.ConfigSet( + ocrConfigs[0].ocrPluginType, + ocrConfigs[0].configDigest, + ocrConfigs[0].signers, + ocrConfigs[0].transmitters, + ocrConfigs[0].F + ); + + vm.expectEmit(); + emit MultiOCR3Helper.AfterConfigSet(ocrConfigs[0].ocrPluginType); + + s_multiOCR3.setOCR3Configs(ocrConfigs); + + MultiOCR3Base.OCRConfig memory expectedConfig = MultiOCR3Base.OCRConfig({ + configInfo: MultiOCR3Base.ConfigInfo({ + configDigest: ocrConfigs[0].configDigest, + F: ocrConfigs[0].F, + n: uint8(ocrConfigs[0].signers.length), + isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled + }), + signers: s_validSigners, + transmitters: s_partialTransmitters + }); + _assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig); + } + function test_SetConfigWithoutSigners_Success() public { uint8 F = 1; address[] memory signers = new address[](0); @@ -530,8 +572,12 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { function test_Fuzz_SetConfig_Success(MultiOCR3Base.OCRConfigArgs memory ocrConfig, uint64 randomAddressOffset) public { // condition: cannot assume max oracle count - vm.assume(ocrConfig.transmitters.length <= 31); - vm.assume(ocrConfig.signers.length <= 31); + vm.assume(ocrConfig.transmitters.length <= 255); + vm.assume(ocrConfig.signers.length <= 255); + // condition: at least one transmitter + vm.assume(ocrConfig.transmitters.length > 0); + // condition: number of transmitters does not exceed signers + vm.assume(ocrConfig.signers.length == 0 || ocrConfig.transmitters.length <= ocrConfig.signers.length); // condition: F > 0 ocrConfig.F = uint8(bound(ocrConfig.F, 1, 3)); @@ -839,7 +885,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { function test_FTooHigh_Revert() public { address[] memory signers = new address[](0); - address[] memory transmitters = new address[](0); + address[] memory transmitters = new address[](1); MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ @@ -876,6 +922,26 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { s_multiOCR3.setOCR3Configs(ocrConfigs); } + function test_NoTransmitters_Revert() public { + address[] memory signers = new address[](0); + address[] memory transmitters = new address[](0); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: 0, + configDigest: _getBasicConfigDigest(10, signers, transmitters), + F: 1, + isSignatureVerificationEnabled: false, + signers: signers, + transmitters: transmitters + }); + + vm.expectRevert( + abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.NO_TRANSMITTERS) + ); + s_multiOCR3.setOCR3Configs(ocrConfigs); + } + function test_TooManyTransmitters_Revert() public { address[] memory signers = new address[](0); address[] memory transmitters = new address[](257); @@ -918,4 +984,23 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { ); s_multiOCR3.setOCR3Configs(ocrConfigs); } + + function test_MoreTransmittersThanSigners_Revert() public { + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: 0, + configDigest: _getBasicConfigDigest(1, s_validSigners, s_partialTransmitters), + F: 1, + isSignatureVerificationEnabled: true, + signers: s_partialSigners, + transmitters: s_validTransmitters + }); + + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.TOO_MANY_TRANSMITTERS + ) + ); + s_multiOCR3.setOCR3Configs(ocrConfigs); + } } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol index 8db8be3d116..73adbb12c0d 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.24; import {IFeeQuoter} from "../../interfaces/IFeeQuoter.sol"; import {IMessageInterceptor} from "../../interfaces/IMessageInterceptor.sol"; -import {IPriceRegistry} from "../../interfaces/IPriceRegistry.sol"; import {IRMNV2} from "../../interfaces/IRMNV2.sol"; import {IRouter} from "../../interfaces/IRouter.sol"; import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; @@ -13,7 +12,6 @@ import {FeeQuoter} from "../../FeeQuoter.sol"; import {NonceManager} from "../../NonceManager.sol"; import {Client} from "../../libraries/Client.sol"; import {Internal} from "../../libraries/Internal.sol"; -import {MerkleMultiProof} from "../../libraries/MerkleMultiProof.sol"; import {Pool} from "../../libraries/Pool.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; @@ -285,9 +283,9 @@ contract OffRamp_setDynamicConfig is OffRampSetup { _assertSameConfig(dynamicConfig, newConfig); } - function test_SetDynamicConfigWithValidator_Success() public { + function test_SetDynamicConfigWithInterceptor_Success() public { OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(s_feeQuoter)); - dynamicConfig.messageValidator = address(s_inboundMessageValidator); + dynamicConfig.messageInterceptor = address(s_inboundMessageInterceptor); vm.expectEmit(); emit OffRamp.DynamicConfigSet(dynamicConfig); @@ -342,28 +340,32 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); messages[0].header.nonce++; messages[0].header.sequenceNumber++; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -374,17 +376,19 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].header.nonce = 0; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); // Nonce never increments on unordered messages. uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -396,17 +400,19 @@ contract OffRamp_executeSingleReport is OffRampSetup { ); messages[0].header.sequenceNumber++; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); // Nonce never increments on unordered messages. nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -421,7 +427,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.Any2EVMRampMessage[] memory messagesChain1 = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesChain1), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesChain1), new OffRamp.GasLimitOverride[](0) ); uint64 nonceChain1 = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messagesChain1[0].sender); @@ -432,7 +438,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { assertEq(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_3, messagesChain2[0].sender), 0); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain2), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain2), new OffRamp.GasLimitOverride[](0) ); assertGt(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_3, messagesChain2[0].sender), 0); @@ -450,17 +456,19 @@ contract OffRamp_executeSingleReport is OffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); // Nonce should increment on non-strict assertEq(uint64(0), s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, abi.encode(OWNER))); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( OffRamp.ReceiverError.selector, @@ -475,14 +483,16 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].header.nonce++; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); vm.expectEmit(); emit NonceManager.SkippedIncorrectNonce( messages[0].header.sourceChainSelector, messages[0].header.nonce, messages[0].sender ); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_SkippedIncorrectNonceStillExecutes_Success() public { @@ -490,18 +500,20 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[1].header.nonce++; - messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); + messages[1].header.messageId = _hashMessage(messages[1], ON_RAMP_ADDRESS_1); vm.expectEmit(); emit NonceManager.SkippedIncorrectNonce(SOURCE_CHAIN_SELECTOR_1, messages[1].header.nonce, messages[1].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -512,12 +524,14 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -525,22 +539,26 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].header.nonce = 0; - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -548,7 +566,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } // Send a message to a contract that does not implement the CCIPReceiver interface @@ -558,15 +578,17 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); messages[0].receiver = address(newReceiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -581,12 +603,12 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.resumeGasMetering(); vm.recordLogs(); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -598,22 +620,21 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); + messages[1].header.messageId = _hashMessage(messages[1], ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.resumeGasMetering(); vm.recordLogs(); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); - assertExecutionStateChangedEventLogs( logs, SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -623,7 +644,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[1].header.sequenceNumber, messages[1].header.messageId, - Internal._hash(messages[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -634,7 +655,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); + messages[1].header.messageId = _hashMessage(messages[1], ON_RAMP_ADDRESS_1); assertEq(uint64(0), s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, abi.encode(OWNER))); @@ -650,7 +671,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -659,7 +680,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[1].header.sequenceNumber, messages[1].header.messageId, - Internal._hash(messages[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -682,7 +703,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { if (orderings[i]) { messages[i].header.nonce = ++expectedNonce; } - messages[i].header.messageId = Internal._hash(messages[i], ON_RAMP_ADDRESS_1); + messages[i].header.messageId = _hashMessage(messages[i], ON_RAMP_ADDRESS_1); } uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, abi.encode(OWNER)); @@ -705,7 +726,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[i].header.sequenceNumber, messages[i].header.messageId, - Internal._hash(messages[i], ON_RAMP_ADDRESS_1), + _hashMessage(messages[i], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -722,17 +743,19 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].tokenAmounts[0].sourcePoolAddress = abi.encode(fakePoolAddress); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); + messages[1].header.messageId = _hashMessage(messages[1], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( OffRamp.TokenHandlingError.selector, @@ -747,7 +770,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); } @@ -760,7 +783,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, false); @@ -769,7 +792,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); @@ -788,25 +811,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectRevert( abi.encodeWithSelector(OffRamp.InvalidMessageDestChainSelector.selector, messages[0].header.destChainSelector) ); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); - } - - function test_MismatchingOnRampRoot_Revert() public { - s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 0); - - Internal.Any2EVMRampMessage[] memory messages = - _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - - OffRamp.CommitReport memory commitReport = _constructCommitReport( - // Root against mismatching on ramp - Internal._hash(messages[0], ON_RAMP_ADDRESS_3) - ); - _commit(commitReport, s_latestSequenceNumber); - - Internal.ExecutionReportSingleChain memory executionReport = - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); - vm.expectRevert(abi.encodeWithSelector(OffRamp.RootNotCommitted.selector, SOURCE_CHAIN_SELECTOR_1)); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0)); } function test_UnhealthySingleChainCurse_Revert() public { @@ -817,7 +822,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); vm.recordLogs(); // Uncurse should succeed @@ -826,7 +831,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); } @@ -839,7 +844,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectRevert(OffRamp.UnexpectedTokenData.selector); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); } function test_EmptyReport_Revert() public { @@ -852,7 +857,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages: new Internal.Any2EVMRampMessage[](0), offchainTokenData: new bytes[][](0) }), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); } @@ -886,7 +891,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(newSourceChainSelector, newOnRamp); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, newSourceChainSelector)); - s_offRamp.executeSingleReport(_generateReportFromMessages(newSourceChainSelector, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(newSourceChainSelector, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_DisabledSourceChain_Revert() public { @@ -894,7 +901,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, SOURCE_CHAIN_SELECTOR_2)); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_2, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_2, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_TokenDataMismatch_Revert() public { @@ -909,7 +918,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { OffRamp.TokenDataMismatch.selector, SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber ) ); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); } function test_RouterYULCall_Revert() public { @@ -919,18 +928,18 @@ contract OffRamp_executeSingleReport is OffRampSetup { // gas limit too high, Router's external call should revert messages[0].gasLimit = 1e36; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain memory executionReport = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.recordLogs(); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector(CallWithExactGas.NotEnoughGasForCall.selector) ); @@ -946,15 +955,17 @@ contract OffRamp_executeSingleReport is OffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( OffRamp.ReceiverError.selector, @@ -966,23 +977,26 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.AlreadyAttempted(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function _constructCommitReport(bytes32 merkleRoot) internal view returns (OffRamp.CommitReport memory) { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: abi.encode(ON_RAMP_ADDRESS_1), minSeqNr: 1, maxSeqNr: 2, - merkleRoot: merkleRoot, - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: merkleRoot }); return OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); } } @@ -997,7 +1011,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { function test_executeSingleMessage_NoTokens_Success() public { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithTokens_Success() public { @@ -1013,7 +1027,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { originalSender: message.sender, receiver: message.receiver, amount: message.tokenAmounts[0].amount, - localToken: abi.decode(message.tokenAmounts[0].destTokenAddress, (address)), + localToken: message.tokenAmounts[0].destTokenAddress, remoteChainSelector: SOURCE_CHAIN_SELECTOR_1, sourcePoolAddress: message.tokenAmounts[0].sourcePoolAddress, sourcePoolData: message.tokenAmounts[0].extraData, @@ -1022,24 +1036,24 @@ contract OffRamp_executeSingleMessage is OffRampSetup { ) ); - s_offRamp.executeSingleMessage(message, offchainTokenData); + s_offRamp.executeSingleMessage(message, offchainTokenData, new uint32[](0)); } - function test_executeSingleMessage_WithValidation_Success() public { + function test_executeSingleMessage_WithVInterception_Success() public { vm.stopPrank(); vm.startPrank(OWNER); - _enableInboundMessageValidator(); + _enableInboundMessageInterceptor(); vm.startPrank(address(s_offRamp)); Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_NonContract_Success() public { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); message.receiver = STRANGER; - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_NonContractWithTokens_Success() public { @@ -1053,7 +1067,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); message.receiver = STRANGER; - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } // Reverts @@ -1071,7 +1085,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage)); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_ZeroGasDONExecution_Revert() public { @@ -1081,7 +1095,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.ReceiverError.selector, "")); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_MessageSender_Revert() public { @@ -1089,30 +1103,30 @@ contract OffRamp_executeSingleMessage is OffRampSetup { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); vm.expectRevert(OffRamp.CanOnlySelfCall.selector); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithFailingValidation_Revert() public { vm.stopPrank(); vm.startPrank(OWNER); - _enableInboundMessageValidator(); + _enableInboundMessageInterceptor(); vm.startPrank(address(s_offRamp)); Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); - s_inboundMessageValidator.setMessageIdValidationState(message.header.messageId, true); + s_inboundMessageInterceptor.setMessageIdValidationState(message.header.messageId, true); vm.expectRevert( abi.encodeWithSelector( IMessageInterceptor.MessageValidationError.selector, abi.encodeWithSelector(IMessageInterceptor.MessageValidationError.selector, bytes("Invalid message")) ) ); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() public { vm.stopPrank(); vm.startPrank(OWNER); - _enableInboundMessageValidator(); + _enableInboundMessageInterceptor(); vm.startPrank(address(s_offRamp)); Internal.Any2EVMRampMessage memory message = @@ -1121,16 +1135,16 @@ contract OffRamp_executeSingleMessage is OffRampSetup { // Setup the receiver to a non-CCIP Receiver, which will skip the Router call (but should still perform the validation) MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); message.receiver = address(newReceiver); - message.header.messageId = Internal._hash(message, ON_RAMP_ADDRESS_1); + message.header.messageId = _hashMessage(message, ON_RAMP_ADDRESS_1); - s_inboundMessageValidator.setMessageIdValidationState(message.header.messageId, true); + s_inboundMessageInterceptor.setMessageIdValidationState(message.header.messageId, true); vm.expectRevert( abi.encodeWithSelector( IMessageInterceptor.MessageValidationError.selector, abi.encodeWithSelector(IMessageInterceptor.MessageValidationError.selector, bytes("Invalid message")) ) ); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } } @@ -1149,12 +1163,14 @@ contract OffRamp_batchExecute is OffRampSetup { uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1176,16 +1192,15 @@ contract OffRamp_batchExecute is OffRampSetup { uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages1[0].sender); vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); - assertExecutionStateChangedEventLogs( logs, messages1[0].header.sourceChainSelector, messages1[0].header.sequenceNumber, messages1[0].header.messageId, - Internal._hash(messages1[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1195,7 +1210,7 @@ contract OffRamp_batchExecute is OffRampSetup { messages1[1].header.sourceChainSelector, messages1[1].header.sequenceNumber, messages1[1].header.messageId, - Internal._hash(messages1[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1205,7 +1220,7 @@ contract OffRamp_batchExecute is OffRampSetup { messages2[0].header.sourceChainSelector, messages2[0].header.sequenceNumber, messages2[0].header.messageId, - Internal._hash(messages2[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages2[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1227,7 +1242,7 @@ contract OffRamp_batchExecute is OffRampSetup { vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1236,7 +1251,7 @@ contract OffRamp_batchExecute is OffRampSetup { messages1[0].header.sourceChainSelector, messages1[0].header.sequenceNumber, messages1[0].header.messageId, - Internal._hash(messages1[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1246,7 +1261,7 @@ contract OffRamp_batchExecute is OffRampSetup { messages1[1].header.sourceChainSelector, messages1[1].header.sequenceNumber, messages1[1].header.messageId, - Internal._hash(messages1[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1256,7 +1271,7 @@ contract OffRamp_batchExecute is OffRampSetup { messages2[0].header.sourceChainSelector, messages2[0].header.sequenceNumber, messages2[0].header.messageId, - Internal._hash(messages2[0], ON_RAMP_ADDRESS_3), + _hashMessage(messages2[0], ON_RAMP_ADDRESS_3), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1288,7 +1303,7 @@ contract OffRamp_batchExecute is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedReportExecution(SOURCE_CHAIN_SELECTOR_1); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1302,7 +1317,7 @@ contract OffRamp_batchExecute is OffRampSetup { assertEq(logSourceChainSelector, messages2[0].header.sourceChainSelector); assertEq(logSequenceNumber, messages2[0].header.sequenceNumber); assertEq(logMessageId, messages2[0].header.messageId); - assertEq(logMessageHash, Internal._hash(messages2[0], ON_RAMP_ADDRESS_3)); + assertEq(logMessageHash, _hashMessage(messages2[0], ON_RAMP_ADDRESS_3)); assertEq(logState, uint8(Internal.MessageExecutionState.SUCCESS)); } } @@ -1320,12 +1335,12 @@ contract OffRamp_batchExecute is OffRampSetup { emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1339,7 +1354,7 @@ contract OffRamp_batchExecute is OffRampSetup { _generateBatchReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[][](1) + new OffRamp.GasLimitOverride[][](1) ); _setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, false); @@ -1349,7 +1364,7 @@ contract OffRamp_batchExecute is OffRampSetup { _generateBatchReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[][](1) + new OffRamp.GasLimitOverride[][](1) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); @@ -1358,7 +1373,7 @@ contract OffRamp_batchExecute is OffRampSetup { // Reverts function test_ZeroReports_Revert() public { vm.expectRevert(OffRamp.EmptyReport.selector); - s_offRamp.batchExecute(new Internal.ExecutionReportSingleChain[](0), new uint256[][](1)); + s_offRamp.batchExecute(new Internal.ExecutionReportSingleChain[](0), new OffRamp.GasLimitOverride[][](1)); } function test_OutOfBoundsGasLimitsAccess_Revert() public { @@ -1374,7 +1389,7 @@ contract OffRamp_batchExecute is OffRampSetup { reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages2); vm.expectRevert(); - s_offRamp.batchExecute(reports, new uint256[][](1)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](1)); } } @@ -1391,13 +1406,15 @@ contract OffRamp_manuallyExecute is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](1); - gasLimitOverrides[0] = new uint256[](messages.length); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](messages.length); vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); @@ -1405,7 +1422,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1415,21 +1432,23 @@ contract OffRamp_manuallyExecute is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0][0] += 1; + gasLimitOverrides[0][0].receiverExecutionGasLimit += 1; vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1439,7 +1458,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); assertEq( messages[0].header.nonce - 1, s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender) @@ -1447,7 +1466,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { s_reverting_receiver.setRevert(true); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); vm.recordLogs(); @@ -1456,7 +1475,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( OffRamp.ReceiverError.selector, abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, "") @@ -1475,33 +1494,33 @@ contract OffRamp_manuallyExecute is OffRampSetup { for (uint64 i = 0; i < 3; ++i) { messages1[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); messages1[i].receiver = address(s_reverting_receiver); - messages1[i].header.messageId = Internal._hash(messages1[i], ON_RAMP_ADDRESS_1); + messages1[i].header.messageId = _hashMessage(messages1[i], ON_RAMP_ADDRESS_1); } for (uint64 i = 0; i < 2; ++i) { messages2[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3, i + 1); messages2[i].receiver = address(s_reverting_receiver); - messages2[i].header.messageId = Internal._hash(messages2[i], ON_RAMP_ADDRESS_3); + messages2[i].header.messageId = _hashMessage(messages2[i], ON_RAMP_ADDRESS_3); } Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); for (uint256 i = 0; i < 3; ++i) { - gasLimitOverrides[0][i] += 1; + gasLimitOverrides[0][i].receiverExecutionGasLimit += 1; } for (uint256 i = 0; i < 2; ++i) { - gasLimitOverrides[1][i] += 1; + gasLimitOverrides[1][i].receiverExecutionGasLimit += 1; } vm.recordLogs(); @@ -1515,7 +1534,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages1[j].header.sequenceNumber, messages1[j].header.messageId, - Internal._hash(messages1[j], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[j], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1527,7 +1546,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_3, messages2[k].header.sequenceNumber, messages2[k].header.messageId, - Internal._hash(messages2[k], ON_RAMP_ADDRESS_3), + _hashMessage(messages2[k], ON_RAMP_ADDRESS_3), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1542,10 +1561,12 @@ contract OffRamp_manuallyExecute is OffRampSetup { } messages[1].receiver = address(s_reverting_receiver); - messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); + messages[1].header.messageId = _hashMessage(messages[1], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1554,7 +1575,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1564,7 +1585,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[1].header.sequenceNumber, messages[1].header.messageId, - Internal._hash(messages[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( OffRamp.ReceiverError.selector, @@ -1577,7 +1598,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[2].header.sequenceNumber, messages[2].header.messageId, - Internal._hash(messages[2], ON_RAMP_ADDRESS_1), + _hashMessage(messages[2], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1588,9 +1609,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { Internal.Any2EVMRampMessage[] memory newMessages = new Internal.Any2EVMRampMessage[](1); newMessages[0] = messages[1]; - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(newMessages); - gasLimitOverrides[0][0] += 1; + gasLimitOverrides[0][0].receiverExecutionGasLimit += 1; vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, newMessages), gasLimitOverrides); @@ -1598,7 +1619,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1609,22 +1630,24 @@ contract OffRamp_manuallyExecute is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].gasLimit = 1; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector(OffRamp.ReceiverError.selector, "") ); - uint256[][] memory gasLimitOverrides = new uint256[][](1); - gasLimitOverrides[0] = new uint256[](1); - gasLimitOverrides[0][0] = 100_000; + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](1); + gasLimitOverrides[0][0].receiverExecutionGasLimit = 100_000; vm.expectEmit(); emit ConformingReceiver.MessageReceived(); @@ -1635,7 +1658,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1654,7 +1677,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { vm.chainId(chain2); vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.ForkedChain.selector, chain1, chain2)); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); s_offRamp.manuallyExecute(reports, gasLimitOverrides); @@ -1670,22 +1693,22 @@ contract OffRamp_manuallyExecute is OffRampSetup { // No overrides for report vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](0)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](0)); // No messages - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1 message missing - gasLimitOverrides[0] = new uint256[](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1 message in excess - gasLimitOverrides[0] = new uint256[](3); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](3); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); @@ -1704,47 +1727,99 @@ contract OffRamp_manuallyExecute is OffRampSetup { reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](0)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](0)); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](1)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](1)); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 2nd report empty - gasLimitOverrides[0] = new uint256[](2); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1st report empty - gasLimitOverrides[0] = new uint256[](0); - gasLimitOverrides[1] = new uint256[](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](0); + gasLimitOverrides[1] = new OffRamp.GasLimitOverride[](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1st report oversized - gasLimitOverrides[0] = new uint256[](3); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](3); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); } - function test_ManualExecInvalidGasLimit_Revert() public { + function test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() public { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + gasLimitOverrides[0][0].receiverExecutionGasLimit--; + + vm.expectRevert( + abi.encodeWithSelector( + OffRamp.InvalidManualExecutionGasLimit.selector, + SOURCE_CHAIN_SELECTOR_1, + messages[0].header.messageId, + gasLimitOverrides[0][0].receiverExecutionGasLimit + ) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + } + + function test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() public { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1000; + amounts[1] = 1000; + Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](1); + messages[0] = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); + + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + // empty tokenGasOverride array provided + vm.expectRevert( + abi.encodeWithSelector(OffRamp.ManualExecutionGasAmountCountMismatch.selector, messages[0].header.messageId, 1) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + + //trying with excesss elements tokenGasOverride array provided + gasLimitOverrides[0][0].tokenGasOverrides = new uint32[](3); + vm.expectRevert( + abi.encodeWithSelector(OffRamp.ManualExecutionGasAmountCountMismatch.selector, messages[0].header.messageId, 1) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + } + + function test_manuallyExecute_InvalidTokenGasOverride_Revert() public { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1000; + amounts[1] = 1000; + Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](1); + messages[0] = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); + + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0][0]--; + uint32[] memory tokenGasOverrides = new uint32[](2); + tokenGasOverrides[0] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD; + tokenGasOverrides[1] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD - 1; //invalid token gas override value + gasLimitOverrides[0][0].tokenGasOverrides = tokenGasOverrides; vm.expectRevert( abi.encodeWithSelector( - OffRamp.InvalidManualExecutionGasLimit.selector, SOURCE_CHAIN_SELECTOR_1, 0, gasLimitOverrides[0][0] + OffRamp.InvalidManualExecutionTokenGasOverride.selector, + messages[0].header.messageId, + 1, + DEFAULT_TOKEN_DEST_GAS_OVERHEAD, + tokenGasOverrides[1] ) ); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); @@ -1755,13 +1830,15 @@ contract OffRamp_manuallyExecute is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(true); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); vm.expectRevert( @@ -1791,26 +1868,27 @@ contract OffRamp_manuallyExecute is OffRampSetup { // send the message that they want to replay. Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - messages[0].tokenAmounts = new Internal.RampTokenAmount[](1); - messages[0].tokenAmounts[0] = Internal.RampTokenAmount({ + messages[0].tokenAmounts = new Internal.Any2EVMTokenTransfer[](1); + messages[0].tokenAmounts[0] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[s_sourceFeeToken]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[s_sourceFeeToken]), + destTokenAddress: s_destTokenBySourceToken[s_sourceFeeToken], extraData: "", amount: tokenAmount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS }); messages[0].receiver = address(receiver); - messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); + messages[0].header.messageId = _hashMessage(messages[0], ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); // sets the report to be repeated on the ReentrancyAbuser to be able to replay receiver.setPayload(report); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + gasLimitOverrides[0][0].tokenGasOverrides = new uint32[](messages[0].tokenAmounts.length); // The first entry should be fine and triggers the second entry which is skipped. Due to the reentrancy // the second completes first, so we expect the skip event before the success event. @@ -1825,7 +1903,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1841,20 +1919,20 @@ contract OffRamp_manuallyExecute is OffRampSetup { for (uint64 i = 0; i < 3; ++i) { messages1[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); messages1[i].receiver = address(s_reverting_receiver); - messages1[i].header.messageId = Internal._hash(messages1[i], ON_RAMP_ADDRESS_1); + messages1[i].header.messageId = _hashMessage(messages1[i], ON_RAMP_ADDRESS_1); } for (uint64 i = 0; i < 2; ++i) { messages2[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3, i + 1); messages2[i].receiver = address(s_reverting_receiver); - messages2[i].header.messageId = Internal._hash(messages2[i], ON_RAMP_ADDRESS_3); + messages2[i].header.messageId = _hashMessage(messages2[i], ON_RAMP_ADDRESS_3); } Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); @@ -1864,6 +1942,28 @@ contract OffRamp_manuallyExecute is OffRampSetup { s_offRamp.manuallyExecute(reports, gasLimitOverrides); } + + function test_manuallyExecute_SourceChainSelectorMismatch_Revert() public { + Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](1); + Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1); + messages1[0] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); + messages2[0] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); + + Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); + reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); + reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); + + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); + gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); + + vm.expectRevert( + abi.encodeWithSelector( + OffRamp.SourceChainSelectorMismatch.selector, SOURCE_CHAIN_SELECTOR_3, SOURCE_CHAIN_SELECTOR_1 + ) + ); + s_offRamp.manuallyExecute(reports, gasLimitOverrides); + } } contract OffRamp_execute is OffRampSetup { @@ -1893,7 +1993,7 @@ contract OffRamp_execute is OffRampSetup { SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, messages[0].header.messageId, - Internal._hash(messages[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1926,7 +2026,7 @@ contract OffRamp_execute is OffRampSetup { messages1[0].header.sourceChainSelector, messages1[0].header.sequenceNumber, messages1[0].header.messageId, - Internal._hash(messages1[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1936,7 +2036,7 @@ contract OffRamp_execute is OffRampSetup { messages1[1].header.sourceChainSelector, messages1[1].header.sequenceNumber, messages1[1].header.messageId, - Internal._hash(messages1[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1946,7 +2046,7 @@ contract OffRamp_execute is OffRampSetup { messages2[0].header.sourceChainSelector, messages2[0].header.sequenceNumber, messages2[0].header.messageId, - Internal._hash(messages2[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages2[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1980,7 +2080,7 @@ contract OffRamp_execute is OffRampSetup { reports[i].messages[j].header.sourceChainSelector, reports[i].messages[j].header.sequenceNumber, reports[i].messages[j].header.messageId, - Internal._hash(reports[i].messages[j], ON_RAMP_ADDRESS_1), + _hashMessage(reports[i].messages[j], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -1989,7 +2089,7 @@ contract OffRamp_execute is OffRampSetup { } function test_MultipleReportsWithPartialValidationFailures_Success() public { - _enableInboundMessageValidator(); + _enableInboundMessageInterceptor(); Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2); Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1); @@ -2002,8 +2102,8 @@ contract OffRamp_execute is OffRampSetup { reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages2); - s_inboundMessageValidator.setMessageIdValidationState(messages1[0].header.messageId, true); - s_inboundMessageValidator.setMessageIdValidationState(messages2[0].header.messageId, true); + s_inboundMessageInterceptor.setMessageIdValidationState(messages1[0].header.messageId, true); + s_inboundMessageInterceptor.setMessageIdValidationState(messages2[0].header.messageId, true); vm.expectEmit(); emit MultiOCR3Base.Transmitted( @@ -2020,7 +2120,7 @@ contract OffRamp_execute is OffRampSetup { messages1[0].header.sourceChainSelector, messages1[0].header.sequenceNumber, messages1[0].header.messageId, - Internal._hash(messages1[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( IMessageInterceptor.MessageValidationError.selector, @@ -2033,7 +2133,7 @@ contract OffRamp_execute is OffRampSetup { messages1[1].header.sourceChainSelector, messages1[1].header.sequenceNumber, messages1[1].header.messageId, - Internal._hash(messages1[1], ON_RAMP_ADDRESS_1), + _hashMessage(messages1[1], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.SUCCESS, "" ); @@ -2043,7 +2143,7 @@ contract OffRamp_execute is OffRampSetup { messages2[0].header.sourceChainSelector, messages2[0].header.sequenceNumber, messages2[0].header.messageId, - Internal._hash(messages2[0], ON_RAMP_ADDRESS_1), + _hashMessage(messages2[0], ON_RAMP_ADDRESS_1), Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( IMessageInterceptor.MessageValidationError.selector, @@ -2091,8 +2191,8 @@ contract OffRamp_execute is OffRampSetup { ocrPluginType: uint8(Internal.OCRPluginType.Commit), configDigest: s_configDigestCommit, F: s_F, - isSignatureVerificationEnabled: false, - signers: s_emptySigners, + isSignatureVerificationEnabled: true, + signers: s_validSigners, transmitters: s_validTransmitters }); s_offRamp.setOCR3Configs(ocrConfigs); @@ -2145,7 +2245,7 @@ contract OffRamp_execute is OffRampSetup { function test_IncorrectArrayType_Revert() public { bytes32[3] memory reportContext = [s_configDigestExec, s_configDigestExec, s_configDigestExec]; - uint256[] memory wrongData = new uint256[](1); + uint256[] memory wrongData = new uint256[](2); wrongData[0] = 1; vm.startPrank(s_validTransmitters[0]); @@ -2335,7 +2435,7 @@ contract OffRamp_trialExecute is OffRampSetup { uint256 startingBalance = dstToken0.balanceOf(message.receiver); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.SUCCESS), uint256(newState)); assertEq("", err); @@ -2358,7 +2458,7 @@ contract OffRamp_trialExecute is OffRampSetup { s_maybeRevertingPool.setShouldRevert(errorMessage); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage), err); @@ -2378,7 +2478,7 @@ contract OffRamp_trialExecute is OffRampSetup { s_maybeRevertingPool.setShouldRevert(errorMessage); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage), err); } @@ -2392,7 +2492,7 @@ contract OffRamp_trialExecute is OffRampSetup { // Happy path, pool is correct (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.SUCCESS), uint256(newState)); assertEq("", err); @@ -2400,42 +2500,42 @@ contract OffRamp_trialExecute is OffRampSetup { // address 0 has no contract assertEq(address(0).code.length, 0); - message.tokenAmounts[0] = Internal.RampTokenAmount({ + message.tokenAmounts[0] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(address(0)), - destTokenAddress: abi.encode(address(0)), + destTokenAddress: address(0), extraData: "", amount: message.tokenAmounts[0].amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); - message.header.messageId = Internal._hash(message, ON_RAMP_ADDRESS_1); + message.header.messageId = _hashMessage(message, ON_RAMP_ADDRESS_1); // Unhappy path, no revert but marked as failed. - (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); - assertEq(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, abi.encode(address(0))), err); + assertEq(abi.encodeWithSelector(OffRamp.NotACompatiblePool.selector, address(0)), err); address notAContract = makeAddr("not_a_contract"); - message.tokenAmounts[0] = Internal.RampTokenAmount({ + message.tokenAmounts[0] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(address(0)), - destTokenAddress: abi.encode(notAContract), + destTokenAddress: notAContract, extraData: "", amount: message.tokenAmounts[0].amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); - message.header.messageId = Internal._hash(message, ON_RAMP_ADDRESS_1); + message.header.messageId = _hashMessage(message, ON_RAMP_ADDRESS_1); - (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.NotACompatiblePool.selector, address(0)), err); } } -contract OffRamp__releaseOrMintSingleToken is OffRampSetup { +contract OffRamp_releaseOrMintSingleToken is OffRampSetup { function setUp() public virtual override { super.setUp(); _setupMultipleOffRamps(); @@ -2450,12 +2550,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { IERC20 dstToken1 = IERC20(s_destTokenBySourceToken[token]); uint256 startingBalance = dstToken1.balanceOf(OWNER); - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[token]), + destTokenAddress: s_destTokenBySourceToken[token], extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); vm.expectCall( @@ -2484,12 +2584,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { uint256 amount = 123123; address token = s_sourceTokens[0]; - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[token]), + destTokenAddress: s_destTokenBySourceToken[token], extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); // Mock the call so returns 2 slots of data @@ -2506,12 +2606,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { uint256 amount = 123123; address token = s_sourceTokens[0]; - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[token]), + destTokenAddress: s_destTokenBySourceToken[token], extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); bytes memory revertData = "failed to balanceOf"; @@ -2531,12 +2631,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { address token = s_sourceTokens[0]; uint256 mockedStaticBalance = 50000; - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[token]), + destTokenAddress: s_destTokenBySourceToken[token], extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); vm.mockCall( @@ -2559,12 +2659,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { address token = s_sourceTokens[0]; uint256 mockedStaticBalance = 50000; - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[token]), + destTokenAddress: s_destTokenBySourceToken[token], extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); // This should make the call fail if it does not skip the check @@ -2587,12 +2687,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { bytes memory originalSender = abi.encode(OWNER); bytes memory offchainTokenData = abi.encode(keccak256("offchainTokenData")); - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(destToken), + destTokenAddress: destToken, extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); // Address(0) should always revert @@ -2630,12 +2730,12 @@ contract OffRamp__releaseOrMintSingleToken is OffRampSetup { bytes memory originalSender = abi.encode(OWNER); bytes memory offchainTokenData = abi.encode(keccak256("offchainTokenData")); - Internal.RampTokenAmount memory tokenAmount = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer memory tokenAmount = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]), - destTokenAddress: abi.encode(destToken), + destTokenAddress: destToken, extraData: "", amount: amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); bytes memory revertData = "call reverted :o"; @@ -2665,7 +2765,43 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); offchainTokenData[0] = abi.encode(0x12345678); - Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + + vm.expectCall( + s_destPoolBySourceToken[srcTokenAmounts[0].token], + abi.encodeWithSelector( + LockReleaseTokenPool.releaseOrMint.selector, + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: OWNER, + amount: srcTokenAmounts[0].amount, + localToken: s_destTokenBySourceToken[srcTokenAmounts[0].token], + remoteChainSelector: SOURCE_CHAIN_SELECTOR_1, + sourcePoolAddress: sourceTokenAmounts[0].sourcePoolAddress, + sourcePoolData: sourceTokenAmounts[0].extraData, + offchainTokenData: offchainTokenData[0] + }) + ) + ); + + s_offRamp.releaseOrMintTokens( + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) + ); + + assertEq(startingBalance + amount1, dstToken1.balanceOf(OWNER)); + } + + function test_releaseOrMintTokens_WithGasOverride_Success() public { + Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts(); + IERC20 dstToken1 = IERC20(s_destFeeToken); + uint256 startingBalance = dstToken1.balanceOf(OWNER); + uint256 amount1 = 100; + srcTokenAmounts[0].amount = amount1; + + bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); + offchainTokenData[0] = abi.encode(0x12345678); + + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); vm.expectCall( s_destPoolBySourceToken[srcTokenAmounts[0].token], @@ -2684,8 +2820,12 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { ) ); + uint32[] memory gasOverrides = new uint32[](sourceTokenAmounts.length); + for (uint256 i = 0; i < gasOverrides.length; i++) { + gasOverrides[i] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; + } s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, gasOverrides ); assertEq(startingBalance + amount1, dstToken1.balanceOf(OWNER)); @@ -2699,7 +2839,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); - Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); address pool = s_destPoolBySourceToken[srcTokenAmounts[1].token]; address destToken = s_destTokenBySourceToken[srcTokenAmounts[1].token]; @@ -2707,7 +2847,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { MaybeRevertingBurnMintTokenPool(pool).setReleaseOrMintMultiplier(destinationDenominationMultiplier); Client.EVMTokenAmount[] memory destTokenAmounts = s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) ); assertEq(destTokenAmounts[1].amount, amount * destinationDenominationMultiplier); assertEq(destTokenAmounts[1].token, destToken); @@ -2728,7 +2868,8 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, - new bytes[](srcTokenAmounts.length) + new bytes[](srcTokenAmounts.length), + new uint32[](0) ); } @@ -2738,7 +2879,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { srcTokenAmounts[0].amount = amount; bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); - Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); vm.mockCall( s_destPoolBySourceToken[srcTokenAmounts[0].token], @@ -2762,23 +2903,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.InvalidDataLength.selector, Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES, 64)); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData - ); - } - - function test_releaseOrMintTokens_InvalidEVMAddress_Revert() public { - Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts(); - - bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); - Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); - bytes memory wrongAddress = abi.encode(address(1000), address(10000), address(10000)); - - sourceTokenAmounts[0].destTokenAddress = wrongAddress; - - vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, wrongAddress)); - - s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) ); } @@ -2786,17 +2911,19 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { // The offRamp is a contract, but not a pool address fakePoolAddress = address(s_offRamp); - Internal.RampTokenAmount[] memory sourceTokenAmounts = new Internal.RampTokenAmount[](1); - sourceTokenAmounts[0] = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = new Internal.Any2EVMTokenTransfer[](1); + sourceTokenAmounts[0] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(fakePoolAddress), - destTokenAddress: abi.encode(s_offRamp), + destTokenAddress: address(s_offRamp), extraData: "", amount: 1, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); vm.expectRevert(abi.encodeWithSelector(OffRamp.NotACompatiblePool.selector, address(0))); - s_offRamp.releaseOrMintTokens(sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1)); + s_offRamp.releaseOrMintTokens( + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1), new uint32[](0) + ); } function test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() public { @@ -2807,7 +2934,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); offchainTokenData[0] = abi.encode(0x12345678); - Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); vm.expectCall( s_destPoolBySourceToken[srcTokenAmounts[0].token], @@ -2827,29 +2954,29 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { ); vm.expectRevert(); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_3, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_3, offchainTokenData, new uint32[](0) ); } /// forge-config: default.fuzz.runs = 32 /// forge-config: ccip.fuzz.runs = 1024 // Uint256 gives a good range of values to test, both inside and outside of the eth address space. - function test_Fuzz__releaseOrMintTokens_AnyRevertIsCaught_Success(uint256 destPool) public { + function test_Fuzz__releaseOrMintTokens_AnyRevertIsCaught_Success(address destPool) public { // Input 447301751254033913445893214690834296930546521452, which is 0x4E59B44847B379578588920CA78FBF26C0B4956C // triggers some Create2Deployer and causes it to fail - vm.assume(destPool != 447301751254033913445893214690834296930546521452); + vm.assume(destPool != 0x4e59b44847b379578588920cA78FbF26c0B4956C); bytes memory unusedVar = abi.encode(makeAddr("unused")); - Internal.RampTokenAmount[] memory sourceTokenAmounts = new Internal.RampTokenAmount[](1); - sourceTokenAmounts[0] = Internal.RampTokenAmount({ + Internal.Any2EVMTokenTransfer[] memory sourceTokenAmounts = new Internal.Any2EVMTokenTransfer[](1); + sourceTokenAmounts[0] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: unusedVar, - destTokenAddress: abi.encode(destPool), + destTokenAddress: destPool, extraData: unusedVar, amount: 1, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); try s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1) + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1), new uint32[](0) ) {} catch (bytes memory reason) { // Any revert should be a TokenHandlingError, InvalidEVMAddress, InvalidDataLength or NoContract as those are caught by the offramp assertTrue( @@ -2860,7 +2987,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { "Expected TokenHandlingError or InvalidEVMAddress" ); - if (destPool > type(uint160).max) { + if (uint160(destPool) > type(uint160).max) { assertEq(reason, abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, abi.encode(destPool))); } } @@ -3027,6 +3154,27 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { ); } + function test_ReplaceExistingChainOnRamp_Success() public { + OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1); + sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({ + router: s_destRouter, + sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRamp: ON_RAMP_ADDRESS_1, + isEnabled: true + }); + + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); + + sourceChainConfigs[0].onRamp = ON_RAMP_ADDRESS_2; + + vm.expectEmit(); + emit OffRamp.SourceChainConfigSet( + SOURCE_CHAIN_SELECTOR_1, + OffRamp.SourceChainConfig({router: s_destRouter, isEnabled: true, minSeqNr: 1, onRamp: ON_RAMP_ADDRESS_2}) + ); + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); + } + // Reverts function test_ZeroOnRampAddress_Revert() public { @@ -3040,6 +3188,10 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); + + sourceChainConfigs[0].onRamp = abi.encode(address(0)); + vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector); + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } function test_RouterAddress_Revert() public { @@ -3068,7 +3220,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - function test_ReplaceExistingChainOnRamp_Revert() public { + function test_InvalidOnRampUpdate_Revert() public { OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, @@ -3079,9 +3231,31 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); + Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); + roots[0] = Internal.MerkleRoot({ + sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, + minSeqNr: 1, + maxSeqNr: 2, + merkleRoot: "test #2" + }); + + _commit( + OffRamp.CommitReport({ + priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 + }), + s_latestSequenceNumber + ); + + vm.stopPrank(); + vm.startPrank(OWNER); + sourceChainConfigs[0].onRamp = ON_RAMP_ADDRESS_2; - vm.expectRevert(abi.encodeWithSelector(OffRamp.InvalidStaticConfig.selector, SOURCE_CHAIN_SELECTOR_1)); + vm.expectRevert(abi.encodeWithSelector(OffRamp.InvalidOnRampUpdate.selector, SOURCE_CHAIN_SELECTOR_1)); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } } @@ -3100,7 +3274,7 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = _constructCommitReport(); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport); + emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -3118,17 +3292,21 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: max1, - merkleRoot: root, - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: root }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 + }); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport); + emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -3147,16 +3325,20 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: maxSeq, - merkleRoot: "stale report 1", - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: "stale report 1" + }); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport); + emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -3171,7 +3353,7 @@ contract OffRamp_commit is OffRampSetup { commitReport.merkleRoots[0].merkleRoot = "stale report 2"; vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport); + emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -3191,7 +3373,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectEmit(); @@ -3213,7 +3396,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectEmit(); @@ -3231,7 +3415,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectEmit(); @@ -3283,7 +3468,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, tokenPrice1), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectEmit(); @@ -3298,16 +3484,16 @@ contract OffRamp_commit is OffRampSetup { roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: maxSeq, - merkleRoot: "stale report", - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: "stale report" }); commitReport.priceUpdates = _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, tokenPrice2); commitReport.merkleRoots = roots; vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport); + emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -3373,26 +3559,6 @@ contract OffRamp_commit is OffRampSetup { s_offRamp.commit(reportContext, abi.encode(commitReport), rs, ss, rawVs); } - function test_WrongConfigWithoutSigners_Revert() public { - _redeployOffRampWithNoOCRConfigs(); - - OffRamp.CommitReport memory commitReport = _constructCommitReport(); - - MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); - ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ - ocrPluginType: uint8(Internal.OCRPluginType.Commit), - configDigest: s_configDigestCommit, - F: s_F, - isSignatureVerificationEnabled: false, - signers: s_emptySigners, - transmitters: s_validTransmitters - }); - s_offRamp.setOCR3Configs(ocrConfigs); - - vm.expectRevert(); - _commit(commitReport, s_latestSequenceNumber); - } - function test_FailedRMNVerification_Reverts() public { // force RMN verification to fail vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes("")); @@ -3413,8 +3579,12 @@ contract OffRamp_commit is OffRampSetup { onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 + }); vm.expectRevert(abi.encodeWithSelector(OffRamp.CursedByRMN.selector, roots[0].sourceChainSelector)); _commit(commitReport, s_latestSequenceNumber); @@ -3424,13 +3594,17 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: 4, - merkleRoot: bytes32(0), - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: bytes32(0) + }); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); vm.expectRevert(OffRamp.InvalidRoot.selector); _commit(commitReport, s_latestSequenceNumber); @@ -3440,13 +3614,17 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 2, maxSeqNr: 2, - merkleRoot: bytes32(0), - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: bytes32(0) + }); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); vm.expectRevert( abi.encodeWithSelector( @@ -3461,13 +3639,17 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: 0, - merkleRoot: bytes32(0), - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: bytes32(0) + }); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); vm.expectRevert( abi.encodeWithSelector( @@ -3482,7 +3664,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectRevert(OffRamp.StaleCommitReport.selector); @@ -3494,7 +3677,8 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); vm.expectEmit(); @@ -3509,14 +3693,18 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: 0, + onRampAddress: abi.encode(ON_RAMP_ADDRESS_1), minSeqNr: 1, maxSeqNr: 2, - merkleRoot: "Only a single root", - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: "Only a single root" }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 + }); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, 0)); _commit(commitReport, s_latestSequenceNumber); @@ -3526,13 +3714,17 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: 2, - merkleRoot: "Only a single root", - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: "Only a single root" + }); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + merkleRoots: roots, + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); _commit(commitReport, s_latestSequenceNumber); commitReport.merkleRoots[0].minSeqNr = 3; @@ -3544,20 +3736,58 @@ contract OffRamp_commit is OffRampSetup { _commit(commitReport, ++s_latestSequenceNumber); } + function test_CommitOnRampMismatch_Revert() public { + OffRamp.CommitReport memory commitReport = _constructCommitReport(); + + commitReport.merkleRoots[0].onRampAddress = ON_RAMP_ADDRESS_2; + + vm.expectRevert(abi.encodeWithSelector(OffRamp.CommitOnRampMismatch.selector, ON_RAMP_ADDRESS_2, ON_RAMP_ADDRESS_1)); + _commit(commitReport, s_latestSequenceNumber); + } + function _constructCommitReport() internal view returns (OffRamp.CommitReport memory) { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + onRampAddress: ON_RAMP_ADDRESS_1, minSeqNr: 1, maxSeqNr: s_maxInterval, - merkleRoot: "test #2", - onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) + merkleRoot: "test #2" }); return OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), merkleRoots: roots, - rmnSignatures: s_rmnSignatures + rmnSignatures: s_rmnSignatures, + rmnRawVs: 0 + }); + } +} + +contract OffRamp_afterOC3ConfigSet is OffRampSetup { + function test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() public { + s_offRamp = new OffRampHelper( + OffRamp.StaticConfig({ + chainSelector: DEST_CHAIN_SELECTOR, + rmn: s_mockRMNRemote, + tokenAdminRegistry: address(s_tokenAdminRegistry), + nonceManager: address(s_inboundNonceManager) + }), + _generateDynamicOffRampConfig(address(s_feeQuoter)), + new OffRamp.SourceChainConfigArgs[](0) + ); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: uint8(Internal.OCRPluginType.Commit), + configDigest: s_configDigestCommit, + F: s_F, + isSignatureVerificationEnabled: false, + signers: s_validSigners, + transmitters: s_validTransmitters }); + + vm.expectRevert(OffRamp.SignatureVerificationDisabled.selector); + s_offRamp.setOCR3Configs(ocrConfigs); } } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol index 2d65ee735ca..6b18992f699 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.24; import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; import {ICommitStore} from "../../interfaces/ICommitStore.sol"; -import {IRMN} from "../../interfaces/IRMN.sol"; import {IRMNV2} from "../../interfaces/IRMNV2.sol"; import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol"; @@ -16,7 +15,6 @@ import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; import {EVM2EVMOffRamp} from "../../offRamp/EVM2EVMOffRamp.sol"; import {OffRamp} from "../../offRamp/OffRamp.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; - import {FeeQuoterSetup} from "../feeQuoter/FeeQuoterSetup.t.sol"; import {EVM2EVMOffRampHelper} from "../helpers/EVM2EVMOffRampHelper.sol"; import {MaybeRevertingBurnMintTokenPool} from "../helpers/MaybeRevertingBurnMintTokenPool.sol"; @@ -44,7 +42,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { MaybeRevertingBurnMintTokenPool internal s_maybeRevertingPool; OffRampHelper internal s_offRamp; - MessageInterceptorHelper internal s_inboundMessageValidator; + MessageInterceptorHelper internal s_inboundMessageInterceptor; NonceManager internal s_inboundNonceManager; RMN internal s_realRMN; address internal s_sourceTokenPool = makeAddr("sourceTokenPool"); @@ -62,7 +60,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { FeeQuoterSetup.setUp(); MultiOCR3BaseSetup.setUp(); - s_inboundMessageValidator = new MessageInterceptorHelper(); + s_inboundMessageInterceptor = new MessageInterceptorHelper(); s_receiver = new MaybeRevertMessageReceiver(false); s_secondary_receiver = new MaybeRevertMessageReceiver(false); s_reverting_receiver = new MaybeRevertMessageReceiver(true); @@ -229,9 +227,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { return OffRamp.DynamicConfig({ permissionLessExecutionThresholdSeconds: PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS, feeQuoter: feeQuoter, - messageValidator: address(0), - maxPoolReleaseOrMintGas: MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS, - maxTokenTransferGas: MAX_TOKEN_POOL_TRANSFER_GAS + messageInterceptor: address(0) }); } @@ -242,9 +238,9 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](numberOfTokens); for (uint256 i = 0; i < numberOfTokens; ++i) { - Internal.RampTokenAmount memory tokenAmount = original.tokenAmounts[i]; + Internal.Any2EVMTokenTransfer memory tokenAmount = original.tokenAmounts[i]; - address destPoolAddress = abi.decode(tokenAmount.destTokenAddress, (address)); + address destPoolAddress = tokenAmount.destTokenAddress; TokenPool pool = TokenPool(destPoolAddress); destTokenAmounts[i].token = address(pool.getToken()); destTokenAmounts[i].amount = tokenAmount.amount; @@ -289,16 +285,17 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { ) internal view returns (Internal.Any2EVMRampMessage memory) { bytes memory data = abi.encode(0); - Internal.RampTokenAmount[] memory rampTokenAmounts = new Internal.RampTokenAmount[](tokenAmounts.length); + Internal.Any2EVMTokenTransfer[] memory any2EVMTokenTransfer = + new Internal.Any2EVMTokenTransfer[](tokenAmounts.length); // Correctly set the TokenDataPayload for each token. Tokens have to be set up in the TokenSetup. for (uint256 i = 0; i < tokenAmounts.length; ++i) { - rampTokenAmounts[i] = Internal.RampTokenAmount({ + any2EVMTokenTransfer[i] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[tokenAmounts[i].token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[tokenAmounts[i].token]), + destTokenAddress: s_destTokenBySourceToken[tokenAmounts[i].token], extraData: "", amount: tokenAmounts[i].amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); } @@ -313,11 +310,11 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { sender: abi.encode(OWNER), data: data, receiver: address(s_receiver), - tokenAmounts: rampTokenAmounts, + tokenAmounts: any2EVMTokenTransfer, gasLimit: GAS_LIMIT }); - message.header.messageId = Internal._hash(message, onRamp); + message.header.messageId = _hashMessage(message, onRamp); return message; } @@ -375,10 +372,10 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { function _getGasLimitsFromMessages( Internal.Any2EVMRampMessage[] memory messages - ) internal pure returns (uint256[] memory) { - uint256[] memory gasLimits = new uint256[](messages.length); + ) internal pure returns (OffRamp.GasLimitOverride[] memory) { + OffRamp.GasLimitOverride[] memory gasLimits = new OffRamp.GasLimitOverride[](messages.length); for (uint256 i = 0; i < messages.length; ++i) { - gasLimits[i] = messages[i].gasLimit; + gasLimits[i].receiverExecutionGasLimit = messages[i].gasLimit; } return gasLimits; @@ -386,9 +383,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { function _assertSameConfig(OffRamp.DynamicConfig memory a, OffRamp.DynamicConfig memory b) public pure { assertEq(a.permissionLessExecutionThresholdSeconds, b.permissionLessExecutionThresholdSeconds); - assertEq(a.maxPoolReleaseOrMintGas, b.maxPoolReleaseOrMintGas); - assertEq(a.maxTokenTransferGas, b.maxTokenTransferGas); - assertEq(a.messageValidator, b.messageValidator); + assertEq(a.messageInterceptor, b.messageInterceptor); assertEq(a.feeQuoter, b.feeQuoter); } @@ -404,23 +399,23 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { function _getDefaultSourceTokenData( Client.EVMTokenAmount[] memory srcTokenAmounts - ) internal view returns (Internal.RampTokenAmount[] memory) { - Internal.RampTokenAmount[] memory sourceTokenData = new Internal.RampTokenAmount[](srcTokenAmounts.length); + ) internal view returns (Internal.Any2EVMTokenTransfer[] memory) { + Internal.Any2EVMTokenTransfer[] memory sourceTokenData = new Internal.Any2EVMTokenTransfer[](srcTokenAmounts.length); for (uint256 i = 0; i < srcTokenAmounts.length; ++i) { - sourceTokenData[i] = Internal.RampTokenAmount({ + sourceTokenData[i] = Internal.Any2EVMTokenTransfer({ sourcePoolAddress: abi.encode(s_sourcePoolByToken[srcTokenAmounts[i].token]), - destTokenAddress: abi.encode(s_destTokenBySourceToken[srcTokenAmounts[i].token]), + destTokenAddress: s_destTokenBySourceToken[srcTokenAmounts[i].token], extraData: "", amount: srcTokenAmounts[i].amount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD }); } return sourceTokenData; } - function _enableInboundMessageValidator() internal { + function _enableInboundMessageInterceptor() internal { OffRamp.DynamicConfig memory dynamicConfig = s_offRamp.getDynamicConfig(); - dynamicConfig.messageValidator = address(s_inboundMessageValidator); + dynamicConfig.messageInterceptor = address(s_inboundMessageInterceptor); s_offRamp.setDynamicConfig(dynamicConfig); } @@ -538,4 +533,21 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { assertTrue(logs[i].topics[0] != eventSelector); } } + + function _hashMessage( + Internal.Any2EVMRampMessage memory message, + bytes memory onRamp + ) internal pure returns (bytes32) { + return Internal._hash( + message, + keccak256( + abi.encode( + Internal.ANY_2_EVM_MESSAGE_HASH, + message.header.sourceChainSelector, + message.header.destChainSelector, + keccak256(onRamp) + ) + ) + ); + } } diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol index d989c15651e..2a7fac892cf 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol @@ -287,7 +287,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup { IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); vm.expectEmit(); - emit OnRamp.FeePaid(s_sourceFeeToken, feeAmount); + emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER)); + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), feeAmount); @@ -307,7 +308,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup { uint256 expectedJuels = (feeAmount * conversionRate) / 1e18; vm.expectEmit(); - emit OnRamp.FeePaid(s_sourceTokens[1], expectedJuels); + emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, expectedJuels, OWNER)); + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); assertEq(IERC20(s_sourceTokens[1]).balanceOf(address(s_onRamp)), feeAmount); @@ -352,8 +354,6 @@ contract OnRamp_forwardFromRouter is OnRampSetup { Internal.EVM2AnyRampMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeTokenAmount, originalSender); vm.expectEmit(); - emit OnRamp.FeePaid(s_sourceFeeToken, feeTokenAmount); - vm.expectEmit(false, false, false, true); emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedEvent); // Assert the message Id is correct @@ -363,8 +363,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup { ); } - function test_forwardFromRouter_WithValidation_Success() public { - _enableOutboundMessageValidator(); + function test_forwardFromRouter_WithInterception_Success() public { + _enableOutboundMessageInterceptor(); Client.EVM2AnyMessage memory message = _generateEmptyMessage(); message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT * 2})); @@ -373,7 +373,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup { message.tokenAmounts[0].amount = 1e18; message.tokenAmounts[0].token = s_sourceTokens[0]; IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_outboundMessageValidator.setMessageIdValidationState(keccak256(abi.encode(message)), false); + s_outboundmessageInterceptor.setMessageIdValidationState(keccak256(abi.encode(message)), false); vm.expectEmit(); emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, feeAmount, OWNER)); @@ -420,8 +420,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup { s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, _generateEmptyMessage(), 0, STRANGER); } - function test_MessageValidationError_Revert() public { - _enableOutboundMessageValidator(); + function test_MessageInterceptionError_Revert() public { + _enableOutboundMessageInterceptor(); Client.EVM2AnyMessage memory message = _generateEmptyMessage(); message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT * 2})); @@ -430,7 +430,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup { message.tokenAmounts[0].amount = 1e18; message.tokenAmounts[0].token = s_sourceTokens[0]; IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_outboundMessageValidator.setMessageIdValidationState(keccak256(abi.encode(message)), true); + s_outboundmessageInterceptor.setMessageIdValidationState(keccak256(abi.encode(message)), true); vm.expectRevert( abi.encodeWithSelector(IMessageInterceptor.MessageValidationError.selector, bytes("Invalid message")) @@ -667,11 +667,12 @@ contract OnRamp_getFee is OnRampSetup { } contract OnRamp_setDynamicConfig is OnRampSetup { - function test_SetDynamicConfig_Success() public { + function test_setDynamicConfig_Success() public { OnRamp.StaticConfig memory staticConfig = s_onRamp.getStaticConfig(); OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({ feeQuoter: address(23423), - messageValidator: makeAddr("messageValidator"), + reentrancyGuardEntered: false, + messageInterceptor: makeAddr("messageInterceptor"), feeAggregator: FEE_AGGREGATOR, allowListAdmin: address(0) }); @@ -687,11 +688,12 @@ contract OnRamp_setDynamicConfig is OnRampSetup { // Reverts - function test_SetConfigInvalidConfigFeeQuoterEqAddressZero_Revert() public { + function test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() public { OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({ feeQuoter: address(0), + reentrancyGuardEntered: false, feeAggregator: FEE_AGGREGATOR, - messageValidator: makeAddr("messageValidator"), + messageInterceptor: makeAddr("messageInterceptor"), allowListAdmin: address(0) }); @@ -699,10 +701,11 @@ contract OnRamp_setDynamicConfig is OnRampSetup { s_onRamp.setDynamicConfig(newConfig); } - function test_SetConfigInvalidConfig_Revert() public { + function test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() public { OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({ feeQuoter: address(23423), - messageValidator: address(0), + reentrancyGuardEntered: false, + messageInterceptor: address(0), feeAggregator: FEE_AGGREGATOR, allowListAdmin: address(0) }); @@ -713,10 +716,11 @@ contract OnRamp_setDynamicConfig is OnRampSetup { s_onRamp.setDynamicConfig(newConfig); } - function test_SetConfigInvalidConfigFeeAggregatorEqAddressZero_Revert() public { + function test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() public { OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({ feeQuoter: address(23423), - messageValidator: address(0), + reentrancyGuardEntered: false, + messageInterceptor: address(0), feeAggregator: address(0), allowListAdmin: address(0) }); @@ -725,7 +729,7 @@ contract OnRamp_setDynamicConfig is OnRampSetup { s_onRamp.setDynamicConfig(newConfig); } - function test_SetConfigOnlyOwner_Revert() public { + function test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() public { vm.startPrank(STRANGER); vm.expectRevert("Only callable by owner"); s_onRamp.setDynamicConfig(_generateDynamicOnRampConfig(address(2))); @@ -733,6 +737,19 @@ contract OnRamp_setDynamicConfig is OnRampSetup { vm.expectRevert("Only callable by owner"); s_onRamp.setDynamicConfig(_generateDynamicOnRampConfig(address(2))); } + + function test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() public { + OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({ + feeQuoter: address(23423), + reentrancyGuardEntered: true, + messageInterceptor: makeAddr("messageInterceptor"), + feeAggregator: FEE_AGGREGATOR, + allowListAdmin: address(0) + }); + + vm.expectRevert(OnRamp.InvalidConfig.selector); + s_onRamp.setDynamicConfig(newConfig); + } } contract OnRamp_withdrawFeeTokens is OnRampSetup { @@ -854,8 +871,8 @@ contract OnRamp_applyDestChainConfigUpdates is OnRampSetup { } } -contract OnRamp_allowListConfigUpdates is OnRampSetup { - function test_applyAllowList_Success() public { +contract OnRamp_applyAllowListUpdates is OnRampSetup { + function test_applyAllowListUpdates_Success() public { vm.stopPrank(); vm.startPrank(OWNER); @@ -946,7 +963,7 @@ contract OnRamp_allowListConfigUpdates is OnRampSetup { assertEq(3, s_onRamp.getAllowedSendersList(DEST_CHAIN_SELECTOR).length); } - function test_applyAllowList_Revert() public { + function test_applyAllowListUpdates_Revert() public { vm.stopPrank(); vm.startPrank(OWNER); @@ -990,4 +1007,24 @@ contract OnRamp_allowListConfigUpdates is OnRampSetup { s_onRamp.applyAllowListUpdates(applyAllowListConfigArgsItems); vm.stopPrank(); } + + function test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() public { + vm.stopPrank(); + vm.startPrank(OWNER); + + address[] memory addedAllowlistedSenders = new address[](1); + addedAllowlistedSenders[0] = vm.addr(1); + + OnRamp.AllowListConfigArgs memory allowListConfigArgs = OnRamp.AllowListConfigArgs({ + allowListEnabled: false, + destChainSelector: DEST_CHAIN_SELECTOR, + addedAllowlistedSenders: addedAllowlistedSenders, + removedAllowlistedSenders: new address[](0) + }); + OnRamp.AllowListConfigArgs[] memory applyAllowListConfigArgsItems = new OnRamp.AllowListConfigArgs[](1); + applyAllowListConfigArgsItems[0] = allowListConfigArgs; + + vm.expectRevert(abi.encodeWithSelector(OnRamp.InvalidAllowListRequest.selector, DEST_CHAIN_SELECTOR)); + s_onRamp.applyAllowListUpdates(applyAllowListConfigArgsItems); + } } diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol index 4c43c16f59d..6ecd3a58071 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/OnRampSetup.t.sol @@ -22,14 +22,14 @@ contract OnRampSetup is FeeQuoterFeeSetup { bytes32 internal s_metadataHash; OnRampHelper internal s_onRamp; - MessageInterceptorHelper internal s_outboundMessageValidator; + MessageInterceptorHelper internal s_outboundmessageInterceptor; address[] internal s_offRamps; NonceManager internal s_outboundNonceManager; function setUp() public virtual override { super.setUp(); - s_outboundMessageValidator = new MessageInterceptorHelper(); + s_outboundmessageInterceptor = new MessageInterceptorHelper(); s_outboundNonceManager = new NonceManager(new address[](0)); (s_onRamp, s_metadataHash) = _deployOnRamp( SOURCE_CHAIN_SELECTOR, s_sourceRouter, address(s_outboundNonceManager), address(s_tokenAdminRegistry) @@ -64,13 +64,33 @@ contract OnRampSetup is FeeQuoterFeeSetup { }); } + /// @dev a helper function to compose EVM2AnyRampMessage messages + /// @dev it is assummed that LINK is the payment token because feeTokenAmount == feeValueJuels function _messageToEvent( Client.EVM2AnyMessage memory message, uint64 seqNum, uint64 nonce, uint256 feeTokenAmount, address originalSender - ) public view returns (Internal.EVM2AnyRampMessage memory) { + ) internal view returns (Internal.EVM2AnyRampMessage memory) { + return _messageToEvent( + message, + seqNum, + nonce, + feeTokenAmount, // fee paid + feeTokenAmount, // converstion to jules is the same + originalSender + ); + } + + function _messageToEvent( + Client.EVM2AnyMessage memory message, + uint64 seqNum, + uint64 nonce, + uint256 feeTokenAmount, + uint256 feeValueJuels, + address originalSender + ) internal view returns (Internal.EVM2AnyRampMessage memory) { return _messageToEvent( message, SOURCE_CHAIN_SELECTOR, @@ -78,6 +98,7 @@ contract OnRampSetup is FeeQuoterFeeSetup { seqNum, nonce, feeTokenAmount, + feeValueJuels, originalSender, s_metadataHash, s_tokenAdminRegistry @@ -87,7 +108,8 @@ contract OnRampSetup is FeeQuoterFeeSetup { function _generateDynamicOnRampConfig(address feeQuoter) internal pure returns (OnRamp.DynamicConfig memory) { return OnRamp.DynamicConfig({ feeQuoter: feeQuoter, - messageValidator: address(0), + reentrancyGuardEntered: false, + messageInterceptor: address(0), feeAggregator: FEE_AGGREGATOR, allowListAdmin: address(0) }); @@ -138,7 +160,7 @@ contract OnRampSetup is FeeQuoterFeeSetup { ); } - function _enableOutboundMessageValidator() internal { + function _enableOutboundMessageInterceptor() internal { (, address msgSender,) = vm.readCallers(); bool resetPrank = false; @@ -150,7 +172,7 @@ contract OnRampSetup is FeeQuoterFeeSetup { } OnRamp.DynamicConfig memory dynamicConfig = s_onRamp.getDynamicConfig(); - dynamicConfig.messageValidator = address(s_outboundMessageValidator); + dynamicConfig.messageInterceptor = address(s_outboundmessageInterceptor); s_onRamp.setDynamicConfig(dynamicConfig); if (resetPrank) { diff --git a/contracts/src/v0.8/ccip/test/pools/HybridLockReleaseUSDCTokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/HybridLockReleaseUSDCTokenPool.t.sol index 96216c6fcc4..ddb8c29dc2a 100644 --- a/contracts/src/v0.8/ccip/test/pools/HybridLockReleaseUSDCTokenPool.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/HybridLockReleaseUSDCTokenPool.t.sol @@ -17,7 +17,6 @@ import {HybridLockReleaseUSDCTokenPool} from "../../pools/USDC/HybridLockRelease import {USDCBridgeMigrator} from "../../pools/USDC/USDCBridgeMigrator.sol"; import {USDCTokenPool} from "../../pools/USDC/USDCTokenPool.sol"; import {BaseTest} from "../BaseTest.t.sol"; -import {USDCTokenPoolHelper} from "../helpers/USDCTokenPoolHelper.sol"; import {MockE2EUSDCTransmitter} from "../mocks/MockE2EUSDCTransmitter.sol"; import {MockUSDCTokenMessenger} from "../mocks/MockUSDCTokenMessenger.sol"; @@ -111,6 +110,7 @@ contract USDCTokenPoolSetup is BaseTest { emit HybridLockReleaseUSDCTokenPool.LiquidityProviderSet(address(0), OWNER, DEST_CHAIN_SELECTOR); s_usdcTokenPool.setLiquidityProvider(DEST_CHAIN_SELECTOR, OWNER); + s_usdcTokenPool.setLiquidityProvider(SOURCE_CHAIN_SELECTOR, OWNER); } function setUpRamps() internal { @@ -224,7 +224,7 @@ contract HybridUSDCTokenPoolTests is USDCTokenPoolSetup { localToken: address(s_token), remoteChainSelector: SOURCE_CHAIN_SELECTOR, sourcePoolAddress: sourceTokenData.sourcePoolAddress, - sourcePoolData: "", + sourcePoolData: abi.encode(s_usdcTokenPool.LOCK_RELEASE_FLAG()), offchainTokenData: "" }) ); @@ -329,7 +329,7 @@ contract HybridUSDCTokenPoolTests is USDCTokenPoolSetup { ); } - function test_LockOrBurn_LocKReleaseMechanism_then_switchToPrimary_Success() public { + function test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() public { // Test Enabling the LR mechanism and sending an outgoing message test_LockOrBurn_PrimaryMechanism_Success(); @@ -372,44 +372,6 @@ contract HybridUSDCTokenPoolTests is USDCTokenPoolSetup { test_MintOrRelease_incomingMessageWithPrimaryMechanism(); } - function test_withdrawLiquidity_Success() public { - uint256 liquidityAmount = 1e12; - - vm.startPrank(OWNER); - s_token.approve(address(s_usdcTokenPool), type(uint256).max); - - s_usdcTokenPool.setLiquidityProvider(SOURCE_CHAIN_SELECTOR, OWNER); - assertEq(s_usdcTokenPool.getLiquidityProvider(SOURCE_CHAIN_SELECTOR), OWNER, "Owner is not Rebalancer"); - - s_usdcTokenPool.provideLiquidity(SOURCE_CHAIN_SELECTOR, liquidityAmount); - - assertEq(s_usdcTokenPool.getLockedTokensForChain(SOURCE_CHAIN_SELECTOR), liquidityAmount); - - assertEq( - s_token.balanceOf(address(s_usdcTokenPool)), - liquidityAmount, - "Available tokens doesn't match provided liquidity amount" - ); - - uint256 withdrawalAmount = liquidityAmount / 2; // Withdraw half of the liquidity - - vm.expectEmit(); - emit ILiquidityContainer.LiquidityRemoved(OWNER, withdrawalAmount); - - s_usdcTokenPool.withdrawLiquidity(SOURCE_CHAIN_SELECTOR, withdrawalAmount); - - assertEq( - s_usdcTokenPool.getLockedTokensForChain(SOURCE_CHAIN_SELECTOR), - liquidityAmount - withdrawalAmount, - "Remaining liquidity incorrect" - ); - assertEq( - s_token.balanceOf(address(s_usdcTokenPool)), - liquidityAmount - withdrawalAmount, - "Available tokens doesn't match provided liquidity amount" - ); - } - function test_LockOrBurn_WhileMigrationPause_Revert() public { // Create a fake migration proposal s_usdcTokenPool.proposeCCTPMigration(DEST_CHAIN_SELECTOR); @@ -450,6 +412,140 @@ contract HybridUSDCTokenPoolTests is USDCTokenPoolSetup { }) ); } + + function test_ReleaseOrMint_WhileMigrationPause_Revert() public { + address recipient = address(1234); + + // Designate the SOURCE_CHAIN as not using native-USDC, and so the L/R mechanism must be used instead + uint64[] memory destChainAdds = new uint64[](1); + destChainAdds[0] = SOURCE_CHAIN_SELECTOR; + + s_usdcTokenPool.updateChainSelectorMechanisms(new uint64[](0), destChainAdds); + + assertTrue( + s_usdcTokenPool.shouldUseLockRelease(SOURCE_CHAIN_SELECTOR), + "Lock/Release mech not configured for incoming message from SOURCE_CHAIN_SELECTOR" + ); + + vm.startPrank(OWNER); + + vm.expectEmit(); + emit USDCBridgeMigrator.CCTPMigrationProposed(SOURCE_CHAIN_SELECTOR); + + // Propose the migration to CCTP + s_usdcTokenPool.proposeCCTPMigration(SOURCE_CHAIN_SELECTOR); + + Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({ + sourcePoolAddress: abi.encode(SOURCE_CHAIN_USDC_POOL), + destTokenAddress: abi.encode(address(s_usdcTokenPool)), + extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: 1, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})), + destGasAmount: USDC_DEST_TOKEN_GAS + }); + + bytes memory sourcePoolDataLockRelease = abi.encode(s_usdcTokenPool.LOCK_RELEASE_FLAG()); + + uint256 amount = 1e6; + + vm.startPrank(s_routerAllowedOffRamp); + + // Expect revert because the lane is paused and no incoming messages should be allowed + vm.expectRevert( + abi.encodeWithSelector(HybridLockReleaseUSDCTokenPool.LanePausedForCCTPMigration.selector, SOURCE_CHAIN_SELECTOR) + ); + + s_usdcTokenPool.releaseOrMint( + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: recipient, + amount: amount, + localToken: address(s_token), + remoteChainSelector: SOURCE_CHAIN_SELECTOR, + sourcePoolAddress: sourceTokenData.sourcePoolAddress, + sourcePoolData: sourcePoolDataLockRelease, + offchainTokenData: "" + }) + ); + } + + function test_transferLiquidity_Success() public { + // Set as the OWNER so we can provide liquidity + vm.startPrank(OWNER); + + s_usdcTokenPool.setLiquidityProvider(DEST_CHAIN_SELECTOR, OWNER); + s_token.approve(address(s_usdcTokenPool), type(uint256).max); + + uint256 liquidityAmount = 1e9; + + // Provide some liquidity to the pool + s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, liquidityAmount); + + // Set the new token pool as the rebalancer + s_usdcTokenPool.transferOwnership(address(s_usdcTokenPoolTransferLiquidity)); + + vm.expectEmit(); + emit ILiquidityContainer.LiquidityRemoved(address(s_usdcTokenPoolTransferLiquidity), liquidityAmount); + + vm.expectEmit(); + emit HybridLockReleaseUSDCTokenPool.LiquidityTransferred( + address(s_usdcTokenPool), DEST_CHAIN_SELECTOR, liquidityAmount + ); + + s_usdcTokenPoolTransferLiquidity.transferLiquidity(address(s_usdcTokenPool), DEST_CHAIN_SELECTOR); + + assertEq( + s_usdcTokenPool.owner(), + address(s_usdcTokenPoolTransferLiquidity), + "Ownership of the old pool should be transferred to the new pool" + ); + + assertEq( + s_usdcTokenPoolTransferLiquidity.getLockedTokensForChain(DEST_CHAIN_SELECTOR), + liquidityAmount, + "Tokens locked for dest chain doesn't match expected amount in storage" + ); + + assertEq( + s_usdcTokenPool.getLockedTokensForChain(DEST_CHAIN_SELECTOR), + 0, + "Tokens locked for dest chain in old token pool doesn't match expected amount in storage" + ); + + assertEq( + s_token.balanceOf(address(s_usdcTokenPoolTransferLiquidity)), + liquidityAmount, + "Liquidity amount of tokens should be new in new pool, but aren't" + ); + + assertEq( + s_token.balanceOf(address(s_usdcTokenPool)), + 0, + "Liquidity amount of tokens should be zero in old pool, but aren't" + ); + } + + function test_cannotTransferLiquidityDuringPendingMigration_Revert() public { + // Set as the OWNER so we can provide liquidity + vm.startPrank(OWNER); + + s_usdcTokenPool.setLiquidityProvider(DEST_CHAIN_SELECTOR, OWNER); + s_token.approve(address(s_usdcTokenPool), type(uint256).max); + + uint256 liquidityAmount = 1e9; + + // Provide some liquidity to the pool + s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, liquidityAmount); + + // Set the new token pool as the rebalancer + s_usdcTokenPool.transferOwnership(address(s_usdcTokenPoolTransferLiquidity)); + + s_usdcTokenPool.proposeCCTPMigration(DEST_CHAIN_SELECTOR); + + vm.expectRevert( + abi.encodeWithSelector(HybridLockReleaseUSDCTokenPool.LanePausedForCCTPMigration.selector, DEST_CHAIN_SELECTOR) + ); + + s_usdcTokenPoolTransferLiquidity.transferLiquidity(address(s_usdcTokenPool), DEST_CHAIN_SELECTOR); + } } contract HybridUSDCTokenPoolMigrationTests is HybridUSDCTokenPoolTests { @@ -592,70 +688,197 @@ contract HybridUSDCTokenPoolMigrationTests is HybridUSDCTokenPoolTests { s_usdcTokenPool.burnLockedUSDC(); } - function test_transferLiquidity_Success() public { - // Set as the OWNER so we can provide liquidity - vm.startPrank(OWNER); - s_usdcTokenPoolTransferLiquidity.setLiquidityProvider(DEST_CHAIN_SELECTOR, OWNER); + function test_cannotModifyLiquidityWithoutPermissions_Revert() public { + address randomAddr = makeAddr("RANDOM"); - s_token.approve(address(s_usdcTokenPoolTransferLiquidity), type(uint256).max); + vm.startPrank(randomAddr); - uint256 liquidityAmount = 1e9; + vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, randomAddr)); - // Provide 1000 USDC as liquidity - s_usdcTokenPoolTransferLiquidity.provideLiquidity(DEST_CHAIN_SELECTOR, liquidityAmount); + // Revert because there's insufficient permissions for the DEST_CHAIN_SELECTOR to provide liquidity + s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, 1e6); + } - // Set the new token pool as the rebalancer - s_usdcTokenPoolTransferLiquidity.setLiquidityProvider(DEST_CHAIN_SELECTOR, address(s_usdcTokenPool)); + function test_cannotCancelANonExistentMigrationProposal() public { + vm.expectRevert(USDCBridgeMigrator.NoExistingMigrationProposal.selector); - vm.expectEmit(); - emit ILiquidityContainer.LiquidityRemoved(address(s_usdcTokenPool), liquidityAmount); + // Proposal to migrate doesn't exist, and so the chain selector is zero, and therefore should revert + s_usdcTokenPool.cancelExistingCCTPMigrationProposal(); + } + + function test_unstickManualTxAfterMigration_destChain_Success() public { + address recipient = address(1234); + // Test the edge case where a tx is stuck in the manual tx queue and the destination chain is the one that + // should process is after a migration. I.E the message will have the Lock-Release flag set in the OffChainData, + // which should tell it to use the lock-release mechanism with the tokens provided. + + // We want the released amount to be 1e6, so to simulate the workflow, we sent those tokens to the contract as + // liquidity + uint256 amount = 1e6; + // Add 1e12 liquidity so that there's enough to release + vm.startPrank(s_usdcTokenPool.getLiquidityProvider(SOURCE_CHAIN_SELECTOR)); + + s_token.approve(address(s_usdcTokenPool), type(uint256).max); + s_usdcTokenPool.provideLiquidity(SOURCE_CHAIN_SELECTOR, amount); + + // By Default, the source chain will be indicated as use-CCTP so we need to change that. We create a message + // that will use the Lock-Release flag in the offchain data to indicate that the tokens should be released + // instead of minted since there's no attestation for us to use. + + vm.startPrank(s_routerAllowedOffRamp); vm.expectEmit(); - emit HybridLockReleaseUSDCTokenPool.LiquidityTransferred( - address(s_usdcTokenPoolTransferLiquidity), DEST_CHAIN_SELECTOR, liquidityAmount + emit TokenPool.Released(s_routerAllowedOffRamp, recipient, amount); + + Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({ + sourcePoolAddress: abi.encode(SOURCE_CHAIN_USDC_POOL), + destTokenAddress: abi.encode(address(s_usdcTokenPool)), + extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: 1, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})), + destGasAmount: USDC_DEST_TOKEN_GAS + }); + + Pool.ReleaseOrMintOutV1 memory poolReturnDataV1 = s_usdcTokenPool.releaseOrMint( + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: recipient, + amount: amount, + localToken: address(s_token), + remoteChainSelector: SOURCE_CHAIN_SELECTOR, + sourcePoolAddress: sourceTokenData.sourcePoolAddress, + sourcePoolData: abi.encode(s_usdcTokenPool.LOCK_RELEASE_FLAG()), + offchainTokenData: "" + }) + ); + + // By this point, the tx should have executed, with the Lock-Release taking over, and being forwaded to the + // recipient + + assertEq(poolReturnDataV1.destinationAmount, amount, "destinationAmount and actual amount transferred differ"); + assertEq(s_token.balanceOf(address(s_usdcTokenPool)), 0, "Tokens should be transferred out of the pool"); + assertEq(s_token.balanceOf(recipient), amount, "Tokens should be transferred to the recipient"); + + // We also want to check that the system uses CCTP Burn/Mint for all other messages that don't have that flag + // which after a migration will mean all new messages. + + // The message should fail without an error because it failed to decode a non-existent attestation which would + // revert without an error + vm.expectRevert(); + + s_usdcTokenPool.releaseOrMint( + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: recipient, + amount: amount, + localToken: address(s_token), + remoteChainSelector: SOURCE_CHAIN_SELECTOR, + sourcePoolAddress: sourceTokenData.sourcePoolAddress, + sourcePoolData: "", + offchainTokenData: "" + }) ); + } - s_usdcTokenPool.transferLiquidity(address(s_usdcTokenPoolTransferLiquidity), DEST_CHAIN_SELECTOR, liquidityAmount); + function test_unstickManualTxAfterMigration_homeChain_Success() public { + address CIRCLE = makeAddr("CIRCLE"); + address recipient = address(1234); + + // Mark the destination chain as supporting CCTP, so use L/R instead. + uint64[] memory destChainAdds = new uint64[](1); + destChainAdds[0] = DEST_CHAIN_SELECTOR; + + s_usdcTokenPool.updateChainSelectorMechanisms(new uint64[](0), destChainAdds); + + // Test the edge case where a tx is stuck in the manual tx queue and the source chain (mainnet) needs unsticking + // In this test we want 1e6 worth of tokens to be stuck, so first we provide liquidity to the pool >1e6 + + uint256 amount = 1e6; + // Add 1e12 liquidity so that there's enough to release + vm.startPrank(s_usdcTokenPool.getLiquidityProvider(SOURCE_CHAIN_SELECTOR)); + + s_token.approve(address(s_usdcTokenPool), type(uint256).max); + + // I picked 3x the amount to be stuck so that we can have enough to release with a buffer + s_usdcTokenPool.provideLiquidity(SOURCE_CHAIN_SELECTOR, amount * 3); + + // At this point in the process, the router will lock new messages, so we want to simulate excluding tokens + // stuck coming back from the destination, to the home chain. This way they can be released and not minted + // since there's no corresponding attestation to use for minting. + vm.startPrank(OWNER); + + // Exclude the tokens from being burned and check for the event + vm.expectEmit(); + emit USDCBridgeMigrator.TokensExcludedFromBurn(SOURCE_CHAIN_SELECTOR, amount, (amount * 3) - amount); + + s_usdcTokenPool.excludeTokensFromBurn(SOURCE_CHAIN_SELECTOR, amount); assertEq( - s_usdcTokenPool.getLockedTokensForChain(DEST_CHAIN_SELECTOR), - liquidityAmount, - "Tokens locked for dest chain doesn't match expected amount in storage" + s_usdcTokenPool.getLockedTokensForChain(SOURCE_CHAIN_SELECTOR), + (amount * 3), + "Tokens locked minus ones excluded from the burn should be 2e6" ); assertEq( - s_usdcTokenPoolTransferLiquidity.getLockedTokensForChain(DEST_CHAIN_SELECTOR), - 0, - "Tokens locked for dest chain in old token pool doesn't match expected amount in storage" + s_usdcTokenPool.getExcludedTokensByChain(SOURCE_CHAIN_SELECTOR), + 1e6, + "1e6 tokens should be excluded from the burn" ); + s_usdcTokenPool.setCircleMigratorAddress(CIRCLE); + + s_usdcTokenPool.proposeCCTPMigration(SOURCE_CHAIN_SELECTOR); + + vm.startPrank(CIRCLE); + + s_usdcTokenPool.burnLockedUSDC(); + assertEq( - s_token.balanceOf(address(s_usdcTokenPool)), - liquidityAmount, - "Liquidity amount of tokens should be new in new pool, but aren't" + s_usdcTokenPool.getLockedTokensForChain(SOURCE_CHAIN_SELECTOR), 0, "All tokens should be burned out of the pool" ); - } - function test_cannotModifyLiquidityWithoutPermissions_Revert() public { - address randomAddr = makeAddr("RANDOM"); + assertEq( + s_usdcTokenPool.getExcludedTokensByChain(SOURCE_CHAIN_SELECTOR), + 1e6, + "There should still be 1e6 tokens excluded from the burn" + ); - vm.startPrank(randomAddr); + assertEq(s_token.balanceOf(address(s_usdcTokenPool)), 1e6, "All tokens minus the excluded should be in the pool"); - vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, randomAddr)); + // Now that the burn is successful, we can release the tokens that were excluded from the burn + vm.startPrank(s_routerAllowedOffRamp); - // Revert because there's insufficient permissions for the DEST_CHAIN_SELECTOR to provide liquidity - s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, 1e6); + vm.expectEmit(); + emit TokenPool.Released(s_routerAllowedOffRamp, recipient, amount); - vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, randomAddr)); + Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({ + sourcePoolAddress: abi.encode(SOURCE_CHAIN_USDC_POOL), + destTokenAddress: abi.encode(address(s_usdcTokenPool)), + extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: 1, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})), + destGasAmount: USDC_DEST_TOKEN_GAS + }); - // Revert because there's insufficient permissions for the DEST_CHAIN_SELECTOR to withdraw liquidity - s_usdcTokenPool.withdrawLiquidity(DEST_CHAIN_SELECTOR, 1e6); - } + Pool.ReleaseOrMintOutV1 memory poolReturnDataV1 = s_usdcTokenPool.releaseOrMint( + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: recipient, + amount: amount, + localToken: address(s_token), + remoteChainSelector: SOURCE_CHAIN_SELECTOR, + sourcePoolAddress: sourceTokenData.sourcePoolAddress, + sourcePoolData: abi.encode(s_usdcTokenPool.LOCK_RELEASE_FLAG()), + offchainTokenData: "" + }) + ); - function test_cannotCancelANonExistentMigrationProposal() public { - vm.expectRevert(USDCBridgeMigrator.NoExistingMigrationProposal.selector); + assertEq(poolReturnDataV1.destinationAmount, amount, "destinationAmount and actual amount transferred differ"); + assertEq(s_token.balanceOf(address(s_usdcTokenPool)), 0, "Tokens should be transferred out of the pool"); + assertEq(s_token.balanceOf(recipient), amount, "Tokens should be transferred to the recipient"); + assertEq( + s_usdcTokenPool.getExcludedTokensByChain(SOURCE_CHAIN_SELECTOR), + 0, + "All tokens should be released from the exclusion list" + ); - // Proposal to migrate doesn't exist, and so the chain selector is zero, and therefore should revert - s_usdcTokenPool.cancelExistingCCTPMigrationProposal(); + // We also want to check that the system uses CCTP Burn/Mint for all other messages that don't have that flag + test_MintOrRelease_incomingMessageWithPrimaryMechanism(); } } diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol index 318821c441b..90b56d4370a 100644 --- a/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol +++ b/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; +import {IPriceRegistry} from "../../interfaces/IPriceRegistry.sol"; + import {AggregateRateLimiter} from "../../AggregateRateLimiter.sol"; import {Client} from "../../libraries/Client.sol"; import {Internal} from "../../libraries/Internal.sol"; @@ -220,7 +222,7 @@ contract AggregateTokenLimiter_getTokenValue is AggregateTokenLimiterSetup { function test_GetTokenValue_Success() public view { uint256 numberOfTokens = 10; Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: TOKEN, amount: 10}); - uint256 value = s_rateLimiter.getTokenValue(tokenAmount, s_feeQuoter); + uint256 value = s_rateLimiter.getTokenValue(tokenAmount, IPriceRegistry(address(s_feeQuoter))); assertEq(value, (numberOfTokens * TOKEN_PRICE) / 1e18); } @@ -230,6 +232,6 @@ contract AggregateTokenLimiter_getTokenValue is AggregateTokenLimiterSetup { Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: tokenWithNoPrice, amount: 10}); vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, tokenWithNoPrice)); - s_rateLimiter.getTokenValue(tokenAmount, s_feeQuoter); + s_rateLimiter.getTokenValue(tokenAmount, IPriceRegistry(address(s_feeQuoter))); } } diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol new file mode 100644 index 00000000000..c5226d32067 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome.t.sol @@ -0,0 +1,377 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {Internal} from "../../libraries/Internal.sol"; +import {RMNHome} from "../../rmn/RMNHome.sol"; +import {Test} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; + +contract RMNHomeTest is Test { + struct Config { + RMNHome.StaticConfig staticConfig; + RMNHome.DynamicConfig dynamicConfig; + } + + bytes32 internal constant ZERO_DIGEST = bytes32(uint256(0)); + RMNHome public s_rmnHome = new RMNHome(); + + function _getBaseConfig() internal pure returns (Config memory) { + RMNHome.Node[] memory nodes = new RMNHome.Node[](3); + nodes[0] = RMNHome.Node({peerId: keccak256("peerId_0"), offchainPublicKey: keccak256("offchainPublicKey_0")}); + nodes[1] = RMNHome.Node({peerId: keccak256("peerId_1"), offchainPublicKey: keccak256("offchainPublicKey_1")}); + nodes[2] = RMNHome.Node({peerId: keccak256("peerId_2"), offchainPublicKey: keccak256("offchainPublicKey_2")}); + + RMNHome.SourceChain[] memory sourceChains = new RMNHome.SourceChain[](2); + // Observer 0 for source chain 9000 + sourceChains[0] = RMNHome.SourceChain({chainSelector: 9000, minObservers: 1, observerNodesBitmap: 1 << 0}); + // Observers 1 and 2 for source chain 9001 + sourceChains[1] = RMNHome.SourceChain({chainSelector: 9001, minObservers: 2, observerNodesBitmap: 1 << 1 | 1 << 2}); + + return Config({ + staticConfig: RMNHome.StaticConfig({nodes: nodes, offchainConfig: abi.encode("static_config")}), + dynamicConfig: RMNHome.DynamicConfig({sourceChains: sourceChains, offchainConfig: abi.encode("dynamic_config")}) + }); + } + + uint256 private constant PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..00 + uint256 private constant PREFIX = 0x000b << (256 - 16); // 0x000b00..00 + + function _getConfigDigest(bytes memory staticConfig, uint32 version) internal view returns (bytes32) { + return bytes32( + (PREFIX & PREFIX_MASK) + | ( + uint256( + keccak256(bytes.concat(abi.encode(bytes32("EVM"), block.chainid, address(s_rmnHome), version), staticConfig)) + ) & ~PREFIX_MASK + ) + ); + } +} + +contract RMNHome_getConfigDigests is RMNHomeTest { + function test_getConfigDigests_success() public { + (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, ZERO_DIGEST); + assertEq(candidateDigest, ZERO_DIGEST); + + Config memory config = _getBaseConfig(); + bytes32 firstDigest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, ZERO_DIGEST); + assertEq(candidateDigest, firstDigest); + + s_rmnHome.promoteCandidateAndRevokeActive(firstDigest, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, firstDigest); + assertEq(candidateDigest, ZERO_DIGEST); + + bytes32 secondDigest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + (activeDigest, candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, firstDigest); + assertEq(candidateDigest, secondDigest); + + assertEq(activeDigest, s_rmnHome.getActiveDigest()); + assertEq(candidateDigest, s_rmnHome.getCandidateDigest()); + } +} + +contract RMNHome_setCandidate is RMNHomeTest { + function test_setCandidate_success() public { + Config memory config = _getBaseConfig(); + RMNHome.VersionedConfig memory versionedConfig = RMNHome.VersionedConfig({ + version: 1, + staticConfig: config.staticConfig, + dynamicConfig: config.dynamicConfig, + configDigest: ZERO_DIGEST + }); + + versionedConfig.configDigest = _getConfigDigest(abi.encode(versionedConfig.staticConfig), versionedConfig.version); + + vm.expectEmit(); + emit RMNHome.ConfigSet( + versionedConfig.configDigest, versionedConfig.version, versionedConfig.staticConfig, versionedConfig.dynamicConfig + ); + + s_rmnHome.setCandidate(versionedConfig.staticConfig, versionedConfig.dynamicConfig, ZERO_DIGEST); + + (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(versionedConfig.configDigest); + assertTrue(ok); + assertEq(storedVersionedConfig.version, versionedConfig.version); + RMNHome.StaticConfig memory storedStaticConfig = storedVersionedConfig.staticConfig; + RMNHome.DynamicConfig memory storedDynamicConfig = storedVersionedConfig.dynamicConfig; + + assertEq(storedStaticConfig.nodes.length, versionedConfig.staticConfig.nodes.length); + for (uint256 i = 0; i < storedStaticConfig.nodes.length; i++) { + RMNHome.Node memory storedNode = storedStaticConfig.nodes[i]; + assertEq(storedNode.peerId, versionedConfig.staticConfig.nodes[i].peerId); + assertEq(storedNode.offchainPublicKey, versionedConfig.staticConfig.nodes[i].offchainPublicKey); + } + + assertEq(storedDynamicConfig.sourceChains.length, versionedConfig.dynamicConfig.sourceChains.length); + for (uint256 i = 0; i < storedDynamicConfig.sourceChains.length; i++) { + RMNHome.SourceChain memory storedSourceChain = storedDynamicConfig.sourceChains[i]; + assertEq(storedSourceChain.chainSelector, versionedConfig.dynamicConfig.sourceChains[i].chainSelector); + assertEq(storedSourceChain.minObservers, versionedConfig.dynamicConfig.sourceChains[i].minObservers); + assertEq(storedSourceChain.observerNodesBitmap, versionedConfig.dynamicConfig.sourceChains[i].observerNodesBitmap); + } + assertEq(storedDynamicConfig.offchainConfig, versionedConfig.dynamicConfig.offchainConfig); + assertEq(storedStaticConfig.offchainConfig, versionedConfig.staticConfig.offchainConfig); + } + + function test_setCandidate_ConfigDigestMismatch_reverts() public { + Config memory config = _getBaseConfig(); + + bytes32 digest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, digest, ZERO_DIGEST)); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + vm.expectEmit(); + emit RMNHome.CandidateConfigRevoked(digest); + + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, digest); + } + + function test_setCandidate_OnlyOwner_reverts() public { + Config memory config = _getBaseConfig(); + + vm.startPrank(address(0)); + + vm.expectRevert("Only callable by owner"); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } +} + +contract RMNHome_revokeCandidate is RMNHomeTest { + // Sets two configs + function setUp() public { + Config memory config = _getBaseConfig(); + bytes32 digest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + s_rmnHome.promoteCandidateAndRevokeActive(digest, ZERO_DIGEST); + + config.dynamicConfig.sourceChains[0].minObservers--; + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_revokeCandidate_success() public { + (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests(); + + vm.expectEmit(); + emit RMNHome.CandidateConfigRevoked(priorCandidateDigest); + + s_rmnHome.revokeCandidate(priorCandidateDigest); + + (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(priorCandidateDigest); + assertFalse(ok); + // Ensure no old data is returned, even though it's still in storage + assertEq(storedVersionedConfig.version, 0); + assertEq(storedVersionedConfig.staticConfig.nodes.length, 0); + assertEq(storedVersionedConfig.dynamicConfig.sourceChains.length, 0); + + // Asser the active digest is unaffected but the candidate digest is set to zero + (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, priorActiveDigest); + assertEq(candidateDigest, ZERO_DIGEST); + assertTrue(candidateDigest != priorCandidateDigest); + } + + function test_revokeCandidate_ConfigDigestMismatch_reverts() public { + (, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests(); + + bytes32 wrongDigest = keccak256("wrong_digest"); + vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorCandidateDigest, wrongDigest)); + s_rmnHome.revokeCandidate(wrongDigest); + } + + function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public { + vm.expectRevert(RMNHome.RevokingZeroDigestNotAllowed.selector); + s_rmnHome.revokeCandidate(ZERO_DIGEST); + } + + function test_revokeCandidate_OnlyOwner_reverts() public { + vm.startPrank(address(0)); + + vm.expectRevert("Only callable by owner"); + s_rmnHome.revokeCandidate(keccak256("configDigest")); + } +} + +contract RMNHome_promoteCandidateAndRevokeActive is RMNHomeTest { + function test_promoteCandidateAndRevokeActive_success() public { + Config memory config = _getBaseConfig(); + bytes32 firstConfigToPromote = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + vm.expectEmit(); + emit RMNHome.ConfigPromoted(firstConfigToPromote); + + s_rmnHome.promoteCandidateAndRevokeActive(firstConfigToPromote, ZERO_DIGEST); + + // Assert the active digest is updated and the candidate digest is set to zero + (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, firstConfigToPromote); + assertEq(candidateDigest, ZERO_DIGEST); + + // Set a new candidate to promote over a non-zero active config. + config.staticConfig.offchainConfig = abi.encode("new_static_config"); + config.dynamicConfig.offchainConfig = abi.encode("new_dynamic_config"); + bytes32 secondConfigToPromote = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + + vm.expectEmit(); + emit RMNHome.ActiveConfigRevoked(firstConfigToPromote); + + vm.expectEmit(); + emit RMNHome.ConfigPromoted(secondConfigToPromote); + + s_rmnHome.promoteCandidateAndRevokeActive(secondConfigToPromote, firstConfigToPromote); + + (RMNHome.VersionedConfig memory activeConfig, RMNHome.VersionedConfig memory candidateConfig) = + s_rmnHome.getAllConfigs(); + assertEq(activeConfig.configDigest, secondConfigToPromote); + assertEq(activeConfig.staticConfig.offchainConfig, config.staticConfig.offchainConfig); + assertEq(activeConfig.dynamicConfig.offchainConfig, config.dynamicConfig.offchainConfig); + + assertEq(candidateConfig.configDigest, ZERO_DIGEST); + } + + function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() public { + vm.expectRevert(RMNHome.NoOpStateTransitionNotAllowed.selector); + s_rmnHome.promoteCandidateAndRevokeActive(ZERO_DIGEST, ZERO_DIGEST); + } + + function test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() public { + (bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests(); + bytes32 wrongActiveDigest = keccak256("wrongActiveDigest"); + bytes32 wrongCandidateDigest = keccak256("wrongCandidateDigest"); + + vm.expectRevert( + abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongCandidateDigest) + ); + s_rmnHome.promoteCandidateAndRevokeActive(wrongCandidateDigest, wrongActiveDigest); + + vm.expectRevert(abi.encodeWithSelector(RMNHome.ConfigDigestMismatch.selector, priorActiveDigest, wrongActiveDigest)); + + s_rmnHome.promoteCandidateAndRevokeActive(priorCandidateDigest, wrongActiveDigest); + } + + function test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() public { + vm.startPrank(address(0)); + + vm.expectRevert("Only callable by owner"); + s_rmnHome.promoteCandidateAndRevokeActive(keccak256("toPromote"), keccak256("ToRevoke")); + } +} + +contract RMNHome__validateStaticAndDynamicConfig is RMNHomeTest { + function test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() public { + Config memory config = _getBaseConfig(); + config.staticConfig.nodes = new RMNHome.Node[](257); + + vm.expectRevert(RMNHome.OutOfBoundsNodesLength.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() public { + Config memory config = _getBaseConfig(); + config.staticConfig.nodes[1].peerId = config.staticConfig.nodes[0].peerId; + + vm.expectRevert(RMNHome.DuplicatePeerId.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() public { + Config memory config = _getBaseConfig(); + config.staticConfig.nodes[1].offchainPublicKey = config.staticConfig.nodes[0].offchainPublicKey; + + vm.expectRevert(RMNHome.DuplicateOffchainPublicKey.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() public { + Config memory config = _getBaseConfig(); + config.dynamicConfig.sourceChains[1].chainSelector = config.dynamicConfig.sourceChains[0].chainSelector; + + vm.expectRevert(RMNHome.DuplicateSourceChain.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() public { + Config memory config = _getBaseConfig(); + config.dynamicConfig.sourceChains[0].observerNodesBitmap = 1 << config.staticConfig.nodes.length; + + vm.expectRevert(RMNHome.OutOfBoundsObserverNodeIndex.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() public { + Config memory config = _getBaseConfig(); + config.dynamicConfig.sourceChains[0].minObservers++; + + vm.expectRevert(RMNHome.MinObserversTooHigh.selector); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } +} + +contract RMNHome_setDynamicConfig is RMNHomeTest { + function setUp() public { + Config memory config = _getBaseConfig(); + s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST); + } + + function test_setDynamicConfig_success() public { + (bytes32 priorActiveDigest,) = s_rmnHome.getConfigDigests(); + + Config memory config = _getBaseConfig(); + config.dynamicConfig.sourceChains[0].minObservers--; + + (, bytes32 candidateConfigDigest) = s_rmnHome.getConfigDigests(); + + vm.expectEmit(); + emit RMNHome.DynamicConfigSet(candidateConfigDigest, config.dynamicConfig); + + s_rmnHome.setDynamicConfig(config.dynamicConfig, candidateConfigDigest); + + (RMNHome.VersionedConfig memory storedVersionedConfig, bool ok) = s_rmnHome.getConfig(candidateConfigDigest); + assertTrue(ok); + assertEq( + storedVersionedConfig.dynamicConfig.sourceChains[0].minObservers, + config.dynamicConfig.sourceChains[0].minObservers + ); + + // Asser the digests don't change when updating the dynamic config + (bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests(); + assertEq(activeDigest, priorActiveDigest); + assertEq(candidateDigest, candidateConfigDigest); + } + + // Asserts the validation function is being called + function test_setDynamicConfig_MinObserversTooHigh_reverts() public { + Config memory config = _getBaseConfig(); + config.dynamicConfig.sourceChains[0].minObservers++; + + vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, ZERO_DIGEST)); + s_rmnHome.setDynamicConfig(config.dynamicConfig, ZERO_DIGEST); + } + + function test_setDynamicConfig_DigestNotFound_reverts() public { + // Zero always reverts + vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, ZERO_DIGEST)); + s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, ZERO_DIGEST); + + // Non-existent digest reverts + bytes32 nonExistentDigest = keccak256("nonExistentDigest"); + vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, nonExistentDigest)); + s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, nonExistentDigest); + } + + function test_setDynamicConfig_OnlyOwner_reverts() public { + Config memory config = _getBaseConfig(); + + vm.startPrank(address(0)); + + vm.expectRevert("Only callable by owner"); + s_rmnHome.setDynamicConfig(config.dynamicConfig, keccak256("configDigest")); + } +} diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol new file mode 100644 index 00000000000..f24b3ac9c94 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote.t.sol @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {IRMNV2} from "../../interfaces/IRMNV2.sol"; +import {Internal} from "../../libraries/Internal.sol"; +import {GLOBAL_CURSE_SUBJECT, LEGACY_CURSE_SUBJECT, RMNRemote} from "../../rmn/RMNRemote.sol"; +import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol"; + +contract RMNRemote_constructor is RMNRemoteSetup { + function test_constructor_success() public view { + assertEq(s_rmnRemote.getLocalChainSelector(), 1); + } + + function test_constructor_zeroChainSelector_reverts() public { + vm.expectRevert(RMNRemote.ZeroValueNotAllowed.selector); + new RMNRemote(0); + } +} + +contract RMNRemote_setConfig is RMNRemoteSetup { + function test_setConfig_minSignersIs0_success() public { + // Initially there is no config, the version is 0 + uint32 currentConfigVersion = 0; + RMNRemote.Config memory config = + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectEmit(); + emit RMNRemote.ConfigSet(++currentConfigVersion, config); + + s_rmnRemote.setConfig(config); + + (uint32 version, RMNRemote.Config memory gotConfig) = s_rmnRemote.getVersionedConfig(); + assertEq(gotConfig.minSigners, 0); + assertEq(version, currentConfigVersion); + + // A new config should increment the version + vm.expectEmit(); + emit RMNRemote.ConfigSet(++currentConfigVersion, config); + + s_rmnRemote.setConfig(config); + } + + function test_setConfig_addSigner_removeSigner_success() public { + uint32 currentConfigVersion = 0; + uint256 numSigners = s_signers.length; + RMNRemote.Config memory config = + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectEmit(); + emit RMNRemote.ConfigSet(++currentConfigVersion, config); + + s_rmnRemote.setConfig(config); + + // add a signer + address newSigner = makeAddr("new signer"); + s_signers.push(RMNRemote.Signer({onchainPublicKey: newSigner, nodeIndex: uint64(numSigners)})); + config = RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectEmit(); + emit RMNRemote.ConfigSet(++currentConfigVersion, config); + + s_rmnRemote.setConfig(config); + + (uint32 version, RMNRemote.Config memory gotConfig) = s_rmnRemote.getVersionedConfig(); + assertEq(gotConfig.signers.length, s_signers.length); + assertEq(gotConfig.signers[numSigners].onchainPublicKey, newSigner); + assertEq(gotConfig.signers[numSigners].nodeIndex, uint64(numSigners)); + assertEq(version, currentConfigVersion); + + // remove two signers + s_signers.pop(); + s_signers.pop(); + config = RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectEmit(); + emit RMNRemote.ConfigSet(++currentConfigVersion, config); + + s_rmnRemote.setConfig(config); + + (version, gotConfig) = s_rmnRemote.getVersionedConfig(); + assertEq(gotConfig.signers.length, s_signers.length); + assertEq(version, currentConfigVersion); + } + + function test_setConfig_invalidSignerOrder_reverts() public { + s_signers.push(RMNRemote.Signer({onchainPublicKey: address(4), nodeIndex: 0})); + RMNRemote.Config memory config = + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectRevert(RMNRemote.InvalidSignerOrder.selector); + s_rmnRemote.setConfig(config); + } + + function test_setConfig_minSignersTooHigh_reverts() public { + RMNRemote.Config memory config = RMNRemote.Config({ + rmnHomeContractConfigDigest: _randomBytes32(), + signers: s_signers, + minSigners: uint64(s_signers.length + 1) + }); + + vm.expectRevert(RMNRemote.MinSignersTooHigh.selector); + s_rmnRemote.setConfig(config); + } + + function test_setConfig_duplicateOnChainPublicKey_reverts() public { + s_signers.push(RMNRemote.Signer({onchainPublicKey: s_signerWallets[0].addr, nodeIndex: uint64(s_signers.length)})); + RMNRemote.Config memory config = + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}); + + vm.expectRevert(RMNRemote.DuplicateOnchainPublicKey.selector); + s_rmnRemote.setConfig(config); + } +} + +contract RMNRemote_verify_withConfigNotSet is RMNRemoteSetup { + function test_verify_reverts() public { + Internal.MerkleRoot[] memory merkleRoots = new Internal.MerkleRoot[](0); + IRMNV2.Signature[] memory signatures = new IRMNV2.Signature[](0); + + vm.expectRevert(RMNRemote.ConfigNotSet.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, merkleRoots, signatures, 0); + } +} + +contract RMNRemote_verify_withConfigSet is RMNRemoteSetup { + function setUp() public override { + super.setUp(); + RMNRemote.Config memory config = + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 2}); + s_rmnRemote.setConfig(config); + _generatePayloadAndSigs(2, 2); + } + + function test_verify_success() public view { + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } + + function test_verify_minSignersIsZero_success() public { + vm.stopPrank(); + vm.prank(OWNER); + s_rmnRemote.setConfig( + RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, minSigners: 0}) + ); + + vm.stopPrank(); + vm.prank(OFF_RAMP_ADDRESS); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, new IRMNV2.Signature[](0), s_v); + } + + function test_verify_InvalidSignature_reverts() public { + IRMNV2.Signature memory sig = s_signatures[s_signatures.length - 1]; + sig.r = _randomBytes32(); + s_signatures.pop(); + s_signatures.push(sig); + + vm.expectRevert(RMNRemote.InvalidSignature.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } + + function test_verify_OutOfOrderSignatures_not_sorted_reverts() public { + IRMNV2.Signature memory sig1 = s_signatures[s_signatures.length - 1]; + s_signatures.pop(); + IRMNV2.Signature memory sig2 = s_signatures[s_signatures.length - 1]; + s_signatures.pop(); + s_signatures.push(sig1); + s_signatures.push(sig2); + + vm.expectRevert(RMNRemote.OutOfOrderSignatures.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } + + function test_verify_OutOfOrderSignatures_duplicateSignature_reverts() public { + IRMNV2.Signature memory sig = s_signatures[s_signatures.length - 2]; + s_signatures.pop(); + s_signatures.push(sig); + + vm.expectRevert(RMNRemote.OutOfOrderSignatures.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } + + function test_verify_UnexpectedSigner_reverts() public { + _setupSigners(2); // create 2 new signers that aren't configured on RMNRemote + _generatePayloadAndSigs(2, 2); + + vm.expectRevert(RMNRemote.UnexpectedSigner.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } + + function test_verify_ThresholdNotMet_reverts() public { + _generatePayloadAndSigs(2, 1); // 1 sig requested, but 2 required + + vm.expectRevert(RMNRemote.ThresholdNotMet.selector); + s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures, s_v); + } +} + +contract RMNRemote_curse is RMNRemoteSetup { + function test_curse_success() public { + vm.expectEmit(); + emit RMNRemote.Cursed(s_curseSubjects); + + s_rmnRemote.curse(s_curseSubjects); + + assertEq(abi.encode(s_rmnRemote.getCursedSubjects()), abi.encode(s_curseSubjects)); + assertTrue(s_rmnRemote.isCursed(curseSubj1)); + assertTrue(s_rmnRemote.isCursed(curseSubj2)); + // Should not have cursed a random subject + assertFalse(s_rmnRemote.isCursed(bytes16(keccak256("subject 3")))); + } + + function test_curse_AlreadyCursed_duplicateSubject_reverts() public { + s_curseSubjects.push(curseSubj1); + + vm.expectRevert(abi.encodeWithSelector(RMNRemote.AlreadyCursed.selector, curseSubj1)); + s_rmnRemote.curse(s_curseSubjects); + } + + function test_curse_calledByNonOwner_reverts() public { + vm.expectRevert("Only callable by owner"); + vm.stopPrank(); + vm.prank(STRANGER); + s_rmnRemote.curse(s_curseSubjects); + } +} + +contract RMNRemote_uncurse is RMNRemoteSetup { + function setUp() public override { + super.setUp(); + s_rmnRemote.curse(s_curseSubjects); + } + + function test_uncurse_success() public { + vm.expectEmit(); + emit RMNRemote.Uncursed(s_curseSubjects); + + s_rmnRemote.uncurse(s_curseSubjects); + + assertEq(s_rmnRemote.getCursedSubjects().length, 0); + assertFalse(s_rmnRemote.isCursed(curseSubj1)); + assertFalse(s_rmnRemote.isCursed(curseSubj2)); + } + + function test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() public { + s_curseSubjects.push(curseSubj1); + + vm.expectRevert(abi.encodeWithSelector(RMNRemote.NotCursed.selector, curseSubj1)); + s_rmnRemote.uncurse(s_curseSubjects); + } + + function test_uncurse_calledByNonOwner_reverts() public { + vm.expectRevert("Only callable by owner"); + vm.stopPrank(); + vm.prank(STRANGER); + s_rmnRemote.uncurse(s_curseSubjects); + } +} + +contract RMNRemote_global_and_legacy_curses is RMNRemoteSetup { + function test_global_and_legacy_curses_success() public { + bytes16 randSubject = bytes16(keccak256("random subject")); + assertFalse(s_rmnRemote.isCursed()); + assertFalse(s_rmnRemote.isCursed(randSubject)); + + s_rmnRemote.curse(GLOBAL_CURSE_SUBJECT); + assertTrue(s_rmnRemote.isCursed()); + assertTrue(s_rmnRemote.isCursed(randSubject)); + + s_rmnRemote.uncurse(GLOBAL_CURSE_SUBJECT); + assertFalse(s_rmnRemote.isCursed()); + assertFalse(s_rmnRemote.isCursed(randSubject)); + + s_rmnRemote.curse(LEGACY_CURSE_SUBJECT); + assertTrue(s_rmnRemote.isCursed()); + assertFalse(s_rmnRemote.isCursed(randSubject)); // legacy curse doesn't affect specific subjects + + s_rmnRemote.uncurse(LEGACY_CURSE_SUBJECT); + assertFalse(s_rmnRemote.isCursed()); + assertFalse(s_rmnRemote.isCursed(randSubject)); + } +} diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol new file mode 100644 index 00000000000..6896cb91c6f --- /dev/null +++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemoteSetup.t.sol @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {IRMNV2} from "../../interfaces/IRMNV2.sol"; +import {Internal} from "../../libraries/Internal.sol"; +import {RMNRemote} from "../../rmn/RMNRemote.sol"; +import {BaseTest} from "../BaseTest.t.sol"; +import {Vm} from "forge-std/Vm.sol"; + +import "forge-std/console.sol"; + +contract RMNRemoteSetup is BaseTest { + RMNRemote public s_rmnRemote; + address public OFF_RAMP_ADDRESS; + + RMNRemote.Signer[] public s_signers; + Vm.Wallet[] public s_signerWallets; + + Internal.MerkleRoot[] s_merkleRoots; + IRMNV2.Signature[] s_signatures; + uint256 internal s_v; + + bytes16 internal constant curseSubj1 = bytes16(keccak256("subject 1")); + bytes16 internal constant curseSubj2 = bytes16(keccak256("subject 2")); + bytes16[] internal s_curseSubjects; + + function setUp() public virtual override { + super.setUp(); + s_rmnRemote = new RMNRemote(1); + OFF_RAMP_ADDRESS = makeAddr("OFF RAMP"); + s_curseSubjects = [curseSubj1, curseSubj2]; + + _setupSigners(10); + } + + /// @notice sets up a list of signers with strictly increasing onchain public keys + /// @dev signers do not have to be in order when configured, but they do when generating signatures + /// rather than sort signers every time, we do it once here and store the sorted list + function _setupSigners(uint256 numSigners) internal { + // remove any existing config + while (s_signerWallets.length > 0) { + s_signerWallets.pop(); + } + while (s_signers.length > 0) { + s_signers.pop(); + } + + for (uint256 i = 0; i < numSigners; i++) { + s_signerWallets.push(vm.createWallet(_randomNum())); + } + + _sort(s_signerWallets); + + for (uint256 i = 0; i < numSigners; i++) { + s_signers.push(RMNRemote.Signer({onchainPublicKey: s_signerWallets[i].addr, nodeIndex: uint64(i)})); + } + } + + /// @notice generates n merkleRoots and matching valid signatures and populates them into + /// the shared storage vars + function _generatePayloadAndSigs(uint256 numUpdates, uint256 numSigs) internal { + require(numUpdates > 0, "need at least 1 dest lane update"); + require(numSigs <= s_signerWallets.length, "cannot generate more sigs than signers"); + + // remove any existing merkleRoots and sigs + while (s_merkleRoots.length > 0) { + s_merkleRoots.pop(); + } + while (s_signatures.length > 0) { + s_signatures.pop(); + } + s_v = 0; + + for (uint256 i = 0; i < numUpdates; i++) { + s_merkleRoots.push(_generateRandomDestLaneUpdate()); + } + + for (uint256 i = 0; i < numSigs; i++) { + (uint8 v, IRMNV2.Signature memory sig) = _signDestLaneUpdate(s_merkleRoots, s_signerWallets[i]); + s_signatures.push(sig); + if (v == 28) { + s_v += 1 << i; + } + } + } + + /// @notice generates a random dest lane update + function _generateRandomDestLaneUpdate() private returns (Internal.MerkleRoot memory) { + uint64 minSeqNum = uint32(_randomNum()); + uint64 maxSeqNum = minSeqNum + 100; + return Internal.MerkleRoot({ + sourceChainSelector: uint64(_randomNum()), + onRampAddress: abi.encode(_randomAddress()), + minSeqNr: minSeqNum, + maxSeqNr: maxSeqNum, + merkleRoot: _randomBytes32() + }); + } + + /// @notice signs the provided payload with the provided wallet + /// @return sigV v, either 27 of 28 + /// @return sig the signature + function _signDestLaneUpdate( + Internal.MerkleRoot[] memory merkleRoots, + Vm.Wallet memory wallet + ) private returns (uint8 sigV, IRMNV2.Signature memory) { + (, RMNRemote.Config memory config) = s_rmnRemote.getVersionedConfig(); + bytes32 digest = keccak256( + abi.encode( + s_rmnRemote.getReportDigestHeader(), + RMNRemote.Report({ + destChainId: block.chainid, + destChainSelector: s_rmnRemote.getLocalChainSelector(), + rmnRemoteContractAddress: address(s_rmnRemote), + offrampAddress: OFF_RAMP_ADDRESS, + rmnHomeContractConfigDigest: config.rmnHomeContractConfigDigest, + merkleRoots: merkleRoots + }) + ) + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(wallet, digest); + return (v, IRMNV2.Signature({r: r, s: s})); + } + + /// @notice bubble sort on a storage array of wallets + function _sort(Vm.Wallet[] storage wallets) private { + bool swapped; + for (uint256 i = 1; i < wallets.length; i++) { + swapped = false; + for (uint256 j = 0; j < wallets.length - i; j++) { + Vm.Wallet memory next = wallets[j + 1]; + Vm.Wallet memory actual = wallets[j]; + if (next.addr < actual.addr) { + wallets[j] = next; + wallets[j + 1] = actual; + swapped = true; + } + } + if (!swapped) { + return; + } + } + } +} diff --git a/contracts/src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol b/contracts/src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol new file mode 100644 index 00000000000..b78096773ab --- /dev/null +++ b/contracts/src/v0.8/shared/enumerable/EnumerableSetWithBytes16.sol @@ -0,0 +1,454 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol) +// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. + +/// @dev this is a fully copy of OZ's EnumerableSet library with the addition of a Bytes16Set + +pragma solidity ^0.8.0; + +/** + * @dev Library for managing + * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive + * types. + * + * Sets have the following properties: + * + * - Elements are added, removed, and checked for existence in constant time + * (O(1)). + * - Elements are enumerated in O(n). No guarantees are made on the ordering. + * + * ```solidity + * contract Example { + * // Add the library methods + * using EnumerableSet for EnumerableSet.AddressSet; + * + * // Declare a set state variable + * EnumerableSet.AddressSet private mySet; + * } + * ``` + * + * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) + * and `uint256` (`UintSet`) are supported. + * + * [WARNING] + * ==== + * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure + * unusable. + * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. + * + * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an + * array of EnumerableSet. + * ==== + */ +library EnumerableSet { + // To implement this library for multiple types with as little code + // repetition as possible, we write it in terms of a generic Set type with + // bytes32 values. + // The Set implementation uses private functions, and user-facing + // implementations (such as AddressSet) are just wrappers around the + // underlying Set. + // This means that we can only create new EnumerableSets for types that fit + // in bytes32. + + struct Set { + // Storage of set values + bytes32[] _values; + // Position is the index of the value in the `values` array plus 1. + // Position 0 is used to mean a value is not in the set. + mapping(bytes32 value => uint256) _positions; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function _add(Set storage set, bytes32 value) private returns (bool) { + if (!_contains(set, value)) { + set._values.push(value); + // The value is stored at length-1, but we add 1 to all indexes + // and use 0 as a sentinel value + set._positions[value] = set._values.length; + return true; + } else { + return false; + } + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function _remove(Set storage set, bytes32 value) private returns (bool) { + // We cache the value's position to prevent multiple reads from the same storage slot + uint256 position = set._positions[value]; + + if (position != 0) { + // Equivalent to contains(set, value) + // To delete an element from the _values array in O(1), we swap the element to delete with the last one in + // the array, and then remove the last element (sometimes called as 'swap and pop'). + // This modifies the order of the array, as noted in {at}. + + uint256 valueIndex = position - 1; + uint256 lastIndex = set._values.length - 1; + + if (valueIndex != lastIndex) { + bytes32 lastValue = set._values[lastIndex]; + + // Move the lastValue to the index where the value to delete is + set._values[valueIndex] = lastValue; + // Update the tracked position of the lastValue (that was just moved) + set._positions[lastValue] = position; + } + + // Delete the slot where the moved value was stored + set._values.pop(); + + // Delete the tracked position for the deleted slot + delete set._positions[value]; + + return true; + } else { + return false; + } + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function _contains(Set storage set, bytes32 value) private view returns (bool) { + return set._positions[value] != 0; + } + + /** + * @dev Returns the number of values on the set. O(1). + */ + function _length(Set storage set) private view returns (uint256) { + return set._values.length; + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function _at(Set storage set, uint256 index) private view returns (bytes32) { + return set._values[index]; + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function _values(Set storage set) private view returns (bytes32[] memory) { + return set._values; + } + + // Bytes32Set + + struct Bytes32Set { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { + return _add(set._inner, value); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { + return _remove(set._inner, value); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { + return _contains(set._inner, value); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(Bytes32Set storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { + return _at(set._inner, index); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { + bytes32[] memory store = _values(set._inner); + bytes32[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + + // AddressSet + + struct AddressSet { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(AddressSet storage set, address value) internal returns (bool) { + return _add(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(AddressSet storage set, address value) internal returns (bool) { + return _remove(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(AddressSet storage set, address value) internal view returns (bool) { + return _contains(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(AddressSet storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(AddressSet storage set, uint256 index) internal view returns (address) { + return address(uint160(uint256(_at(set._inner, index)))); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(AddressSet storage set) internal view returns (address[] memory) { + bytes32[] memory store = _values(set._inner); + address[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + + // UintSet + + struct UintSet { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(UintSet storage set, uint256 value) internal returns (bool) { + return _add(set._inner, bytes32(value)); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(UintSet storage set, uint256 value) internal returns (bool) { + return _remove(set._inner, bytes32(value)); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(UintSet storage set, uint256 value) internal view returns (bool) { + return _contains(set._inner, bytes32(value)); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(UintSet storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(UintSet storage set, uint256 index) internal view returns (uint256) { + return uint256(_at(set._inner, index)); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(UintSet storage set) internal view returns (uint256[] memory) { + bytes32[] memory store = _values(set._inner); + uint256[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + + // Bytes16Set + + struct Bytes16Set { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(Bytes16Set storage set, bytes16 value) internal returns (bool) { + return _add(set._inner, bytes32(value)); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(Bytes16Set storage set, bytes16 value) internal returns (bool) { + return _remove(set._inner, bytes32(value)); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(Bytes16Set storage set, bytes16 value) internal view returns (bool) { + return _contains(set._inner, bytes32(value)); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(Bytes16Set storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(Bytes16Set storage set, uint256 index) internal view returns (bytes16) { + return bytes16(_at(set._inner, index)); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(Bytes16Set storage set) internal view returns (bytes16[] memory) { + bytes32[] memory store = _values(set._inner); + bytes16[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } +} diff --git a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go index c2cd25768a9..c97432bd941 100644 --- a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go @@ -32,6 +32,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" + readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" "github.com/smartcontractkit/chainlink-ccip/pkg/consts" "github.com/smartcontractkit/chainlink-ccip/pkg/contractreader" ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader" @@ -65,12 +66,20 @@ func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) { }, } - s := testSetup(ctx, t, chainD, chainD, nil, cfg) + onRampAddress := utils.RandomAddress() + s := testSetup(ctx, t, chainD, chainD, nil, cfg, map[cciptypes.ChainSelector][]types.BoundContract{ + chainS1: { + { + Address: onRampAddress.Hex(), + Name: consts.ContractNameOnRamp, + }, + }, + }) tokenA := common.HexToAddress("123") const numReports = 5 - for i := uint8(0); i < numReports; i++ { + for i := 0; i < numReports; i++ { _, err := s.contract.EmitCommitReportAccepted(s.auth, ccip_reader_tester.OffRampCommitReport{ PriceUpdates: ccip_reader_tester.InternalPriceUpdates{ TokenPriceUpdates: []ccip_reader_tester.InternalTokenPriceUpdate{ @@ -91,9 +100,21 @@ func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) { SourceChainSelector: uint64(chainS1), MinSeqNr: 10, MaxSeqNr: 20, - MerkleRoot: [32]byte{i + 1}, + MerkleRoot: [32]byte{uint8(i) + 1}, //nolint:gosec // this won't overflow + OnRampAddress: common.LeftPadBytes(onRampAddress.Bytes(), 32), }, }, + RmnSignatures: []ccip_reader_tester.IRMNV2Signature{ + { + R: [32]byte{1}, + S: [32]byte{2}, + }, + { + R: [32]byte{3}, + S: [32]byte{4}, + }, + }, + RmnRawVs: big.NewInt(100), }) assert.NoError(t, err) s.sb.Commit() @@ -116,8 +137,10 @@ func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) { return len(reports) == numReports-1 }, tests.WaitTimeout(t), 50*time.Millisecond) + assert.Len(t, reports, numReports-1) assert.Len(t, reports[0].Report.MerkleRoots, 1) assert.Equal(t, chainS1, reports[0].Report.MerkleRoots[0].ChainSel) + assert.Equal(t, onRampAddress.Bytes(), []byte(reports[0].Report.MerkleRoots[0].OnRampAddress)) assert.Equal(t, cciptypes.SeqNum(10), reports[0].Report.MerkleRoots[0].SeqNumsRange.Start()) assert.Equal(t, cciptypes.SeqNum(20), reports[0].Report.MerkleRoots[0].SeqNumsRange.End()) assert.Equal(t, "0x0200000000000000000000000000000000000000000000000000000000000000", @@ -128,6 +151,11 @@ func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) { assert.Equal(t, chainD, reports[0].Report.PriceUpdates.GasPriceUpdates[0].ChainSel) assert.Equal(t, uint64(90), reports[0].Report.PriceUpdates.GasPriceUpdates[0].GasPrice.Uint64()) + + // TODO assert once chainlink-ccip changes are done + // assert.Len(t, reports[0].Report.RMNSignatures, 2) + // assert.Equal(t, reports[0].Report.RMNSignatures[0].R, [32]byte{1}) + // assert.Equal(t, reports[0].Report.RMNSignatures[0].S, [32]byte{2}) } func TestCCIPReader_ExecutedMessageRanges(t *testing.T) { @@ -149,7 +177,7 @@ func TestCCIPReader_ExecutedMessageRanges(t *testing.T) { }, } - s := testSetup(ctx, t, chainD, chainD, nil, cfg) + s := testSetup(ctx, t, chainD, chainD, nil, cfg, nil) _, err := s.contract.EmitExecutionStateChanged( s.auth, @@ -216,7 +244,7 @@ func TestCCIPReader_MsgsBetweenSeqNums(t *testing.T) { }, } - s := testSetup(ctx, t, chainS1, chainD, nil, cfg) + s := testSetup(ctx, t, chainS1, chainD, nil, cfg, nil) _, err := s.contract.EmitCCIPMessageSent(s.auth, uint64(chainD), ccip_reader_tester.InternalEVM2AnyRampMessage{ Header: ccip_reader_tester.InternalRampMessageHeader{ @@ -231,7 +259,8 @@ func TestCCIPReader_MsgsBetweenSeqNums(t *testing.T) { ExtraArgs: make([]byte, 0), FeeToken: utils.RandomAddress(), FeeTokenAmount: big.NewInt(0), - TokenAmounts: make([]ccip_reader_tester.InternalRampTokenAmount, 0), + FeeValueJuels: big.NewInt(0), + TokenAmounts: make([]ccip_reader_tester.InternalEVM2AnyTokenTransfer, 0), }) assert.NoError(t, err) @@ -248,7 +277,8 @@ func TestCCIPReader_MsgsBetweenSeqNums(t *testing.T) { ExtraArgs: make([]byte, 0), FeeToken: utils.RandomAddress(), FeeTokenAmount: big.NewInt(0), - TokenAmounts: make([]ccip_reader_tester.InternalRampTokenAmount, 0), + FeeValueJuels: big.NewInt(0), + TokenAmounts: make([]ccip_reader_tester.InternalEVM2AnyTokenTransfer, 0), }) assert.NoError(t, err) @@ -305,7 +335,7 @@ func TestCCIPReader_NextSeqNum(t *testing.T) { }, } - s := testSetup(ctx, t, chainD, chainD, onChainSeqNums, cfg) + s := testSetup(ctx, t, chainD, chainD, onChainSeqNums, cfg, nil) seqNums, err := s.reader.NextSeqNum(ctx, []cciptypes.ChainSelector{chainS1, chainS2, chainS3}) assert.NoError(t, err) @@ -332,7 +362,7 @@ func TestCCIPReader_GetExpectedNextSequenceNumber(t *testing.T) { }, } - s := testSetup(ctx, t, chainS1, chainD, nil, cfg) + s := testSetup(ctx, t, chainS1, chainD, nil, cfg, nil) _, err := s.contract.SetDestChainSeqNr(s.auth, uint64(chainD), 10) require.NoError(t, err) @@ -382,7 +412,7 @@ func TestCCIPReader_Nonces(t *testing.T) { }, } - s := testSetup(ctx, t, chainD, chainD, nil, cfg) + s := testSetup(ctx, t, chainD, chainD, nil, cfg, nil) // Add some nonces. for chain, addrs := range nonces { @@ -409,7 +439,15 @@ func TestCCIPReader_Nonces(t *testing.T) { } } -func testSetup(ctx context.Context, t *testing.T, readerChain, destChain cciptypes.ChainSelector, onChainSeqNums map[cciptypes.ChainSelector]cciptypes.SeqNum, cfg evmtypes.ChainReaderConfig) *testSetupData { +func testSetup( + ctx context.Context, + t *testing.T, + readerChain, + destChain cciptypes.ChainSelector, + onChainSeqNums map[cciptypes.ChainSelector]cciptypes.SeqNum, + cfg evmtypes.ChainReaderConfig, + otherBindings map[cciptypes.ChainSelector][]types.BoundContract, +) *testSetupData { const chainID = 1337 // Generate a new key pair for the simulated account @@ -482,11 +520,23 @@ func testSetup(ctx context.Context, t *testing.T, readerChain, destChain cciptyp }, }) require.NoError(t, err) + var otherCrs = make(map[cciptypes.ChainSelector]contractreader.Extended) + for chain, bindings := range otherBindings { + m := readermocks.NewMockContractReaderFacade(t) + m.EXPECT().Bind(ctx, bindings).Return(nil) + ecr := contractreader.NewExtendedContractReader(m) + err = ecr.Bind(ctx, bindings) + require.NoError(t, err) + otherCrs[chain] = ecr + } err = cr.Start(ctx) require.NoError(t, err) contractReaders := map[cciptypes.ChainSelector]contractreader.Extended{readerChain: extendedCr} + for chain, cr := range otherCrs { + contractReaders[chain] = cr + } contractWriters := make(map[cciptypes.ChainSelector]types.ChainWriter) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(lggr, contractReaders, contractWriters, destChain, nil) diff --git a/core/capabilities/ccip/ccip_integration_tests/helpers.go b/core/capabilities/ccip/ccip_integration_tests/helpers.go deleted file mode 100644 index 4670333e391..00000000000 --- a/core/capabilities/ccip/ccip_integration_tests/helpers.go +++ /dev/null @@ -1,953 +0,0 @@ -package ccip_integration_tests - -import ( - "bytes" - "encoding/hex" - "math/big" - "sort" - "testing" - "time" - - "github.com/smartcontractkit/chainlink-ccip/chainconfig" - "github.com/smartcontractkit/chainlink-ccip/pluginconfig" - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" - "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" - cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - - confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" - "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" - - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ocr3_config_encoder" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/weth9" - kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/link_token" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" - - chainsel "github.com/smartcontractkit/chain-selectors" - - "github.com/stretchr/testify/require" -) - -var ( - homeChainID = chainsel.GETH_TESTNET.EvmChainID - ccipMessageSentTopic = onramp.OnRampCCIPMessageSent{}.Topic() - commitReportAcceptedTopic = offramp.OffRampCommitReportAccepted{}.Topic() - executionStateChangedTopic = offramp.OffRampExecutionStateChanged{}.Topic() -) - -const ( - CapabilityLabelledName = "ccip" - CapabilityVersion = "v1.0.0" - NodeOperatorID = 1 - - // These constants drive what is set in the plugin offchain configs. - FirstBlockAge = 8 * time.Hour - RemoteGasPriceBatchWriteFrequency = 30 * time.Minute - BatchGasLimit = 6_500_000 - RelativeBoostPerWaitHour = 1.5 - InflightCacheExpiry = 10 * time.Minute - RootSnoozeTime = 30 * time.Minute - BatchingStrategyID = 0 - DeltaProgress = 30 * time.Second - DeltaResend = 10 * time.Second - DeltaInitial = 20 * time.Second - DeltaRound = 2 * time.Second - DeltaGrace = 2 * time.Second - DeltaCertifiedCommitRequest = 10 * time.Second - DeltaStage = 10 * time.Second - Rmax = 3 - MaxDurationQuery = 50 * time.Millisecond - MaxDurationObservation = 5 * time.Second - MaxDurationShouldAcceptAttestedReport = 10 * time.Second - MaxDurationShouldTransmitAcceptedReport = 10 * time.Second -) - -func e18Mult(amount uint64) *big.Int { - return new(big.Int).Mul(uBigInt(amount), uBigInt(1e18)) -} - -func uBigInt(i uint64) *big.Int { - return new(big.Int).SetUint64(i) -} - -type homeChain struct { - backend *backends.SimulatedBackend - owner *bind.TransactOpts - chainID uint64 - capabilityRegistry *kcr.CapabilitiesRegistry - ccipConfig *ccip_config.CCIPConfig -} - -type onchainUniverse struct { - backend *backends.SimulatedBackend - owner *bind.TransactOpts - chainID uint64 - linkToken *link_token.LinkToken - weth *weth9.WETH9 - router *router.Router - rmnProxy *rmn_proxy_contract.RMNProxyContract - rmn *mock_rmn_contract.MockRMNContract - onramp *onramp.OnRamp - offramp *offramp.OffRamp - priceRegistry *fee_quoter.FeeQuoter - tokenAdminRegistry *token_admin_registry.TokenAdminRegistry - nonceManager *nonce_manager.NonceManager - receiver *maybe_revert_message_receiver.MaybeRevertMessageReceiver -} - -type requestData struct { - destChainSelector uint64 - receiverAddress common.Address - data []byte -} - -func (u *onchainUniverse) SendCCIPRequests(t *testing.T, requestDatas []requestData) { - for _, reqData := range requestDatas { - msg := router.ClientEVM2AnyMessage{ - Receiver: common.LeftPadBytes(reqData.receiverAddress.Bytes(), 32), - Data: reqData.data, - TokenAmounts: nil, // TODO: no tokens for now - FeeToken: u.weth.Address(), - ExtraArgs: nil, // TODO: no extra args for now, falls back to default - } - fee, err := u.router.GetFee(&bind.CallOpts{Context: testutils.Context(t)}, reqData.destChainSelector, msg) - require.NoError(t, err) - _, err = u.weth.Deposit(&bind.TransactOpts{ - From: u.owner.From, - Signer: u.owner.Signer, - Value: fee, - }) - require.NoError(t, err) - u.backend.Commit() - _, err = u.weth.Approve(u.owner, u.router.Address(), fee) - require.NoError(t, err) - u.backend.Commit() - - t.Logf("Sending CCIP request from chain %d (selector %d) to chain selector %d", - u.chainID, getSelector(u.chainID), reqData.destChainSelector) - _, err = u.router.CcipSend(u.owner, reqData.destChainSelector, msg) - require.NoError(t, err) - u.backend.Commit() - } -} - -type chainBase struct { - backend *backends.SimulatedBackend - owner *bind.TransactOpts -} - -// createUniverses does the following: -// 1. Creates 1 home chain and `numChains`-1 non-home chains -// 2. Sets up home chain with the capability registry and the CCIP config contract -// 2. Deploys the CCIP contracts to all chains. -// 3. Sets up the initial configurations for the contracts on all chains. -// 4. Wires the chains together. -// -// Conceptually one universe is ONE chain with all the contracts deployed on it and all the dependencies initialized. -func createUniverses( - t *testing.T, - numChains int, -) (homeChainUni homeChain, universes map[uint64]onchainUniverse) { - chains := createChains(t, numChains) - - homeChainBase, ok := chains[homeChainID] - require.True(t, ok, "home chain backend not available") - // Set up home chain first - homeChainUniverse := setupHomeChain(t, homeChainBase.owner, homeChainBase.backend) - - // deploy the ccip contracts on all chains - universes = make(map[uint64]onchainUniverse) - for chainID, base := range chains { - owner := base.owner - backend := base.backend - // deploy the CCIP contracts - linkToken := deployLinkToken(t, owner, backend, chainID) - rmn := deployMockRMNContract(t, owner, backend, chainID) - rmnProxy := deployRMNProxyContract(t, owner, backend, rmn.Address(), chainID) - weth := deployWETHContract(t, owner, backend, chainID) - rout := deployRouter(t, owner, backend, weth.Address(), rmnProxy.Address(), chainID) - priceRegistry := deployPriceRegistry(t, owner, backend, linkToken.Address(), weth.Address(), big.NewInt(1e18), chainID) - tokenAdminRegistry := deployTokenAdminRegistry(t, owner, backend, chainID) - nonceManager := deployNonceManager(t, owner, backend, chainID) - - // ====================================================================== - // OnRamp - // ====================================================================== - onRampAddr, _, _, err := onramp.DeployOnRamp( - owner, - backend, - onramp.OnRampStaticConfig{ - ChainSelector: getSelector(chainID), - Rmn: rmnProxy.Address(), - NonceManager: nonceManager.Address(), - TokenAdminRegistry: tokenAdminRegistry.Address(), - }, - onramp.OnRampDynamicConfig{ - FeeQuoter: priceRegistry.Address(), - // `withdrawFeeTokens` onRamp function is not part of the message flow - // so we can set this to any address - FeeAggregator: testutils.NewAddress(), - }, - // Destination chain configs will be set up later once we have all chains - []onramp.OnRampDestChainConfigArgs{}, - ) - require.NoErrorf(t, err, "failed to deploy onramp on chain id %d", chainID) - backend.Commit() - onramp, err := onramp.NewOnRamp(onRampAddr, backend) - require.NoError(t, err) - - // ====================================================================== - // OffRamp - // ====================================================================== - offrampAddr, _, _, err := offramp.DeployOffRamp( - owner, - backend, - offramp.OffRampStaticConfig{ - ChainSelector: getSelector(chainID), - Rmn: rmnProxy.Address(), - TokenAdminRegistry: tokenAdminRegistry.Address(), - NonceManager: nonceManager.Address(), - }, - offramp.OffRampDynamicConfig{ - FeeQuoter: priceRegistry.Address(), - }, - // Source chain configs will be set up later once we have all chains - []offramp.OffRampSourceChainConfigArgs{}, - ) - require.NoErrorf(t, err, "failed to deploy offramp on chain id %d", chainID) - backend.Commit() - offramp, err := offramp.NewOffRamp(offrampAddr, backend) - require.NoError(t, err) - - receiverAddress, _, _, err := maybe_revert_message_receiver.DeployMaybeRevertMessageReceiver( - owner, - backend, - false, - ) - require.NoError(t, err, "failed to deploy MaybeRevertMessageReceiver on chain id %d", chainID) - backend.Commit() - receiver, err := maybe_revert_message_receiver.NewMaybeRevertMessageReceiver(receiverAddress, backend) - require.NoError(t, err) - - universe := onchainUniverse{ - backend: backend, - owner: owner, - chainID: chainID, - linkToken: linkToken, - weth: weth, - router: rout, - rmnProxy: rmnProxy, - rmn: rmn, - onramp: onramp, - offramp: offramp, - priceRegistry: priceRegistry, - tokenAdminRegistry: tokenAdminRegistry, - nonceManager: nonceManager, - receiver: receiver, - } - // Set up the initial configurations for the contracts - setupUniverseBasics(t, universe) - - universes[chainID] = universe - } - - // Once we have all chains created and contracts deployed, we can set up the initial configurations and wire chains together - connectUniverses(t, universes) - - // print out all contract addresses for debugging purposes - for chainID, uni := range universes { - t.Logf("Chain ID: %d\n Chain Selector: %d\n LinkToken: %s\n WETH: %s\n Router: %s\n RMNProxy: %s\n RMN: %s\n OnRamp: %s\n OffRamp: %s\n PriceRegistry: %s\n TokenAdminRegistry: %s\n NonceManager: %s\n", - chainID, - getSelector(chainID), - uni.linkToken.Address().Hex(), - uni.weth.Address().Hex(), - uni.router.Address().Hex(), - uni.rmnProxy.Address().Hex(), - uni.rmn.Address().Hex(), - uni.onramp.Address().Hex(), - uni.offramp.Address().Hex(), - uni.priceRegistry.Address().Hex(), - uni.tokenAdminRegistry.Address().Hex(), - uni.nonceManager.Address().Hex(), - ) - } - - // print out topic hashes of relevant events for debugging purposes - t.Logf("Topic hash of CommitReportAccepted: %s", commitReportAcceptedTopic.Hex()) - t.Logf("Topic hash of ExecutionStateChanged: %s", executionStateChangedTopic.Hex()) - t.Logf("Topic hash of CCIPMessageSent: %s", ccipMessageSentTopic.Hex()) - - return homeChainUniverse, universes -} - -// Creates 1 home chain and `numChains`-1 non-home chains -func createChains(t *testing.T, numChains int) map[uint64]chainBase { - chains := make(map[uint64]chainBase) - - homeChainOwner := testutils.MustNewSimTransactor(t) - homeChainBackend := backends.NewSimulatedBackend(core.GenesisAlloc{ - homeChainOwner.From: core.GenesisAccount{ - Balance: assets.Ether(10_000).ToInt(), - }, - }, 30e6) - tweakChainTimestamp(t, homeChainBackend, FirstBlockAge) - - chains[homeChainID] = chainBase{ - owner: homeChainOwner, - backend: homeChainBackend, - } - - for chainID := chainsel.TEST_90000001.EvmChainID; len(chains) < numChains && chainID < chainsel.TEST_90000020.EvmChainID; chainID++ { - owner := testutils.MustNewSimTransactor(t) - backend := backends.NewSimulatedBackend(core.GenesisAlloc{ - owner.From: core.GenesisAccount{ - Balance: assets.Ether(10_000).ToInt(), - }, - }, 30e6) - - tweakChainTimestamp(t, backend, FirstBlockAge) - - chains[chainID] = chainBase{ - owner: owner, - backend: backend, - } - } - - return chains -} - -// CCIP relies on block timestamps, but SimulatedBackend uses by default clock starting from 1970-01-01 -// This trick is used to move the clock closer to the current time. We set first block to be X hours ago. -// Tests create plenty of transactions so this number can't be too low, every new block mined will tick the clock, -// if you mine more than "X hours" transactions, SimulatedBackend will panic because generated timestamps will be in the future. -func tweakChainTimestamp(t *testing.T, backend *backends.SimulatedBackend, tweak time.Duration) { - blockTime := time.Unix(int64(backend.Blockchain().CurrentHeader().Time), 0) - sinceBlockTime := time.Since(blockTime) - diff := sinceBlockTime - tweak - err := backend.AdjustTime(diff) - require.NoError(t, err, "unable to adjust time on simulated chain") - backend.Commit() - backend.Commit() -} - -func setupHomeChain(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend) homeChain { - // deploy the capability registry on the home chain - crAddress, _, _, err := kcr.DeployCapabilitiesRegistry(owner, backend) - require.NoError(t, err, "failed to deploy capability registry on home chain") - backend.Commit() - - capabilityRegistry, err := kcr.NewCapabilitiesRegistry(crAddress, backend) - require.NoError(t, err) - - ccAddress, _, _, err := ccip_config.DeployCCIPConfig(owner, backend, crAddress) - require.NoError(t, err) - backend.Commit() - - capabilityConfig, err := ccip_config.NewCCIPConfig(ccAddress, backend) - require.NoError(t, err) - - _, err = capabilityRegistry.AddCapabilities(owner, []kcr.CapabilitiesRegistryCapability{ - { - LabelledName: CapabilityLabelledName, - Version: CapabilityVersion, - CapabilityType: 2, // consensus. not used (?) - ResponseType: 0, // report. not used (?) - ConfigurationContract: ccAddress, - }, - }) - require.NoError(t, err, "failed to add capabilities to the capability registry") - backend.Commit() - - // Add NodeOperator, for simplicity we'll add one NodeOperator only - // First NodeOperator will have NodeOperatorId = 1 - _, err = capabilityRegistry.AddNodeOperators(owner, []kcr.CapabilitiesRegistryNodeOperator{ - { - Admin: owner.From, - Name: "NodeOperator", - }, - }) - require.NoError(t, err, "failed to add node operator to the capability registry") - backend.Commit() - - return homeChain{ - backend: backend, - owner: owner, - chainID: homeChainID, - capabilityRegistry: capabilityRegistry, - ccipConfig: capabilityConfig, - } -} - -func sortP2PIDS(p2pIDs [][32]byte) { - sort.Slice(p2pIDs, func(i, j int) bool { - return bytes.Compare(p2pIDs[i][:], p2pIDs[j][:]) < 0 - }) -} - -func (h *homeChain) AddNodes( - t *testing.T, - p2pIDs [][32]byte, - capabilityIDs [][32]byte, -) { - sortP2PIDS(p2pIDs) - var nodeParams []kcr.CapabilitiesRegistryNodeParams - for _, p2pID := range p2pIDs { - nodeParam := kcr.CapabilitiesRegistryNodeParams{ - NodeOperatorId: NodeOperatorID, - Signer: p2pID, // Not used in tests - P2pId: p2pID, - HashedCapabilityIds: capabilityIDs, - } - nodeParams = append(nodeParams, nodeParam) - } - _, err := h.capabilityRegistry.AddNodes(h.owner, nodeParams) - require.NoError(t, err, "failed to add node operator oracles") - h.backend.Commit() -} - -func AddChainConfig( - t *testing.T, - h homeChain, - chainSelector uint64, - p2pIDs [][32]byte, - f uint8, -) ccip_config.CCIPConfigTypesChainConfigInfo { - sortP2PIDS(p2pIDs) - // First Add ChainConfig that includes all p2pIDs as readers - encodedExtraChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{ - GasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(1000), - DAGasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(0), - OptimisticConfirmations: 1, - }) - require.NoError(t, err) - chainConfig := integrationhelpers.SetupConfigInfo(chainSelector, p2pIDs, f, encodedExtraChainConfig) - inputConfig := []ccip_config.CCIPConfigTypesChainConfigInfo{ - chainConfig, - } - _, err = h.ccipConfig.ApplyChainConfigUpdates(h.owner, nil, inputConfig) - require.NoError(t, err) - h.backend.Commit() - return chainConfig -} - -func (h *homeChain) AddDON( - t *testing.T, - ccipCapabilityID [32]byte, - chainSelector uint64, - uni onchainUniverse, - f uint8, - bootstrapP2PID [32]byte, - p2pIDs [][32]byte, - oracles []confighelper2.OracleIdentityExtra, -) { - // Get OCR3 Config from helper - var schedule []int - for range oracles { - schedule = append(schedule, 1) - } - - tabi, err := ocr3_config_encoder.IOCR3ConfigEncoderMetaData.GetAbi() - require.NoError(t, err) - - // Add DON on capability registry contract - var ocr3Configs []ocr3_config_encoder.CCIPConfigTypesOCR3Config - for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - var encodedOffchainConfig []byte - var err2 error - if pluginType == cctypes.PluginTypeCCIPCommit { - encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(pluginconfig.CommitOffchainConfig{ - RemoteGasPriceBatchWriteFrequency: *commonconfig.MustNewDuration(RemoteGasPriceBatchWriteFrequency), - // TODO: implement token price writes - // TokenPriceBatchWriteFrequency: *commonconfig.MustNewDuration(tokenPriceBatchWriteFrequency), - }) - require.NoError(t, err2) - } else { - encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(pluginconfig.ExecuteOffchainConfig{ - BatchGasLimit: BatchGasLimit, - RelativeBoostPerWaitHour: RelativeBoostPerWaitHour, - MessageVisibilityInterval: *commonconfig.MustNewDuration(FirstBlockAge), - InflightCacheExpiry: *commonconfig.MustNewDuration(InflightCacheExpiry), - RootSnoozeTime: *commonconfig.MustNewDuration(RootSnoozeTime), - BatchingStrategyID: BatchingStrategyID, - }) - require.NoError(t, err2) - } - signers, transmitters, configF, _, offchainConfigVersion, offchainConfig, err2 := ocr3confighelper.ContractSetConfigArgsForTests( - DeltaProgress, - DeltaResend, - DeltaInitial, - DeltaRound, - DeltaGrace, - DeltaCertifiedCommitRequest, - DeltaStage, - Rmax, - schedule, - oracles, - encodedOffchainConfig, - MaxDurationQuery, - MaxDurationObservation, - MaxDurationShouldAcceptAttestedReport, - MaxDurationShouldTransmitAcceptedReport, - int(f), - []byte{}, // empty OnChainConfig - ) - require.NoError(t, err2, "failed to create contract config") - - signersBytes := make([][]byte, len(signers)) - for i, signer := range signers { - signersBytes[i] = signer - } - - transmittersBytes := make([][]byte, len(transmitters)) - for i, transmitter := range transmitters { - // anotherErr because linting doesn't want to shadow err - parsed, anotherErr := common.ParseHexOrString(string(transmitter)) - require.NoError(t, anotherErr) - transmittersBytes[i] = parsed - } - - ocr3Configs = append(ocr3Configs, ocr3_config_encoder.CCIPConfigTypesOCR3Config{ - PluginType: uint8(pluginType), - ChainSelector: chainSelector, - F: configF, - OffchainConfigVersion: offchainConfigVersion, - OfframpAddress: uni.offramp.Address().Bytes(), - P2pIds: p2pIDs, - Signers: signersBytes, - Transmitters: transmittersBytes, - OffchainConfig: offchainConfig, - }) - } - - encodedCall, err := tabi.Pack("exposeOCR3Config", ocr3Configs) - require.NoError(t, err) - - // Trim first four bytes to remove function selector. - encodedConfigs := encodedCall[4:] - - // commit so that we have an empty block to filter events from - h.backend.Commit() - - _, err = h.capabilityRegistry.AddDON(h.owner, p2pIDs, []kcr.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: ccipCapabilityID, - Config: encodedConfigs, - }, - }, false, false, f) - require.NoError(t, err) - h.backend.Commit() - - endBlock := h.backend.Blockchain().CurrentBlock().Number.Uint64() - iter, err := h.capabilityRegistry.FilterConfigSet(&bind.FilterOpts{ - Start: h.backend.Blockchain().CurrentBlock().Number.Uint64() - 1, - End: &endBlock, - }, []uint32{}) - require.NoError(t, err, "failed to filter config set events") - var donID uint32 - for iter.Next() { - donID = iter.Event.DonId - break - } - require.NotZero(t, donID, "failed to get donID from config set event") - - var signerAddresses []common.Address - for _, oracle := range oracles { - signerAddresses = append(signerAddresses, common.BytesToAddress(oracle.OnchainPublicKey)) - } - - var transmitterAddresses []common.Address - for _, oracle := range oracles { - transmitterAddresses = append(transmitterAddresses, common.HexToAddress(string(oracle.TransmitAccount))) - } - - // get the config digest from the ccip config contract and set config on the offramp. - var offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs - for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - ocrConfig, err1 := h.ccipConfig.GetOCRConfig(&bind.CallOpts{ - Context: testutils.Context(t), - }, donID, uint8(pluginType)) - require.NoError(t, err1, "failed to get OCR3 config from ccip config contract") - require.Len(t, ocrConfig, 1, "expected exactly one OCR3 config") - offrampOCR3Configs = append(offrampOCR3Configs, offramp.MultiOCR3BaseOCRConfigArgs{ - ConfigDigest: ocrConfig[0].ConfigDigest, - OcrPluginType: uint8(pluginType), - F: f, - IsSignatureVerificationEnabled: pluginType == cctypes.PluginTypeCCIPCommit, - Signers: signerAddresses, - Transmitters: transmitterAddresses, - }) - } - - uni.backend.Commit() - - _, err = uni.offramp.SetOCR3Configs(uni.owner, offrampOCR3Configs) - require.NoError(t, err, "failed to set ocr3 configs on offramp") - uni.backend.Commit() - - for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - ocrConfig, err := uni.offramp.LatestConfigDetails(&bind.CallOpts{ - Context: testutils.Context(t), - }, uint8(pluginType)) - require.NoError(t, err, "failed to get latest commit OCR3 config") - require.Equalf(t, offrampOCR3Configs[pluginType].ConfigDigest, ocrConfig.ConfigInfo.ConfigDigest, "%s OCR3 config digest mismatch", pluginType.String()) - require.Equalf(t, offrampOCR3Configs[pluginType].F, ocrConfig.ConfigInfo.F, "%s OCR3 config F mismatch", pluginType.String()) - require.Equalf(t, offrampOCR3Configs[pluginType].IsSignatureVerificationEnabled, ocrConfig.ConfigInfo.IsSignatureVerificationEnabled, "%s OCR3 config signature verification mismatch", pluginType.String()) - if pluginType == cctypes.PluginTypeCCIPCommit { - // only commit will set signers, exec doesn't need them. - require.Equalf(t, offrampOCR3Configs[pluginType].Signers, ocrConfig.Signers, "%s OCR3 config signers mismatch", pluginType.String()) - } - require.Equalf(t, offrampOCR3Configs[pluginType].Transmitters, ocrConfig.Transmitters, "%s OCR3 config transmitters mismatch", pluginType.String()) - } - - t.Logf("set ocr3 config on the offramp, signers: %+v, transmitters: %+v", signerAddresses, transmitterAddresses) -} - -func connectUniverses( - t *testing.T, - universes map[uint64]onchainUniverse, -) { - for _, uni := range universes { - wireRouter(t, uni, universes) - wirePriceRegistry(t, uni, universes) - wireOnRamp(t, uni, universes) - wireOffRamp(t, uni, universes) - initRemoteChainsGasPrices(t, uni, universes) - } -} - -// setupUniverseBasics sets up the initial configurations for the CCIP contracts on a single chain. -// 1. Mint 1000 LINK to the owner -// 2. Set the price registry with local token prices -// 3. Authorize the onRamp and offRamp on the nonce manager -func setupUniverseBasics(t *testing.T, uni onchainUniverse) { - // ============================================================================= - // Universe specific updates/configs - // These updates are specific to each universe and are set up here - // These updates don't depend on other chains - // ============================================================================= - owner := uni.owner - // ============================================================================= - // Mint 1000 LINK to owner - // ============================================================================= - _, err := uni.linkToken.GrantMintRole(owner, owner.From) - require.NoError(t, err) - _, err = uni.linkToken.Mint(owner, owner.From, e18Mult(1000)) - require.NoError(t, err) - uni.backend.Commit() - - // ============================================================================= - // Price updates for tokens - // These are the prices of the fee tokens of local chain in USD - // ============================================================================= - tokenPriceUpdates := []fee_quoter.InternalTokenPriceUpdate{ - { - SourceToken: uni.linkToken.Address(), - UsdPerToken: e18Mult(20), - }, - { - SourceToken: uni.weth.Address(), - UsdPerToken: e18Mult(4000), - }, - } - _, err = uni.priceRegistry.UpdatePrices(owner, fee_quoter.InternalPriceUpdates{ - TokenPriceUpdates: tokenPriceUpdates, - }) - require.NoErrorf(t, err, "failed to update prices in price registry on chain id %d", uni.chainID) - uni.backend.Commit() - - _, err = uni.priceRegistry.ApplyAuthorizedCallerUpdates(owner, fee_quoter.AuthorizedCallersAuthorizedCallerArgs{ - AddedCallers: []common.Address{ - uni.offramp.Address(), - }, - }) - require.NoError(t, err, "failed to authorize offramp on price registry") - uni.backend.Commit() - - // ============================================================================= - // Authorize OnRamp & OffRamp on NonceManager - // Otherwise the onramp will not be able to call the nonceManager to get next Nonce - // ============================================================================= - authorizedCallersAuthorizedCallerArgs := nonce_manager.AuthorizedCallersAuthorizedCallerArgs{ - AddedCallers: []common.Address{ - uni.onramp.Address(), - uni.offramp.Address(), - }, - } - _, err = uni.nonceManager.ApplyAuthorizedCallerUpdates(owner, authorizedCallersAuthorizedCallerArgs) - require.NoError(t, err) - uni.backend.Commit() -} - -// As we can't change router contract. The contract was expecting onRamp and offRamp per lane and not per chain -// In the new architecture we have only one onRamp and one offRamp per chain. -// hence we add the mapping for all remote chains to the onRamp/offRamp contract of the local chain -func wireRouter(t *testing.T, uni onchainUniverse, universes map[uint64]onchainUniverse) { - owner := uni.owner - var ( - routerOnrampUpdates []router.RouterOnRamp - routerOfframpUpdates []router.RouterOffRamp - ) - for remoteChainID := range universes { - if remoteChainID == uni.chainID { - continue - } - routerOnrampUpdates = append(routerOnrampUpdates, router.RouterOnRamp{ - DestChainSelector: getSelector(remoteChainID), - OnRamp: uni.onramp.Address(), - }) - routerOfframpUpdates = append(routerOfframpUpdates, router.RouterOffRamp{ - SourceChainSelector: getSelector(remoteChainID), - OffRamp: uni.offramp.Address(), - }) - } - _, err := uni.router.ApplyRampUpdates(owner, routerOnrampUpdates, []router.RouterOffRamp{}, routerOfframpUpdates) - require.NoErrorf(t, err, "failed to apply ramp updates on router on chain id %d", uni.chainID) - uni.backend.Commit() -} - -// Setting OnRampDestChainConfigs -func wirePriceRegistry(t *testing.T, uni onchainUniverse, universes map[uint64]onchainUniverse) { - owner := uni.owner - var priceRegistryDestChainConfigArgs []fee_quoter.FeeQuoterDestChainConfigArgs - for remoteChainID := range universes { - if remoteChainID == uni.chainID { - continue - } - priceRegistryDestChainConfigArgs = append(priceRegistryDestChainConfigArgs, fee_quoter.FeeQuoterDestChainConfigArgs{ - DestChainSelector: getSelector(remoteChainID), - DestChainConfig: defaultPriceRegistryDestChainConfig(t), - }) - } - _, err := uni.priceRegistry.ApplyDestChainConfigUpdates(owner, priceRegistryDestChainConfigArgs) - require.NoErrorf(t, err, "failed to apply dest chain config updates on price registry on chain id %d", uni.chainID) - uni.backend.Commit() -} - -// Setting OnRampDestChainConfigs -func wireOnRamp(t *testing.T, uni onchainUniverse, universes map[uint64]onchainUniverse) { - owner := uni.owner - var onrampSourceChainConfigArgs []onramp.OnRampDestChainConfigArgs - for remoteChainID := range universes { - if remoteChainID == uni.chainID { - continue - } - onrampSourceChainConfigArgs = append(onrampSourceChainConfigArgs, onramp.OnRampDestChainConfigArgs{ - DestChainSelector: getSelector(remoteChainID), - Router: uni.router.Address(), - }) - } - _, err := uni.onramp.ApplyDestChainConfigUpdates(owner, onrampSourceChainConfigArgs) - require.NoErrorf(t, err, "failed to apply dest chain config updates on onramp with chain id %d", uni.chainID) - uni.backend.Commit() -} - -// Setting OffRampSourceChainConfigs -func wireOffRamp(t *testing.T, uni onchainUniverse, universes map[uint64]onchainUniverse) { - owner := uni.owner - var offrampSourceChainConfigArgs []offramp.OffRampSourceChainConfigArgs - for remoteChainID, remoteUniverse := range universes { - if remoteChainID == uni.chainID { - continue - } - offrampSourceChainConfigArgs = append(offrampSourceChainConfigArgs, offramp.OffRampSourceChainConfigArgs{ - SourceChainSelector: getSelector(remoteChainID), - IsEnabled: true, - Router: uni.router.Address(), - OnRamp: remoteUniverse.onramp.Address().Bytes(), - }) - } - _, err := uni.offramp.ApplySourceChainConfigUpdates(owner, offrampSourceChainConfigArgs) - require.NoErrorf(t, err, "failed to apply source chain config updates on offramp on chain id %d", uni.chainID) - uni.backend.Commit() - for remoteChainID, remoteUniverse := range universes { - if remoteChainID == uni.chainID { - continue - } - sourceCfg, err2 := uni.offramp.GetSourceChainConfig(&bind.CallOpts{}, getSelector(remoteChainID)) - require.NoError(t, err2) - require.True(t, sourceCfg.IsEnabled, "source chain config should be enabled") - require.Equal(t, remoteUniverse.onramp.Address(), common.BytesToAddress(sourceCfg.OnRamp), "source chain config onRamp address mismatch") - } -} - -func getSelector(chainID uint64) uint64 { - selector, err := chainsel.SelectorFromChainId(chainID) - if err != nil { - panic(err) - } - return selector -} - -// initRemoteChainsGasPrices sets the gas prices for all chains except the local chain in the local price registry -func initRemoteChainsGasPrices(t *testing.T, uni onchainUniverse, universes map[uint64]onchainUniverse) { - var gasPriceUpdates []fee_quoter.InternalGasPriceUpdate - for remoteChainID := range universes { - if remoteChainID == uni.chainID { - continue - } - gasPriceUpdates = append(gasPriceUpdates, - fee_quoter.InternalGasPriceUpdate{ - DestChainSelector: getSelector(remoteChainID), - UsdPerUnitGas: big.NewInt(2e12), - }, - ) - } - _, err := uni.priceRegistry.UpdatePrices(uni.owner, fee_quoter.InternalPriceUpdates{ - GasPriceUpdates: gasPriceUpdates, - }) - require.NoError(t, err) -} - -func defaultPriceRegistryDestChainConfig(t *testing.T) fee_quoter.FeeQuoterDestChainConfig { - // https://github.com/smartcontractkit/ccip/blob/c4856b64bd766f1ddbaf5d13b42d3c4b12efde3a/contracts/src/v0.8/ccip/libraries/Internal.sol#L337-L337 - /* - ```Solidity - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - bytes4 public constant CHAIN_FAMILY_SELECTOR_EVM = 0x2812d52c; - ``` - */ - evmFamilySelector, err := hex.DecodeString("2812d52c") - require.NoError(t, err) - return fee_quoter.FeeQuoterDestChainConfig{ - IsEnabled: true, - MaxNumberOfTokensPerMsg: 10, - MaxDataBytes: 256, - MaxPerMsgGasLimit: 3_000_000, - DestGasOverhead: 50_000, - DefaultTokenFeeUSDCents: 1, - DestGasPerPayloadByte: 10, - DestDataAvailabilityOverheadGas: 0, - DestGasPerDataAvailabilityByte: 100, - DestDataAvailabilityMultiplierBps: 1, - DefaultTokenDestGasOverhead: 125_000, - DefaultTxGasLimit: 200_000, - GasMultiplierWeiPerEth: 1, - NetworkFeeUSDCents: 1, - ChainFamilySelector: [4]byte(evmFamilySelector), - } -} - -func deployLinkToken(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, chainID uint64) *link_token.LinkToken { - linkAddr, _, _, err := link_token.DeployLinkToken(owner, backend) - require.NoErrorf(t, err, "failed to deploy link token on chain id %d", chainID) - backend.Commit() - linkToken, err := link_token.NewLinkToken(linkAddr, backend) - require.NoError(t, err) - return linkToken -} - -func deployMockRMNContract(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, chainID uint64) *mock_rmn_contract.MockRMNContract { - rmnAddr, _, _, err := mock_rmn_contract.DeployMockRMNContract(owner, backend) - require.NoErrorf(t, err, "failed to deploy mock arm on chain id %d", chainID) - backend.Commit() - rmn, err := mock_rmn_contract.NewMockRMNContract(rmnAddr, backend) - require.NoError(t, err) - return rmn -} - -func deployRMNProxyContract(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, rmnAddr common.Address, chainID uint64) *rmn_proxy_contract.RMNProxyContract { - rmnProxyAddr, _, _, err := rmn_proxy_contract.DeployRMNProxyContract(owner, backend, rmnAddr) - require.NoErrorf(t, err, "failed to deploy arm proxy on chain id %d", chainID) - backend.Commit() - rmnProxy, err := rmn_proxy_contract.NewRMNProxyContract(rmnProxyAddr, backend) - require.NoError(t, err) - return rmnProxy -} - -func deployWETHContract(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, chainID uint64) *weth9.WETH9 { - wethAddr, _, _, err := weth9.DeployWETH9(owner, backend) - require.NoErrorf(t, err, "failed to deploy weth contract on chain id %d", chainID) - backend.Commit() - weth, err := weth9.NewWETH9(wethAddr, backend) - require.NoError(t, err) - return weth -} - -func deployRouter(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, wethAddr, rmnProxyAddr common.Address, chainID uint64) *router.Router { - routerAddr, _, _, err := router.DeployRouter(owner, backend, wethAddr, rmnProxyAddr) - require.NoErrorf(t, err, "failed to deploy router on chain id %d", chainID) - backend.Commit() - rout, err := router.NewRouter(routerAddr, backend) - require.NoError(t, err) - return rout -} - -func deployPriceRegistry( - t *testing.T, - owner *bind.TransactOpts, - backend *backends.SimulatedBackend, - linkAddr, - wethAddr common.Address, - maxFeeJuelsPerMsg *big.Int, - chainID uint64, -) *fee_quoter.FeeQuoter { - priceRegistryAddr, _, _, err := fee_quoter.DeployFeeQuoter( - owner, - backend, - fee_quoter.FeeQuoterStaticConfig{ - MaxFeeJuelsPerMsg: maxFeeJuelsPerMsg, - LinkToken: linkAddr, - StalenessThreshold: 24 * 60 * 60, // 24 hours - }, - []common.Address{ - owner.From, // owner can update prices in this test - }, // price updaters, will be set to offramp later - []common.Address{linkAddr, wethAddr}, // fee tokens - // empty for now, need to fill in when testing token transfers - []fee_quoter.FeeQuoterTokenPriceFeedUpdate{}, - // empty for now, need to fill in when testing token transfers - []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs{}, - []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs{ - { - PremiumMultiplierWeiPerEth: 9e17, // 0.9 ETH - Token: linkAddr, - }, - { - PremiumMultiplierWeiPerEth: 1e18, - Token: wethAddr, - }, - }, - // Destination chain configs will be set up later once we have all chains - []fee_quoter.FeeQuoterDestChainConfigArgs{}, - ) - require.NoErrorf(t, err, "failed to deploy price registry on chain id %d", chainID) - backend.Commit() - priceRegistry, err := fee_quoter.NewFeeQuoter(priceRegistryAddr, backend) - require.NoError(t, err) - return priceRegistry -} - -func deployTokenAdminRegistry(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, chainID uint64) *token_admin_registry.TokenAdminRegistry { - tarAddr, _, _, err := token_admin_registry.DeployTokenAdminRegistry(owner, backend) - require.NoErrorf(t, err, "failed to deploy token admin registry on chain id %d", chainID) - backend.Commit() - tokenAdminRegistry, err := token_admin_registry.NewTokenAdminRegistry(tarAddr, backend) - require.NoError(t, err) - return tokenAdminRegistry -} - -func deployNonceManager(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend, chainID uint64) *nonce_manager.NonceManager { - nonceManagerAddr, _, _, err := nonce_manager.DeployNonceManager(owner, backend, []common.Address{owner.From}) - require.NoErrorf(t, err, "failed to deploy nonce_manager on chain id %d", chainID) - backend.Commit() - nonceManager, err := nonce_manager.NewNonceManager(nonceManagerAddr, backend) - require.NoError(t, err) - return nonceManager -} diff --git a/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go index f0921cc8f49..faf8444523f 100644 --- a/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go @@ -5,11 +5,11 @@ import ( "testing" "time" - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" - mapset "github.com/deckarep/golang-set/v2" "github.com/onsi/gomega" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" + libocrtypes "github.com/smartcontractkit/libocr/ragep2p/types" "github.com/smartcontractkit/chainlink-ccip/chainconfig" @@ -19,12 +19,12 @@ import ( "github.com/stretchr/testify/require" - capcfg "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" ) -func TestHomeChainReader(t *testing.T) { +func TestHomeChainReader_ChainConfigs(t *testing.T) { ctx := testutils.Context(t) lggr := logger.TestLogger(t) uni := integrationhelpers.NewTestUniverse(ctx, t, lggr) @@ -44,15 +44,15 @@ func TestHomeChainReader(t *testing.T) { OptimisticConfirmations: 1, }) require.NoError(t, err) - inputConfig := []capcfg.CCIPConfigTypesChainConfigInfo{ + inputConfig := []ccip_home.CCIPHomeChainConfigArgs{ integrationhelpers.SetupConfigInfo(integrationhelpers.ChainA, p2pIDs, integrationhelpers.FChainA, encodedChainConfig), integrationhelpers.SetupConfigInfo(integrationhelpers.ChainB, p2pIDs[1:], integrationhelpers.FChainB, encodedChainConfig), integrationhelpers.SetupConfigInfo(integrationhelpers.ChainC, p2pIDs[2:], integrationhelpers.FChainC, encodedChainConfig), } - _, err = uni.CcipCfg.ApplyChainConfigUpdates(uni.Transactor, nil, inputConfig) + _, err = uni.CCIPHome.ApplyChainConfigUpdates(uni.Transactor, nil, inputConfig) require.NoError(t, err) uni.Backend.Commit() - chainConfigInfos, err := uni.CcipCfg.GetAllChainConfigs(nil, big.NewInt(0), big.NewInt(100)) + chainConfigInfos, err := uni.CCIPHome.GetAllChainConfigs(nil, big.NewInt(0), big.NewInt(100)) require.NoError(t, err) require.Len(t, chainConfigInfos, len(inputConfig)) @@ -81,7 +81,7 @@ func TestHomeChainReader(t *testing.T) { // Remove chain C from the chain configs and expect the home chain reader to // update its state accordingly. - _, err = uni.CcipCfg.ApplyChainConfigUpdates(uni.Transactor, []uint64{integrationhelpers.ChainC}, nil) + _, err = uni.CCIPHome.ApplyChainConfigUpdates(uni.Transactor, []uint64{integrationhelpers.ChainC}, nil) require.NoError(t, err) uni.Backend.Commit() diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go index e6eb3aa6e09..23c6a6a9d91 100644 --- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go +++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go @@ -9,32 +9,27 @@ import ( "testing" "time" - configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" - cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/smartcontractkit/chainlink-ccip/pkg/consts" ccipreader "github.com/smartcontractkit/chainlink-ccip/pkg/reader" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ocr3_config_encoder" - kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" - "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/stretchr/testify/require" + configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" + cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) @@ -88,7 +83,7 @@ type TestUniverse struct { Transactor *bind.TransactOpts Backend *backends.SimulatedBackend CapReg *kcr.CapabilitiesRegistry - CcipCfg *ccip_config.CCIPConfig + CCIPHome *ccip_home.CCIPHome TestingT *testing.T LogPoller logpoller.LogPoller HeadTracker logpoller.HeadTracker @@ -109,11 +104,11 @@ func NewTestUniverse(ctx context.Context, t *testing.T, lggr logger.Logger) Test capReg, err := kcr.NewCapabilitiesRegistry(crAddress, backend) require.NoError(t, err) - ccAddress, _, _, err := ccip_config.DeployCCIPConfig(transactor, backend, crAddress) + ccAddress, _, _, err := ccip_home.DeployCCIPHome(transactor, backend, crAddress) require.NoError(t, err) backend.Commit() - cc, err := ccip_config.NewCCIPConfig(ccAddress, backend) + cc, err := ccip_home.NewCCIPHome(ccAddress, backend) require.NoError(t, err) db := pgtest.NewSqlxDB(t) @@ -138,7 +133,7 @@ func NewTestUniverse(ctx context.Context, t *testing.T, lggr logger.Logger) Test Transactor: transactor, Backend: backend, CapReg: capReg, - CcipCfg: cc, + CCIPHome: cc, TestingT: t, SimClient: cl, LogPoller: lp, @@ -180,7 +175,7 @@ func (t *TestUniverse) AddCapability(p2pIDs [][32]byte) { Version: CcipCapabilityVersion, CapabilityType: 0, ResponseType: 0, - ConfigurationContract: t.CcipCfg.Address(), + ConfigurationContract: t.CCIPHome.Address(), }, }) require.NoError(t.TestingT, err, "failed to add capability to registry") @@ -234,7 +229,7 @@ func (t *TestUniverse) AddCapability(p2pIDs [][32]byte) { func NewHomeChainReader(t *testing.T, logPoller logpoller.LogPoller, headTracker logpoller.HeadTracker, client client.Client, ccAddress common.Address) ccipreader.HomeChain { cr := NewReader(t, logPoller, headTracker, client, ccAddress, configsevm.HomeChainReaderConfigRaw) - hcr := ccipreader.NewHomeChainReader(cr, logger.TestLogger(t), 500*time.Millisecond, types.BoundContract{ + hcr := ccipreader.NewHomeChainReader(cr, logger.TestLogger(t), 50*time.Millisecond, types.BoundContract{ Address: ccAddress.String(), Name: consts.ContractNameCCIPConfig, }) @@ -248,56 +243,121 @@ func (t *TestUniverse) AddDONToRegistry( ccipCapabilityID [32]byte, chainSelector uint64, f uint8, - bootstrapP2PID [32]byte, p2pIDs [][32]byte, ) { - tabi, err := ocr3_config_encoder.IOCR3ConfigEncoderMetaData.GetAbi() + tabi, err := ccip_home.CCIPHomeMetaData.GetAbi() require.NoError(t.TestingT, err) - var ( - signers [][]byte - transmitters [][]byte - ) - for range p2pIDs { - signers = append(signers, testutils.NewAddress().Bytes()) - transmitters = append(transmitters, testutils.NewAddress().Bytes()) + var nodes []ccip_home.CCIPHomeOCR3Node + + for i := range p2pIDs { + nodes = append(nodes, ccip_home.CCIPHomeOCR3Node{ + P2pId: p2pIDs[i], + SignerKey: testutils.NewAddress().Bytes(), + TransmitterKey: testutils.NewAddress().Bytes(), + }) + } + + // find the max don id, the next DON id will be max + 1. + iter, err := t.CapReg.FilterConfigSet(nil, nil) + require.NoError(t.TestingT, err) + var maxDonID uint32 + for iter.Next() { + if iter.Event.DonId > maxDonID { + maxDonID = iter.Event.DonId + } } - var ocr3Configs []ocr3_config_encoder.CCIPConfigTypesOCR3Config + donID := maxDonID + 1 + for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - ocr3Configs = append(ocr3Configs, ocr3_config_encoder.CCIPConfigTypesOCR3Config{ + ocr3Config := ccip_home.CCIPHomeOCR3Config{ PluginType: uint8(pluginType), ChainSelector: chainSelector, - F: f, + FRoleDON: f, OffchainConfigVersion: 30, OfframpAddress: testutils.NewAddress().Bytes(), - P2pIds: p2pIDs, - Signers: signers, - Transmitters: transmitters, + RmnHomeAddress: testutils.NewAddress().Bytes(), + Nodes: nodes, OffchainConfig: []byte("offchain config"), - }) - } + } + encodedSetCandidateCall, err := tabi.Pack( + "setCandidate", + donID, + ocr3Config.PluginType, + ocr3Config, + [32]byte{}, + ) + require.NoError(t.TestingT, err) + // Create DON should be called only once, any subsequent calls should be updating DON + if pluginType == cctypes.PluginTypeCCIPCommit { + _, err = t.CapReg.AddDON( + t.Transactor, p2pIDs, []kcr.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: ccipCapabilityID, + Config: encodedSetCandidateCall, + }, + }, + false, + false, + f, + ) + } else { + _, err = t.CapReg.UpdateDON( + t.Transactor, donID, p2pIDs, []kcr.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: ccipCapabilityID, + Config: encodedSetCandidateCall, + }, + }, + false, + f, + ) + } - encodedCall, err := tabi.Pack("exposeOCR3Config", ocr3Configs) - require.NoError(t.TestingT, err) + require.NoError(t.TestingT, err) + t.Backend.Commit() - // Trim first four bytes to remove function selector. - encodedConfigs := encodedCall[4:] + configs, err := t.CCIPHome.GetAllConfigs(nil, donID, uint8(pluginType)) + require.NoError(t.TestingT, err) + require.Equal(t.TestingT, ocr3Config, configs.CandidateConfig.Config) - _, err = t.CapReg.AddDON(t.Transactor, p2pIDs, []kcr.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: ccipCapabilityID, - Config: encodedConfigs, - }, - }, false, false, f) - require.NoError(t.TestingT, err) - t.Backend.Commit() + // get the config digest of the candidate + candidateDigest, err := t.CCIPHome.GetCandidateDigest(nil, donID, ocr3Config.PluginType) + require.NoError(t.TestingT, err) + encodedPromotionCall, err := tabi.Pack( + "promoteCandidateAndRevokeActive", + donID, + ocr3Config.PluginType, + candidateDigest, + [32]byte{}, + ) + require.NoError(t.TestingT, err) + + _, err = t.CapReg.UpdateDON( + t.Transactor, donID, p2pIDs, []kcr.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: ccipCapabilityID, + Config: encodedPromotionCall, + }, + }, + false, + f, + ) + + require.NoError(t.TestingT, err) + t.Backend.Commit() + + configs, err = t.CCIPHome.GetAllConfigs(nil, donID, uint8(pluginType)) + require.NoError(t.TestingT, err) + require.Equal(t.TestingT, ocr3Config, configs.ActiveConfig.Config) + } } -func SetupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg []byte) ccip_config.CCIPConfigTypesChainConfigInfo { - return ccip_config.CCIPConfigTypesChainConfigInfo{ +func SetupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg []byte) ccip_home.CCIPHomeChainConfigArgs { + return ccip_home.CCIPHomeChainConfigArgs{ ChainSelector: chainSelector, - ChainConfig: ccip_config.CCIPConfigTypesChainConfig{ + ChainConfig: ccip_home.CCIPHomeChainConfig{ Readers: readers, FChain: fChain, Config: cfg, diff --git a/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go b/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go deleted file mode 100644 index aff02cd55d8..00000000000 --- a/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go +++ /dev/null @@ -1,318 +0,0 @@ -package ccip_integration_tests - -import ( - "context" - "fmt" - "math/big" - "net/http" - "strconv" - "sync" - "testing" - "time" - - coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks" - - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - gethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/jmoiron/sqlx" - - "github.com/smartcontractkit/chainlink/v2/core/services/job" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" - - "github.com/smartcontractkit/chainlink-common/pkg/config" - "github.com/smartcontractkit/chainlink-common/pkg/loop" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - - "github.com/smartcontractkit/chainlink/v2/core/services/relay" - - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" - v2toml "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml" - evmutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" - configv2 "github.com/smartcontractkit/chainlink/v2/core/config/toml" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" - "github.com/smartcontractkit/chainlink/v2/core/logger" - "github.com/smartcontractkit/chainlink/v2/core/logger/audit" - "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key" - "github.com/smartcontractkit/chainlink/v2/core/utils" - "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight" - "github.com/smartcontractkit/chainlink/v2/plugins" - - "github.com/stretchr/testify/require" - "go.uber.org/zap/zapcore" -) - -type ocr3Node struct { - app chainlink.Application - peerID string - transmitters map[uint64]common.Address - keybundle ocr2key.KeyBundle - db *sqlx.DB -} - -// setupNodeOCR3 creates a chainlink node and any associated keys in order to run -// ccip. -func setupNodeOCR3( - t *testing.T, - port int, - universes map[uint64]onchainUniverse, - homeChainUniverse homeChain, - logLevel zapcore.Level, -) *ocr3Node { - // Do not want to load fixtures as they contain a dummy chainID. - cfg, db := heavyweight.FullTestDBNoFixturesV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { - c.Insecure.OCRDevelopmentMode = ptr(true) // Disables ocr spec validation so we can have fast polling for the test. - - c.Feature.LogPoller = ptr(true) - - // P2P V2 configs. - c.P2P.V2.Enabled = ptr(true) - c.P2P.V2.DeltaDial = config.MustNewDuration(500 * time.Millisecond) - c.P2P.V2.DeltaReconcile = config.MustNewDuration(5 * time.Second) - c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", port)} - - // Enable Capabilities, This is a pre-requisite for registrySyncer to work. - c.Capabilities.ExternalRegistry.NetworkID = ptr(relay.NetworkEVM) - c.Capabilities.ExternalRegistry.ChainID = ptr(strconv.FormatUint(homeChainUniverse.chainID, 10)) - c.Capabilities.ExternalRegistry.Address = ptr(homeChainUniverse.capabilityRegistry.Address().String()) - - // OCR configs - c.OCR.Enabled = ptr(false) - c.OCR.DefaultTransactionQueueDepth = ptr(uint32(200)) - c.OCR2.Enabled = ptr(true) - c.OCR2.ContractPollInterval = config.MustNewDuration(5 * time.Second) - - c.Log.Level = ptr(configv2.LogLevel(logLevel)) - - var chains v2toml.EVMConfigs - for chainID := range universes { - chains = append(chains, createConfigV2Chain(uBigInt(chainID))) - } - c.EVM = chains - }) - - lggr := logger.TestLogger(t) - lggr.SetLogLevel(logLevel) - ctx := testutils.Context(t) - clients := make(map[uint64]client.Client) - - for chainID, uni := range universes { - clients[chainID] = client.NewSimulatedBackendClient(t, uni.backend, uBigInt(chainID)) - } - - master := keystore.New(db, utils.FastScryptParams, lggr) - - kStore := KeystoreSim{ - eks: &EthKeystoreSim{ - Eth: master.Eth(), - t: t, - }, - csa: master.CSA(), - } - mailMon := mailbox.NewMonitor("ccip", lggr.Named("mailbox")) - evmOpts := chainlink.EVMFactoryConfig{ - ChainOpts: legacyevm.ChainOpts{ - AppConfig: cfg, - GenEthClient: func(i *big.Int) client.Client { - client, ok := clients[i.Uint64()] - if !ok { - t.Fatal("no backend for chainID", i) - } - return client - }, - MailMon: mailMon, - DS: db, - }, - CSAETHKeystore: kStore, - } - relayerFactory := chainlink.RelayerFactory{ - Logger: lggr, - LoopRegistry: plugins.NewLoopRegistry(lggr.Named("LoopRegistry"), cfg.Tracing(), cfg.Telemetry()), - GRPCOpts: loop.GRPCOpts{}, - CapabilitiesRegistry: coretypes.NewCapabilitiesRegistry(t), - } - initOps := []chainlink.CoreRelayerChainInitFunc{chainlink.InitEVM(testutils.Context(t), relayerFactory, evmOpts)} - rci, err := chainlink.NewCoreRelayerChainInteroperators(initOps...) - require.NoError(t, err) - - app, err := chainlink.NewApplication(chainlink.ApplicationOpts{ - Config: cfg, - DS: db, - KeyStore: master, - RelayerChainInteroperators: rci, - Logger: lggr, - ExternalInitiatorManager: nil, - CloseLogger: lggr.Sync, - UnrestrictedHTTPClient: &http.Client{}, - RestrictedHTTPClient: &http.Client{}, - AuditLogger: audit.NoopLogger, - MailMon: mailMon, - LoopRegistry: plugins.NewLoopRegistry(lggr, cfg.Tracing(), cfg.Telemetry()), - }) - require.NoError(t, err) - require.NoError(t, app.GetKeyStore().Unlock(ctx, "password")) - _, err = app.GetKeyStore().P2P().Create(ctx) - require.NoError(t, err) - - p2pIDs, err := app.GetKeyStore().P2P().GetAll() - require.NoError(t, err) - require.Len(t, p2pIDs, 1) - peerID := p2pIDs[0].PeerID() - // create a transmitter for each chain - transmitters := make(map[uint64]common.Address) - for chainID, uni := range universes { - backend := uni.backend - owner := uni.owner - cID := uBigInt(chainID) - addrs, err2 := app.GetKeyStore().Eth().EnabledAddressesForChain(testutils.Context(t), cID) - require.NoError(t, err2) - if len(addrs) == 1 { - // just fund the address - fundAddress(t, owner, addrs[0], assets.Ether(10).ToInt(), backend) - transmitters[chainID] = addrs[0] - } else { - // create key and fund it - _, err3 := app.GetKeyStore().Eth().Create(testutils.Context(t), cID) - require.NoError(t, err3, "failed to create key for chain", chainID) - sendingKeys, err3 := app.GetKeyStore().Eth().EnabledAddressesForChain(testutils.Context(t), cID) - require.NoError(t, err3) - require.Len(t, sendingKeys, 1) - fundAddress(t, owner, sendingKeys[0], assets.Ether(10).ToInt(), backend) - transmitters[chainID] = sendingKeys[0] - } - } - require.Len(t, transmitters, len(universes)) - - keybundle, err := app.GetKeyStore().OCR2().Create(ctx, chaintype.EVM) - require.NoError(t, err) - - t.Cleanup(func() { - require.NoError(t, db.Close()) - }) - - return &ocr3Node{ - // can't use this app because it doesn't have the right toml config - // missing bootstrapp - app: app, - peerID: peerID.Raw(), - transmitters: transmitters, - keybundle: keybundle, - db: db, - } -} - -func ptr[T any](v T) *T { return &v } - -var _ keystore.Eth = &EthKeystoreSim{} - -type EthKeystoreSim struct { - keystore.Eth - t *testing.T -} - -// override -func (e *EthKeystoreSim) SignTx(ctx context.Context, address common.Address, tx *gethtypes.Transaction, chainID *big.Int) (*gethtypes.Transaction, error) { - // always sign with chain id 1337 for the simulated backend - return e.Eth.SignTx(ctx, address, tx, big.NewInt(1337)) -} - -type KeystoreSim struct { - eks keystore.Eth - csa keystore.CSA -} - -func (e KeystoreSim) Eth() keystore.Eth { - return e.eks -} - -func (e KeystoreSim) CSA() keystore.CSA { - return e.csa -} - -func fundAddress(t *testing.T, from *bind.TransactOpts, to common.Address, amount *big.Int, backend *backends.SimulatedBackend) { - nonce, err := backend.PendingNonceAt(testutils.Context(t), from.From) - require.NoError(t, err) - gp, err := backend.SuggestGasPrice(testutils.Context(t)) - require.NoError(t, err) - rawTx := gethtypes.NewTx(&gethtypes.LegacyTx{ - Nonce: nonce, - GasPrice: gp, - Gas: 21000, - To: &to, - Value: amount, - }) - signedTx, err := from.Signer(from.From, rawTx) - require.NoError(t, err) - err = backend.SendTransaction(testutils.Context(t), signedTx) - require.NoError(t, err) - backend.Commit() -} - -func createConfigV2Chain(chainID *big.Int) *v2toml.EVMConfig { - chain := v2toml.Defaults((*evmutils.Big)(chainID)) - chain.GasEstimator.LimitDefault = ptr(uint64(5e6)) - chain.LogPollInterval = config.MustNewDuration(100 * time.Millisecond) - chain.Transactions.ForwardersEnabled = ptr(false) - chain.FinalityDepth = ptr(uint32(2)) - return &v2toml.EVMConfig{ - ChainID: (*evmutils.Big)(chainID), - Enabled: ptr(true), - Chain: chain, - Nodes: v2toml.EVMNodes{&v2toml.Node{}}, - } -} - -// Commit blocks periodically in the background for all chains -func commitBlocksBackground(t *testing.T, universes map[uint64]onchainUniverse, tick *time.Ticker) { - t.Log("starting ticker to commit blocks") - tickCtx, tickCancel := context.WithCancel(testutils.Context(t)) - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - for { - select { - case <-tick.C: - for _, uni := range universes { - uni.backend.Commit() - } - case <-tickCtx.Done(): - return - } - } - }() - t.Cleanup(func() { - tickCancel() - wg.Wait() - }) -} - -// p2pKeyID: nodes p2p id -// ocrKeyBundleID: nodes ocr key bundle id -func mustGetJobSpec(t *testing.T, bootstrapP2PID p2pkey.PeerID, bootstrapPort int, p2pKeyID string, ocrKeyBundleID string) job.Job { - specArgs := validate.SpecArgs{ - P2PV2Bootstrappers: []string{ - fmt.Sprintf("%s@127.0.0.1:%d", bootstrapP2PID.Raw(), bootstrapPort), - }, - CapabilityVersion: CapabilityVersion, - CapabilityLabelledName: CapabilityLabelledName, - OCRKeyBundleIDs: map[string]string{ - relay.NetworkEVM: ocrKeyBundleID, - }, - P2PKeyID: p2pKeyID, - PluginConfig: map[string]any{}, - } - specToml, err := validate.NewCCIPSpecToml(specArgs) - require.NoError(t, err) - jb, err := validate.ValidatedCCIPSpec(specToml) - require.NoError(t, err) - return jb -} diff --git a/core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go b/core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go deleted file mode 100644 index 57d2e09f225..00000000000 --- a/core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package ccip_integration_tests - -import ( - "testing" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - gethcommon "github.com/ethereum/go-ethereum/common" - - "github.com/stretchr/testify/require" - - "golang.org/x/exp/maps" - - pp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ping_pong_demo" -) - -/* -* Test is setting up 3 chains (let's call them A, B, C), each chain deploys and starts 2 ping pong contracts for the other 2. -* A ---deploy+start---> (pingPongB, pingPongC) -* B ---deploy+start---> (pingPongA, pingPongC) -* C ---deploy+start---> (pingPongA, pingPongB) -* and then checks that each ping pong contract emitted `CCIPMessageSent` event from the expected source to destination. -* Test fails if any wiring between contracts is not correct. - */ -func TestPingPong(t *testing.T) { - _, universes := createUniverses(t, 3) - pingPongs := initializePingPongContracts(t, universes) - for chainID, universe := range universes { - for otherChain, pingPong := range pingPongs[chainID] { - t.Log("PingPong From: ", chainID, " To: ", otherChain) - _, err := pingPong.StartPingPong(universe.owner) - require.NoError(t, err) - universe.backend.Commit() - - logIter, err := universe.onramp.FilterCCIPMessageSent(&bind.FilterOpts{Start: 0}, nil) - require.NoError(t, err) - // Iterate until latest event - for logIter.Next() { - } - log := logIter.Event - require.Equal(t, getSelector(otherChain), log.DestChainSelector) - require.Equal(t, pingPong.Address(), log.Message.Sender) - chainPingPongAddr := pingPongs[otherChain][chainID].Address().Bytes() - // With chain agnostic addresses we need to pad the address to the correct length if the receiver is zero prefixed - paddedAddr := gethcommon.LeftPadBytes(chainPingPongAddr, len(log.Message.Receiver)) - require.Equal(t, paddedAddr, log.Message.Receiver) - } - } -} - -// InitializeContracts initializes ping pong contracts on all chains and -// connects them all to each other. -func initializePingPongContracts( - t *testing.T, - chainUniverses map[uint64]onchainUniverse, -) map[uint64]map[uint64]*pp.PingPongDemo { - pingPongs := make(map[uint64]map[uint64]*pp.PingPongDemo) - chainIDs := maps.Keys(chainUniverses) - // For each chain initialize N ping pong contracts, where N is the (number of chains - 1) - for chainID, universe := range chainUniverses { - pingPongs[chainID] = make(map[uint64]*pp.PingPongDemo) - for _, chainToConnect := range chainIDs { - if chainToConnect == chainID { - continue // don't connect chain to itself - } - backend := universe.backend - owner := universe.owner - pingPongAddr, _, _, err := pp.DeployPingPongDemo(owner, backend, universe.router.Address(), universe.linkToken.Address()) - require.NoError(t, err) - backend.Commit() - pingPong, err := pp.NewPingPongDemo(pingPongAddr, backend) - require.NoError(t, err) - backend.Commit() - // Fund the ping pong contract with LINK - _, err = universe.linkToken.Transfer(owner, pingPong.Address(), e18Mult(10)) - backend.Commit() - require.NoError(t, err) - pingPongs[chainID][chainToConnect] = pingPong - } - } - - // Set up each ping pong contract to its counterpart on the other chain - for chainID, universe := range chainUniverses { - for chainToConnect, pingPong := range pingPongs[chainID] { - _, err := pingPong.SetCounterpart( - universe.owner, - getSelector(chainUniverses[chainToConnect].chainID), - // This is the address of the ping pong contract on the other chain - pingPongs[chainToConnect][chainID].Address(), - ) - require.NoError(t, err) - universe.backend.Commit() - } - } - return pingPongs -} diff --git a/core/capabilities/ccip/ccipevm/commitcodec.go b/core/capabilities/ccip/ccipevm/commitcodec.go index ca515ff2119..85c90b6b5c4 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec.go +++ b/core/capabilities/ccip/ccipevm/commitcodec.go @@ -4,45 +4,53 @@ import ( "context" "fmt" "math/big" - "strings" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/libocr/offchainreporting2plus/types" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_encoding_utils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) +var ( + ccipEncodingUtilsABI = abihelpers.MustParseABI(ccip_encoding_utils.EncodingUtilsABI) +) + // CommitPluginCodecV1 is a codec for encoding and decoding commit plugin reports. // Compatible with: // - "OffRamp 1.6.0-dev" -type CommitPluginCodecV1 struct { - commitReportAcceptedEventInputs abi.Arguments -} +type CommitPluginCodecV1 struct{} func NewCommitPluginCodecV1() *CommitPluginCodecV1 { - abiParsed, err := abi.JSON(strings.NewReader(offramp.OffRampABI)) - if err != nil { - panic(fmt.Errorf("parse multi offramp abi: %s", err)) - } - eventInputs := abihelpers.MustGetEventInputs("CommitReportAccepted", abiParsed) - return &CommitPluginCodecV1{commitReportAcceptedEventInputs: eventInputs} + return &CommitPluginCodecV1{} } func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.CommitPluginReport) ([]byte, error) { - merkleRoots := make([]offramp.InternalMerkleRoot, 0, len(report.MerkleRoots)) + merkleRoots := make([]ccip_encoding_utils.InternalMerkleRoot, 0, len(report.MerkleRoots)) for _, root := range report.MerkleRoots { - merkleRoots = append(merkleRoots, offramp.InternalMerkleRoot{ + merkleRoots = append(merkleRoots, ccip_encoding_utils.InternalMerkleRoot{ SourceChainSelector: uint64(root.ChainSel), - MinSeqNr: uint64(root.SeqNumsRange.Start()), - MaxSeqNr: uint64(root.SeqNumsRange.End()), - MerkleRoot: root.MerkleRoot, + // TODO: abi-encoded address for EVM source, figure out what to do for non-EVM. + OnRampAddress: common.LeftPadBytes(root.OnRampAddress, 32), + MinSeqNr: uint64(root.SeqNumsRange.Start()), + MaxSeqNr: uint64(root.SeqNumsRange.End()), + MerkleRoot: root.MerkleRoot, }) } - tokenPriceUpdates := make([]offramp.InternalTokenPriceUpdate, 0, len(report.PriceUpdates.TokenPriceUpdates)) + rmnSignatures := make([]ccip_encoding_utils.IRMNV2Signature, 0, len(report.RMNSignatures)) + for _, sig := range report.RMNSignatures { + rmnSignatures = append(rmnSignatures, ccip_encoding_utils.IRMNV2Signature{ + R: sig.R, + S: sig.S, + }) + } + + tokenPriceUpdates := make([]ccip_encoding_utils.InternalTokenPriceUpdate, 0, len(report.PriceUpdates.TokenPriceUpdates)) for _, update := range report.PriceUpdates.TokenPriceUpdates { if !common.IsHexAddress(string(update.TokenID)) { return nil, fmt.Errorf("invalid token address: %s", update.TokenID) @@ -50,55 +58,65 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi if update.Price.IsEmpty() { return nil, fmt.Errorf("empty price for token: %s", update.TokenID) } - tokenPriceUpdates = append(tokenPriceUpdates, offramp.InternalTokenPriceUpdate{ + tokenPriceUpdates = append(tokenPriceUpdates, ccip_encoding_utils.InternalTokenPriceUpdate{ SourceToken: common.HexToAddress(string(update.TokenID)), UsdPerToken: update.Price.Int, }) } - gasPriceUpdates := make([]offramp.InternalGasPriceUpdate, 0, len(report.PriceUpdates.GasPriceUpdates)) + gasPriceUpdates := make([]ccip_encoding_utils.InternalGasPriceUpdate, 0, len(report.PriceUpdates.GasPriceUpdates)) for _, update := range report.PriceUpdates.GasPriceUpdates { if update.GasPrice.IsEmpty() { return nil, fmt.Errorf("empty gas price for chain: %d", update.ChainSel) } - gasPriceUpdates = append(gasPriceUpdates, offramp.InternalGasPriceUpdate{ + gasPriceUpdates = append(gasPriceUpdates, ccip_encoding_utils.InternalGasPriceUpdate{ DestChainSelector: uint64(update.ChainSel), UsdPerUnitGas: update.GasPrice.Int, }) } - evmReport := offramp.OffRampCommitReport{ - PriceUpdates: offramp.InternalPriceUpdates{ - TokenPriceUpdates: tokenPriceUpdates, - GasPriceUpdates: gasPriceUpdates, - }, - MerkleRoots: merkleRoots, + priceUpdates := ccip_encoding_utils.InternalPriceUpdates{ + TokenPriceUpdates: tokenPriceUpdates, + GasPriceUpdates: gasPriceUpdates, + } + + commitReport := &ccip_encoding_utils.OffRampCommitReport{ + PriceUpdates: priceUpdates, + MerkleRoots: merkleRoots, + RmnSignatures: rmnSignatures, + RmnRawVs: report.RMNRawVs.Int, + } + + packed, err := ccipEncodingUtilsABI.Pack("exposeCommitReport", commitReport) + if err != nil { + return nil, fmt.Errorf("failed to pack commit report: %w", err) } - return c.commitReportAcceptedEventInputs.PackValues([]interface{}{evmReport}) + return packed[4:], nil } func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptypes.CommitPluginReport, error) { - unpacked, err := c.commitReportAcceptedEventInputs.Unpack(bytes) + method, ok := ccipEncodingUtilsABI.Methods["exposeCommitReport"] + if !ok { + return cciptypes.CommitPluginReport{}, fmt.Errorf("missing method exposeCommitReport") + } + + unpacked, err := method.Inputs.Unpack(bytes) if err != nil { - return cciptypes.CommitPluginReport{}, err + return cciptypes.CommitPluginReport{}, fmt.Errorf("failed to unpack commit report: %w", err) } if len(unpacked) != 1 { return cciptypes.CommitPluginReport{}, fmt.Errorf("expected 1 argument, got %d", len(unpacked)) } - commitReportRaw := abi.ConvertType(unpacked[0], new(offramp.OffRampCommitReport)) - commitReport, is := commitReportRaw.(*offramp.OffRampCommitReport) - if !is { - return cciptypes.CommitPluginReport{}, - fmt.Errorf("expected OffRampCommitReport, got %T", unpacked[0]) - } + commitReport := *abi.ConvertType(unpacked[0], new(ccip_encoding_utils.OffRampCommitReport)).(*ccip_encoding_utils.OffRampCommitReport) merkleRoots := make([]cciptypes.MerkleRootChain, 0, len(commitReport.MerkleRoots)) for _, root := range commitReport.MerkleRoots { merkleRoots = append(merkleRoots, cciptypes.MerkleRootChain{ - ChainSel: cciptypes.ChainSelector(root.SourceChainSelector), + ChainSel: cciptypes.ChainSelector(root.SourceChainSelector), + OnRampAddress: root.OnRampAddress, SeqNumsRange: cciptypes.NewSeqNumRange( cciptypes.SeqNum(root.MinSeqNr), cciptypes.SeqNum(root.MaxSeqNr), @@ -123,12 +141,22 @@ func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptyp }) } + rmnSignatures := make([]cciptypes.RMNECDSASignature, 0, len(commitReport.RmnSignatures)) + for _, sig := range commitReport.RmnSignatures { + rmnSignatures = append(rmnSignatures, cciptypes.RMNECDSASignature{ + R: sig.R, + S: sig.S, + }) + } + return cciptypes.CommitPluginReport{ MerkleRoots: merkleRoots, PriceUpdates: cciptypes.PriceUpdates{ TokenPriceUpdates: tokenPriceUpdates, GasPriceUpdates: gasPriceUpdates, }, + RMNSignatures: rmnSignatures, + RMNRawVs: cciptypes.NewBigInt(commitReport.RmnRawVs), }, nil } diff --git a/core/capabilities/ccip/ccipevm/commitcodec_test.go b/core/capabilities/ccip/ccipevm/commitcodec_test.go index 22dd0bfd126..999f9468283 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec_test.go +++ b/core/capabilities/ccip/ccipevm/commitcodec_test.go @@ -5,15 +5,13 @@ import ( "math/rand" "testing" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) @@ -21,7 +19,8 @@ var randomCommitReport = func() cciptypes.CommitPluginReport { return cciptypes.CommitPluginReport{ MerkleRoots: []cciptypes.MerkleRootChain{ { - ChainSel: cciptypes.ChainSelector(rand.Uint64()), + OnRampAddress: common.LeftPadBytes(utils.RandomAddress().Bytes(), 32), + ChainSel: cciptypes.ChainSelector(rand.Uint64()), SeqNumsRange: cciptypes.NewSeqNumRange( cciptypes.SeqNum(rand.Uint64()), cciptypes.SeqNum(rand.Uint64()), @@ -29,7 +28,8 @@ var randomCommitReport = func() cciptypes.CommitPluginReport { MerkleRoot: utils.RandomBytes32(), }, { - ChainSel: cciptypes.ChainSelector(rand.Uint64()), + OnRampAddress: common.LeftPadBytes(utils.RandomAddress().Bytes(), 32), + ChainSel: cciptypes.ChainSelector(rand.Uint64()), SeqNumsRange: cciptypes.NewSeqNumRange( cciptypes.SeqNum(rand.Uint64()), cciptypes.SeqNum(rand.Uint64()), @@ -50,6 +50,11 @@ var randomCommitReport = func() cciptypes.CommitPluginReport { {GasPrice: cciptypes.NewBigInt(utils.RandUint256()), ChainSel: cciptypes.ChainSelector(rand.Uint64())}, }, }, + RMNSignatures: []cciptypes.RMNECDSASignature{ + {R: utils.RandomBytes32(), S: utils.RandomBytes32()}, + {R: utils.RandomBytes32(), S: utils.RandomBytes32()}, + }, + RMNRawVs: cciptypes.NewBigInt(utils.RandUint256()), } } @@ -136,24 +141,3 @@ func BenchmarkCommitPluginCodecV1_Decode(b *testing.B) { require.NoError(b, err) } } - -func TestDecodeCommitReport(t *testing.T) { - report := hexutil.MustDecode("0x2d04ab76000a61cae2575edd7bc451a34fdad33f7d577226b7ab6015122590d6abc4e450000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000380010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000c9f9284461c852b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001dc7b58803f528bba0ff4fed53b1309d3ea5319201eb7b74e1d7952985966a09000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002023d96f990f8e5a2cfb69307999265fc1af26b85b5b979c5dffdb45fe41ca29d326001361e4a8bf3b3de5719b2441501ca1d82521ad87b98c805c65f77afa272000000000000000000000000000000000000000000000000000000000000000224b0ec1abc40a8b57b7caa1f952b03b99ff2997236cd91a667463faf172f781023e5abc6a3a5c2fc9ae829869c73387f438bd81697696313efaad61f39a480d8") - tabi, err := offramp.OffRampMetaData.GetAbi() - require.NoError(t, err) - unpacked, err := tabi.Methods["commit"].Inputs.Unpack(report[4:]) - require.NoError(t, err) - require.Len(t, unpacked, 5) - - reportBytes := *abi.ConvertType(unpacked[1], &[]byte{}).(*[]byte) - t.Log("reportBytes: ", hexutil.Encode(reportBytes)) - - unpackedReportRaw, err := tabi.Events["CommitReportAccepted"].Inputs.Unpack(reportBytes) - require.NoError(t, err) - - unpackedReport := *abi.ConvertType(unpackedReportRaw[0], &offramp.OffRampCommitReport{}).(*offramp.OffRampCommitReport) - - t.Log("roots: ", unpackedReport.MerkleRoots) - t.Log("price updates: ", unpackedReport.PriceUpdates) - t.Log("rmn sigs: ", unpackedReport.RmnSignatures) -} diff --git a/core/capabilities/ccip/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go index 2349beb390b..7ce380b8a02 100644 --- a/core/capabilities/ccip/ccipevm/executecodec.go +++ b/core/capabilities/ccip/ccipevm/executecodec.go @@ -53,17 +53,23 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec for _, message := range chainReport.Messages { receiver := common.BytesToAddress(message.Receiver) - tokenAmounts := make([]offramp.InternalRampTokenAmount, 0, len(message.TokenAmounts)) + tokenAmounts := make([]offramp.InternalAny2EVMTokenTransfer, 0, len(message.TokenAmounts)) for _, tokenAmount := range message.TokenAmounts { if tokenAmount.Amount.IsEmpty() { return nil, fmt.Errorf("empty amount for token: %s", tokenAmount.DestTokenAddress) } - tokenAmounts = append(tokenAmounts, offramp.InternalRampTokenAmount{ + destGasAmount, err := abiDecodeUint32(tokenAmount.DestExecData) + if err != nil { + return nil, fmt.Errorf("decode dest gas amount: %w", err) + } + + tokenAmounts = append(tokenAmounts, offramp.InternalAny2EVMTokenTransfer{ SourcePoolAddress: tokenAmount.SourcePoolAddress, - DestTokenAddress: tokenAmount.DestTokenAddress, + DestTokenAddress: common.BytesToAddress(tokenAmount.DestTokenAddress), ExtraData: tokenAmount.ExtraData, Amount: tokenAmount.Amount.Int, + DestGasAmount: destGasAmount, }) } @@ -134,11 +140,17 @@ func (e *ExecutePluginCodecV1) Decode(ctx context.Context, encodedReport []byte) for _, evmMessage := range evmChainReport.Messages { tokenAmounts := make([]cciptypes.RampTokenAmount, 0, len(evmMessage.TokenAmounts)) for _, tokenAmount := range evmMessage.TokenAmounts { + destData, err := abiEncodeUint32(tokenAmount.DestGasAmount) + if err != nil { + return cciptypes.ExecutePluginReport{}, fmt.Errorf("abi encode dest gas amount: %w", err) + } tokenAmounts = append(tokenAmounts, cciptypes.RampTokenAmount{ SourcePoolAddress: tokenAmount.SourcePoolAddress, - DestTokenAddress: tokenAmount.DestTokenAddress, - ExtraData: tokenAmount.ExtraData, - Amount: cciptypes.NewBigInt(tokenAmount.Amount), + // TODO: should this be abi-encoded? + DestTokenAddress: tokenAmount.DestTokenAddress.Bytes(), + ExtraData: tokenAmount.ExtraData, + Amount: cciptypes.NewBigInt(tokenAmount.Amount), + DestExecData: destData, }) } diff --git a/core/capabilities/ccip/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go index 4f207fdb0e2..def6add7bd0 100644 --- a/core/capabilities/ccip/ccipevm/executecodec_test.go +++ b/core/capabilities/ccip/ccipevm/executecodec_test.go @@ -34,11 +34,15 @@ var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.Execute tokenAmounts := make([]cciptypes.RampTokenAmount, numTokensPerMsg) for z := 0; z < numTokensPerMsg; z++ { + encodedDestExecData, err2 := abiEncodeUint32(rand.Uint32()) + require.NoError(t, err2) + tokenAmounts[z] = cciptypes.RampTokenAmount{ SourcePoolAddress: utils.RandomAddress().Bytes(), DestTokenAddress: utils.RandomAddress().Bytes(), ExtraData: data, Amount: cciptypes.NewBigInt(utils.RandUint256()), + DestExecData: encodedDestExecData, } } diff --git a/core/capabilities/ccip/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go index cf37a28b003..1d6464d242a 100644 --- a/core/capabilities/ccip/ccipevm/msghasher.go +++ b/core/capabilities/ccip/ccipevm/msghasher.go @@ -6,6 +6,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -43,35 +44,59 @@ func NewMessageHasherV1() *MessageHasherV1 { // It constructs all of the inputs to the final keccak256 hash in Internal._hash(Any2EVMRampMessage). // The main structure of the hash is as follows: /* - keccak256( - leafDomainSeparator, - keccak256(any_2_evm_message_hash, header.sourceChainSelector, header.destinationChainSelector, onRamp), - keccak256(fixedSizeMessageFields), - keccak256(messageData), - keccak256(encodedRampTokenAmounts), - ) + // 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 the RMN maintainers. + return keccak256( + abi.encode( + MerkleMultiProof.LEAF_DOMAIN_SEPARATOR, + metadataHash, + keccak256( + abi.encode( + original.header.messageId, + original.receiver, + original.header.sequenceNumber, + original.gasLimit, + original.header.nonce + ) + ), + keccak256(original.sender), + keccak256(original.data), + keccak256(abi.encode(original.tokenAmounts)) + ) + ); */ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (cciptypes.Bytes32, error) { - var rampTokenAmounts []message_hasher.InternalRampTokenAmount + var rampTokenAmounts []message_hasher.InternalAny2EVMTokenTransfer for _, rta := range msg.TokenAmounts { - rampTokenAmounts = append(rampTokenAmounts, message_hasher.InternalRampTokenAmount{ + destGasAmount, err := abiDecodeUint32(rta.DestExecData) + if err != nil { + return [32]byte{}, fmt.Errorf("decode dest gas amount: %w", err) + } + + rampTokenAmounts = append(rampTokenAmounts, message_hasher.InternalAny2EVMTokenTransfer{ SourcePoolAddress: rta.SourcePoolAddress, - DestTokenAddress: rta.DestTokenAddress, + DestTokenAddress: common.BytesToAddress(rta.DestTokenAddress), ExtraData: rta.ExtraData, Amount: rta.Amount.Int, + DestGasAmount: destGasAmount, }) } - encodedRampTokenAmounts, err := h.abiEncode("encodeTokenAmountsHashPreimage", rampTokenAmounts) + + encodedRampTokenAmounts, err := h.abiEncode("encodeAny2EVMTokenAmountsHashPreimage", rampTokenAmounts) if err != nil { return [32]byte{}, fmt.Errorf("abi encode token amounts: %w", err) } + fmt.Printf("encodedRampTokenAmounts: %x\n", encodedRampTokenAmounts) + metaDataHashInput, err := h.abiEncode( "encodeMetadataHashPreimage", ANY_2_EVM_MESSAGE_HASH, uint64(msg.Header.SourceChainSelector), uint64(msg.Header.DestChainSelector), - []byte(msg.Header.OnRamp), + // TODO: this is evm-specific padding, fix. + // no-op if the onramp is already 32 bytes. + utils.Keccak256Fixed(common.LeftPadBytes(msg.Header.OnRamp, 32)), ) if err != nil { return [32]byte{}, fmt.Errorf("abi encode metadata hash input: %w", err) @@ -89,7 +114,6 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty fixedSizeFieldsEncoded, err := h.abiEncode( "encodeFixedSizeFieldsHashPreimage", msg.Header.MessageID, - []byte(msg.Sender), common.BytesToAddress(msg.Receiver), uint64(msg.Header.SequenceNumber), gasLimit, @@ -102,8 +126,9 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty packedValues, err := h.abiEncode( "encodeFinalHashPreimage", leafDomainSeparator, - utils.Keccak256Fixed(metaDataHashInput), + utils.Keccak256Fixed(metaDataHashInput), // metaDataHash utils.Keccak256Fixed(fixedSizeFieldsEncoded), + utils.Keccak256Fixed(msg.Sender), utils.Keccak256Fixed(msg.Data), utils.Keccak256Fixed(encodedRampTokenAmounts), ) @@ -111,6 +136,8 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("abi encode packed values: %w", err) } + fmt.Printf("packedValues: %x\n", packedValues) + return utils.Keccak256Fixed(packedValues), nil } @@ -123,5 +150,19 @@ func (h *MessageHasherV1) abiEncode(method string, values ...interface{}) ([]byt return res[4:], nil } +func abiDecodeUint32(data []byte) (uint32, error) { + raw, err := utils.ABIDecode(`[{ "type": "uint32" }]`, data) + if err != nil { + return 0, fmt.Errorf("abi decode uint32: %w", err) + } + + val := *abi.ConvertType(raw[0], new(uint32)).(*uint32) + return val, nil +} + +func abiEncodeUint32(data uint32) ([]byte, error) { + return utils.ABIEncode(`[{ "type": "uint32" }]`, data) +} + // Interface compliance check var _ cciptypes.MessageHasher = (*MessageHasherV1)(nil) diff --git a/core/capabilities/ccip/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go index 911a10b26a5..c4f19673879 100644 --- a/core/capabilities/ccip/ccipevm/msghasher_test.go +++ b/core/capabilities/ccip/ccipevm/msghasher_test.go @@ -43,13 +43,17 @@ func TestMessageHasher_EVM2EVM(t *testing.T) { func testHasherEVM2EVM(ctx context.Context, t *testing.T, d *testSetupData, evmExtraArgs evmExtraArgs) { ccipMsg := createEVM2EVMMessage(t, d.contract, evmExtraArgs) - var tokenAmounts []message_hasher.InternalRampTokenAmount + var tokenAmounts []message_hasher.InternalAny2EVMTokenTransfer for _, rta := range ccipMsg.TokenAmounts { - tokenAmounts = append(tokenAmounts, message_hasher.InternalRampTokenAmount{ + destGasAmount, err := abiDecodeUint32(rta.DestExecData) + require.NoError(t, err) + + tokenAmounts = append(tokenAmounts, message_hasher.InternalAny2EVMTokenTransfer{ SourcePoolAddress: rta.SourcePoolAddress, - DestTokenAddress: rta.DestTokenAddress, + DestTokenAddress: common.BytesToAddress(rta.DestTokenAddress), ExtraData: rta.ExtraData[:], Amount: rta.Amount.Int, + DestGasAmount: destGasAmount, }) } evmMsg := message_hasher.InternalAny2EVMRampMessage{ @@ -124,11 +128,14 @@ func createEVM2EVMMessage(t *testing.T, messageHasher *message_hasher.MessageHas var tokenAmounts []cciptypes.RampTokenAmount for i := 0; i < len(sourceTokenDatas); i++ { extraData := utils.RandomBytes32() + encodedDestExecData, err := utils.ABIEncode(`[{ "type": "uint32" }]`, rand.Uint32()) + require.NoError(t, err) tokenAmounts = append(tokenAmounts, cciptypes.RampTokenAmount{ SourcePoolAddress: abiEncodedAddress(t), DestTokenAddress: abiEncodedAddress(t), ExtraData: extraData[:], Amount: cciptypes.NewBigInt(big.NewInt(0).SetUint64(rand.Uint64())), + DestExecData: encodedDestExecData, }) } diff --git a/core/capabilities/ccip/configs/evm/contract_reader.go b/core/capabilities/ccip/configs/evm/contract_reader.go index bbbcc6faa93..5326c5efd87 100644 --- a/core/capabilities/ccip/configs/evm/contract_reader.go +++ b/core/capabilities/ccip/configs/evm/contract_reader.go @@ -9,7 +9,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pkg/consts" evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" @@ -23,8 +23,8 @@ import ( var ( onrampABI = evmtypes.MustGetABI(onramp.OnRampABI) - capabilitiesRegsitryABI = evmtypes.MustGetABI(kcr.CapabilitiesRegistryABI) - ccipConfigABI = evmtypes.MustGetABI(ccip_config.CCIPConfigABI) + capabilitiesRegistryABI = evmtypes.MustGetABI(kcr.CapabilitiesRegistryABI) + ccipHomeABI = evmtypes.MustGetABI(ccip_home.CCIPHomeABI) feeQuoterABI = evmtypes.MustGetABI(fee_quoter.FeeQuoterABI) nonceManagerABI = evmtypes.MustGetABI(nonce_manager.NonceManagerABI) priceFeedABI = evmtypes.MustGetABI(aggregator_v3_interface.AggregatorV3InterfaceABI) @@ -143,10 +143,6 @@ var DestReaderConfig = evmrelaytypes.ChainReaderConfig{ ChainSpecificName: mustGetMethodName("processMessageArgs", feeQuoterABI), ReadType: evmrelaytypes.Method, }, - consts.MethodNameProcessPoolReturnData: { - ChainSpecificName: mustGetMethodName("processPoolReturnData", feeQuoterABI), - ReadType: evmrelaytypes.Method, - }, consts.MethodNameGetValidatedTokenPrice: { ChainSpecificName: mustGetMethodName("getValidatedTokenPrice", feeQuoterABI), ReadType: evmrelaytypes.Method, @@ -294,18 +290,18 @@ var HomeChainReaderConfigRaw = evmrelaytypes.ChainReaderConfig{ ContractABI: kcr.CapabilitiesRegistryABI, Configs: map[string]*evmrelaytypes.ChainReaderDefinition{ consts.MethodNameGetCapability: { - ChainSpecificName: mustGetMethodName("getCapability", capabilitiesRegsitryABI), + ChainSpecificName: mustGetMethodName("getCapability", capabilitiesRegistryABI), }, }, }, consts.ContractNameCCIPConfig: { - ContractABI: ccip_config.CCIPConfigABI, + ContractABI: ccip_home.CCIPHomeABI, Configs: map[string]*evmrelaytypes.ChainReaderDefinition{ consts.MethodNameGetAllChainConfigs: { - ChainSpecificName: mustGetMethodName("getAllChainConfigs", ccipConfigABI), + ChainSpecificName: mustGetMethodName("getAllChainConfigs", ccipHomeABI), }, consts.MethodNameGetOCRConfig: { - ChainSpecificName: mustGetMethodName("getOCRConfig", ccipConfigABI), + ChainSpecificName: mustGetMethodName("getAllConfigs", ccipHomeABI), }, }, }, diff --git a/core/capabilities/ccip/launcher/bluegreen.go b/core/capabilities/ccip/launcher/bluegreen.go deleted file mode 100644 index c15f8c038f6..00000000000 --- a/core/capabilities/ccip/launcher/bluegreen.go +++ /dev/null @@ -1,132 +0,0 @@ -package launcher - -import ( - "fmt" - - cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - - "go.uber.org/multierr" - - ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader" -) - -// blueGreenDeployment represents a blue-green deployment of OCR instances. -type blueGreenDeployment struct { - // blue is the blue OCR instance. - // blue must always be present. - blue cctypes.CCIPOracle - - // green is the green OCR instance. - // green may or may not be present. - // green must never be present if blue is not present. - // TODO: should we enforce this invariant somehow? - green cctypes.CCIPOracle -} - -// ccipDeployment represents blue-green deployments of both commit and exec -// OCR instances. -type ccipDeployment struct { - commit blueGreenDeployment - exec blueGreenDeployment -} - -// Close shuts down all OCR instances in the deployment. -func (c *ccipDeployment) Close() error { - var err error - - // shutdown blue commit instance. - err = multierr.Append(err, c.commit.blue.Close()) - - // shutdown green commit instance. - if c.commit.green != nil { - err = multierr.Append(err, c.commit.green.Close()) - } - - // shutdown blue exec instance. - err = multierr.Append(err, c.exec.blue.Close()) - - // shutdown green exec instance. - if c.exec.green != nil { - err = multierr.Append(err, c.exec.green.Close()) - } - - return err -} - -// StartBlue starts the blue OCR instances. -func (c *ccipDeployment) StartBlue() error { - var err error - - err = multierr.Append(err, c.commit.blue.Start()) - err = multierr.Append(err, c.exec.blue.Start()) - - return err -} - -// CloseBlue shuts down the blue OCR instances. -func (c *ccipDeployment) CloseBlue() error { - var err error - - err = multierr.Append(err, c.commit.blue.Close()) - err = multierr.Append(err, c.exec.blue.Close()) - - return err -} - -// HandleBlueGreen handles the blue-green deployment transition. -// prevDeployment is the previous deployment state. -// there are two possible cases: -// -// 1. both blue and green are present in prevDeployment, but only blue is present in c. -// this is a promotion of green to blue, so we need to shut down the blue deployment -// and make green the new blue. In this case green is already running, so there's no -// need to start it. However, we need to shut down the blue deployment. -// -// 2. only blue is present in prevDeployment, both blue and green are present in c. -// In this case, blue is already running, so there's no need to start it. We need to -// start green. -func (c *ccipDeployment) HandleBlueGreen(prevDeployment *ccipDeployment) error { - if prevDeployment == nil { - return fmt.Errorf("previous deployment is nil") - } - - var err error - if prevDeployment.commit.green != nil && c.commit.green == nil { - err = multierr.Append(err, prevDeployment.commit.blue.Close()) - } else if prevDeployment.commit.green == nil && c.commit.green != nil { - err = multierr.Append(err, c.commit.green.Start()) - } else { - return fmt.Errorf("invalid blue-green deployment transition") - } - - if prevDeployment.exec.green != nil && c.exec.green == nil { - err = multierr.Append(err, prevDeployment.exec.blue.Close()) - } else if prevDeployment.exec.green == nil && c.exec.green != nil { - err = multierr.Append(err, c.exec.green.Start()) - } else { - return fmt.Errorf("invalid blue-green deployment transition") - } - - return err -} - -// HasGreenInstance returns true if the deployment has a green instance for the -// given plugin type. -func (c *ccipDeployment) HasGreenInstance(pluginType cctypes.PluginType) bool { - switch pluginType { - case cctypes.PluginTypeCCIPCommit: - return c.commit.green != nil - case cctypes.PluginTypeCCIPExec: - return c.exec.green != nil - default: - return false - } -} - -func isNewGreenInstance(pluginType cctypes.PluginType, ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta, prevDeployment ccipDeployment) bool { - return len(ocrConfigs) == 2 && !prevDeployment.HasGreenInstance(pluginType) -} - -func isPromotion(pluginType cctypes.PluginType, ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta, prevDeployment ccipDeployment) bool { - return len(ocrConfigs) == 1 && prevDeployment.HasGreenInstance(pluginType) -} diff --git a/core/capabilities/ccip/launcher/deployment.go b/core/capabilities/ccip/launcher/deployment.go new file mode 100644 index 00000000000..bed6296549e --- /dev/null +++ b/core/capabilities/ccip/launcher/deployment.go @@ -0,0 +1,131 @@ +package launcher + +import ( + "fmt" + + cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + + "go.uber.org/multierr" + + ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader" +) + +// activeCandidateDeployment represents a active-candidate deployment of OCR instances. +type activeCandidateDeployment struct { + // active is the active OCR instance. + // active must always be present. + active cctypes.CCIPOracle + + // candidate is the candidate OCR instance. + // candidate may or may not be present. + // candidate must never be present if active is not present. + candidate cctypes.CCIPOracle +} + +// ccipDeployment represents active-candidate deployments of both commit and exec +// OCR instances. +type ccipDeployment struct { + commit activeCandidateDeployment + exec activeCandidateDeployment +} + +// Close shuts down all OCR instances in the deployment. +func (c *ccipDeployment) Close() error { + var err error + + // shutdown active commit instance. + err = multierr.Append(err, c.commit.active.Close()) + + // shutdown candidate commit instance. + if c.commit.candidate != nil { + err = multierr.Append(err, c.commit.candidate.Close()) + } + + // shutdown active exec instance. + err = multierr.Append(err, c.exec.active.Close()) + + // shutdown candidate exec instance. + if c.exec.candidate != nil { + err = multierr.Append(err, c.exec.candidate.Close()) + } + + return err +} + +// StartActive starts the active OCR instances. +func (c *ccipDeployment) StartActive() error { + var err error + + err = multierr.Append(err, c.commit.active.Start()) + err = multierr.Append(err, c.exec.active.Start()) + + return err +} + +// CloseActive shuts down the active OCR instances. +func (c *ccipDeployment) CloseActive() error { + var err error + + err = multierr.Append(err, c.commit.active.Close()) + err = multierr.Append(err, c.exec.active.Close()) + + return err +} + +// TransitionDeployment handles the active-candidate deployment transition. +// prevDeployment is the previous deployment state. +// there are two possible cases: +// +// 1. both active and candidate are present in prevDeployment, but only active is present in c. +// this is a promotion of candidate to active, so we need to shut down the active deployment +// and make candidate the new active. In this case candidate is already running, so there's no +// need to start it. However, we need to shut down the active deployment. +// +// 2. only active is present in prevDeployment, both active and candidate are present in c. +// In this case, active is already running, so there's no need to start it. We need to +// start candidate. +func (c *ccipDeployment) TransitionDeployment(prevDeployment *ccipDeployment) error { + if prevDeployment == nil { + return fmt.Errorf("previous deployment is nil") + } + + var err error + if prevDeployment.commit.candidate != nil && c.commit.candidate == nil { + err = multierr.Append(err, prevDeployment.commit.active.Close()) + } else if prevDeployment.commit.candidate == nil && c.commit.candidate != nil { + err = multierr.Append(err, c.commit.candidate.Start()) + } else { + return fmt.Errorf("invalid active-candidate deployment transition") + } + + if prevDeployment.exec.candidate != nil && c.exec.candidate == nil { + err = multierr.Append(err, prevDeployment.exec.active.Close()) + } else if prevDeployment.exec.candidate == nil && c.exec.candidate != nil { + err = multierr.Append(err, c.exec.candidate.Start()) + } else { + return fmt.Errorf("invalid active-candidate deployment transition") + } + + return err +} + +// HasCandidateInstance returns true if the deployment has a candidate instance for the +// given plugin type. +func (c *ccipDeployment) HasCandidateInstance(pluginType cctypes.PluginType) bool { + switch pluginType { + case cctypes.PluginTypeCCIPCommit: + return c.commit.candidate != nil + case cctypes.PluginTypeCCIPExec: + return c.exec.candidate != nil + default: + return false + } +} + +func isNewCandidateInstance(pluginType cctypes.PluginType, ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta, prevDeployment ccipDeployment) bool { + return len(ocrConfigs) == 2 && !prevDeployment.HasCandidateInstance(pluginType) +} + +func isPromotion(pluginType cctypes.PluginType, ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta, prevDeployment ccipDeployment) bool { + return len(ocrConfigs) == 1 && prevDeployment.HasCandidateInstance(pluginType) +} diff --git a/core/capabilities/ccip/launcher/bluegreen_test.go b/core/capabilities/ccip/launcher/deployment_test.go similarity index 80% rename from core/capabilities/ccip/launcher/bluegreen_test.go rename to core/capabilities/ccip/launcher/deployment_test.go index 965491180e6..a7fa8888314 100644 --- a/core/capabilities/ccip/launcher/bluegreen_test.go +++ b/core/capabilities/ccip/launcher/deployment_test.go @@ -27,7 +27,7 @@ func Test_ccipDeployment_Close(t *testing.T) { wantErr bool }{ { - name: "no errors, blue only", + name: "no errors, active only", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -45,7 +45,7 @@ func Test_ccipDeployment_Close(t *testing.T) { wantErr: false, }, { - name: "no errors, blue and green", + name: "no errors, active and candidate", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: mocktypes.NewCCIPOracle(t), @@ -67,7 +67,7 @@ func Test_ccipDeployment_Close(t *testing.T) { wantErr: false, }, { - name: "error on commit blue", + name: "error on commit active", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -88,19 +88,19 @@ func Test_ccipDeployment_Close(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &ccipDeployment{ - commit: blueGreenDeployment{ - blue: tt.args.commitBlue, + commit: activeCandidateDeployment{ + active: tt.args.commitBlue, }, - exec: blueGreenDeployment{ - blue: tt.args.execBlue, + exec: activeCandidateDeployment{ + active: tt.args.execBlue, }, } if tt.args.commitGreen != nil { - c.commit.green = tt.args.commitGreen + c.commit.candidate = tt.args.commitGreen } if tt.args.execGreen != nil { - c.exec.green = tt.args.execGreen + c.exec.candidate = tt.args.execGreen } tt.expect(t, tt.args) @@ -144,7 +144,7 @@ func Test_ccipDeployment_StartBlue(t *testing.T) { wantErr: false, }, { - name: "error on commit blue", + name: "error on commit active", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), execBlue: mocktypes.NewCCIPOracle(t), @@ -160,7 +160,7 @@ func Test_ccipDeployment_StartBlue(t *testing.T) { wantErr: true, }, { - name: "error on exec blue", + name: "error on exec active", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), execBlue: mocktypes.NewCCIPOracle(t), @@ -179,17 +179,17 @@ func Test_ccipDeployment_StartBlue(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &ccipDeployment{ - commit: blueGreenDeployment{ - blue: tt.args.commitBlue, + commit: activeCandidateDeployment{ + active: tt.args.commitBlue, }, - exec: blueGreenDeployment{ - blue: tt.args.execBlue, + exec: activeCandidateDeployment{ + active: tt.args.execBlue, }, } tt.expect(t, tt.args) defer tt.asserts(t, tt.args) - err := c.StartBlue() + err := c.StartActive() if tt.wantErr { require.Error(t, err) } else { @@ -228,7 +228,7 @@ func Test_ccipDeployment_CloseBlue(t *testing.T) { wantErr: false, }, { - name: "error on commit blue", + name: "error on commit active", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), execBlue: mocktypes.NewCCIPOracle(t), @@ -244,7 +244,7 @@ func Test_ccipDeployment_CloseBlue(t *testing.T) { wantErr: true, }, { - name: "error on exec blue", + name: "error on exec active", args: args{ commitBlue: mocktypes.NewCCIPOracle(t), execBlue: mocktypes.NewCCIPOracle(t), @@ -263,17 +263,17 @@ func Test_ccipDeployment_CloseBlue(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &ccipDeployment{ - commit: blueGreenDeployment{ - blue: tt.args.commitBlue, + commit: activeCandidateDeployment{ + active: tt.args.commitBlue, }, - exec: blueGreenDeployment{ - blue: tt.args.execBlue, + exec: activeCandidateDeployment{ + active: tt.args.execBlue, }, } tt.expect(t, tt.args) defer tt.asserts(t, tt.args) - err := c.CloseBlue() + err := c.CloseActive() if tt.wantErr { require.Error(t, err) } else { @@ -284,7 +284,7 @@ func Test_ccipDeployment_CloseBlue(t *testing.T) { } func Test_ccipDeployment_HandleBlueGreen_PrevDeploymentNil(t *testing.T) { - require.Error(t, (&ccipDeployment{}).HandleBlueGreen(nil)) + require.Error(t, (&ccipDeployment{}).TransitionDeployment(nil)) } func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { @@ -303,7 +303,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr bool }{ { - name: "promotion blue to green", + name: "promotion active to candidate", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: mocktypes.NewCCIPOracle(t), @@ -327,7 +327,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr: false, }, { - name: "new green deployment", + name: "new candidate deployment", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -351,7 +351,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr: false, }, { - name: "error on commit green start", + name: "error on commit candidate start", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -375,7 +375,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr: true, }, { - name: "error on exec green start", + name: "error on exec candidate start", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -399,7 +399,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr: true, }, { - name: "invalid blue-green deployment transition commit: both prev and future deployment have green", + name: "invalid active-candidate deployment transition commit: both prev and future deployment have candidate", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: mocktypes.NewCCIPOracle(t), @@ -417,7 +417,7 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { wantErr: true, }, { - name: "invalid blue-green deployment transition exec: both prev and future exec deployment have green", + name: "invalid active-candidate deployment transition exec: both prev and future exec deployment have candidate", argsPrevDeployment: args{ commitBlue: mocktypes.NewCCIPOracle(t), commitGreen: nil, @@ -442,38 +442,38 @@ func Test_ccipDeployment_HandleBlueGreen(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { futDeployment := &ccipDeployment{ - commit: blueGreenDeployment{ - blue: tt.argsFutureDeployment.commitBlue, + commit: activeCandidateDeployment{ + active: tt.argsFutureDeployment.commitBlue, }, - exec: blueGreenDeployment{ - blue: tt.argsFutureDeployment.execBlue, + exec: activeCandidateDeployment{ + active: tt.argsFutureDeployment.execBlue, }, } if tt.argsFutureDeployment.commitGreen != nil { - futDeployment.commit.green = tt.argsFutureDeployment.commitGreen + futDeployment.commit.candidate = tt.argsFutureDeployment.commitGreen } if tt.argsFutureDeployment.execGreen != nil { - futDeployment.exec.green = tt.argsFutureDeployment.execGreen + futDeployment.exec.candidate = tt.argsFutureDeployment.execGreen } prevDeployment := &ccipDeployment{ - commit: blueGreenDeployment{ - blue: tt.argsPrevDeployment.commitBlue, + commit: activeCandidateDeployment{ + active: tt.argsPrevDeployment.commitBlue, }, - exec: blueGreenDeployment{ - blue: tt.argsPrevDeployment.execBlue, + exec: activeCandidateDeployment{ + active: tt.argsPrevDeployment.execBlue, }, } if tt.argsPrevDeployment.commitGreen != nil { - prevDeployment.commit.green = tt.argsPrevDeployment.commitGreen + prevDeployment.commit.candidate = tt.argsPrevDeployment.commitGreen } if tt.argsPrevDeployment.execGreen != nil { - prevDeployment.exec.green = tt.argsPrevDeployment.execGreen + prevDeployment.exec.candidate = tt.argsPrevDeployment.execGreen } tt.expect(t, tt.argsFutureDeployment, tt.argsPrevDeployment) defer tt.asserts(t, tt.argsFutureDeployment, tt.argsPrevDeployment) - err := futDeployment.HandleBlueGreen(prevDeployment) + err := futDeployment.TransitionDeployment(prevDeployment) if tt.wantErr { require.Error(t, err) } else { @@ -495,31 +495,31 @@ func Test_isNewGreenInstance(t *testing.T) { want bool }{ { - "prev deployment only blue", + "prev deployment only active", args{ pluginType: cctypes.PluginTypeCCIPCommit, ocrConfigs: []ccipreaderpkg.OCR3ConfigWithMeta{ {}, {}, }, prevDeployment: ccipDeployment{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), }, }, }, true, }, { - "green -> blue promotion", + "candidate -> active promotion", args{ pluginType: cctypes.PluginTypeCCIPCommit, ocrConfigs: []ccipreaderpkg.OCR3ConfigWithMeta{ {}, }, prevDeployment: ccipDeployment{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), - green: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), + candidate: mocktypes.NewCCIPOracle(t), }, }, }, @@ -528,7 +528,7 @@ func Test_isNewGreenInstance(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := isNewGreenInstance(tt.args.pluginType, tt.args.ocrConfigs, tt.args.prevDeployment) + got := isNewCandidateInstance(tt.args.pluginType, tt.args.ocrConfigs, tt.args.prevDeployment) require.Equal(t, tt.want, got) }) } @@ -546,31 +546,31 @@ func Test_isPromotion(t *testing.T) { want bool }{ { - "prev deployment only blue", + "prev deployment only active", args{ pluginType: cctypes.PluginTypeCCIPCommit, ocrConfigs: []ccipreaderpkg.OCR3ConfigWithMeta{ {}, {}, }, prevDeployment: ccipDeployment{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), }, }, }, false, }, { - "green -> blue promotion", + "candidate -> active promotion", args{ pluginType: cctypes.PluginTypeCCIPCommit, ocrConfigs: []ccipreaderpkg.OCR3ConfigWithMeta{ {}, }, prevDeployment: ccipDeployment{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), - green: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), + candidate: mocktypes.NewCCIPOracle(t), }, }, }, @@ -588,8 +588,8 @@ func Test_isPromotion(t *testing.T) { func Test_ccipDeployment_HasGreenInstance(t *testing.T) { type fields struct { - commit blueGreenDeployment - exec blueGreenDeployment + commit activeCandidateDeployment + exec activeCandidateDeployment } type args struct { pluginType cctypes.PluginType @@ -601,11 +601,11 @@ func Test_ccipDeployment_HasGreenInstance(t *testing.T) { want bool }{ { - "commit green present", + "commit candidate present", fields{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), - green: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), + candidate: mocktypes.NewCCIPOracle(t), }, }, args{ @@ -614,10 +614,10 @@ func Test_ccipDeployment_HasGreenInstance(t *testing.T) { true, }, { - "commit green not present", + "commit candidate not present", fields{ - commit: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), + commit: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), }, }, args{ @@ -626,11 +626,11 @@ func Test_ccipDeployment_HasGreenInstance(t *testing.T) { false, }, { - "exec green present", + "exec candidate present", fields{ - exec: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), - green: mocktypes.NewCCIPOracle(t), + exec: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), + candidate: mocktypes.NewCCIPOracle(t), }, }, args{ @@ -639,10 +639,10 @@ func Test_ccipDeployment_HasGreenInstance(t *testing.T) { true, }, { - "exec green not present", + "exec candidate not present", fields{ - exec: blueGreenDeployment{ - blue: mocktypes.NewCCIPOracle(t), + exec: activeCandidateDeployment{ + active: mocktypes.NewCCIPOracle(t), }, }, args{ @@ -662,19 +662,19 @@ func Test_ccipDeployment_HasGreenInstance(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &ccipDeployment{} - if tt.fields.commit.blue != nil { - c.commit.blue = tt.fields.commit.blue + if tt.fields.commit.active != nil { + c.commit.active = tt.fields.commit.active } - if tt.fields.commit.green != nil { - c.commit.green = tt.fields.commit.green + if tt.fields.commit.candidate != nil { + c.commit.candidate = tt.fields.commit.candidate } - if tt.fields.exec.blue != nil { - c.exec.blue = tt.fields.exec.blue + if tt.fields.exec.active != nil { + c.exec.active = tt.fields.exec.active } - if tt.fields.exec.green != nil { - c.exec.green = tt.fields.exec.green + if tt.fields.exec.candidate != nil { + c.exec.candidate = tt.fields.exec.candidate } - got := c.HasGreenInstance(tt.args.pluginType) + got := c.HasCandidateInstance(tt.args.pluginType) require.Equal(t, tt.want, got) }) } diff --git a/core/capabilities/ccip/launcher/integration_test.go b/core/capabilities/ccip/launcher/integration_test.go index 2680d587d1a..33a769971f1 100644 --- a/core/capabilities/ccip/launcher/integration_test.go +++ b/core/capabilities/ccip/launcher/integration_test.go @@ -4,6 +4,8 @@ import ( "testing" "time" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" + cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" it "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -12,7 +14,7 @@ import ( "github.com/onsi/gomega" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer" @@ -60,15 +62,22 @@ func TestIntegration_Launcher(t *testing.T) { t.Cleanup(func() { require.NoError(t, regSyncer.Close()) }) t.Cleanup(func() { require.NoError(t, launcher.Close()) }) - chainAConf := it.SetupConfigInfo(it.ChainA, p2pIDs, it.FChainA, []byte("ChainA")) - chainBConf := it.SetupConfigInfo(it.ChainB, p2pIDs[1:], it.FChainB, []byte("ChainB")) - chainCConf := it.SetupConfigInfo(it.ChainC, p2pIDs[2:], it.FChainC, []byte("ChainC")) - inputConfig := []ccip_config.CCIPConfigTypesChainConfigInfo{ + encodedChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{ + GasPriceDeviationPPB: cciptypes.NewBigIntFromInt64(1000), + DAGasPriceDeviationPPB: cciptypes.NewBigIntFromInt64(1_000_000), + OptimisticConfirmations: 1, + }) + require.NoError(t, err) + + chainAConf := it.SetupConfigInfo(it.ChainA, p2pIDs, it.FChainA, encodedChainConfig) + chainBConf := it.SetupConfigInfo(it.ChainB, p2pIDs[1:], it.FChainB, encodedChainConfig) + chainCConf := it.SetupConfigInfo(it.ChainC, p2pIDs[2:], it.FChainC, encodedChainConfig) + inputConfig := []ccip_home.CCIPHomeChainConfigArgs{ chainAConf, chainBConf, chainCConf, } - _, err = uni.CcipCfg.ApplyChainConfigUpdates(uni.Transactor, nil, inputConfig) + _, err = uni.CCIPHome.ApplyChainConfigUpdates(uni.Transactor, nil, inputConfig) require.NoError(t, err) uni.Backend.Commit() @@ -79,7 +88,6 @@ func TestIntegration_Launcher(t *testing.T) { ccipCapabilityID, it.ChainA, it.FChainA, - p2pIDs[1], p2pIDs) gomega.NewWithT(t).Eventually(func() bool { diff --git a/core/capabilities/ccip/launcher/launcher.go b/core/capabilities/ccip/launcher/launcher.go index 7f677d50c8c..9e6e67d5f99 100644 --- a/core/capabilities/ccip/launcher/launcher.go +++ b/core/capabilities/ccip/launcher/launcher.go @@ -201,9 +201,9 @@ func (l *launcher) processUpdate(updated map[registrysyncer.DonID]registrysyncer if err != nil { return err } - if err := futDeployment.HandleBlueGreen(prevDeployment); err != nil { - // TODO: how to handle a failed blue-green deployment? - return fmt.Errorf("failed to handle blue-green deployment for CCIP DON %d: %w", donID, err) + if err := futDeployment.TransitionDeployment(prevDeployment); err != nil { + // TODO: how to handle a failed active-candidate deployment? + return fmt.Errorf("failed to handle active-candidate deployment for CCIP DON %d: %w", donID, err) } // update state. @@ -236,9 +236,9 @@ func (l *launcher) processAdded(added map[registrysyncer.DonID]registrysyncer.DO continue } - if err := dep.StartBlue(); err != nil { - if shutdownErr := dep.CloseBlue(); shutdownErr != nil { - l.lggr.Errorw("Failed to shutdown blue instance after failed start", "donId", donID, "err", shutdownErr) + if err := dep.StartActive(); err != nil { + if shutdownErr := dep.CloseActive(); shutdownErr != nil { + l.lggr.Errorw("Failed to shutdown active instance after failed start", "donId", donID, "err", shutdownErr) } return fmt.Errorf("failed to start oracles for CCIP DON %d: %w", donID, err) } @@ -278,7 +278,7 @@ func (l *launcher) processRemoved(removed map[registrysyncer.DonID]registrysynce // updateDON is a pure function that handles the case where a DON in the capability registry // has received a new configuration. -// It returns a new ccipDeployment that can then be used to perform the blue-green deployment, +// It returns a new ccipDeployment that can then be used to perform the active-candidate deployment, // based on the previous deployment. func updateDON( lggr logger.Logger, @@ -306,14 +306,14 @@ func updateDON( don.ID, err) } - commitBgd, err := createFutureBlueGreenDeployment(don.ID, prevDeployment, commitOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPCommit) + commitBgd, err := createFutureActiveCandidateDeployment(don.ID, prevDeployment, commitOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPCommit) if err != nil { - return nil, fmt.Errorf("failed to create future blue-green deployment for CCIP commit plugin: %w, don id: %d", err, don.ID) + return nil, fmt.Errorf("failed to create future active-candidate deployment for CCIP commit plugin: %w, don id: %d", err, don.ID) } - execBgd, err := createFutureBlueGreenDeployment(don.ID, prevDeployment, execOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPExec) + execBgd, err := createFutureActiveCandidateDeployment(don.ID, prevDeployment, execOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPExec) if err != nil { - return nil, fmt.Errorf("failed to create future blue-green deployment for CCIP exec plugin: %w, don id: %d", err, don.ID) + return nil, fmt.Errorf("failed to create future active-candidate deployment for CCIP exec plugin: %w, don id: %d", err, don.ID) } return &ccipDeployment{ @@ -323,38 +323,38 @@ func updateDON( } // valid cases: -// a) len(ocrConfigs) == 2 && !prevDeployment.HasGreenInstance(pluginType): this is a new green instance. -// b) len(ocrConfigs) == 1 && prevDeployment.HasGreenInstance(): this is a promotion of green->blue. +// a) len(ocrConfigs) == 2 && !prevDeployment.HasCandidateInstance(pluginType): this is a new candidate instance. +// b) len(ocrConfigs) == 1 && prevDeployment.HasCandidateInstance(): this is a promotion of candidate->active. // All other cases are invalid. This is enforced in the ccip config contract. -func createFutureBlueGreenDeployment( +func createFutureActiveCandidateDeployment( donID uint32, prevDeployment ccipDeployment, ocrConfigs []ccipreader.OCR3ConfigWithMeta, oracleCreator cctypes.OracleCreator, pluginType cctypes.PluginType, -) (blueGreenDeployment, error) { - var deployment blueGreenDeployment - if isNewGreenInstance(pluginType, ocrConfigs, prevDeployment) { - // this is a new green instance. +) (activeCandidateDeployment, error) { + var deployment activeCandidateDeployment + if isNewCandidateInstance(pluginType, ocrConfigs, prevDeployment) { + // this is a new candidate instance. greenOracle, err := oracleCreator.Create(donID, cctypes.OCR3ConfigWithMeta(ocrConfigs[1])) if err != nil { - return blueGreenDeployment{}, fmt.Errorf("failed to create CCIP commit oracle: %w", err) + return activeCandidateDeployment{}, fmt.Errorf("failed to create CCIP commit oracle: %w", err) } - deployment.blue = prevDeployment.commit.blue - deployment.green = greenOracle + deployment.active = prevDeployment.commit.active + deployment.candidate = greenOracle } else if isPromotion(pluginType, ocrConfigs, prevDeployment) { - // this is a promotion of green->blue. - deployment.blue = prevDeployment.commit.green + // this is a promotion of candidate->active. + deployment.active = prevDeployment.commit.candidate } else { - return blueGreenDeployment{}, fmt.Errorf("invariant violation: expected 1 or 2 OCR configs for CCIP plugin (type: %d), got %d", pluginType, len(ocrConfigs)) + return activeCandidateDeployment{}, fmt.Errorf("invariant violation: expected 1 or 2 OCR configs for CCIP plugin (type: %d), got %d", pluginType, len(ocrConfigs)) } return deployment, nil } // createDON is a pure function that handles the case where a new DON is added to the capability registry. -// It returns a new ccipDeployment that can then be used to start the blue instance. +// It returns a new ccipDeployment that can then be used to start the active instance. func createDON( lggr logger.Logger, p2pID ragep2ptypes.PeerID, @@ -402,11 +402,11 @@ func createDON( } return &ccipDeployment{ - commit: blueGreenDeployment{ - blue: commitOracle, + commit: activeCandidateDeployment{ + active: commitOracle, }, - exec: blueGreenDeployment{ - blue: execOracle, + exec: activeCandidateDeployment{ + active: execOracle, }, }, nil } diff --git a/core/capabilities/ccip/launcher/launcher_test.go b/core/capabilities/ccip/launcher/launcher_test.go index 06e9f88c4e6..48bdeda4cde 100644 --- a/core/capabilities/ccip/launcher/launcher_test.go +++ b/core/capabilities/ccip/launcher/launcher_test.go @@ -51,10 +51,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPCommit), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(3)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(4)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) homeChainReader. @@ -62,10 +59,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPExec), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(3)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(4)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) oracleCreator.EXPECT().Type().Return(cctypes.OracleTypePlugin).Once() @@ -90,10 +84,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPCommit), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(3)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(4)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) homeChainReader. @@ -101,10 +92,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPExec), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(3)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(4)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) oracleCreator.EXPECT().Type().Return(cctypes.OracleTypeBootstrap).Once() @@ -127,10 +115,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPCommit), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(2)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) homeChainReader. @@ -138,10 +123,7 @@ func Test_createDON(t *testing.T) { Return([]ccipreaderpkg.OCR3ConfigWithMeta{{ Config: ccipreaderpkg.OCR3Config{ PluginType: uint8(cctypes.PluginTypeCCIPExec), - P2PIds: [][32]byte{ - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID(), - p2pkey.MustNewV2XXXTestingOnly(big.NewInt(2)).PeerID(), - }, + Nodes: getOCR3Nodes(3, 4), }, }}, nil) @@ -184,20 +166,20 @@ func Test_createFutureBlueGreenDeployment(t *testing.T) { tests := []struct { name string args args - want blueGreenDeployment + want activeCandidateDeployment wantErr bool }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createFutureBlueGreenDeployment(tt.args.donID, tt.args.prevDeployment, tt.args.ocrConfigs, tt.args.oracleCreator, tt.args.pluginType) + got, err := createFutureActiveCandidateDeployment(tt.args.donID, tt.args.prevDeployment, tt.args.ocrConfigs, tt.args.oracleCreator, tt.args.pluginType) if (err != nil) != tt.wantErr { - t.Errorf("createFutureBlueGreenDeployment() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("createFutureActiveCandidateDeployment() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createFutureBlueGreenDeployment() = %v, want %v", got, tt.want) + t.Errorf("createFutureActiveCandidateDeployment() = %v, want %v", got, tt.want) } }) } @@ -258,15 +240,15 @@ func Test_launcher_processDiff(t *testing.T) { fields{ dons: map[registrysyncer.DonID]*ccipDeployment{ 1: { - commit: blueGreenDeployment{ - blue: newMock(t, + commit: activeCandidateDeployment{ + active: newMock(t, func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) }, func(m *mocks.CCIPOracle) { m.On("Close").Return(nil) }), }, - exec: blueGreenDeployment{ - blue: newMock(t, + exec: activeCandidateDeployment{ + active: newMock(t, func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) }, func(m *mocks.CCIPOracle) { m.On("Close").Return(nil) @@ -349,7 +331,7 @@ func Test_launcher_processDiff(t *testing.T) { false, }, { - "don updated new green instance success", + "don updated new candidate instance success", fields{ lggr: logger.TestLogger(t), p2pID: p2pID1, @@ -395,13 +377,13 @@ func Test_launcher_processDiff(t *testing.T) { }), dons: map[registrysyncer.DonID]*ccipDeployment{ 1: { - commit: blueGreenDeployment{ - blue: newMock(t, func(t *testing.T) *mocks.CCIPOracle { + commit: activeCandidateDeployment{ + active: newMock(t, func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) }, func(m *mocks.CCIPOracle) {}), }, - exec: blueGreenDeployment{ - blue: newMock(t, func(t *testing.T) *mocks.CCIPOracle { + exec: activeCandidateDeployment{ + active: newMock(t, func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) }, func(m *mocks.CCIPOracle) {}), }, @@ -453,6 +435,13 @@ func Test_launcher_processDiff(t *testing.T) { } } +func getOCR3Nodes(p2pIDs ...int64) []ccipreaderpkg.OCR3Node { + nodes := make([]ccipreaderpkg.OCR3Node, len(p2pIDs)) + for i, p2pID := range p2pIDs { + nodes[i] = ccipreaderpkg.OCR3Node{P2pID: p2pkey.MustNewV2XXXTestingOnly(big.NewInt(p2pID)).PeerID()} + } + return nodes +} func newMock[T any](t *testing.T, newer func(t *testing.T) T, expect func(m T)) T { o := newer(t) expect(o) diff --git a/core/capabilities/ccip/ocrimpls/config_tracker.go b/core/capabilities/ccip/ocrimpls/config_tracker.go index 3a6a27fa40c..c70aa50030a 100644 --- a/core/capabilities/ccip/ocrimpls/config_tracker.go +++ b/core/capabilities/ccip/ocrimpls/config_tracker.go @@ -39,12 +39,19 @@ func (c *configTracker) Notify() <-chan struct{} { } func (c *configTracker) contractConfig() types.ContractConfig { + var signers [][]byte + var transmitters [][]byte + for _, node := range c.cfg.Config.Nodes { + signers = append(signers, node.SignerKey) + transmitters = append(transmitters, node.TransmitterKey) + } + return types.ContractConfig{ ConfigDigest: c.cfg.ConfigDigest, - ConfigCount: c.cfg.ConfigCount, - Signers: toOnchainPublicKeys(c.cfg.Config.Signers), - Transmitters: toOCRAccounts(c.cfg.Config.Transmitters), - F: c.cfg.Config.F, + ConfigCount: uint64(c.cfg.Version), + Signers: toOnchainPublicKeys(signers), + Transmitters: toOCRAccounts(transmitters), + F: c.cfg.Config.FRoleDON, OnchainConfig: []byte{}, OffchainConfigVersion: c.cfg.Config.OffchainConfigVersion, OffchainConfig: c.cfg.Config.OffchainConfig, diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go index c89ca239175..295dee120f8 100644 --- a/core/gethwrappers/ccip/deployment_test/deployment_test.go +++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go @@ -48,9 +48,7 @@ func TestDeployAllV1_6(t *testing.T) { }, offramp.OffRampDynamicConfig{ FeeQuoter: common.HexToAddress("0x4"), PermissionLessExecutionThresholdSeconds: uint32((8 * time.Hour).Seconds()), - MaxTokenTransferGas: 50_000, - MaxPoolReleaseOrMintGas: 50_000, - MessageValidator: common.HexToAddress("0x5"), + MessageInterceptor: common.HexToAddress("0x5"), }, nil) require.NoError(t, err) chain.Commit() @@ -62,10 +60,10 @@ func TestDeployAllV1_6(t *testing.T) { NonceManager: common.HexToAddress("0x2"), TokenAdminRegistry: common.HexToAddress("0x3"), }, onramp.OnRampDynamicConfig{ - FeeQuoter: common.HexToAddress("0x4"), - MessageValidator: common.HexToAddress("0x5"), - FeeAggregator: common.HexToAddress("0x6"), - AllowListAdmin: common.HexToAddress("0x7"), + FeeQuoter: common.HexToAddress("0x4"), + MessageInterceptor: common.HexToAddress("0x5"), + FeeAggregator: common.HexToAddress("0x6"), + AllowListAdmin: common.HexToAddress("0x7"), }, nil) require.NoError(t, err) chain.Commit() diff --git a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go deleted file mode 100644 index 3c2d44cd302..00000000000 --- a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go +++ /dev/null @@ -1,1126 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package ccip_config - -import ( - "errors" - "fmt" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "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" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" -) - -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -type CCIPConfigTypesChainConfig struct { - Readers [][32]byte - FChain uint8 - Config []byte -} - -type CCIPConfigTypesChainConfigInfo struct { - ChainSelector uint64 - ChainConfig CCIPConfigTypesChainConfig -} - -type CCIPConfigTypesOCR3Config struct { - PluginType uint8 - ChainSelector uint64 - F uint8 - OffchainConfigVersion uint64 - OfframpAddress []byte - P2pIds [][32]byte - Signers [][]byte - Transmitters [][]byte - OffchainConfig []byte -} - -type CCIPConfigTypesOCR3ConfigWithMeta struct { - Config CCIPConfigTypesOCR3Config - ConfigCount uint64 - ConfigDigest [32]byte -} - -var CCIPConfigMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"p2pIdsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signersLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transmittersLength\",\"type\":\"uint256\"}],\"name\":\"P2PIdsLengthNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"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\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004080380380620040808339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051613e7f620002016000396000818160f801528181610ea701526111170152613e7f6000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b1461020f578063f442c89a14610222578063fba64a7c1461023557600080fd5b80638318ed5d146101b05780638da5cb5b146101d1578063b74b2356146101ef57600080fd5b8063181f5a77116100b2578063181f5a771461013d5780634bd0473f1461018657806379ba5097146101a657600080fd5b806301ffc9a7146100ce578063020330e6146100f6575b600080fd5b6100e16100dc366004612cbd565b610248565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b6101796040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100ed9190612d63565b610199610194366004612da7565b6102e1565b6040516100ed9190612ec6565b6101ae610759565b005b6101796101be366004613082565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610118565b6102026101fd36600461309f565b61085b565b6040516100ed9190613105565b6101ae61021d366004613195565b610adc565b6101ae610230366004613217565b610af0565b6101ae61024336600461329b565b610e8f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102db57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561030b5761030b612ddc565b600181111561031c5761031c612ddc565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561074d57600084815260209020604080516101808101909152600884029091018054829060608201908390829060ff16600181111561038f5761038f612ddc565b60018111156103a0576103a0612ddc565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916103f890613358565b80601f016020809104026020016040519081016040528092919081815260200182805461042490613358565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156104c957602002820191906000526020600020905b8154815260200190600101908083116104b5575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156105a357838290600052602060002001805461051690613358565b80601f016020809104026020016040519081016040528092919081815260200182805461054290613358565b801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b5050505050815260200190600101906104f7565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561067c5783829060005260206000200180546105ef90613358565b80601f016020809104026020016040519081016040528092919081815260200182805461061b90613358565b80156106685780601f1061063d57610100808354040283529160200191610668565b820191906000526020600020905b81548152906001019060200180831161064b57829003601f168201915b5050505050815260200190600101906105d0565b50505050815260200160058201805461069490613358565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613358565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b505050919092525050508152600682015467ffffffffffffffff16602080830191909152600790920154604090910152908252600192909201910161034a565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b606060006108696003610f4a565b9050600061087784866133da565b90508315806108865750818110155b156108c65760408051600080825260208201909252906108bc565b6108a9612a5c565b8152602001906001900390816108a15790505b50925050506102db565b60006108d28583613420565b9050828111156108df5750815b60006108eb8383613433565b67ffffffffffffffff811115610903576109036133f1565b60405190808252806020026020018201604052801561093c57816020015b610929612a5c565b8152602001906001900390816109215790505b509050600061094b6003610f54565b9050835b83811015610acf57600082828151811061096b5761096b613446565b60209081029190910181015160408051808201825267ffffffffffffffff8316808252600090815260028552829020825181546080818802830181019095526060820181815295975092958601949093919284928491908401828280156109f157602002820191906000526020600020905b8154815260200190600101908083116109dd575b5050509183525050600182015460ff166020820152600282018054604090920191610a1b90613358565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613358565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b50505091909252505050905284610aab8885613433565b81518110610abb57610abb613446565b60209081029190910101525060010161094f565b5090979650505050505050565b610ae4610f68565b610aed81610feb565b50565b610af8610f68565b60005b83811015610cde57610b3f858583818110610b1857610b18613446565b9050602002016020810190610b2d9190613475565b60039067ffffffffffffffff166110e0565b610ba957848482818110610b5557610b55613446565b9050602002016020810190610b6a9190613475565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d6565b60026000868684818110610bbf57610bbf613446565b9050602002016020810190610bd49190613475565b67ffffffffffffffff1681526020810191909152604001600090812090610bfb8282612aa4565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c33600283016000612ac2565b5050610c71858583818110610c4a57610c4a613446565b9050602002016020810190610c5f9190613475565b60039067ffffffffffffffff166110f8565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610ca557610ca5613446565b9050602002016020810190610cba9190613475565b60405167ffffffffffffffff909116815260200160405180910390a1600101610afb565b5060005b81811015610e88576000838383818110610cfe57610cfe613446565b9050602002810190610d109190613490565b610d1e9060208101906134ce565b610d27906136d0565b90506000848484818110610d3d57610d3d613446565b9050602002810190610d4f9190613490565b610d5d906020810190613475565b9050610d6c8260000151611104565b816020015160ff16600003610dad576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120835180518593610ddd928492910190612afc565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610e2a90826137b7565b50610e4491506003905067ffffffffffffffff8316611250565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051610e769291906138d1565b60405180910390a15050600101610ce2565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610efe576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f15610f108688018861397c565b61125c565b8151919350915015610f2d57610f2d836000846114a7565b805115610f4057610f40836001836114a7565b5050505050505050565b60006102db825490565b60606000610f6183611c09565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107d6565b565b3373ffffffffffffffffffffffffffffffffffffffff82160361106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107d6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610f61565b6000610f618383611c65565b60005b815181101561124c5760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe84848151811061116357611163613446565b60200260200101516040518263ffffffff1660e01b815260040161118991815260200190565b600060405180830381865afa1580156111a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526111ec9190810190613bc7565b60800151036112445781818151811061120757611207613446565b60200260200101516040517f8907a4fa0000000000000000000000000000000000000000000000000000000081526004016107d691815260200190565b600101611107565b5050565b6000610f618383611d5f565b606080600460ff168351111561129e576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61131b6040805161012081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816112b457505060408051600280825260608201909252919350602082015b6113ac6040805161012081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161134557905050905060008060005b855181101561149a5760008682815181106113e4576113e4613446565b602002602001015160000151600181111561140157611401612ddc565b0361144e5785818151811061141857611418613446565b602002602001015185848151811061143257611432613446565b60200260200101819052508261144790613c9f565b9250611492565b85818151811061146057611460613446565b602002602001015184838151811061147a5761147a613446565b60200260200101819052508161148f90613c9f565b91505b6001016113c7565b5090835281529092909150565b63ffffffff83166000908152600560205260408120818460018111156114cf576114cf612ddc565b60018111156114e0576114e0612ddc565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561191157600084815260209020604080516101808101909152600884029091018054829060608201908390829060ff16600181111561155357611553612ddc565b600181111561156457611564612ddc565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916115bc90613358565b80601f01602080910402602001604051908101604052809291908181526020018280546115e890613358565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561168d57602002820191906000526020600020905b815481526020019060010190808311611679575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156117675783829060005260206000200180546116da90613358565b80601f016020809104026020016040519081016040528092919081815260200182805461170690613358565b80156117535780601f1061172857610100808354040283529160200191611753565b820191906000526020600020905b81548152906001019060200180831161173657829003601f168201915b5050505050815260200190600101906116bb565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118405783829060005260206000200180546117b390613358565b80601f01602080910402602001604051908101604052809291908181526020018280546117df90613358565b801561182c5780601f106118015761010080835404028352916020019161182c565b820191906000526020600020905b81548152906001019060200180831161180f57829003601f168201915b505050505081526020019060010190611794565b50505050815260200160058201805461185890613358565b80601f016020809104026020016040519081016040528092919081815260200182805461188490613358565b80156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b505050919092525050508152600682015467ffffffffffffffff16602080830191909152600790920154604090910152908252600192909201910161150e565b50505050905060006119238251611dae565b905060006119318451611dae565b905061193d8282611e00565b600061194c8785878686611ebc565b905061195884826122a0565b63ffffffff871660009081526005602052604081209087600181111561198057611980612ddc565b600181111561199157611991612ddc565b815260200190815260200160002060006119ab9190612b47565b60005b8151811015610f405763ffffffff88166000908152600560205260408120908860018111156119df576119df612ddc565b60018111156119f0576119f0612ddc565b8152602001908152602001600020828281518110611a1057611a10613446565b6020908102919091018101518254600181810185556000948552929093208151805160089095029091018054929490939192849283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016908381811115611a7a57611a7a612ddc565b021790555060208201518154604084015160608501517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217815560808201516001820190611b4990826137b7565b5060a08201518051611b65916002840191602090910190612afc565b5060c08201518051611b81916003840191602090910190612b68565b5060e08201518051611b9d916004840191602090910190612b68565b506101008201516005820190611bb390826137b7565b50505060208201516006820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff9092169190911790556040909101516007909101556001016119ae565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c5957602002820191906000526020600020905b815481526020019060010190808311611c45575b50505050509050919050565b60008181526001830160205260408120548015611d4e576000611c89600183613433565b8554909150600090611c9d90600190613433565b9050808214611d02576000866000018281548110611cbd57611cbd613446565b9060005260206000200154905080876000018481548110611ce057611ce0613446565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d1357611d13613cd7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102db565b60009150506102db565b5092915050565b6000818152600183016020526040812054611da6575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102db565b5060006102db565b60006002821115611dee576040517f3e478526000000000000000000000000000000000000000000000000000000008152600481018390526024016107d6565b8160028111156102db576102db612ddc565b6000826002811115611e1457611e14612ddc565b826002811115611e2657611e26612ddc565b611e309190613d06565b90508060011480611e7c5750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611e7c57506002836002811115611e7a57611e7a612ddc565b145b15611e8657505050565b82826040517f0a6b675b0000000000000000000000000000000000000000000000000000000081526004016107d6929190613d36565b60606000845167ffffffffffffffff811115611eda57611eda6133f1565b604051908082528060200260200182016040528015611f03578160200160208202803683370190505b5090506000846002811115611f1a57611f1a612ddc565b148015611f3857506001836002811115611f3657611f36612ddc565b145b15611f7957600181600081518110611f5257611f52613446565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250506120e1565b6001846002811115611f8d57611f8d612ddc565b148015611fab57506002836002811115611fa957611fa9612ddc565b145b156120425785600081518110611fc357611fc3613446565b60200260200101516020015181600081518110611fe257611fe2613446565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250508560008151811061201757612017613446565b602002602001015160200151600161202f9190613d51565b81600181518110611f5257611f52613446565b600284600281111561205657612056612ddc565b1480156120745750600183600281111561207257612072612ddc565b145b156120ab578560018151811061208c5761208c613446565b60200260200101516020015181600081518110611f5257611f52613446565b83836040517f0a6b675b0000000000000000000000000000000000000000000000000000000081526004016107d6929190613d36565b6000855167ffffffffffffffff8111156120fd576120fd6133f1565b6040519080825280602002602001820160405280156121ab57816020015b6040805161018081018252600060608083018281526080840183905260a0840183905260c0840183905260e08401829052610100840182905261012084018290526101408401829052610160840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161211b5790505b50905060005b8251811015612294576121dc8782815181106121cf576121cf613446565b602002602001015161261f565b60405180606001604052808883815181106121f9576121f9613446565b6020026020010151815260200184838151811061221857612218613446565b602002602001015167ffffffffffffffff16815260200161226c8b86858151811061224557612245613446565b60200260200101518b868151811061225f5761225f613446565b602002602001015161298e565b81525082828151811061228157612281613446565b60209081029190910101526001016121b1565b50979650505050505050565b81518151811580156122b25750806001145b1561235457826000815181106122ca576122ca613446565b60200260200101516020015167ffffffffffffffff1660011461234e57826000815181106122fa576122fa613446565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152600160248201526044016107d6565b50505050565b8160011480156123645750806002145b1561251a578360008151811061237c5761237c613446565b6020026020010151604001518360008151811061239b5761239b613446565b6020026020010151604001511461242757826000815181106123bf576123bf613446565b602002602001015160400151846000815181106123de576123de613446565b6020026020010151604001516040517fc7ccdd7f0000000000000000000000000000000000000000000000000000000081526004016107d6929190918252602082015260400190565b8360008151811061243a5761243a613446565b60200260200101516020015160016124529190613d51565b67ffffffffffffffff168360018151811061246f5761246f613446565b60200260200101516020015167ffffffffffffffff161461234e578260018151811061249d5761249d613446565b602002602001015160200151846000815181106124bc576124bc613446565b60200260200101516020015160016124d49190613d51565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9283166004820152911660248201526044016107d6565b81600214801561252a5750806001145b156125ed578360018151811061254257612542613446565b6020026020010151604001518360008151811061256157612561613446565b6020026020010151604001511461234e578260008151811061258557612585613446565b602002602001015160400151846001815181106125a4576125a4613446565b6020026020010151604001516040517f9e9756700000000000000000000000000000000000000000000000000000000081526004016107d6929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff16600003612667576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561267c5761267c612ddc565b1415801561269d575060018151600181111561269a5761269a612ddc565b14155b156126d4576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080810151511580612711575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b15612748576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516127639060039067ffffffffffffffff166110e0565b6127ab5760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d6565b60208082015167ffffffffffffffff166000908152600290915260408120600101546127db9060ff166003613d72565b6127e6906001613d8e565b60ff169050808260e0015151101561283b5760e0820151516040517f548dd21f0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016107d6565b60c08201515161010081111561287d576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260a00151518114158061289657508260e00151518114155b156128f05760a08301515160c08401515160e0850151516040517fba900f6d0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016107d6565b826040015160ff16600003612931576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040830151612941906003613d72565b60ff16811161297c576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129898360a00151611104565b505050565b60008082602001518584600001518560800151878760a001518860c001518960e001518a604001518b606001518c61010001516040516020016129db9b9a99989796959493929190613da7565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b6040518060400160405280600067ffffffffffffffff168152602001612a9f604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610aed9190612bba565b508054612ace90613358565b6000825580601f10612ade575050565b601f016020900490600052602060002090810190610aed9190612bba565b828054828255906000526020600020908101928215612b37579160200282015b82811115612b37578251825591602001919060010190612b1c565b50612b43929150612bba565b5090565b5080546000825560080290600052602060002090810190610aed9190612bcf565b828054828255906000526020600020908101928215612bae579160200282015b82811115612bae5782518290612b9e90826137b7565b5091602001919060010190612b88565b50612b43929150612c82565b5b80821115612b435760008155600101612bbb565b80821115612b435780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612c0e6001830182612ac2565b612c1c600283016000612aa4565b612c2a600383016000612c9f565b612c38600483016000612c9f565b612c46600583016000612ac2565b5050506006810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006007820155600801612bcf565b80821115612b43576000612c968282612ac2565b50600101612c82565b5080546000825590600052602060002090810190610aed9190612c82565b600060208284031215612ccf57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f6157600080fd5b6000815180845260005b81811015612d2557602081850181015186830182015201612d09565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f616020830184612cff565b63ffffffff81168114610aed57600080fd5b8035612d9381612d76565b919050565b803560028110612d9357600080fd5b60008060408385031215612dba57600080fd5b8235612dc581612d76565b9150612dd360208401612d98565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110612e1b57612e1b612ddc565b9052565b60008151808452602080850194506020840160005b83811015612e5057815187529582019590820190600101612e34565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610acf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952612eb4838351612cff565b98840198925090830190600101612e7a565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613074577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160608151818652612f348287018251612e0b565b898101516080612f4f8189018367ffffffffffffffff169052565b8a830151915060a0612f65818a018460ff169052565b938301519360c09250612f838984018667ffffffffffffffff169052565b818401519450610120915060e082818b0152612fa36101808b0187612cff565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0610100818c890301818d0152612fe28885612e1f565b958701518c87038301868e0152959750612ffc8887612e5b565b9750828701519550818c8903016101408d01526130198887612e5b565b975080870151965050808b8803016101608c0152505050505061303c8282612cff565b915050888201516130588a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101612eef565b509098975050505050505050565b60006020828403121561309457600080fd5b8135610f6181612d76565b600080604083850312156130b257600080fd5b50508035926020909101359150565b60008151606084526130d66060850182612e1f565b905060ff6020840151166020850152604083015184820360408601526130fc8282612cff565b95945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613074578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff168452870151878401879052613182878501826130c1565b958801959350509086019060010161312e565b6000602082840312156131a757600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610f6157600080fd5b60008083601f8401126131dd57600080fd5b50813567ffffffffffffffff8111156131f557600080fd5b6020830191508360208260051b850101111561321057600080fd5b9250929050565b6000806000806040858703121561322d57600080fd5b843567ffffffffffffffff8082111561324557600080fd5b613251888389016131cb565b9096509450602087013591508082111561326a57600080fd5b50613277878288016131cb565b95989497509550505050565b803567ffffffffffffffff81168114612d9357600080fd5b600080600080600080608087890312156132b457600080fd5b863567ffffffffffffffff808211156132cc57600080fd5b6132d88a838b016131cb565b909850965060208901359150808211156132f157600080fd5b818901915089601f83011261330557600080fd5b81358181111561331457600080fd5b8a602082850101111561332657600080fd5b60208301965080955050505061333e60408801613283565b915061334c60608801612d88565b90509295509295509295565b600181811c9082168061336c57607f821691505b6020821081036133a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102db576102db6133ab565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102db576102db6133ab565b818103818111156102db576102db6133ab565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561348757600080fd5b610f6182613283565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126134c457600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126134c457600080fd5b604051610120810167ffffffffffffffff81118282101715613526576135266133f1565b60405290565b60405160e0810167ffffffffffffffff81118282101715613526576135266133f1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613596576135966133f1565b604052919050565b600067ffffffffffffffff8211156135b8576135b86133f1565b5060051b60200190565b600082601f8301126135d357600080fd5b813560206135e86135e38361359e565b61354f565b8083825260208201915060208460051b87010193508684111561360a57600080fd5b602086015b84811015613626578035835291830191830161360f565b509695505050505050565b803560ff81168114612d9357600080fd5b600082601f83011261365357600080fd5b813567ffffffffffffffff81111561366d5761366d6133f1565b61369e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161354f565b8181528460208386010111156136b357600080fd5b816020850160208301376000918101602001919091529392505050565b6000606082360312156136e257600080fd5b6040516060810167ffffffffffffffff8282108183111715613706576137066133f1565b81604052843591508082111561371b57600080fd5b613727368387016135c2565b835261373560208601613631565b6020840152604085013591508082111561374e57600080fd5b5061375b36828601613642565b60408301525092915050565b601f821115612989576000816000526020600020601f850160051c810160208610156137905750805b601f850160051c820191505b818110156137af5782815560010161379c565b505050505050565b815167ffffffffffffffff8111156137d1576137d16133f1565b6137e5816137df8454613358565b84613767565b602080601f83116001811461383857600084156138025750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137af565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561388557888601518255948401946001909101908401613866565b50858210156138c157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831681526040602082015260006138f460408301846130c1565b949350505050565b600082601f83011261390d57600080fd5b8135602061391d6135e38361359e565b82815260059290921b8401810191818101908684111561393c57600080fd5b8286015b8481101561362657803567ffffffffffffffff8111156139605760008081fd5b61396e8986838b0101613642565b845250918301918301613940565b6000602080838503121561398f57600080fd5b823567ffffffffffffffff808211156139a757600080fd5b818501915085601f8301126139bb57600080fd5b81356139c96135e38261359e565b81815260059190911b830184019084810190888311156139e857600080fd5b8585015b83811015613b5057803585811115613a0357600080fd5b8601610120818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001811315613a3957600080fd5b613a41613502565b613a4c8a8401612d98565b8152613a5a60408401613283565b8a820152613a6a60608401613631565b6040820152613a7b60808401613283565b606082015260a083013588811115613a9257600080fd5b613aa08e8c83870101613642565b60808301525060c083013588811115613ab857600080fd5b613ac68e8c838701016135c2565b60a08301525060e083013588811115613adf5760008081fd5b613aed8e8c838701016138fc565b60c0830152506101008084013589811115613b085760008081fd5b613b168f8d838801016138fc565b60e084015250918301359188831115613b2f5760008081fd5b613b3d8e8c85870101613642565b90820152855250509186019186016139ec565b5098975050505050505050565b8051612d9381612d76565b600082601f830112613b7957600080fd5b81516020613b896135e38361359e565b8083825260208201915060208460051b870101935086841115613bab57600080fd5b602086015b848110156136265780518352918301918301613bb0565b600060208284031215613bd957600080fd5b815167ffffffffffffffff80821115613bf157600080fd5b9083019060e08286031215613c0557600080fd5b613c0d61352c565b613c1683613b5d565b8152613c2460208401613b5d565b6020820152613c3560408401613b5d565b6040820152606083015160608201526080830151608082015260a083015182811115613c6057600080fd5b613c6c87828601613b68565b60a08301525060c083015182811115613c8457600080fd5b613c9087828601613b68565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cd057613cd06133ab565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611d5857611d586133ab565b60038110612e1b57612e1b612ddc565b60408101613d448285613d26565b610f616020830184613d26565b67ffffffffffffffff818116838216019080821115611d5857611d586133ab565b60ff8181168382160290811690818114611d5857611d586133ab565b60ff81811683821601908111156102db576102db6133ab565b600061016067ffffffffffffffff8e16835263ffffffff8d166020840152613dd2604084018d612e0b565b806060840152613de48184018c612cff565b67ffffffffffffffff8b166080850152905082810360a0840152613e08818a612e1f565b905082810360c0840152613e1c8189612e5b565b905082810360e0840152613e308188612e5b565b60ff8716610100850152905067ffffffffffffffff8516610120840152828103610140840152613e608185612cff565b9e9d505050505050505050505050505056fea164736f6c6343000818000a", -} - -var CCIPConfigABI = CCIPConfigMetaData.ABI - -var CCIPConfigBin = CCIPConfigMetaData.Bin - -func DeployCCIPConfig(auth *bind.TransactOpts, backend bind.ContractBackend, capabilitiesRegistry common.Address) (common.Address, *types.Transaction, *CCIPConfig, error) { - parsed, err := CCIPConfigMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPConfigBin), backend, capabilitiesRegistry) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &CCIPConfig{address: address, abi: *parsed, CCIPConfigCaller: CCIPConfigCaller{contract: contract}, CCIPConfigTransactor: CCIPConfigTransactor{contract: contract}, CCIPConfigFilterer: CCIPConfigFilterer{contract: contract}}, nil -} - -type CCIPConfig struct { - address common.Address - abi abi.ABI - CCIPConfigCaller - CCIPConfigTransactor - CCIPConfigFilterer -} - -type CCIPConfigCaller struct { - contract *bind.BoundContract -} - -type CCIPConfigTransactor struct { - contract *bind.BoundContract -} - -type CCIPConfigFilterer struct { - contract *bind.BoundContract -} - -type CCIPConfigSession struct { - Contract *CCIPConfig - CallOpts bind.CallOpts - TransactOpts bind.TransactOpts -} - -type CCIPConfigCallerSession struct { - Contract *CCIPConfigCaller - CallOpts bind.CallOpts -} - -type CCIPConfigTransactorSession struct { - Contract *CCIPConfigTransactor - TransactOpts bind.TransactOpts -} - -type CCIPConfigRaw struct { - Contract *CCIPConfig -} - -type CCIPConfigCallerRaw struct { - Contract *CCIPConfigCaller -} - -type CCIPConfigTransactorRaw struct { - Contract *CCIPConfigTransactor -} - -func NewCCIPConfig(address common.Address, backend bind.ContractBackend) (*CCIPConfig, error) { - abi, err := abi.JSON(strings.NewReader(CCIPConfigABI)) - if err != nil { - return nil, err - } - contract, err := bindCCIPConfig(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &CCIPConfig{address: address, abi: abi, CCIPConfigCaller: CCIPConfigCaller{contract: contract}, CCIPConfigTransactor: CCIPConfigTransactor{contract: contract}, CCIPConfigFilterer: CCIPConfigFilterer{contract: contract}}, nil -} - -func NewCCIPConfigCaller(address common.Address, caller bind.ContractCaller) (*CCIPConfigCaller, error) { - contract, err := bindCCIPConfig(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &CCIPConfigCaller{contract: contract}, nil -} - -func NewCCIPConfigTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPConfigTransactor, error) { - contract, err := bindCCIPConfig(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &CCIPConfigTransactor{contract: contract}, nil -} - -func NewCCIPConfigFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPConfigFilterer, error) { - contract, err := bindCCIPConfig(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &CCIPConfigFilterer{contract: contract}, nil -} - -func bindCCIPConfig(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := CCIPConfigMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -func (_CCIPConfig *CCIPConfigRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _CCIPConfig.Contract.CCIPConfigCaller.contract.Call(opts, result, method, params...) -} - -func (_CCIPConfig *CCIPConfigRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPConfig.Contract.CCIPConfigTransactor.contract.Transfer(opts) -} - -func (_CCIPConfig *CCIPConfigRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _CCIPConfig.Contract.CCIPConfigTransactor.contract.Transact(opts, method, params...) -} - -func (_CCIPConfig *CCIPConfigCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _CCIPConfig.Contract.contract.Call(opts, result, method, params...) -} - -func (_CCIPConfig *CCIPConfigTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPConfig.Contract.contract.Transfer(opts) -} - -func (_CCIPConfig *CCIPConfigTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _CCIPConfig.Contract.contract.Transact(opts, method, params...) -} - -func (_CCIPConfig *CCIPConfigCaller) GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "getAllChainConfigs", pageIndex, pageSize) - - if err != nil { - return *new([]CCIPConfigTypesChainConfigInfo), err - } - - out0 := *abi.ConvertType(out[0], new([]CCIPConfigTypesChainConfigInfo)).(*[]CCIPConfigTypesChainConfigInfo) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) { - return _CCIPConfig.Contract.GetAllChainConfigs(&_CCIPConfig.CallOpts, pageIndex, pageSize) -} - -func (_CCIPConfig *CCIPConfigCallerSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) { - return _CCIPConfig.Contract.GetAllChainConfigs(&_CCIPConfig.CallOpts, pageIndex, pageSize) -} - -func (_CCIPConfig *CCIPConfigCaller) GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "getCapabilityConfiguration", arg0) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { - return _CCIPConfig.Contract.GetCapabilityConfiguration(&_CCIPConfig.CallOpts, arg0) -} - -func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { - return _CCIPConfig.Contract.GetCapabilityConfiguration(&_CCIPConfig.CallOpts, arg0) -} - -func (_CCIPConfig *CCIPConfigCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "getCapabilityRegistry") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) GetCapabilityRegistry() (common.Address, error) { - return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityRegistry() (common.Address, error) { - return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigCaller) GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "getOCRConfig", donId, pluginType) - - if err != nil { - return *new([]CCIPConfigTypesOCR3ConfigWithMeta), err - } - - out0 := *abi.ConvertType(out[0], new([]CCIPConfigTypesOCR3ConfigWithMeta)).(*[]CCIPConfigTypesOCR3ConfigWithMeta) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) GetOCRConfig(donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) { - return _CCIPConfig.Contract.GetOCRConfig(&_CCIPConfig.CallOpts, donId, pluginType) -} - -func (_CCIPConfig *CCIPConfigCallerSession) GetOCRConfig(donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) { - return _CCIPConfig.Contract.GetOCRConfig(&_CCIPConfig.CallOpts, donId, pluginType) -} - -func (_CCIPConfig *CCIPConfigCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) Owner() (common.Address, error) { - return _CCIPConfig.Contract.Owner(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigCallerSession) Owner() (common.Address, error) { - return _CCIPConfig.Contract.Owner(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "supportsInterface", interfaceId) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _CCIPConfig.Contract.SupportsInterface(&_CCIPConfig.CallOpts, interfaceId) -} - -func (_CCIPConfig *CCIPConfigCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { - return _CCIPConfig.Contract.SupportsInterface(&_CCIPConfig.CallOpts, interfaceId) -} - -func (_CCIPConfig *CCIPConfigCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _CCIPConfig.contract.Call(opts, &out, "typeAndVersion") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -func (_CCIPConfig *CCIPConfigSession) TypeAndVersion() (string, error) { - return _CCIPConfig.Contract.TypeAndVersion(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigCallerSession) TypeAndVersion() (string, error) { - return _CCIPConfig.Contract.TypeAndVersion(&_CCIPConfig.CallOpts) -} - -func (_CCIPConfig *CCIPConfigTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPConfig.contract.Transact(opts, "acceptOwnership") -} - -func (_CCIPConfig *CCIPConfigSession) AcceptOwnership() (*types.Transaction, error) { - return _CCIPConfig.Contract.AcceptOwnership(&_CCIPConfig.TransactOpts) -} - -func (_CCIPConfig *CCIPConfigTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _CCIPConfig.Contract.AcceptOwnership(&_CCIPConfig.TransactOpts) -} - -func (_CCIPConfig *CCIPConfigTransactor) ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) { - return _CCIPConfig.contract.Transact(opts, "applyChainConfigUpdates", chainSelectorRemoves, chainConfigAdds) -} - -func (_CCIPConfig *CCIPConfigSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) { - return _CCIPConfig.Contract.ApplyChainConfigUpdates(&_CCIPConfig.TransactOpts, chainSelectorRemoves, chainConfigAdds) -} - -func (_CCIPConfig *CCIPConfigTransactorSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) { - return _CCIPConfig.Contract.ApplyChainConfigUpdates(&_CCIPConfig.TransactOpts, chainSelectorRemoves, chainConfigAdds) -} - -func (_CCIPConfig *CCIPConfigTransactor) BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { - return _CCIPConfig.contract.Transact(opts, "beforeCapabilityConfigSet", arg0, config, arg2, donId) -} - -func (_CCIPConfig *CCIPConfigSession) BeforeCapabilityConfigSet(arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { - return _CCIPConfig.Contract.BeforeCapabilityConfigSet(&_CCIPConfig.TransactOpts, arg0, config, arg2, donId) -} - -func (_CCIPConfig *CCIPConfigTransactorSession) BeforeCapabilityConfigSet(arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { - return _CCIPConfig.Contract.BeforeCapabilityConfigSet(&_CCIPConfig.TransactOpts, arg0, config, arg2, donId) -} - -func (_CCIPConfig *CCIPConfigTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _CCIPConfig.contract.Transact(opts, "transferOwnership", to) -} - -func (_CCIPConfig *CCIPConfigSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPConfig.Contract.TransferOwnership(&_CCIPConfig.TransactOpts, to) -} - -func (_CCIPConfig *CCIPConfigTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPConfig.Contract.TransferOwnership(&_CCIPConfig.TransactOpts, to) -} - -type CCIPConfigCapabilityConfigurationSetIterator struct { - Event *CCIPConfigCapabilityConfigurationSet - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPConfigCapabilityConfigurationSetIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPConfigCapabilityConfigurationSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(CCIPConfigCapabilityConfigurationSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *CCIPConfigCapabilityConfigurationSetIterator) Error() error { - return it.fail -} - -func (it *CCIPConfigCapabilityConfigurationSetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPConfigCapabilityConfigurationSet struct { - Raw types.Log -} - -func (_CCIPConfig *CCIPConfigFilterer) FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPConfigCapabilityConfigurationSetIterator, error) { - - logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "CapabilityConfigurationSet") - if err != nil { - return nil, err - } - return &CCIPConfigCapabilityConfigurationSetIterator{contract: _CCIPConfig.contract, event: "CapabilityConfigurationSet", logs: logs, sub: sub}, nil -} - -func (_CCIPConfig *CCIPConfigFilterer) WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigCapabilityConfigurationSet) (event.Subscription, error) { - - logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "CapabilityConfigurationSet") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPConfigCapabilityConfigurationSet) - if err := _CCIPConfig.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_CCIPConfig *CCIPConfigFilterer) ParseCapabilityConfigurationSet(log types.Log) (*CCIPConfigCapabilityConfigurationSet, error) { - event := new(CCIPConfigCapabilityConfigurationSet) - if err := _CCIPConfig.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -type CCIPConfigChainConfigRemovedIterator struct { - Event *CCIPConfigChainConfigRemoved - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPConfigChainConfigRemovedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPConfigChainConfigRemoved) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(CCIPConfigChainConfigRemoved) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *CCIPConfigChainConfigRemovedIterator) Error() error { - return it.fail -} - -func (it *CCIPConfigChainConfigRemovedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPConfigChainConfigRemoved struct { - ChainSelector uint64 - Raw types.Log -} - -func (_CCIPConfig *CCIPConfigFilterer) FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPConfigChainConfigRemovedIterator, error) { - - logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "ChainConfigRemoved") - if err != nil { - return nil, err - } - return &CCIPConfigChainConfigRemovedIterator{contract: _CCIPConfig.contract, event: "ChainConfigRemoved", logs: logs, sub: sub}, nil -} - -func (_CCIPConfig *CCIPConfigFilterer) WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigRemoved) (event.Subscription, error) { - - logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "ChainConfigRemoved") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPConfigChainConfigRemoved) - if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_CCIPConfig *CCIPConfigFilterer) ParseChainConfigRemoved(log types.Log) (*CCIPConfigChainConfigRemoved, error) { - event := new(CCIPConfigChainConfigRemoved) - if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -type CCIPConfigChainConfigSetIterator struct { - Event *CCIPConfigChainConfigSet - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPConfigChainConfigSetIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPConfigChainConfigSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(CCIPConfigChainConfigSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *CCIPConfigChainConfigSetIterator) Error() error { - return it.fail -} - -func (it *CCIPConfigChainConfigSetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPConfigChainConfigSet struct { - ChainSelector uint64 - ChainConfig CCIPConfigTypesChainConfig - Raw types.Log -} - -func (_CCIPConfig *CCIPConfigFilterer) FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPConfigChainConfigSetIterator, error) { - - logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "ChainConfigSet") - if err != nil { - return nil, err - } - return &CCIPConfigChainConfigSetIterator{contract: _CCIPConfig.contract, event: "ChainConfigSet", logs: logs, sub: sub}, nil -} - -func (_CCIPConfig *CCIPConfigFilterer) WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigSet) (event.Subscription, error) { - - logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "ChainConfigSet") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPConfigChainConfigSet) - if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_CCIPConfig *CCIPConfigFilterer) ParseChainConfigSet(log types.Log) (*CCIPConfigChainConfigSet, error) { - event := new(CCIPConfigChainConfigSet) - if err := _CCIPConfig.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -type CCIPConfigOwnershipTransferRequestedIterator struct { - Event *CCIPConfigOwnershipTransferRequested - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPConfigOwnershipTransferRequestedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPConfigOwnershipTransferRequested) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(CCIPConfigOwnershipTransferRequested) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *CCIPConfigOwnershipTransferRequestedIterator) Error() error { - return it.fail -} - -func (it *CCIPConfigOwnershipTransferRequestedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPConfigOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log -} - -func (_CCIPConfig *CCIPConfigFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferRequestedIterator, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } - - logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) - if err != nil { - return nil, err - } - return &CCIPConfigOwnershipTransferRequestedIterator{contract: _CCIPConfig.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil -} - -func (_CCIPConfig *CCIPConfigFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } - - logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPConfigOwnershipTransferRequested) - if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_CCIPConfig *CCIPConfigFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPConfigOwnershipTransferRequested, error) { - event := new(CCIPConfigOwnershipTransferRequested) - if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -type CCIPConfigOwnershipTransferredIterator struct { - Event *CCIPConfigOwnershipTransferred - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPConfigOwnershipTransferredIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPConfigOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(CCIPConfigOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *CCIPConfigOwnershipTransferredIterator) Error() error { - return it.fail -} - -func (it *CCIPConfigOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPConfigOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log -} - -func (_CCIPConfig *CCIPConfigFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferredIterator, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } - - logs, sub, err := _CCIPConfig.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) - if err != nil { - return nil, err - } - return &CCIPConfigOwnershipTransferredIterator{contract: _CCIPConfig.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -func (_CCIPConfig *CCIPConfigFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { - - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } - - logs, sub, err := _CCIPConfig.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPConfigOwnershipTransferred) - if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_CCIPConfig *CCIPConfigFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPConfigOwnershipTransferred, error) { - event := new(CCIPConfigOwnershipTransferred) - if err := _CCIPConfig.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -func (_CCIPConfig *CCIPConfig) ParseLog(log types.Log) (generated.AbigenLog, error) { - switch log.Topics[0] { - case _CCIPConfig.abi.Events["CapabilityConfigurationSet"].ID: - return _CCIPConfig.ParseCapabilityConfigurationSet(log) - case _CCIPConfig.abi.Events["ChainConfigRemoved"].ID: - return _CCIPConfig.ParseChainConfigRemoved(log) - case _CCIPConfig.abi.Events["ChainConfigSet"].ID: - return _CCIPConfig.ParseChainConfigSet(log) - case _CCIPConfig.abi.Events["OwnershipTransferRequested"].ID: - return _CCIPConfig.ParseOwnershipTransferRequested(log) - case _CCIPConfig.abi.Events["OwnershipTransferred"].ID: - return _CCIPConfig.ParseOwnershipTransferred(log) - - default: - return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) - } -} - -func (CCIPConfigCapabilityConfigurationSet) Topic() common.Hash { - return common.HexToHash("0x84ad7751b744c9e2ee77da1d902b428aec7f0a343d67a24bbe2142e6f58a8d0f") -} - -func (CCIPConfigChainConfigRemoved) Topic() common.Hash { - return common.HexToHash("0x2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0") -} - -func (CCIPConfigChainConfigSet) Topic() common.Hash { - return common.HexToHash("0x05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0") -} - -func (CCIPConfigOwnershipTransferRequested) Topic() common.Hash { - return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") -} - -func (CCIPConfigOwnershipTransferred) Topic() common.Hash { - return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") -} - -func (_CCIPConfig *CCIPConfig) Address() common.Address { - return _CCIPConfig.address -} - -type CCIPConfigInterface interface { - GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPConfigTypesChainConfigInfo, error) - - GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) - - GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) - - GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) - - Owner(opts *bind.CallOpts) (common.Address, error) - - SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) - - TypeAndVersion(opts *bind.CallOpts) (string, error) - - AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - - ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPConfigTypesChainConfigInfo) (*types.Transaction, error) - - BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, config []byte, arg2 uint64, donId uint32) (*types.Transaction, error) - - TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - - FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPConfigCapabilityConfigurationSetIterator, error) - - WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigCapabilityConfigurationSet) (event.Subscription, error) - - ParseCapabilityConfigurationSet(log types.Log) (*CCIPConfigCapabilityConfigurationSet, error) - - FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPConfigChainConfigRemovedIterator, error) - - WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigRemoved) (event.Subscription, error) - - ParseChainConfigRemoved(log types.Log) (*CCIPConfigChainConfigRemoved, error) - - FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPConfigChainConfigSetIterator, error) - - WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPConfigChainConfigSet) (event.Subscription, error) - - ParseChainConfigSet(log types.Log) (*CCIPConfigChainConfigSet, error) - - FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferRequestedIterator, error) - - WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) - - ParseOwnershipTransferRequested(log types.Log) (*CCIPConfigOwnershipTransferRequested, error) - - FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPConfigOwnershipTransferredIterator, error) - - WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPConfigOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) - - ParseOwnershipTransferred(log types.Log) (*CCIPConfigOwnershipTransferred, error) - - ParseLog(log types.Log) (generated.AbigenLog, error) - - Address() common.Address -} diff --git a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go new file mode 100644 index 00000000000..76a7788345f --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go @@ -0,0 +1,282 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccip_encoding_utils + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type CCIPHomeOCR3Config struct { + PluginType uint8 + ChainSelector uint64 + FRoleDON uint8 + OffchainConfigVersion uint64 + OfframpAddress []byte + RmnHomeAddress []byte + Nodes []CCIPHomeOCR3Node + OffchainConfig []byte +} + +type CCIPHomeOCR3Node struct { + P2pId [32]byte + SignerKey []byte + TransmitterKey []byte +} + +type IRMNV2Signature struct { + R [32]byte + S [32]byte +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type OffRampCommitReport struct { + PriceUpdates InternalPriceUpdates + MerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNV2Signature + RmnRawVs *big.Int +} + +type RMNRemoteReport struct { + DestChainId *big.Int + DestChainSelector uint64 + RmnRemoteContractAddress common.Address + OfframpAddress common.Address + RmnHomeContractConfigDigest [32]byte + MerkleRoots []InternalMerkleRoot +} + +var EncodingUtilsMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"commitReport\",\"type\":\"tuple\"}],\"name\":\"exposeCommitReport\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"rmnReportVersion\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"offrampAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"internalType\":\"structRMNRemote.Report\",\"name\":\"rmnReport\",\"type\":\"tuple\"}],\"name\":\"exposeRmnReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +var EncodingUtilsABI = EncodingUtilsMetaData.ABI + +type EncodingUtils struct { + address common.Address + abi abi.ABI + EncodingUtilsCaller + EncodingUtilsTransactor + EncodingUtilsFilterer +} + +type EncodingUtilsCaller struct { + contract *bind.BoundContract +} + +type EncodingUtilsTransactor struct { + contract *bind.BoundContract +} + +type EncodingUtilsFilterer struct { + contract *bind.BoundContract +} + +type EncodingUtilsSession struct { + Contract *EncodingUtils + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type EncodingUtilsCallerSession struct { + Contract *EncodingUtilsCaller + CallOpts bind.CallOpts +} + +type EncodingUtilsTransactorSession struct { + Contract *EncodingUtilsTransactor + TransactOpts bind.TransactOpts +} + +type EncodingUtilsRaw struct { + Contract *EncodingUtils +} + +type EncodingUtilsCallerRaw struct { + Contract *EncodingUtilsCaller +} + +type EncodingUtilsTransactorRaw struct { + Contract *EncodingUtilsTransactor +} + +func NewEncodingUtils(address common.Address, backend bind.ContractBackend) (*EncodingUtils, error) { + abi, err := abi.JSON(strings.NewReader(EncodingUtilsABI)) + if err != nil { + return nil, err + } + contract, err := bindEncodingUtils(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EncodingUtils{address: address, abi: abi, EncodingUtilsCaller: EncodingUtilsCaller{contract: contract}, EncodingUtilsTransactor: EncodingUtilsTransactor{contract: contract}, EncodingUtilsFilterer: EncodingUtilsFilterer{contract: contract}}, nil +} + +func NewEncodingUtilsCaller(address common.Address, caller bind.ContractCaller) (*EncodingUtilsCaller, error) { + contract, err := bindEncodingUtils(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EncodingUtilsCaller{contract: contract}, nil +} + +func NewEncodingUtilsTransactor(address common.Address, transactor bind.ContractTransactor) (*EncodingUtilsTransactor, error) { + contract, err := bindEncodingUtils(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EncodingUtilsTransactor{contract: contract}, nil +} + +func NewEncodingUtilsFilterer(address common.Address, filterer bind.ContractFilterer) (*EncodingUtilsFilterer, error) { + contract, err := bindEncodingUtils(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EncodingUtilsFilterer{contract: contract}, nil +} + +func bindEncodingUtils(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EncodingUtilsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_EncodingUtils *EncodingUtilsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EncodingUtils.Contract.EncodingUtilsCaller.contract.Call(opts, result, method, params...) +} + +func (_EncodingUtils *EncodingUtilsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EncodingUtils.Contract.EncodingUtilsTransactor.contract.Transfer(opts) +} + +func (_EncodingUtils *EncodingUtilsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EncodingUtils.Contract.EncodingUtilsTransactor.contract.Transact(opts, method, params...) +} + +func (_EncodingUtils *EncodingUtilsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EncodingUtils.Contract.contract.Call(opts, result, method, params...) +} + +func (_EncodingUtils *EncodingUtilsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EncodingUtils.Contract.contract.Transfer(opts) +} + +func (_EncodingUtils *EncodingUtilsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EncodingUtils.Contract.contract.Transact(opts, method, params...) +} + +func (_EncodingUtils *EncodingUtilsCaller) ExposeCommitReport(opts *bind.CallOpts, commitReport OffRampCommitReport) ([]byte, error) { + var out []interface{} + err := _EncodingUtils.contract.Call(opts, &out, "exposeCommitReport", commitReport) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeCommitReport(commitReport OffRampCommitReport) ([]byte, error) { + return _EncodingUtils.Contract.ExposeCommitReport(&_EncodingUtils.CallOpts, commitReport) +} + +func (_EncodingUtils *EncodingUtilsCallerSession) ExposeCommitReport(commitReport OffRampCommitReport) ([]byte, error) { + return _EncodingUtils.Contract.ExposeCommitReport(&_EncodingUtils.CallOpts, commitReport) +} + +func (_EncodingUtils *EncodingUtilsCaller) ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error) { + var out []interface{} + err := _EncodingUtils.contract.Call(opts, &out, "exposeOCR3Config", config) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) { + return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config) +} + +func (_EncodingUtils *EncodingUtilsCallerSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) { + return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config) +} + +func (_EncodingUtils *EncodingUtilsTransactor) ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.contract.Transact(opts, "exposeRmnReport", rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtilsTransactorSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtils) Address() common.Address { + return _EncodingUtils.address +} + +type EncodingUtilsInterface interface { + ExposeCommitReport(opts *bind.CallOpts, commitReport OffRampCommitReport) ([]byte, error) + + ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error) + + ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go new file mode 100644 index 00000000000..8976868a430 --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go @@ -0,0 +1,1894 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccip_home + +import ( + "errors" + "fmt" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type CCIPHomeChainConfig struct { + Readers [][32]byte + FChain uint8 + Config []byte +} + +type CCIPHomeChainConfigArgs struct { + ChainSelector uint64 + ChainConfig CCIPHomeChainConfig +} + +type CCIPHomeOCR3Config struct { + PluginType uint8 + ChainSelector uint64 + FRoleDON uint8 + OffchainConfigVersion uint64 + OfframpAddress []byte + RmnHomeAddress []byte + Nodes []CCIPHomeOCR3Node + OffchainConfig []byte +} + +type CCIPHomeOCR3Node struct { + P2pId [32]byte + SignerKey []byte + TransmitterKey []byte +} + +type CCIPHomeVersionedConfig struct { + Version uint32 + ConfigDigest [32]byte + Config CCIPHomeOCR3Config +} + +var CCIPHomeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"gotConfigDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"callDonId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"capabilityRegistryDonId\",\"type\":\"uint32\"}],\"name\":\"DONIdMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fChain\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"FRoleDON\",\"type\":\"uint256\"}],\"name\":\"FChainTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node\",\"name\":\"node\",\"type\":\"tuple\"}],\"name\":\"InvalidNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"InvalidSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"currentActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"currentCandidateDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedActiveDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"proposedCandidateDigest\",\"type\":\"bytes32\"}],\"name\":\"InvalidStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RMNHomeAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RevokingZeroDigestNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ActiveConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CandidateConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigPromoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"update\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getActiveDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getAllConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"activeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"candidateConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getCandidateDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"versionedConfig\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"ok\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getConfigDigests\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"activeConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumChainConfigurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"digestToPromote\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digestToRevoke\",\"type\":\"bytes32\"}],\"name\":\"promoteCandidateAndRevokeActive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"revokeCandidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"digestToOverwrite\",\"type\":\"bytes32\"}],\"name\":\"setCandidate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"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\"}]", + Bin: "0x60a06040526006805463ffffffff191690553480156200001e57600080fd5b5060405162004f2938038062004f298339810160408190526200004191620001b3565b3380600081620000985760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cb57620000cb8162000108565b5050506001600160a01b038116620000f6576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001e5565b336001600160a01b03821603620001625760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008f565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001c657600080fd5b81516001600160a01b0381168114620001de57600080fd5b9392505050565b608051614d1a6200020f60003960008181610180015281816122360152612cfd0152614d1a6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063b74b235611610081578063f2fde38b11610066578063f2fde38b14610356578063f442c89a14610369578063fba64a7c1461037c57600080fd5b8063b74b235614610323578063bae4e0fa1461034357600080fd5b80638318ed5d116100b25780638318ed5d146102d15780638da5cb5b146102f2578063922ea4061461031057600080fd5b806379ba5097146102c15780637ac0d41e146102c957600080fd5b80633df45a72116101245780635a837f97116101095780635a837f97146102785780635f1edd9c1461028d5780637524051a146102ae57600080fd5b80633df45a721461022f5780634851d5491461025057600080fd5b806301ffc9a714610156578063020330e61461017e578063181f5a77146101c557806333d9704a1461020e575b600080fd5b610169610164366004613157565b61038f565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6102016040518060400160405280601281526020017f43434950486f6d6520312e362e302d646576000000000000000000000000000081525081565b6040516101759190613207565b61022161021c366004613254565b610428565b6040516101759291906134ac565b61024261023d3660046134d0565b610922565b604051610175929190613509565b61026361025e3660046134d0565b611222565b60408051928352602083019190915201610175565b61028b61028636600461352e565b611318565b005b6102a061029b3660046134d0565b61162b565b604051908152602001610175565b61028b6102bc366004613254565b6116a2565b61028b61188d565b6102a061198a565b6102016102df366004613574565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff166101a0565b6102a061031e3660046134d0565b61199b565b610336610331366004613591565b6119ec565b6040516101759190613621565b6102a06103513660046136bf565b611c6d565b61028b61036436600461372f565b611e6b565b61028b6103773660046137aa565b611e7f565b61028b61038a366004613837565b61221e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061042257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610430612fe0565b6000805b60028110156109145763ffffffff86166000908152600560205260408120859187600181111561046657610466613295565b600181111561047757610477613295565b81526020019081526020016000208260028110610496576104966138f4565b60070201600101541480156104aa57508315155b1561090c5763ffffffff86166000908152600560205260408120908660018111156104d7576104d7613295565b60018111156104e8576104e8613295565b81526020019081526020016000208160028110610507576105076138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054939592949386938501929190829060ff168781111561056057610560613295565b600181111561057157610571613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916105c990613923565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590613923565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050815260200160028201805461065b90613923565b80601f016020809104026020016040519081016040528092919081815260200182805461068790613923565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561086257838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461073f90613923565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90613923565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081526020016002820180546107d190613923565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd90613923565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b50505050508152505081526020019060010190610702565b50505050815260200160048201805461087a90613923565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690613923565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505050505081525050815250509150925092505061091a565b600101610434565b50600090505b935093915050565b61092a612fe0565b610932612fe0565b63ffffffff841660009081526005602052604081208185600181111561095a5761095a613295565b600181111561096b5761096b613295565b815260200190815260200160002061098386866124db565b63ffffffff1660028110610999576109996138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff909116908111156109f4576109f4613295565b6001811115610a0557610a05613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610a5d90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990613923565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b50505050508152602001600282018054610aef90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1b90613923565b8015610b685780601f10610b3d57610100808354040283529160200191610b68565b820191906000526020600020905b815481529060010190602001808311610b4b57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015610cf6578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054610bd390613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90613923565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b50505050508152602001600282018054610c6590613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9190613923565b8015610cde5780601f10610cb357610100808354040283529160200191610cde565b820191906000526020600020905b815481529060010190602001808311610cc157829003601f168201915b50505050508152505081526020019060010190610b96565b505050508152602001600482018054610d0e90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3a90613923565b8015610d875780601f10610d5c57610100808354040283529160200191610d87565b820191906000526020600020905b815481529060010190602001808311610d6a57829003601f168201915b50505091909252505050905250602081015190915015610da5578092505b63ffffffff8516600090815260056020526040812081866001811115610dcd57610dcd613295565b6001811115610dde57610dde613295565b8152602001908152602001600020610df68787612532565b63ffffffff1660028110610e0c57610e0c6138f4565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610e6757610e67613295565b6001811115610e7857610e78613295565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610ed090613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90613923565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b50505050508152602001600282018054610f6290613923565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e90613923565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561116957838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461104690613923565b80601f016020809104026020016040519081016040528092919081815260200182805461107290613923565b80156110bf5780601f10611094576101008083540402835291602001916110bf565b820191906000526020600020905b8154815290600101906020018083116110a257829003601f168201915b505050505081526020016002820180546110d890613923565b80601f016020809104026020016040519081016040528092919081815260200182805461110490613923565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b50505050508152505081526020019060010190611009565b50505050815260200160048201805461118190613923565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90613923565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b50505091909252505050905250602081015190915015611218578092505b50505b9250929050565b63ffffffff8216600090815260056020526040812081908184600181111561124c5761124c613295565b600181111561125d5761125d613295565b815260200190815260200160002061127585856124db565b63ffffffff166002811061128b5761128b6138f4565b6007020160010154600560008663ffffffff1663ffffffff16815260200190815260200160002060008560018111156112c6576112c6613295565b60018111156112d7576112d7613295565b81526020019081526020016000206112ef8686612532565b63ffffffff1660028110611305576113056138f4565b6007020160010154915091509250929050565b61132061258d565b8115801561132c575080155b15611363576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061136f8585612532565b63ffffffff86811660009081526005602052604081209290911692508491908660018111156113a0576113a0613295565b60018111156113b1576113b1613295565b815260200190815260200160002082600281106113d0576113d06138f4565b6007020160010154146114845763ffffffff851660009081526005602052604081209085600181111561140557611405613295565b600181111561141657611416613295565b81526020019081526020016000208160028110611435576114356138f4565b6007020160010154836040517f93df584c00000000000000000000000000000000000000000000000000000000815260040161147b929190918252602082015260400190565b60405180910390fd5b63ffffffff85166000908152600560205260408120818660018111156114ac576114ac613295565b60018111156114bd576114bd613295565b81526020019081526020016000206114d587876124db565b63ffffffff16600281106114eb576114eb6138f4565b6007020190508281600101541461153e5760018101546040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810184905260440161147b565b6000600180830182905563ffffffff881682526007602052604082209091878381111561156d5761156d613295565b600181111561157e5761157e613295565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000811663ffffffff918216939093181691909117905582156115f85760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a2505050505050565b63ffffffff821660009081526005602052604081208183600181111561165357611653613295565b600181111561166457611664613295565b815260200190815260200160002061167c84846124db565b63ffffffff1660028110611692576116926138f4565b6007020160010154905092915050565b6116aa61258d565b806116e1576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116ed8484612532565b63ffffffff858116600090815260056020526040812092909116925083919085600181111561171e5761171e613295565b600181111561172f5761172f613295565b8152602001908152602001600020826002811061174e5761174e6138f4565b6007020160010154146117f95763ffffffff841660009081526005602052604081209084600181111561178357611783613295565b600181111561179457611794613295565b815260200190815260200160002081600281106117b3576117b36138f4565b6007020160010154826040517f93df584c00000000000000000000000000000000000000000000000000000000815260040161147b929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a263ffffffff841660009081526005602052604081209084600181111561184c5761184c613295565b600181111561185d5761185d613295565b8152602001908152602001600020816002811061187c5761187c6138f4565b600702016001016000905550505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161147b565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600061199660036125c8565b905090565b63ffffffff82166000908152600560205260408120818360018111156119c3576119c3613295565b60018111156119d4576119d4613295565b815260200190815260200160002061167c8484612532565b606060006119fa60036125c8565b90506000611a0884866139a5565b9050831580611a175750818110155b15611a57576040805160008082526020820190925290611a4d565b611a3a61305c565b815260200190600190039081611a325790505b5092505050610422565b6000611a6385836139eb565b905082811115611a705750815b6000611a7c83836139fe565b67ffffffffffffffff811115611a9457611a946139bc565b604051908082528060200260200182016040528015611acd57816020015b611aba61305c565b815260200190600190039081611ab25790505b5090506000611adc60036125d2565b9050835b83811015611c60576000828281518110611afc57611afc6138f4565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015611b8257602002820191906000526020600020905b815481526020019060010190808311611b6e575b5050509183525050600182015460ff166020820152600282018054604090920191611bac90613923565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd890613923565b8015611c255780601f10611bfa57610100808354040283529160200191611c25565b820191906000526020600020905b815481529060010190602001808311611c0857829003601f168201915b50505091909252505050905284611c3c88856139fe565b81518110611c4c57611c4c6138f4565b602090810291909101015250600101611ae0565b5090979650505050505050565b6000611c7761258d565b611c88611c8384613cb4565b6125e6565b6000611c94868661199b565b9050828114611cd9576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810184905260440161147b565b8015611d0b5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b60068054600091908290611d249063ffffffff16613db0565b91906101000a81548163ffffffff021916908363ffffffff16021790559050611d6e878787604051602001611d5991906140be565b60405160208183030381529060405284612a54565b63ffffffff881660009081526005602052604081209194509081886001811115611d9a57611d9a613295565b6001811115611dab57611dab613295565b8152602001908152602001600020611dc38989612532565b63ffffffff1660028110611dd957611dd96138f4565b600702016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff841617815590508560028201611e2382826145e0565b905050837f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c68388604051611e589291906147a7565b60405180910390a2505050949350505050565b611e73612b50565b611e7c81612bd1565b50565b611e87612b50565b60005b8381101561206d57611ece858583818110611ea757611ea76138f4565b9050602002016020810190611ebc91906147ce565b60039067ffffffffffffffff16612cc6565b611f3857848482818110611ee457611ee46138f4565b9050602002016020810190611ef991906147ce565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161147b565b60026000868684818110611f4e57611f4e6138f4565b9050602002016020810190611f6391906147ce565b67ffffffffffffffff1681526020810191909152604001600090812090611f8a828261309f565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611fc26002830160006130bd565b5050612000858583818110611fd957611fd96138f4565b9050602002016020810190611fee91906147ce565b60039067ffffffffffffffff16612cde565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110612034576120346138f4565b905060200201602081019061204991906147ce565b60405167ffffffffffffffff909116815260200160405180910390a1600101611e8a565b5060005b8181101561221757600083838381811061208d5761208d6138f4565b905060200281019061209f91906147eb565b6120ad906020810190614325565b6120b69061481f565b905060008484848181106120cc576120cc6138f4565b90506020028101906120de91906147eb565b6120ec9060208101906147ce565b90506120fb8260000151612cea565b816020015160ff1660000361213c576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8116600090815260026020908152604090912083518051859361216c9284929101906130f7565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055604082015160028201906121b990826148f1565b506121d391506003905067ffffffffffffffff8316612e36565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051612205929190614a0b565b60405180910390a15050600101612071565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461228d576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061229c6004828688614a2e565b6122a591614a58565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa000000000000000000000000000000000000000000000000000000001480159061233b57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7524051a0000000000000000000000000000000000000000000000000000000014155b801561238957507fffffffff0000000000000000000000000000000000000000000000000000000081167f5a837f970000000000000000000000000000000000000000000000000000000014155b156123e4576040517f12ba286f0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008216600482015260240161147b565b60006123f4602460048789614a2e565b8101906124019190614aa0565b90508263ffffffff168114612452576040517f8a6e4ce800000000000000000000000000000000000000000000000000000000815263ffffffff80831660048301528416602482015260440161147b565b6000803073ffffffffffffffffffffffffffffffffffffffff16888860405161247c929190614ab9565b6000604051808303816000865af19150503d80600081146124b9576040519150601f19603f3d011682016040523d82523d6000602084013e6124be565b606091505b5091509150816124cf573d60208201fd5b50505050505050505050565b63ffffffff821660009081526007602052604081208183600181111561250357612503613295565b600181111561251457612514613295565b815260208101919091526040016000205463ffffffff169392505050565b63ffffffff821660009081526007602052604081208183600181111561255a5761255a613295565b600181111561256b5761256b613295565b815260208101919091526040016000205463ffffffff16600118905092915050565b3330146125c6576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610422825490565b606060006125df83612e42565b9392505050565b806020015167ffffffffffffffff1660000361262e576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561264357612643613295565b14158015612664575060018151600181111561266157612661613295565b14155b1561269b576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60808101515115806126d8575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561270f576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a081015151158061274c5750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b15612783576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161279e9060039067ffffffffffffffff16612cc6565b6127e65760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161147b565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612859576040517f2db22040000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161147b565b60c08301515161010081111561289b576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a68360036139a5565b81116128de576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff8111156128fa576128fa6139bc565b604051908082528060200260200182016040528015612923578160200160208202803683370190505b50905060005b838110156129e35760008760c001518281518110612949576129496138f4565b6020026020010151905080604001515160001461296e578361296a81614ac9565b9450505b602081015151158061297f57508051155b156129b857806040517f9fa4031400000000000000000000000000000000000000000000000000000000815260040161147b9190614b01565b80600001518383815181106129cf576129cf6138f4565b602090810291909101015250600101612929565b5060006129f18560036139a5565b6129fc9060016139eb565b905080831015612a42576040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161147b565b612a4b82612cea565b50505050505050565b6040516000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90612ab2907f45564d000000000000000000000000000000000000000000000000000000000090469030908a908a908990602001614b14565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612aef918690602001614b6d565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0a0000000000000000000000000000000000000000000000000000000000001795945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161147b565b3373ffffffffffffffffffffffffffffffffffffffff821603612c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161147b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205415156125df565b60006125df8383612e9e565b60005b8151811015612e325760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe848481518110612d4957612d496138f4565b60200260200101516040518263ffffffff1660e01b8152600401612d6f91815260200190565b600060405180830381865afa158015612d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612dd29190810190614c06565b6080015103612e2a57818181518110612ded57612ded6138f4565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161147b91815260200190565b600101612ced565b5050565b60006125df8383612f91565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e9257602002820191906000526020600020905b815481526020019060010190808311612e7e575b50505050509050919050565b60008181526001830160205260408120548015612f87576000612ec26001836139fe565b8554909150600090612ed6906001906139fe565b9050808214612f3b576000866000018281548110612ef657612ef66138f4565b9060005260206000200154905080876000018481548110612f1957612f196138f4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612f4c57612f4c614cde565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610422565b6000915050610422565b6000818152600183016020526040812054612fd857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610422565b506000610422565b60408051606081018252600080825260208201529081016130576040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b905290565b6040518060400160405280600067ffffffffffffffff168152602001613057604051806060016040528060608152602001600060ff168152602001606081525090565b5080546000825590600052602060002090810190611e7c9190613142565b5080546130c990613923565b6000825580601f106130d9575050565b601f016020900490600052602060002090810190611e7c9190613142565b828054828255906000526020600020908101928215613132579160200282015b82811115613132578251825591602001919060010190613117565b5061313e929150613142565b5090565b5b8082111561313e5760008155600101613143565b60006020828403121561316957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146125df57600080fd5b60005b838110156131b457818101518382015260200161319c565b50506000910152565b600081518084526131d5816020860160208601613199565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006125df60208301846131bd565b63ffffffff81168114611e7c57600080fd5b80356132378161321a565b919050565b60028110611e7c57600080fd5b80356132378161323c565b60008060006060848603121561326957600080fd5b83356132748161321a565b925060208401356132848161323c565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106132fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b80518252600060208201516060602085015261331e60608501826131bd565b90506040830151848203604086015261333782826131bd565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611c60577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189526133998383516132ff565b9884019892509083019060010161335f565b63ffffffff81511682526020810151602083015260006040820151606060408501526133db6060850182516132c4565b602081015167ffffffffffffffff8116608086015250604081015160ff811660a086015250606081015167ffffffffffffffff811660c08601525060808101516101008060e08701526134326101608701836131bd565b915060a08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080888503018389015261346d84836131bd565b935060c08501519250808885030161012089015261348b8484613340565b935060e08501519450808885030161014089015250505061333781836131bd565b6040815260006134bf60408301856133ab565b905082151560208301529392505050565b600080604083850312156134e357600080fd5b82356134ee8161321a565b915060208301356134fe8161323c565b809150509250929050565b60408152600061351c60408301856133ab565b828103602084015261333781856133ab565b6000806000806080858703121561354457600080fd5b843561354f8161321a565b9350602085013561355f8161323c565b93969395505050506040820135916060013590565b60006020828403121561358657600080fd5b81356125df8161321a565b600080604083850312156135a457600080fd5b50508035926020909101359150565b805160608084528151908401819052600091602091908201906080860190845b818110156135ef578351835292840192918401916001016135d3565b505060ff602086015116602087015260408501519250858103604087015261361781846131bd565b9695505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156136b1578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff16845287015187840187905261369e878501826135b3565b958801959350509086019060010161364a565b509098975050505050505050565b600080600080608085870312156136d557600080fd5b84356136e08161321a565b935060208501356136f08161323c565b9250604085013567ffffffffffffffff81111561370c57600080fd5b8501610100818803121561371f57600080fd5b9396929550929360600135925050565b60006020828403121561374157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146125df57600080fd5b60008083601f84011261377757600080fd5b50813567ffffffffffffffff81111561378f57600080fd5b6020830191508360208260051b850101111561121b57600080fd5b600080600080604085870312156137c057600080fd5b843567ffffffffffffffff808211156137d857600080fd5b6137e488838901613765565b909650945060208701359150808211156137fd57600080fd5b5061380a87828801613765565b95989497509550505050565b67ffffffffffffffff81168114611e7c57600080fd5b803561323781613816565b6000806000806000806080878903121561385057600080fd5b863567ffffffffffffffff8082111561386857600080fd5b6138748a838b01613765565b9098509650602089013591508082111561388d57600080fd5b818901915089601f8301126138a157600080fd5b8135818111156138b057600080fd5b8a60208285010111156138c257600080fd5b6020830196508095505050506138da6040880161382c565b91506138e86060880161322c565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061393757607f821691505b602082108103613970577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761042257610422613976565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8082018082111561042257610422613976565b8181038181111561042257610422613976565b6040516060810167ffffffffffffffff81118282101715613a3457613a346139bc565b60405290565b604051610100810167ffffffffffffffff81118282101715613a3457613a346139bc565b60405160e0810167ffffffffffffffff81118282101715613a3457613a346139bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ac857613ac86139bc565b604052919050565b60ff81168114611e7c57600080fd5b803561323781613ad0565b600082601f830112613afb57600080fd5b813567ffffffffffffffff811115613b1557613b156139bc565b613b4660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a81565b818152846020838601011115613b5b57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115613b9257613b926139bc565b5060051b60200190565b600082601f830112613bad57600080fd5b81356020613bc2613bbd83613b78565b613a81565b82815260059290921b84018101918181019086841115613be157600080fd5b8286015b84811015613ca957803567ffffffffffffffff80821115613c065760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215613c3f5760008081fd5b613c47613a11565b87840135815260408085013584811115613c615760008081fd5b613c6f8e8b83890101613aea565b838b015250918401359183831115613c875760008081fd5b613c958d8a85880101613aea565b908201528652505050918301918301613be5565b509695505050505050565b60006101008236031215613cc757600080fd5b613ccf613a3a565b613cd883613249565b8152613ce66020840161382c565b6020820152613cf760408401613adf565b6040820152613d086060840161382c565b6060820152608083013567ffffffffffffffff80821115613d2857600080fd5b613d3436838701613aea565b608084015260a0850135915080821115613d4d57600080fd5b613d5936838701613aea565b60a084015260c0850135915080821115613d7257600080fd5b613d7e36838701613b9c565b60c084015260e0850135915080821115613d9757600080fd5b50613da436828601613aea565b60e08301525092915050565b600063ffffffff808316818103613dc957613dc9613976565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e0857600080fd5b830160208101925035905067ffffffffffffffff811115613e2857600080fd5b80360382131561121b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613eb557600080fd5b830160208101925035905067ffffffffffffffff811115613ed557600080fd5b8060051b360382131561121b57600080fd5b60008383855260208086019550808560051b830101846000805b88811015613fc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868503018a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1893603018112613f61578283fd5b8801803585526060613f7587830183613dd3565b8289890152613f878389018284613e37565b925050506040613f9981840184613dd3565b935087830382890152613fad838583613e37565b9d89019d97505050938601935050600101613f01565b509198975050505050505050565b6000610100613fe884613fe385613249565b6132c4565b613ff46020840161382c565b67ffffffffffffffff16602085015261400f60408401613adf565b60ff1660408501526140236060840161382c565b67ffffffffffffffff16606085015261403f6080840184613dd3565b8260808701526140528387018284613e37565b9250505061406360a0840184613dd3565b85830360a0870152614076838284613e37565b9250505061408760c0840184613e80565b85830360c087015261409a838284613ee7565b925050506140ab60e0840184613dd3565b85830360e0870152613617838284613e37565b6020815260006125df6020830184613fd1565b6000813561042281613816565b6000813561042281613ad0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412057600080fd5b83018035915067ffffffffffffffff82111561413b57600080fd5b60200191503681900382131561121b57600080fd5b5b81811015612e325760008155600101614151565b601f82111561419e57806000526020600020601f840160051c8101602085101561418c5750805b612217601f850160051c830182614150565b505050565b67ffffffffffffffff8311156141bb576141bb6139bc565b6141cf836141c98354613923565b83614165565b6000601f84116001811461422157600085156141eb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612217565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142705786850135825560209485019460019092019101614250565b50868210156142ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142f257600080fd5b83018035915067ffffffffffffffff82111561430d57600080fd5b6020019150600581901b360382131561121b57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261435957600080fd5b9190910192915050565b61436d8154613923565b8015612e3257601f81116001811461438757505060009055565b8260005260206000206143a5601f840160051c820160018301614150565b60008085559055505050565b81358155600180820160206143c960208601866140eb565b67ffffffffffffffff8111156143e1576143e16139bc565b6143f5816143ef8654613923565b86614165565b6000601f82116001811461444757600083156144115750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1786556144da565b6000868152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690835b828110156144935786850135825593870193908901908701614476565b50848210156144ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19848701351681555b505060018360011b0186555b505050505050506144ee60408301836140eb565b6144fc8183600286016141a3565b50505050565b6801000000000000000083111561451b5761451b6139bc565b80548382558084101561459a5760038160030260038104831461454057614540613976565b8560030260038104871461455657614556613976565b6000858152602081209283019291909101905b828210156145955780825561458060018301614363565b61458c60028301614363565b90830190614569565b505050505b5060008181526020812083915b858110156145d8576145c26145bc8487614325565b836143b1565b60209290920191600391909101906001016145a7565b505050505050565b81356145eb8161323c565b60028110614622577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541660ff821681178355505061469961465f602084016140d1565b82547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178255565b6146e36146a8604084016140de565b82547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178255565b6147356146f2606084016140d1565b82547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178255565b61474260808301836140eb565b6147508183600186016141a3565b505061475f60a08301836140eb565b61476d8183600286016141a3565b505061477c60c08301836142bd565b61478a818360038601614502565b505061479960e08301836140eb565b6144fc8183600486016141a3565b63ffffffff831681526040602082015260006147c66040830184613fd1565b949350505050565b6000602082840312156147e057600080fd5b81356125df81613816565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261435957600080fd5b60006060823603121561483157600080fd5b614839613a11565b823567ffffffffffffffff8082111561485157600080fd5b9084019036601f83011261486457600080fd5b81356020614874613bbd83613b78565b82815260059290921b8401810191818101903684111561489357600080fd5b948201945b838610156148b157853582529482019490820190614898565b8652506148bf878201613adf565b908501525060408501359150808211156148d857600080fd5b506148e536828601613aea565b60408301525092915050565b815167ffffffffffffffff81111561490b5761490b6139bc565b61491f816149198454613923565b84614165565b602080601f831160018114614972576000841561493c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145d8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156149bf578886015182559484019460019091019084016149a0565b50858210156149fb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831681526040602082015260006147c660408301846135b3565b60008085851115614a3e57600080fd5b83861115614a4b57600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614a985780818660040360031b1b83161692505b505092915050565b600060208284031215614ab257600080fd5b5035919050565b8183823760009101908152919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614afa57614afa613976565b5060010190565b6020815260006125df60208301846132ff565b8681526020810186905273ffffffffffffffffffffffffffffffffffffffff8516604082015263ffffffff848116606083015260c0820190614b5960808401866132c4565b80841660a084015250979650505050505050565b60008351614b7f818460208801613199565b835190830190614b93818360208801613199565b01949350505050565b80516132378161321a565b600082601f830112614bb857600080fd5b81516020614bc8613bbd83613b78565b8083825260208201915060208460051b870101935086841115614bea57600080fd5b602086015b84811015613ca95780518352918301918301614bef565b600060208284031215614c1857600080fd5b815167ffffffffffffffff80821115614c3057600080fd5b9083019060e08286031215614c4457600080fd5b614c4c613a5e565b614c5583614b9c565b8152614c6360208401614b9c565b6020820152614c7460408401614b9c565b6040820152606083015160608201526080830151608082015260a083015182811115614c9f57600080fd5b614cab87828601614ba7565b60a08301525060c083015182811115614cc357600080fd5b614ccf87828601614ba7565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", +} + +var CCIPHomeABI = CCIPHomeMetaData.ABI + +var CCIPHomeBin = CCIPHomeMetaData.Bin + +func DeployCCIPHome(auth *bind.TransactOpts, backend bind.ContractBackend, capabilitiesRegistry common.Address) (common.Address, *types.Transaction, *CCIPHome, error) { + parsed, err := CCIPHomeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPHomeBin), backend, capabilitiesRegistry) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPHome{address: address, abi: *parsed, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil +} + +type CCIPHome struct { + address common.Address + abi abi.ABI + CCIPHomeCaller + CCIPHomeTransactor + CCIPHomeFilterer +} + +type CCIPHomeCaller struct { + contract *bind.BoundContract +} + +type CCIPHomeTransactor struct { + contract *bind.BoundContract +} + +type CCIPHomeFilterer struct { + contract *bind.BoundContract +} + +type CCIPHomeSession struct { + Contract *CCIPHome + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPHomeCallerSession struct { + Contract *CCIPHomeCaller + CallOpts bind.CallOpts +} + +type CCIPHomeTransactorSession struct { + Contract *CCIPHomeTransactor + TransactOpts bind.TransactOpts +} + +type CCIPHomeRaw struct { + Contract *CCIPHome +} + +type CCIPHomeCallerRaw struct { + Contract *CCIPHomeCaller +} + +type CCIPHomeTransactorRaw struct { + Contract *CCIPHomeTransactor +} + +func NewCCIPHome(address common.Address, backend bind.ContractBackend) (*CCIPHome, error) { + abi, err := abi.JSON(strings.NewReader(CCIPHomeABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPHome(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPHome{address: address, abi: abi, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil +} + +func NewCCIPHomeCaller(address common.Address, caller bind.ContractCaller) (*CCIPHomeCaller, error) { + contract, err := bindCCIPHome(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPHomeCaller{contract: contract}, nil +} + +func NewCCIPHomeTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPHomeTransactor, error) { + contract, err := bindCCIPHome(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPHomeTransactor{contract: contract}, nil +} + +func NewCCIPHomeFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPHomeFilterer, error) { + contract, err := bindCCIPHome(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPHomeFilterer{contract: contract}, nil +} + +func bindCCIPHome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPHomeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPHome *CCIPHomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPHome.Contract.CCIPHomeCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPHome *CCIPHomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transfer(opts) +} + +func (_CCIPHome *CCIPHomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPHome *CCIPHomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPHome.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPHome *CCIPHomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.Contract.contract.Transfer(opts) +} + +func (_CCIPHome *CCIPHomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPHome.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPHome *CCIPHomeCaller) GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getActiveDigest", donId, pluginType) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getAllChainConfigs", pageIndex, pageSize) + + if err != nil { + return *new([]CCIPHomeChainConfigArgs), err + } + + out0 := *abi.ConvertType(out[0], new([]CCIPHomeChainConfigArgs)).(*[]CCIPHomeChainConfigArgs) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize) +} + +func (_CCIPHome *CCIPHomeCaller) GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getAllConfigs", donId, pluginType) + + outstruct := new(GetAllConfigs) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + outstruct.CandidateConfig = *abi.ConvertType(out[1], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCandidateDigest", donId, pluginType) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCapabilityConfiguration", arg0) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { + return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { + return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0) +} + +func (_CCIPHome *CCIPHomeCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCapabilityRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCapabilityRegistry() (common.Address, error) { + return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityRegistry() (common.Address, error) { + return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getConfig", donId, pluginType, configDigest) + + outstruct := new(GetConfig) + if err != nil { + return *outstruct, err + } + + outstruct.VersionedConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + outstruct.Ok = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeCaller) GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getConfigDigests", donId, pluginType) + + outstruct := new(GetConfigDigests) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.CandidateConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getNumChainConfigurations") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetNumChainConfigurations() (*big.Int, error) { + return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetNumChainConfigurations() (*big.Int, error) { + return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) Owner() (common.Address, error) { + return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) Owner() (common.Address, error) { + return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId) +} + +func (_CCIPHome *CCIPHomeCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId) +} + +func (_CCIPHome *CCIPHomeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) TypeAndVersion() (string, error) { + return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) TypeAndVersion() (string, error) { + return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPHome *CCIPHomeSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts) +} + +func (_CCIPHome *CCIPHomeTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts) +} + +func (_CCIPHome *CCIPHomeTransactor) ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "applyChainConfigUpdates", chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeTransactorSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeTransactor) BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "beforeCapabilityConfigSet", arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeTransactorSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeTransactor) PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "promoteCandidateAndRevokeActive", donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeTransactorSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeTransactor) RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "revokeCandidate", donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeTransactorSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeTransactor) SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "setCandidate", donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeTransactorSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPHome *CCIPHomeSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to) +} + +func (_CCIPHome *CCIPHomeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to) +} + +type CCIPHomeActiveConfigRevokedIterator struct { + Event *CCIPHomeActiveConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeActiveConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeActiveConfigRevokedIterator{contract: _CCIPHome.contract, event: "ActiveConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeActiveConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error) { + event := new(CCIPHomeActiveConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeCandidateConfigRevokedIterator struct { + Event *CCIPHomeCandidateConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeCandidateConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeCandidateConfigRevokedIterator{contract: _CCIPHome.contract, event: "CandidateConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeCandidateConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error) { + event := new(CCIPHomeCandidateConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeCapabilityConfigurationSetIterator struct { + Event *CCIPHomeCapabilityConfigurationSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCapabilityConfigurationSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCapabilityConfigurationSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeCapabilityConfigurationSet struct { + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CapabilityConfigurationSet") + if err != nil { + return nil, err + } + return &CCIPHomeCapabilityConfigurationSetIterator{contract: _CCIPHome.contract, event: "CapabilityConfigurationSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CapabilityConfigurationSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeCapabilityConfigurationSet) + if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error) { + event := new(CCIPHomeCapabilityConfigurationSet) + if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeChainConfigRemovedIterator struct { + Event *CCIPHomeChainConfigRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeChainConfigRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeChainConfigRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeChainConfigRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeChainConfigRemoved struct { + ChainSelector uint64 + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigRemoved") + if err != nil { + return nil, err + } + return &CCIPHomeChainConfigRemovedIterator{contract: _CCIPHome.contract, event: "ChainConfigRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeChainConfigRemoved) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error) { + event := new(CCIPHomeChainConfigRemoved) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeChainConfigSetIterator struct { + Event *CCIPHomeChainConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeChainConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeChainConfigSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeChainConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeChainConfigSet struct { + ChainSelector uint64 + ChainConfig CCIPHomeChainConfig + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigSet") + if err != nil { + return nil, err + } + return &CCIPHomeChainConfigSetIterator{contract: _CCIPHome.contract, event: "ChainConfigSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeChainConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error) { + event := new(CCIPHomeChainConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeConfigPromotedIterator struct { + Event *CCIPHomeConfigPromoted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeConfigPromotedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeConfigPromotedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeConfigPromotedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeConfigPromoted struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeConfigPromotedIterator{contract: _CCIPHome.contract, event: "ConfigPromoted", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeConfigPromoted) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error) { + event := new(CCIPHomeConfigPromoted) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeConfigSetIterator struct { + Event *CCIPHomeConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeConfigSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeConfigSet struct { + ConfigDigest [32]byte + Version uint32 + Config CCIPHomeOCR3Config + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeConfigSetIterator{contract: _CCIPHome.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error) { + event := new(CCIPHomeConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeOwnershipTransferRequestedIterator struct { + Event *CCIPHomeOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPHomeOwnershipTransferRequestedIterator{contract: _CCIPHome.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeOwnershipTransferRequested) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error) { + event := new(CCIPHomeOwnershipTransferRequested) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeOwnershipTransferredIterator struct { + Event *CCIPHomeOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPHomeOwnershipTransferredIterator{contract: _CCIPHome.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeOwnershipTransferred) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error) { + event := new(CCIPHomeOwnershipTransferred) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllConfigs struct { + ActiveConfig CCIPHomeVersionedConfig + CandidateConfig CCIPHomeVersionedConfig +} +type GetConfig struct { + VersionedConfig CCIPHomeVersionedConfig + Ok bool +} +type GetConfigDigests struct { + ActiveConfigDigest [32]byte + CandidateConfigDigest [32]byte +} + +func (_CCIPHome *CCIPHome) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPHome.abi.Events["ActiveConfigRevoked"].ID: + return _CCIPHome.ParseActiveConfigRevoked(log) + case _CCIPHome.abi.Events["CandidateConfigRevoked"].ID: + return _CCIPHome.ParseCandidateConfigRevoked(log) + case _CCIPHome.abi.Events["CapabilityConfigurationSet"].ID: + return _CCIPHome.ParseCapabilityConfigurationSet(log) + case _CCIPHome.abi.Events["ChainConfigRemoved"].ID: + return _CCIPHome.ParseChainConfigRemoved(log) + case _CCIPHome.abi.Events["ChainConfigSet"].ID: + return _CCIPHome.ParseChainConfigSet(log) + case _CCIPHome.abi.Events["ConfigPromoted"].ID: + return _CCIPHome.ParseConfigPromoted(log) + case _CCIPHome.abi.Events["ConfigSet"].ID: + return _CCIPHome.ParseConfigSet(log) + case _CCIPHome.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPHome.ParseOwnershipTransferRequested(log) + case _CCIPHome.abi.Events["OwnershipTransferred"].ID: + return _CCIPHome.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPHomeActiveConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8") +} + +func (CCIPHomeCandidateConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b") +} + +func (CCIPHomeCapabilityConfigurationSet) Topic() common.Hash { + return common.HexToHash("0x84ad7751b744c9e2ee77da1d902b428aec7f0a343d67a24bbe2142e6f58a8d0f") +} + +func (CCIPHomeChainConfigRemoved) Topic() common.Hash { + return common.HexToHash("0x2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0") +} + +func (CCIPHomeChainConfigSet) Topic() common.Hash { + return common.HexToHash("0x05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0") +} + +func (CCIPHomeConfigPromoted) Topic() common.Hash { + return common.HexToHash("0xfc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e") +} + +func (CCIPHomeConfigSet) Topic() common.Hash { + return common.HexToHash("0x94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c6") +} + +func (CCIPHomeOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPHomeOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPHome *CCIPHome) Address() common.Address { + return _CCIPHome.address +} + +type CCIPHomeInterface interface { + GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) + + GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) + + GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs, + + error) + + GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) + + GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) + + GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) + + GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) + + GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests, + + error) + + GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) + + BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) + + PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) + + RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) + + SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error) + + WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error) + + FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error) + + WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error) + + FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error) + + WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error) + + ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error) + + FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error) + + WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error) + + ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error) + + FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error) + + WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error) + + ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error) + + FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error) + + WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error) + + FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go index 562287eaf62..113f0635e97 100644 --- a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go +++ b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go @@ -43,7 +43,16 @@ type InternalEVM2AnyRampMessage struct { ExtraArgs []byte FeeToken common.Address FeeTokenAmount *big.Int - TokenAmounts []InternalRampTokenAmount + FeeValueJuels *big.Int + TokenAmounts []InternalEVM2AnyTokenTransfer +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte } type InternalGasPriceUpdate struct { @@ -53,10 +62,10 @@ type InternalGasPriceUpdate struct { type InternalMerkleRoot struct { SourceChainSelector uint64 + OnRampAddress []byte MinSeqNr uint64 MaxSeqNr uint64 MerkleRoot [32]byte - OnRampAddress []byte } type InternalPriceUpdates struct { @@ -72,14 +81,6 @@ type InternalRampMessageHeader struct { Nonce uint64 } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte - DestTokenAddress []byte - ExtraData []byte - Amount *big.Int - DestExecData []byte -} - type InternalTokenPriceUpdate struct { SourceToken common.Address UsdPerToken *big.Int @@ -89,6 +90,7 @@ type OffRampCommitReport struct { PriceUpdates InternalPriceUpdates MerkleRoots []InternalMerkleRoot RmnSignatures []IRMNV2Signature + RmnRawVs *big.Int } type OffRampSourceChainConfig struct { @@ -99,8 +101,8 @@ type OffRampSourceChainConfig struct { } var CCIPReaderTesterMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"emitCCIPMessageSent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"emitCommitReportAccepted\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"emitExecutionStateChanged\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"getInboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"setDestChainSeqNr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"testNonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"setInboundNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceChainConfig\",\"type\":\"tuple\"}],\"name\":\"setSourceChainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50611952806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a4b0d27c11610076578063c92236251161005b578063c92236251461017c578063e83eabba1461018f578063e9d68a8e146101a257600080fd5b8063a4b0d27c14610114578063c1a5a3551461012757600080fd5b806344f38be5146100a85780634cf66e36146100bd5780639041be3d146100d057806393df286714610101575b600080fd5b6100bb6100b6366004610a52565b6101c2565b005b6100bb6100cb366004610bdd565b6101fc565b6100e36100de366004610c5c565b610253565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6100bb61010f366004610cc7565b610283565b6100bb610122366004610eec565b6102fe565b6100bb61013536600461101b565b67ffffffffffffffff918216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691909216179055565b6100e361018a36600461104e565b610344565b6100bb61019d3660046110a1565b610390565b6101b56101b0366004610c5c565b61047a565b6040516100f891906111c1565b7fd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e1816040516101f1919061138a565b60405180910390a150565b828467ffffffffffffffff168667ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516102449291906114ba565b60405180910390a45050505050565b67ffffffffffffffff8082166000908152600160208190526040822054919261027d92169061150a565b92915050565b67ffffffffffffffff84166000908152600260205260409081902090518491906102b09085908590611559565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550505050565b8167ffffffffffffffff167ff6e86ef8896c7a0d629406168f396e883280680c99e649b9e2d36466fbc9f9e5826040516103389190611639565b60405180910390a25050565b67ffffffffffffffff8316600090815260026020526040808220905161036d9085908590611559565b9081526040519081900360200190205467ffffffffffffffff1690509392505050565b67ffffffffffffffff808316600090815260208181526040918290208451815492860151938601519094167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff93151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090931673ffffffffffffffffffffffffffffffffffffffff90951694909417919091179190911691909117815560608201518291906001820190610473908261182b565b5050505050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff87811684528383529286902086519485018752805473ffffffffffffffffffffffffffffffffffffffff8116865274010000000000000000000000000000000000000000810460ff16151593860193909352750100000000000000000000000000000000000000000090920490921694830194909452600184018054939492939184019161053690611787565b80601f016020809104026020016040519081016040528092919081815260200182805461056290611787565b80156105af5780601f10610584576101008083540402835291602001916105af565b820191906000526020600020905b81548152906001019060200180831161059257829003601f168201915b5050505050815250509050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610611576106116105bf565b60405290565b60405160a0810167ffffffffffffffff81118282101715610611576106116105bf565b6040516060810167ffffffffffffffff81118282101715610611576106116105bf565b604051610100810167ffffffffffffffff81118282101715610611576106116105bf565b6040516080810167ffffffffffffffff81118282101715610611576106116105bf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156106eb576106eb6105bf565b604052919050565b600067ffffffffffffffff82111561070d5761070d6105bf565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461073957600080fd5b50565b803561074781610717565b919050565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461074757600080fd5b803567ffffffffffffffff8116811461074757600080fd5b600082601f8301126107a157600080fd5b813560206107b66107b1836106f3565b6106a4565b82815260069290921b840181019181810190868411156107d557600080fd5b8286015b8481101561082257604081890312156107f25760008081fd5b6107fa6105ee565b61080382610778565b815261081085830161074c565b818601528352918301916040016107d9565b509695505050505050565b600082601f83011261083e57600080fd5b813567ffffffffffffffff811115610858576108586105bf565b61088960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016106a4565b81815284602083860101111561089e57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126108cc57600080fd5b813560206108dc6107b1836106f3565b82815260059290921b840181019181810190868411156108fb57600080fd5b8286015b8481101561082257803567ffffffffffffffff808211156109205760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156109595760008081fd5b610961610617565b61096c888501610778565b8152604061097b818601610778565b89830152606061098c818701610778565b8284015260809150818601358184015250828501359250838311156109b15760008081fd5b6109bf8d8a8588010161082d565b9082015286525050509183019183016108ff565b600082601f8301126109e457600080fd5b813560206109f46107b1836106f3565b82815260069290921b84018101918181019086841115610a1357600080fd5b8286015b848110156108225760408189031215610a305760008081fd5b610a386105ee565b813581528482013585820152835291830191604001610a17565b60006020808385031215610a6557600080fd5b823567ffffffffffffffff80821115610a7d57600080fd5b9084019060608287031215610a9157600080fd5b610a9961063a565b823582811115610aa857600080fd5b83016040818903811315610abb57600080fd5b610ac36105ee565b823585811115610ad257600080fd5b8301601f81018b13610ae357600080fd5b8035610af16107b1826106f3565b81815260069190911b8201890190898101908d831115610b1057600080fd5b928a01925b82841015610b605785848f031215610b2d5760008081fd5b610b356105ee565b8435610b4081610717565b8152610b4d858d0161074c565b818d0152825292850192908a0190610b15565b845250505082870135915084821115610b7857600080fd5b610b848a838501610790565b81880152835250508284013582811115610b9d57600080fd5b610ba9888286016108bb565b85830152506040830135935081841115610bc257600080fd5b610bce878585016109d3565b60408201529695505050505050565b600080600080600060a08688031215610bf557600080fd5b610bfe86610778565b9450610c0c60208701610778565b935060408601359250606086013560048110610c2757600080fd5b9150608086013567ffffffffffffffff811115610c4357600080fd5b610c4f8882890161082d565b9150509295509295909350565b600060208284031215610c6e57600080fd5b610c7782610778565b9392505050565b60008083601f840112610c9057600080fd5b50813567ffffffffffffffff811115610ca857600080fd5b602083019150836020828501011115610cc057600080fd5b9250929050565b60008060008060608587031215610cdd57600080fd5b610ce685610778565b9350610cf460208601610778565b9250604085013567ffffffffffffffff811115610d1057600080fd5b610d1c87828801610c7e565b95989497509550505050565b600060a08284031215610d3a57600080fd5b610d42610617565b905081358152610d5460208301610778565b6020820152610d6560408301610778565b6040820152610d7660608301610778565b6060820152610d8760808301610778565b608082015292915050565b600082601f830112610da357600080fd5b81356020610db36107b1836106f3565b82815260059290921b84018101918181019086841115610dd257600080fd5b8286015b8481101561082257803567ffffffffffffffff80821115610df75760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610e305760008081fd5b610e38610617565b8784013583811115610e4a5760008081fd5b610e588d8a8388010161082d565b82525060408085013584811115610e6f5760008081fd5b610e7d8e8b8389010161082d565b8a8401525060608086013585811115610e965760008081fd5b610ea48f8c838a010161082d565b83850152506080915081860135818401525082850135925083831115610eca5760008081fd5b610ed88d8a8588010161082d565b908201528652505050918301918301610dd6565b60008060408385031215610eff57600080fd5b610f0883610778565b9150602083013567ffffffffffffffff80821115610f2557600080fd5b908401906101808287031215610f3a57600080fd5b610f4261065d565b610f4c8784610d28565b8152610f5a60a0840161073c565b602082015260c083013582811115610f7157600080fd5b610f7d8882860161082d565b60408301525060e083013582811115610f9557600080fd5b610fa18882860161082d565b60608301525061010083013582811115610fba57600080fd5b610fc68882860161082d565b608083015250610fd9610120840161073c565b60a082015261014083013560c082015261016083013582811115610ffc57600080fd5b61100888828601610d92565b60e0830152508093505050509250929050565b6000806040838503121561102e57600080fd5b61103783610778565b915061104560208401610778565b90509250929050565b60008060006040848603121561106357600080fd5b61106c84610778565b9250602084013567ffffffffffffffff81111561108857600080fd5b61109486828701610c7e565b9497909650939450505050565b600080604083850312156110b457600080fd5b6110bd83610778565b9150602083013567ffffffffffffffff808211156110da57600080fd5b90840190608082870312156110ee57600080fd5b6110f6610681565b823561110181610717565b81526020830135801515811461111657600080fd5b602082015261112760408401610778565b604082015260608301358281111561113e57600080fd5b61114a8882860161082d565b6060830152508093505050509250929050565b6000815180845260005b8181101561118357602081850181015186830182015201611167565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260208201511515604082015267ffffffffffffffff60408301511660608201526000606083015160808084015261121c60a084018261115d565b949350505050565b60008151808452602080850194506020840160005b83811015611288578151805167ffffffffffffffff1688528301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101611239565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015611341578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805167ffffffffffffffff908116855285820151811686860152604080830151909116908501526060808201519085015260809081015160a09185018290529061132d8186018361115d565b9a86019a94505050908301906001016112b0565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015611288578151805188528301518388015260409096019590820190600101611363565b602080825282516060838301528051604060808501819052815160c086018190526000949392840191859160e08801905b80841015611418578451805173ffffffffffffffffffffffffffffffffffffffff1683528701517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16878301529386019360019390930192908201906113bb565b50938501518785037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800160a0890152936114528186611224565b9450505050508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808583030160408601526114938284611293565b92506040860151915080858403016060860152506114b1828261134e565b95945050505050565b6000600484106114f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8382526040602083015261121c604083018461115d565b67ffffffffffffffff818116838216019080821115611552577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b8183823760009101908152919050565b600082825180855260208086019550808260051b84010181860160005b84811015611341577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a081518186526115ca8287018261115d565b91505085820151858203878701526115e2828261115d565b915050604080830151868303828801526115fc838261115d565b92505050606080830151818701525060808083015192508582038187015250611625818361115d565b9a86019a9450505090830190600101611586565b6020815261168a60208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b600060208301516116b360c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e08501526116d06101a085018361115d565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030161010087015261170d848361115d565b935060808701519150808685030161012087015261172b848361115d565b935060a0870151915061175761014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e087015191508086850301838701525061177d8382611569565b9695505050505050565b600181811c9082168061179b57607f821691505b6020821081036117d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115611826576000816000526020600020601f850160051c810160208610156118035750805b601f850160051c820191505b818110156118225782815560010161180f565b5050505b505050565b815167ffffffffffffffff811115611845576118456105bf565b611859816118538454611787565b846117da565b602080601f8311600181146118ac57600084156118765750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611822565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156118f9578886015182559484019460019091019084016118da565b508582101561193557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"emitCCIPMessageSent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"emitCommitReportAccepted\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"emitExecutionStateChanged\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"getInboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"setDestChainSeqNr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"testNonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"setInboundNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceChainConfig\",\"type\":\"tuple\"}],\"name\":\"setSourceChainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5061188a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c806393df286711610076578063c92236251161005b578063c92236251461017c578063e83eabba1461018f578063e9d68a8e146101a257600080fd5b806393df286714610114578063c1a5a3551461012757600080fd5b8063198b821c146100a85780634bf78697146100bd5780634cf66e36146100d05780639041be3d146100e3575b600080fd5b6100bb6100b6366004610a34565b6101c2565b005b6100bb6100cb366004610d7a565b610204565b6100bb6100de366004610eb5565b61024a565b6100f66100f1366004610f34565b6102a1565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6100bb610122366004610f9f565b6102d1565b6100bb610135366004611000565b67ffffffffffffffff918216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691909216179055565b6100f661018a366004611033565b61034c565b6100bb61019d366004611086565b610398565b6101b56101b0366004610f34565b610482565b60405161010b91906111a6565b602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4926101f99290916112fd565b60405180910390a150565b8167ffffffffffffffff167f8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed8260405161023e91906114b8565b60405180910390a25050565b828467ffffffffffffffff168667ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df28585604051610292929190611610565b60405180910390a45050505050565b67ffffffffffffffff808216600090815260016020819052604082205491926102cb921690611660565b92915050565b67ffffffffffffffff84166000908152600260205260409081902090518491906102fe90859085906116af565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550505050565b67ffffffffffffffff8316600090815260026020526040808220905161037590859085906116af565b9081526040519081900360200190205467ffffffffffffffff1690509392505050565b67ffffffffffffffff808316600090815260208181526040918290208451815492860151938601519094167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff93151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090931673ffffffffffffffffffffffffffffffffffffffff9095169490941791909117919091169190911781556060820151829190600182019061047b9082611763565b5050505050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff87811684528383529286902086519485018752805473ffffffffffffffffffffffffffffffffffffffff8116865274010000000000000000000000000000000000000000810460ff16151593860193909352750100000000000000000000000000000000000000000090920490921694830194909452600184018054939492939184019161053e906116bf565b80601f016020809104026020016040519081016040528092919081815260200182805461056a906116bf565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b5050505050815250509050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610619576106196105c7565b60405290565b60405160a0810167ffffffffffffffff81118282101715610619576106196105c7565b6040516080810167ffffffffffffffff81118282101715610619576106196105c7565b604051610120810167ffffffffffffffff81118282101715610619576106196105c7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156106d0576106d06105c7565b604052919050565b600067ffffffffffffffff8211156106f2576106f26105c7565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461071e57600080fd5b50565b803561072c816106fc565b919050565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461072c57600080fd5b803567ffffffffffffffff8116811461072c57600080fd5b600082601f83011261078657600080fd5b8135602061079b610796836106d8565b610689565b82815260069290921b840181019181810190868411156107ba57600080fd5b8286015b8481101561080757604081890312156107d75760008081fd5b6107df6105f6565b6107e88261075d565b81526107f5858301610731565b818601528352918301916040016107be565b509695505050505050565b600082601f83011261082357600080fd5b813567ffffffffffffffff81111561083d5761083d6105c7565b61086e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610689565b81815284602083860101111561088357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126108b157600080fd5b813560206108c1610796836106d8565b82815260059290921b840181019181810190868411156108e057600080fd5b8286015b8481101561080757803567ffffffffffffffff808211156109055760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d0301121561093e5760008081fd5b61094661061f565b61095188850161075d565b8152604080850135848111156109675760008081fd5b6109758e8b83890101610812565b8a840152506060935061098984860161075d565b90820152608061099a85820161075d565b938201939093529201359082015283529183019183016108e4565b600082601f8301126109c657600080fd5b813560206109d6610796836106d8565b82815260069290921b840181019181810190868411156109f557600080fd5b8286015b848110156108075760408189031215610a125760008081fd5b610a1a6105f6565b8135815284820135858201528352918301916040016109f9565b60006020808385031215610a4757600080fd5b823567ffffffffffffffff80821115610a5f57600080fd5b9084019060808287031215610a7357600080fd5b610a7b610642565b823582811115610a8a57600080fd5b83016040818903811315610a9d57600080fd5b610aa56105f6565b823585811115610ab457600080fd5b8301601f81018b13610ac557600080fd5b8035610ad3610796826106d8565b81815260069190911b8201890190898101908d831115610af257600080fd5b928a01925b82841015610b425785848f031215610b0f5760008081fd5b610b176105f6565b8435610b22816106fc565b8152610b2f858d01610731565b818d0152825292850192908a0190610af7565b845250505082870135915084821115610b5a57600080fd5b610b668a838501610775565b81880152835250508284013582811115610b7f57600080fd5b610b8b888286016108a0565b85830152506040830135935081841115610ba457600080fd5b610bb0878585016109b5565b6040820152606083013560608201528094505050505092915050565b600060a08284031215610bde57600080fd5b610be661061f565b905081358152610bf86020830161075d565b6020820152610c096040830161075d565b6040820152610c1a6060830161075d565b6060820152610c2b6080830161075d565b608082015292915050565b600082601f830112610c4757600080fd5b81356020610c57610796836106d8565b82815260059290921b84018101918181019086841115610c7657600080fd5b8286015b8481101561080757803567ffffffffffffffff80821115610c9b5760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610cd45760008081fd5b610cdc61061f565b610ce7888501610721565b815260408085013584811115610cfd5760008081fd5b610d0b8e8b83890101610812565b8a8401525060608086013585811115610d245760008081fd5b610d328f8c838a0101610812565b83850152506080915081860135818401525082850135925083831115610d585760008081fd5b610d668d8a85880101610812565b908201528652505050918301918301610c7a565b60008060408385031215610d8d57600080fd5b610d968361075d565b9150602083013567ffffffffffffffff80821115610db357600080fd5b908401906101a08287031215610dc857600080fd5b610dd0610665565b610dda8784610bcc565b8152610de860a08401610721565b602082015260c083013582811115610dff57600080fd5b610e0b88828601610812565b60408301525060e083013582811115610e2357600080fd5b610e2f88828601610812565b6060830152506101008084013583811115610e4957600080fd5b610e5589828701610812565b608084015250610e686101208501610721565b60a083015261014084013560c083015261016084013560e083015261018084013583811115610e9657600080fd5b610ea289828701610c36565b8284015250508093505050509250929050565b600080600080600060a08688031215610ecd57600080fd5b610ed68661075d565b9450610ee46020870161075d565b935060408601359250606086013560048110610eff57600080fd5b9150608086013567ffffffffffffffff811115610f1b57600080fd5b610f2788828901610812565b9150509295509295909350565b600060208284031215610f4657600080fd5b610f4f8261075d565b9392505050565b60008083601f840112610f6857600080fd5b50813567ffffffffffffffff811115610f8057600080fd5b602083019150836020828501011115610f9857600080fd5b9250929050565b60008060008060608587031215610fb557600080fd5b610fbe8561075d565b9350610fcc6020860161075d565b9250604085013567ffffffffffffffff811115610fe857600080fd5b610ff487828801610f56565b95989497509550505050565b6000806040838503121561101357600080fd5b61101c8361075d565b915061102a6020840161075d565b90509250929050565b60008060006040848603121561104857600080fd5b6110518461075d565b9250602084013567ffffffffffffffff81111561106d57600080fd5b61107986828701610f56565b9497909650939450505050565b6000806040838503121561109957600080fd5b6110a28361075d565b9150602083013567ffffffffffffffff808211156110bf57600080fd5b90840190608082870312156110d357600080fd5b6110db610642565b82356110e6816106fc565b8152602083013580151581146110fb57600080fd5b602082015261110c6040840161075d565b604082015260608301358281111561112357600080fd5b61112f88828601610812565b6060830152508093505050509250929050565b6000815180845260005b818110156111685760208185018101518683018201520161114c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260208201511515604082015267ffffffffffffffff60408301511660608201526000606083015160808084015261120160a0840182611142565b949350505050565b805160408084528151848201819052600092602091908201906060870190855b81811015611282578351805173ffffffffffffffffffffffffffffffffffffffff1684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858401529284019291850191600101611229565b50508583015187820388850152805180835290840192506000918401905b808310156112f1578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858301529284019260019290920191908501906112a0565b50979650505050505050565b60006040808301604084528086518083526060925060608601915060608160051b8701016020808a0160005b848110156113b5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018652815160a067ffffffffffffffff80835116875285830151828789015261138083890182611142565b848d01518316898e01528b8501519092168b890152506080928301519290960191909152509482019490820190600101611329565b5050878203908801526113c88189611209565b9998505050505050505050565b600082825180855260208086019550808260051b84010181860160005b848110156114ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff825116855285820151818787015261145482870182611142565b9150506040808301518683038288015261146e8382611142565b925050506060808301518187015250608080830151925085820381870152506114978183611142565b9a86019a94505050908301906001016113f2565b5090979650505050505050565b6020815261150960208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161153260c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e085015261154f6101c0850183611142565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061010081878603018188015261158d8584611142565b94506080880151925081878603016101208801526115ab8584611142565b945060a088015192506115d761014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061160683826113d5565b9695505050505050565b600060048410611649577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b838252604060208301526112016040830184611142565b67ffffffffffffffff8181168382160190808211156116a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b8183823760009101908152919050565b600181811c908216806116d357607f821691505b60208210810361170c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561175e576000816000526020600020601f850160051c8101602086101561173b5750805b601f850160051c820191505b8181101561175a57828155600101611747565b5050505b505050565b815167ffffffffffffffff81111561177d5761177d6105c7565b6117918161178b84546116bf565b84611712565b602080601f8311600181146117e457600084156117ae5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561175a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561183157888601518255948401946001909101908401611812565b508582101561186d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a", } var CCIPReaderTesterABI = CCIPReaderTesterMetaData.ABI @@ -566,8 +568,9 @@ func (it *CCIPReaderTesterCommitReportAcceptedIterator) Close() error { } type CCIPReaderTesterCommitReportAccepted struct { - Report OffRampCommitReport - Raw types.Log + MerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log } func (_CCIPReaderTester *CCIPReaderTesterFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*CCIPReaderTesterCommitReportAcceptedIterator, error) { @@ -784,11 +787,11 @@ func (_CCIPReaderTester *CCIPReaderTester) ParseLog(log types.Log) (generated.Ab } func (CCIPReaderTesterCCIPMessageSent) Topic() common.Hash { - return common.HexToHash("0xf6e86ef8896c7a0d629406168f396e883280680c99e649b9e2d36466fbc9f9e5") + return common.HexToHash("0x8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed") } func (CCIPReaderTesterCommitReportAccepted) Topic() common.Hash { - return common.HexToHash("0xd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e1") + return common.HexToHash("0x35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4") } func (CCIPReaderTesterExecutionStateChanged) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go index d8f616053a8..e6b31769246 100644 --- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go +++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go @@ -83,9 +83,14 @@ type FeeQuoterStaticConfig struct { StalenessThreshold uint32 } +type FeeQuoterTokenPriceFeedConfig struct { + DataFeedAddress common.Address + TokenDecimals uint8 +} + type FeeQuoterTokenPriceFeedUpdate struct { SourceToken common.Address - FeedConfig IFeeQuoterTokenPriceFeedConfig + FeedConfig FeeQuoterTokenPriceFeedConfig } type FeeQuoterTokenTransferFeeConfig struct { @@ -112,9 +117,12 @@ type FeeQuoterTokenTransferFeeConfigSingleTokenArgs struct { TokenTransferFeeConfig FeeQuoterTokenTransferFeeConfig } -type IFeeQuoterTokenPriceFeedConfig struct { - DataFeedAddress common.Address - TokenDecimals uint8 +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte } type InternalGasPriceUpdate struct { @@ -127,14 +135,6 @@ type InternalPriceUpdates struct { GasPriceUpdates []InternalGasPriceUpdate } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte - DestTokenAddress []byte - ExtraData []byte - Amount *big.Int - DestExecData []byte -} - type InternalTimestampedPackedUint224 struct { Value *big.Int Timestamp uint32 @@ -154,8 +154,8 @@ type KeystoneFeedsPermissionHandlerPermission struct { } var FeeQuoterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"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\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processPoolReturnData\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e06040523480156200001157600080fd5b506040516200774438038062007744833981016040819052620000349162001834565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a5a565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b26565b5050505050505062001ae5565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001953565b60209081029190910101519050620002f560028262000e5f565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001953565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000e7f565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001953565b6020026020010151600b62000e7f60201b90919060201c565b1562000499578281815181106200045b576200045b62001953565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001953565b6020026020010151600b62000e9660201b90919060201c565b156200053b57818181518110620004fd57620004fd62001953565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001953565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001953565b6020026020010151905060008383815181106200065f576200065f62001953565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506101e08101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160881b900460e01b6001600160e01b03191690036200078557816001600160401b03167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb7248260405162000777919062001969565b60405180910390a2620007c9565b816001600160401b03167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab2082604051620007c0919062001969565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000a7e5762000a7e62001953565b6020026020010151600001519050600083838151811062000aa35762000aa362001953565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a5d565b60005b825181101562000d9957600083828151811062000b4a5762000b4a62001953565b6020026020010151905060008160000151905060005b82602001515181101562000d8a5760008360200151828151811062000b895762000b8962001953565b602002602001015160200151905060008460200151838151811062000bb25762000bb262001953565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c115760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d77908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b60565b50505080600101905062000b29565b5060005b81518110156200054457600082828151811062000dbe5762000dbe62001953565b6020026020010151600001519050600083838151811062000de35762000de362001953565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000d9d565b600062000e76836001600160a01b03841662000ead565b90505b92915050565b600062000e76836001600160a01b03841662000fb1565b600062000e76836001600160a01b03841662001003565b6000818152600183016020526040812054801562000fa657600062000ed460018362001aad565b855490915060009062000eea9060019062001aad565b905081811462000f5657600086600001828154811062000f0e5762000f0e62001953565b906000526020600020015490508087600001848154811062000f345762000f3462001953565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f6a5762000f6a62001acf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e79565b600091505062000e79565b600081815260018301602052604081205462000ffa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e79565b50600062000e79565b6000818152600183016020526040812054801562000fa65760006200102a60018362001aad565b8554909150600090620010409060019062001aad565b905080821462000f5657600086600001828154811062000f0e5762000f0e62001953565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200109f576200109f62001064565b60405290565b60405160c081016001600160401b03811182821017156200109f576200109f62001064565b60405161020081016001600160401b03811182821017156200109f576200109f62001064565b604051601f8201601f191681016001600160401b03811182821017156200111b576200111b62001064565b604052919050565b80516001600160a01b03811681146200113b57600080fd5b919050565b805163ffffffff811681146200113b57600080fd5b6000606082840312156200116857600080fd5b604051606081016001600160401b03811182821017156200118d576200118d62001064565b604052825190915081906001600160601b0381168114620011ad57600080fd5b8152620011bd6020840162001123565b6020820152620011d06040840162001140565b60408201525092915050565b60006001600160401b03821115620011f857620011f862001064565b5060051b60200190565b600082601f8301126200121457600080fd5b815160206200122d6200122783620011dc565b620010f0565b8083825260208201915060208460051b8701019350868411156200125057600080fd5b602086015b848110156200127757620012698162001123565b835291830191830162001255565b509695505050505050565b600082601f8301126200129457600080fd5b81516020620012a76200122783620011dc565b82815260609283028501820192828201919087851115620012c757600080fd5b8387015b858110156200135a5780890382811215620012e65760008081fd5b620012f06200107a565b620012fb8362001123565b8152604080601f1984011215620013125760008081fd5b6200131c6200107a565b92506200132b88850162001123565b835283015160ff81168114620013415760008081fd5b82880152808701919091528452928401928101620012cb565b5090979650505050505050565b80516001600160401b03811681146200113b57600080fd5b805161ffff811681146200113b57600080fd5b805180151581146200113b57600080fd5b600082601f830112620013b557600080fd5b81516020620013c86200122783620011dc565b82815260059290921b84018101918181019086841115620013e857600080fd5b8286015b84811015620012775780516001600160401b03808211156200140d57600080fd5b908801906040601f19838c0381018213156200142857600080fd5b620014326200107a565b6200143f89860162001367565b815282850151848111156200145357600080fd5b8086019550508c603f8601126200146957600080fd5b8885015193506200147e6200122785620011dc565b84815260e09094028501830193898101908e8611156200149d57600080fd5b958401955b858710156200157657868f0360e0811215620014bd57600080fd5b620014c76200107a565b620014d28962001123565b815260c08683011215620014e557600080fd5b620014ef620010a5565b9150620014fe8d8a0162001140565b82526200150d878a0162001140565b8d8301526200151f60608a016200137f565b878301526200153160808a0162001140565b60608301526200154460a08a0162001140565b60808301526200155760c08a0162001392565b60a0830152808d0191909152825260e09690960195908a0190620014a2565b828b015250875250505092840192508301620013ec565b600082601f8301126200159f57600080fd5b81516020620015b26200122783620011dc565b82815260069290921b84018101918181019086841115620015d257600080fd5b8286015b84811015620012775760408189031215620015f15760008081fd5b620015fb6200107a565b620016068262001123565b81526200161585830162001367565b81860152835291830191604001620015d6565b80516001600160e01b0319811681146200113b57600080fd5b600082601f8301126200165357600080fd5b81516020620016666200122783620011dc565b82815261022092830285018201928282019190878511156200168757600080fd5b8387015b858110156200135a5780890382811215620016a65760008081fd5b620016b06200107a565b620016bb8362001367565b815261020080601f1984011215620016d35760008081fd5b620016dd620010ca565b9250620016ec88850162001392565b83526040620016fd8186016200137f565b8985015260606200171081870162001140565b82860152608091506200172582870162001140565b9085015260a06200173886820162001140565b8286015260c091506200174d8287016200137f565b9085015260e06200176086820162001140565b828601526101009150620017768287016200137f565b908501526101206200178a8682016200137f565b828601526101409150620017a08287016200137f565b90850152610160620017b486820162001140565b828601526101809150620017ca82870162001140565b908501526101a0620017de86820162001367565b828601526101c09150620017f482870162001140565b908501526101e06200180886820162001392565b828601526200181983870162001628565b9085015250508087019190915284529284019281016200168b565b6000806000806000806000610120888a0312156200185157600080fd5b6200185d898962001155565b60608901519097506001600160401b03808211156200187b57600080fd5b620018898b838c0162001202565b975060808a0151915080821115620018a057600080fd5b620018ae8b838c0162001202565b965060a08a0151915080821115620018c557600080fd5b620018d38b838c0162001282565b955060c08a0151915080821115620018ea57600080fd5b620018f88b838c01620013a3565b945060e08a01519150808211156200190f57600080fd5b6200191d8b838c016200158d565b93506101008a01519150808211156200193557600080fd5b50620019448a828b0162001641565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610200810160208301516200198a602084018261ffff169052565b506040830151620019a3604084018263ffffffff169052565b506060830151620019bc606084018263ffffffff169052565b506080830151620019d5608084018263ffffffff169052565b5060a0830151620019ec60a084018261ffff169052565b5060c083015162001a0560c084018263ffffffff169052565b5060e083015162001a1c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a080850151909116908301526101c0808401511515908301526101e0928301516001600160e01b031916929091019190915290565b8181038181111562000e7957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615c0562001b3f600039600081816102ef015281816121fd01526122660152600081816102b301528181611917015261197701526000818161027f015281816119a00152611a100152615c056000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c806379ba509711610104578063a69c64c0116100a2578063d02641a011610071578063d02641a014610a81578063d8694ccd14610a94578063f2fde38b14610aa7578063ffdb4b3714610aba57600080fd5b8063a69c64c014610997578063bf78e03f146109aa578063c4276bfc14610a57578063cdc73d5114610a7957600080fd5b806382b49eb0116100de57806382b49eb0146107d95780638da5cb5b1461094957806391a2749a146109715780639ea600261461098457600080fd5b806379ba5097146107ab5780637afac322146107b3578063805f2132146107c657600080fd5b8063407e1086116101715780634ab35b0b1161014b5780634ab35b0b14610441578063514e8cff146104815780636def4ce714610524578063770e2dc41461079857600080fd5b8063407e1086146103fb57806341ed29e71461040e57806345ac924d1461042157600080fd5b8063085318f8116101ad578063085318f814610368578063181f5a77146103885780632451a627146103d15780633937306f146103e657600080fd5b806241e5be146101d3578063061877e3146101f957806306285c6914610252575b600080fd5b6101e66101e13660046142bc565b610b02565b6040519081526020015b60405180910390f35b6102396102073660046142f8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101f0565b61031c604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101f0565b61037b610376366004614370565b610b70565b6040516101f09190614482565b6103c46040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101f09190614504565b6103d9610ee2565b6040516101f09190614517565b6103f96103f4366004614571565b610ef3565b005b6103f9610409366004614713565b6111a8565b6103f961041c366004614845565b6111bc565b61043461042f366004614980565b6111fe565b6040516101f091906149c2565b61045461044f3660046142f8565b6112c9565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b61051761048f366004614a3d565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101f09190614a58565b61078b610532366004614a3d565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161020081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a085015271010000000000000000000000000000000000808404881660c086015275010000000000000000000000000000000000000000008404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c0100000000000000000000000086049094166101a0820152700100000000000000000000000000000000850490911615156101c08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b166101e082015290565b6040516101f09190614a93565b6103f96107a6366004614caa565b6112d4565b6103f96112e6565b6103f96107c1366004614fc4565b6113e3565b6103f96107d436600461506a565b6113f5565b6108e96107e73660046150d6565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101f09190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b6103f961097f366004615100565b6118dd565b6103f96109923660046151c1565b6118ee565b6103f96109a53660046153ce565b6118ff565b610a236109b83660046142f8565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101f0565b610a6a610a65366004615493565b611910565b6040516101f093929190615502565b6103d9611b06565b610517610a8f3660046142f8565b611b12565b6101e6610aa2366004615523565b611c0e565b6103f9610ab53660046142f8565b612118565b610acd610ac8366004615578565b612129565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101f0565b6000610b0d826122b4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b34856122b4565b610b5c907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856155d1565b610b6691906155e8565b90505b9392505050565b67ffffffffffffffff8086166000908152600960205260409020600101546060917101000000000000000000000000000000000090910460e01b908590811115610bbc57610bbc6145ac565b604051908082528060200260200182016040528015610bef57816020015b6060815260200190600190039081610bda5790505b50915060005b85811015610ed7576000858583818110610c1157610c11615623565b610c2792602060409092020190810191506142f8565b90506000888884818110610c3d57610c3d615623565b9050602002810190610c4f9190615652565b610c5d906040810190615690565b9150506020811115610d125767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115610d12576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b610d82848a8a86818110610d2857610d28615623565b9050602002810190610d3a9190615652565b610d48906020810190615690565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061234e92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b0100000000000000000000000000000000000000000000000000000090049091169190610e815781610e87565b82606001515b6040805163ffffffff8316602082015291925001604051602081830303815290604052888781518110610ebc57610ebc615623565b60200260200101819052505050505050806001019050610bf5565b505095945050505050565b6060610eee60026123a5565b905090565b610efb6123b2565b6000610f0782806156f5565b9050905060005b81811015611051576000610f2284806156f5565b83818110610f3257610f32615623565b905060400201803603810190610f489190615789565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a926110409290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610f0e565b50600061106160208401846156f5565b9050905060005b818110156111a257600061107f60208601866156f5565b8381811061108f5761108f615623565b9050604002018036038101906110a591906157c6565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e926111919290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101611068565b50505050565b6111b06123f7565b6111b981612478565b50565b6111c46123f7565b60005b81518110156111fa576111f28282815181106111e5576111e5615623565b6020026020010151612576565b6001016111c7565b5050565b60608160008167ffffffffffffffff81111561121c5761121c6145ac565b60405190808252806020026020018201604052801561126157816020015b604080518082019091526000808252602082015281526020019060019003908161123a5790505b50905060005b828110156112be5761129986868381811061128457611284615623565b9050602002016020810190610a8f91906142f8565b8282815181106112ab576112ab615623565b6020908102919091010152600101611267565b509150505b92915050565b60006112c3826122b4565b6112dc6123f7565b6111fa8282612748565b60015473ffffffffffffffffffffffffffffffffffffffff163314611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610d09565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6113eb6123f7565b6111fa8282612b55565b600080600061143987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c9c92505050565b92509250925061144b33838584612cb7565b6000611459858701876157e9565b905060005b81518110156118d25760006007600084848151811061147f5761147f615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff169150819003611540578282815181106114e9576114e9615623565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b600061158960128386868151811061155a5761155a615623565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612e0f565b9050600660008585815181106115a1576115a1615623565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff1684848151811061161357611613615623565b60200260200101516040015163ffffffff16101561171d5783838151811061163d5761163d615623565b60200260200101516000015184848151811061165b5761165b615623565b6020026020010151604001516006600087878151811061167d5761167d615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610d09565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061175e5761175e615623565b60200260200101516040015163ffffffff168152506006600086868151811061178957611789615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055835184908490811061182157611821615623565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a8286868151811061187757611877615623565b6020026020010151604001516040516118c09291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a2505060010161145e565b505050505050505050565b6118e56123f7565b6111b981612ed5565b6118f66123f7565b6111b981613061565b6119076123f7565b6111b981613507565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036119705785925061199e565b61199b87877f0000000000000000000000000000000000000000000000000000000000000000610b02565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611a3d576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610d09565b67ffffffffffffffff881660009081526009602052604081206001015463ffffffff1690611a6c8787846135f1565b9050806020015193508484611af3836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b6060610eee600b6123a5565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff169082015290611c0557505073ffffffffffffffffffffffffffffffffffffffff166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b698161379a565b67ffffffffffffffff8083166000908152600960209081526040808320815161020081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a086015271010000000000000000000000000000000000808504881660c087015275010000000000000000000000000000000000000000008504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c0100000000000000000000000088049094166101a0830152700100000000000000000000000000000000870490931615156101c08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b166101e0840152909190611e28576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b611e43611e3b60808501606086016142f8565b600b90613929565b611ea257611e5760808401606085016142f8565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b6000611eb160408501856156f5565b9150611f0d905082611ec66020870187615690565b905083611ed38880615690565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061395892505050565b600080611f29611f2360808801606089016142f8565b88612129565b9092509050600080808515611f6c57611f60878b611f4d60808d0160608e016142f8565b88611f5b60408f018f6156f5565b613a02565b91945092509050611f8c565b6101a0870151611f899063ffffffff16662386f26fc100006155d1565b92505b61010087015160009061ffff1615611fd057611fcd886dffffffffffffffffffffffffffff607088901c16611fc460208e018e615690565b90508a86613cda565b90505b61018088015160009067ffffffffffffffff16611ff9611ff360808e018e615690565b8c613d8a565b600001518563ffffffff168b60a0015161ffff168e806020019061201d9190615690565b6120289291506155d1565b8c6080015163ffffffff1661203d91906158b0565b61204791906158b0565b61205191906158b0565b61206b906dffffffffffffffffffffffffffff89166155d1565b61207591906155d1565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f60600160208101906120af91906142f8565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020546120ea9067ffffffffffffffff16896155d1565b6120f491906158b0565b6120fe91906158b0565b61210891906155e8565b9c9b505050505050505050505050565b6121206123f7565b6111b981613e4b565b67ffffffffffffffff811660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16918101829052829182036121e1576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b6000816020015163ffffffff16426121f991906158c3565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681111561229a576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610d09565b6122a3866122b4565b9151919350909150505b9250929050565b6000806122c083611b12565b9050806020015163ffffffff16600014806122f8575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612347576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610d09565b5192915050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016111fa576123a081613f40565b505050565b60606000610b6983613ff3565b6123bd600233613929565b6123f5576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610d09565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610d09565b60005b81518110156111fa57600082828151811061249857612498615623565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a250505080600101905061247b565b600061262f82600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a39061273c908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b60005b8251811015612a7157600083828151811061276857612768615623565b6020026020010151905060008160000151905060005b826020015151811015612a63576000836020015182815181106127a3576127a3615623565b60200260200101516020015190506000846020015183815181106127c9576127c9615623565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101561284c5760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610d09565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590612a51908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010161277e565b50505080600101905061274b565b5060005b81518110156123a0576000828281518110612a9257612a92615623565b60200260200101516000015190506000838381518110612ab457612ab4615623565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612a75565b60005b8251811015612bf857612b8e838281518110612b7657612b76615623565b6020026020010151600b61404f90919063ffffffff16565b15612bf057828181518110612ba557612ba5615623565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612b58565b5060005b81518110156123a057612c32828281518110612c1a57612c1a615623565b6020026020010151600b61407190919063ffffffff16565b15612c9457818181518110612c4957612c49615623565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101612bfc565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16612e08576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610d09565b5050505050565b600080612e1c84866158d6565b9050600060248260ff161115612e5357612e376024836158ef565b612e4290600a615a28565b612e4c90856155e8565b9050612e76565b612e5e8260246158ef565b612e6990600a615a28565b612e7390856155d1565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612ecc576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b8151811015612f70576000828281518110612efa57612efa615623565b60200260200101519050612f1881600261409390919063ffffffff16565b15612f675760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612edd565b50815160005b81518110156111a2576000828281518110612f9357612f93615623565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613003576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61300e60028261404f565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101612f76565b60005b81518110156111fa57600082828151811061308157613081615623565b60200260200101519050600083838151811061309f5761309f615623565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806130d8575061016081015163ffffffff16155b8061312a57506101e08101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806131495750806060015163ffffffff1681610160015163ffffffff16115b1561318c576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d09565b67ffffffffffffffff821660009081526009602052604081206001015471010000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003613230578167ffffffffffffffff167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724826040516132239190614a93565b60405180910390a2613273565b8167ffffffffffffffff167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab208260405161326a9190614a93565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050613064565b60005b81518110156111fa57600082828151811061352757613527615623565b6020026020010151600001519050600083838151811061354957613549615623565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010161350a565b6040805180820190915260008082526020820152600083900361363257506040805180820190915267ffffffffffffffff8216815260006020820152610b69565b600061363e8486615a37565b9050600061364f8560048189615a7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016136ec57808060200190518101906136e39190615aa7565b92505050610b69565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601613768576040518060400160405280828060200190518101906137549190615ad3565b815260006020909101529250610b69915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138289190615b06565b5050509150506000811215613869576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138e88373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138dd9190615b56565b866020015184612e0f565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b69565b836040015163ffffffff168311156139b15760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610d09565b836020015161ffff168211156139f3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a2846101e001518261234e565b6000808083815b81811015613ccc576000878783818110613a2557613a25615623565b905060400201803603810190613a3b9190615b73565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613b5b576101208d0151613b289061ffff16662386f26fc100006155d1565b613b3290886158b0565b96508c610140015186613b459190615bac565b9550613b52602086615bac565b94505050613cc4565b604081015160009061ffff1615613c145760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613bb7578351613bb0906122b4565b9050613bba565b508a5b620186a0836040015161ffff16613bfc8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140b590919063ffffffff16565b613c0691906155d1565b613c1091906155e8565b9150505b6060820151613c239088615bac565b9650816080015186613c359190615bac565b8251909650600090613c549063ffffffff16662386f26fc100006155d1565b905080821015613c7357613c68818a6158b0565b985050505050613cc4565b6000836020015163ffffffff16662386f26fc10000613c9291906155d1565b905080831115613cb257613ca6818b6158b0565b99505050505050613cc4565b613cbc838b6158b0565b995050505050505b600101613a09565b505096509650969350505050565b60008063ffffffff8316613cf0610160866155d1565b613cfc876101c06158b0565b613d0691906158b0565b613d1091906158b0565b905060008760c0015163ffffffff168860e0015161ffff1683613d3391906155d1565b613d3d91906158b0565b61010089015190915061ffff16613d646dffffffffffffffffffffffffffff8916836155d1565b613d6e91906155d1565b613d7e90655af3107a40006155d1565b98975050505050505050565b60408051808201909152600080825260208201526000613db6858585610160015163ffffffff166135f1565b9050826060015163ffffffff1681600001511115613e00576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101c001518015613e1457508060200151155b15610b66576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613eca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610d09565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008151602014613f7f57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614504565b600082806020019051810190613f959190615ad3565b905073ffffffffffffffffffffffffffffffffffffffff811180613fba575061040081105b156112c357826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614504565b60608160000180548060200260200160405190810160405280929190818152602001828054801561404357602002820191906000526020600020905b81548152602001906001019080831161402f575b50505050509050919050565b6000610b698373ffffffffffffffffffffffffffffffffffffffff84166140f2565b6000610b698373ffffffffffffffffffffffffffffffffffffffff8416614141565b6000610b698373ffffffffffffffffffffffffffffffffffffffff841661423b565b6000670de0b6b3a76400006140e8837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166155d1565b610b6991906155e8565b6000818152600183016020526040812054614139575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556112c3565b5060006112c3565b6000818152600183016020526040812054801561422a5760006141656001836158c3565b8554909150600090614179906001906158c3565b90508082146141de57600086600001828154811061419957614199615623565b90600052602060002001549050808760000184815481106141bc576141bc615623565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806141ef576141ef615bc9565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506112c3565b60009150506112c3565b5092915050565b6000818152600183016020526040812054801561422a57600061425f6001836158c3565b8554909150600090614273906001906158c3565b90508181146141de57600086600001828154811061419957614199615623565b803573ffffffffffffffffffffffffffffffffffffffff811681146142b757600080fd5b919050565b6000806000606084860312156142d157600080fd5b6142da84614293565b9250602084013591506142ef60408501614293565b90509250925092565b60006020828403121561430a57600080fd5b610b6982614293565b803567ffffffffffffffff811681146142b757600080fd5b60008083601f84011261433d57600080fd5b50813567ffffffffffffffff81111561435557600080fd5b6020830191508360208260051b85010111156122ad57600080fd5b60008060008060006060868803121561438857600080fd5b61439186614313565b9450602086013567ffffffffffffffff808211156143ae57600080fd5b6143ba89838a0161432b565b909650945060408801359150808211156143d357600080fd5b818801915088601f8301126143e757600080fd5b8135818111156143f657600080fd5b8960208260061b850101111561440b57600080fd5b9699959850939650602001949392505050565b6000815180845260005b8181101561444457602081850181015186830182015201614428565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156144f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526144e585835161441e565b945092850192908501906001016144ab565b5092979650505050505050565b602081526000610b69602083018461441e565b6020808252825182820181905260009190848201906040850190845b8181101561456557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614533565b50909695505050505050565b60006020828403121561458357600080fd5b813567ffffffffffffffff81111561459a57600080fd5b820160408185031215610b6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156145fe576145fe6145ac565b60405290565b60405160a0810167ffffffffffffffff811182821017156145fe576145fe6145ac565b60405160c0810167ffffffffffffffff811182821017156145fe576145fe6145ac565b604051610200810167ffffffffffffffff811182821017156145fe576145fe6145ac565b6040516060810167ffffffffffffffff811182821017156145fe576145fe6145ac565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156146d8576146d86145ac565b604052919050565b600067ffffffffffffffff8211156146fa576146fa6145ac565b5060051b60200190565b60ff811681146111b957600080fd5b6000602080838503121561472657600080fd5b823567ffffffffffffffff81111561473d57600080fd5b8301601f8101851361474e57600080fd5b803561476161475c826146e0565b614691565b8181526060918202830184019184820191908884111561478057600080fd5b938501935b83851015614820578489038181121561479e5760008081fd5b6147a66145db565b6147af87614293565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147e35760008081fd5b6147eb6145db565b92506147f8898901614293565b835287013561480681614704565b828901528088019190915283529384019391850191614785565b50979650505050505050565b80151581146111b957600080fd5b80356142b78161482c565b6000602080838503121561485857600080fd5b823567ffffffffffffffff81111561486f57600080fd5b8301601f8101851361488057600080fd5b803561488e61475c826146e0565b81815260a091820283018401918482019190888411156148ad57600080fd5b938501935b838510156148205780858a0312156148ca5760008081fd5b6148d2614604565b6148db86614293565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146149105760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146149495760008081fd5b90820152606061495a878201614293565b9082015260808681013561496d8161482c565b90820152835293840193918501916148b2565b6000806020838503121561499357600080fd5b823567ffffffffffffffff8111156149aa57600080fd5b6149b68582860161432b565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614a3057614a2084835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b92840192908501906001016149df565b5091979650505050505050565b600060208284031215614a4f57600080fd5b610b6982614313565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016112c3565b81511515815261020081016020830151614ab3602084018261ffff169052565b506040830151614acb604084018263ffffffff169052565b506060830151614ae3606084018263ffffffff169052565b506080830151614afb608084018263ffffffff169052565b5060a0830151614b1160a084018261ffff169052565b5060c0830151614b2960c084018263ffffffff169052565b5060e0830151614b3f60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a080850151909116908301526101c0808401511515908301526101e0808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff811681146142b757600080fd5b803561ffff811681146142b757600080fd5b600082601f830112614c2357600080fd5b81356020614c3361475c836146e0565b82815260069290921b84018101918181019086841115614c5257600080fd5b8286015b84811015614c9f5760408189031215614c6f5760008081fd5b614c776145db565b614c8082614313565b8152614c8d858301614293565b81860152835291830191604001614c56565b509695505050505050565b60008060408385031215614cbd57600080fd5b67ffffffffffffffff83351115614cd357600080fd5b83601f843585010112614ce557600080fd5b614cf561475c84358501356146e0565b8335840180358083526020808401939260059290921b90910101861015614d1b57600080fd5b602085358601015b85358601803560051b01602001811015614f285767ffffffffffffffff81351115614d4d57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a03011215614d8657600080fd5b614d8e6145db565b614d9a60208301614313565b815267ffffffffffffffff60408301351115614db557600080fd5b88603f604084013584010112614dca57600080fd5b614de061475c60206040850135850101356146e0565b6020604084810135850182810135808552928401939260e00201018b1015614e0757600080fd5b6040808501358501015b6040858101358601602081013560e0020101811015614f095760e0818d031215614e3a57600080fd5b614e426145db565b614e4b82614293565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215614e7f57600080fd5b614e87614627565b614e9360208401614bec565b8152614ea160408401614bec565b6020820152614eb260608401614c00565b6040820152614ec360808401614bec565b6060820152614ed460a08401614bec565b6080820152614ee660c084013561482c565b60c083013560a0820152602082810191909152908452929092019160e001614e11565b5080602084015250508085525050602083019250602081019050614d23565b5092505067ffffffffffffffff60208401351115614f4557600080fd5b614f558460208501358501614c12565b90509250929050565b600082601f830112614f6f57600080fd5b81356020614f7f61475c836146e0565b8083825260208201915060208460051b870101935086841115614fa157600080fd5b602086015b84811015614c9f57614fb781614293565b8352918301918301614fa6565b60008060408385031215614fd757600080fd5b823567ffffffffffffffff80821115614fef57600080fd5b614ffb86838701614f5e565b9350602085013591508082111561501157600080fd5b5061501e85828601614f5e565b9150509250929050565b60008083601f84011261503a57600080fd5b50813567ffffffffffffffff81111561505257600080fd5b6020830191508360208285010111156122ad57600080fd5b6000806000806040858703121561508057600080fd5b843567ffffffffffffffff8082111561509857600080fd5b6150a488838901615028565b909650945060208701359150808211156150bd57600080fd5b506150ca87828801615028565b95989497509550505050565b600080604083850312156150e957600080fd5b6150f283614313565b9150614f5560208401614293565b60006020828403121561511257600080fd5b813567ffffffffffffffff8082111561512a57600080fd5b908301906040828603121561513e57600080fd5b6151466145db565b82358281111561515557600080fd5b61516187828601614f5e565b82525060208301358281111561517657600080fd5b61518287828601614f5e565b60208301525095945050505050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146142b757600080fd5b600060208083850312156151d457600080fd5b823567ffffffffffffffff8111156151eb57600080fd5b8301601f810185136151fc57600080fd5b803561520a61475c826146e0565b818152610220918202830184019184820191908884111561522a57600080fd5b938501935b8385101561482057848903818112156152485760008081fd5b6152506145db565b61525987614313565b8152610200807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561528e5760008081fd5b61529661464a565b92506152a389890161483a565b835260406152b2818a01614c00565b8a85015260606152c3818b01614bec565b82860152608091506152d6828b01614bec565b9085015260a06152e78a8201614bec565b8286015260c091506152fa828b01614c00565b9085015260e061530b8a8201614bec565b82860152610100915061531f828b01614c00565b908501526101206153318a8201614c00565b828601526101409150615345828b01614c00565b908501526101606153578a8201614bec565b82860152610180915061536b828b01614bec565b908501526101a061537d8a8201614313565b828601526101c09150615391828b01614bec565b908501526101e06153a38a820161483a565b828601526153b2838b01615191565b908501525050808801919091528352938401939185019161522f565b600060208083850312156153e157600080fd5b823567ffffffffffffffff8111156153f857600080fd5b8301601f8101851361540957600080fd5b803561541761475c826146e0565b81815260069190911b8201830190838101908783111561543657600080fd5b928401925b8284101561548857604084890312156154545760008081fd5b61545c6145db565b61546585614293565b8152615472868601614313565b818701528252604093909301929084019061543b565b979650505050505050565b6000806000806000608086880312156154ab57600080fd5b6154b486614313565b94506154c260208701614293565b935060408601359250606086013567ffffffffffffffff8111156154e557600080fd5b6154f188828901615028565b969995985093965092949392505050565b8381528215156020820152606060408201526000612ecc606083018461441e565b6000806040838503121561553657600080fd5b61553f83614313565b9150602083013567ffffffffffffffff81111561555b57600080fd5b830160a0818603121561556d57600080fd5b809150509250929050565b6000806040838503121561558b57600080fd5b61559483614293565b9150614f5560208401614313565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176112c3576112c36155a2565b60008261561e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261568657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156c557600080fd5b83018035915067ffffffffffffffff8211156156e057600080fd5b6020019150368190038213156122ad57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261572a57600080fd5b83018035915067ffffffffffffffff82111561574557600080fd5b6020019150600681901b36038213156122ad57600080fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146142b757600080fd5b60006040828403121561579b57600080fd5b6157a36145db565b6157ac83614293565b81526157ba6020840161575d565b60208201529392505050565b6000604082840312156157d857600080fd5b6157e06145db565b6157ac83614313565b600060208083850312156157fc57600080fd5b823567ffffffffffffffff81111561581357600080fd5b8301601f8101851361582457600080fd5b803561583261475c826146e0565b8181526060918202830184019184820191908884111561585157600080fd5b938501935b838510156148205780858a03121561586e5760008081fd5b61587661466e565b61587f86614293565b815261588c87870161575d565b87820152604061589d818801614bec565b9082015283529384019391850191615856565b808201808211156112c3576112c36155a2565b818103818111156112c3576112c36155a2565b60ff81811683821601908111156112c3576112c36155a2565b60ff82811682821603908111156112c3576112c36155a2565b600181815b8085111561596157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615947576159476155a2565b8085161561595457918102915b93841c939080029061590d565b509250929050565b600082615978575060016112c3565b81615985575060006112c3565b816001811461599b57600281146159a5576159c1565b60019150506112c3565b60ff8411156159b6576159b66155a2565b50506001821b6112c3565b5060208310610133831016604e8410600b84101617156159e4575081810a6112c3565b6159ee8383615908565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a2057615a206155a2565b029392505050565b6000610b6960ff841683615969565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614be45760049490940360031b84901b1690921692915050565b60008085851115615a8d57600080fd5b83861115615a9a57600080fd5b5050820193919092039150565b600060408284031215615ab957600080fd5b615ac16145db565b8251815260208301516157ba8161482c565b600060208284031215615ae557600080fd5b5051919050565b805169ffffffffffffffffffff811681146142b757600080fd5b600080600080600060a08688031215615b1e57600080fd5b615b2786615aec565b9450602086015193506040860151925060608601519150615b4a60808701615aec565b90509295509295909350565b600060208284031215615b6857600080fd5b8151610b6981614704565b600060408284031215615b8557600080fd5b615b8d6145db565b615b9683614293565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614234576142346155a2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"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\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"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\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60e06040523480156200001157600080fd5b506040516200776138038062007761833981016040819052620000349162001834565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a5a565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b26565b5050505050505062001ae5565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001953565b60209081029190910101519050620002f560028262000e5f565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001953565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000e7f565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001953565b6020026020010151600b62000e7f60201b90919060201c565b1562000499578281815181106200045b576200045b62001953565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001953565b6020026020010151600b62000e9660201b90919060201c565b156200053b57818181518110620004fd57620004fd62001953565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001953565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001953565b6020026020010151905060008383815181106200065f576200065f62001953565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506101e08101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160881b900460e01b6001600160e01b03191690036200078557816001600160401b03167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb7248260405162000777919062001969565b60405180910390a2620007c9565b816001600160401b03167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab2082604051620007c0919062001969565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000a7e5762000a7e62001953565b6020026020010151600001519050600083838151811062000aa35762000aa362001953565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a5d565b60005b825181101562000d9957600083828151811062000b4a5762000b4a62001953565b6020026020010151905060008160000151905060005b82602001515181101562000d8a5760008360200151828151811062000b895762000b8962001953565b602002602001015160200151905060008460200151838151811062000bb25762000bb262001953565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c115760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d77908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b60565b50505080600101905062000b29565b5060005b81518110156200054457600082828151811062000dbe5762000dbe62001953565b6020026020010151600001519050600083838151811062000de35762000de362001953565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000d9d565b600062000e76836001600160a01b03841662000ead565b90505b92915050565b600062000e76836001600160a01b03841662000fb1565b600062000e76836001600160a01b03841662001003565b6000818152600183016020526040812054801562000fa657600062000ed460018362001aad565b855490915060009062000eea9060019062001aad565b905081811462000f5657600086600001828154811062000f0e5762000f0e62001953565b906000526020600020015490508087600001848154811062000f345762000f3462001953565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f6a5762000f6a62001acf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e79565b600091505062000e79565b600081815260018301602052604081205462000ffa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e79565b50600062000e79565b6000818152600183016020526040812054801562000fa65760006200102a60018362001aad565b8554909150600090620010409060019062001aad565b905080821462000f5657600086600001828154811062000f0e5762000f0e62001953565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200109f576200109f62001064565b60405290565b60405160c081016001600160401b03811182821017156200109f576200109f62001064565b60405161020081016001600160401b03811182821017156200109f576200109f62001064565b604051601f8201601f191681016001600160401b03811182821017156200111b576200111b62001064565b604052919050565b80516001600160a01b03811681146200113b57600080fd5b919050565b805163ffffffff811681146200113b57600080fd5b6000606082840312156200116857600080fd5b604051606081016001600160401b03811182821017156200118d576200118d62001064565b604052825190915081906001600160601b0381168114620011ad57600080fd5b8152620011bd6020840162001123565b6020820152620011d06040840162001140565b60408201525092915050565b60006001600160401b03821115620011f857620011f862001064565b5060051b60200190565b600082601f8301126200121457600080fd5b815160206200122d6200122783620011dc565b620010f0565b8083825260208201915060208460051b8701019350868411156200125057600080fd5b602086015b848110156200127757620012698162001123565b835291830191830162001255565b509695505050505050565b600082601f8301126200129457600080fd5b81516020620012a76200122783620011dc565b82815260609283028501820192828201919087851115620012c757600080fd5b8387015b858110156200135a5780890382811215620012e65760008081fd5b620012f06200107a565b620012fb8362001123565b8152604080601f1984011215620013125760008081fd5b6200131c6200107a565b92506200132b88850162001123565b835283015160ff81168114620013415760008081fd5b82880152808701919091528452928401928101620012cb565b5090979650505050505050565b80516001600160401b03811681146200113b57600080fd5b805161ffff811681146200113b57600080fd5b805180151581146200113b57600080fd5b600082601f830112620013b557600080fd5b81516020620013c86200122783620011dc565b82815260059290921b84018101918181019086841115620013e857600080fd5b8286015b84811015620012775780516001600160401b03808211156200140d57600080fd5b908801906040601f19838c0381018213156200142857600080fd5b620014326200107a565b6200143f89860162001367565b815282850151848111156200145357600080fd5b8086019550508c603f8601126200146957600080fd5b8885015193506200147e6200122785620011dc565b84815260e09094028501830193898101908e8611156200149d57600080fd5b958401955b858710156200157657868f0360e0811215620014bd57600080fd5b620014c76200107a565b620014d28962001123565b815260c08683011215620014e557600080fd5b620014ef620010a5565b9150620014fe8d8a0162001140565b82526200150d878a0162001140565b8d8301526200151f60608a016200137f565b878301526200153160808a0162001140565b60608301526200154460a08a0162001140565b60808301526200155760c08a0162001392565b60a0830152808d0191909152825260e09690960195908a0190620014a2565b828b015250875250505092840192508301620013ec565b600082601f8301126200159f57600080fd5b81516020620015b26200122783620011dc565b82815260069290921b84018101918181019086841115620015d257600080fd5b8286015b84811015620012775760408189031215620015f15760008081fd5b620015fb6200107a565b620016068262001123565b81526200161585830162001367565b81860152835291830191604001620015d6565b80516001600160e01b0319811681146200113b57600080fd5b600082601f8301126200165357600080fd5b81516020620016666200122783620011dc565b82815261022092830285018201928282019190878511156200168757600080fd5b8387015b858110156200135a5780890382811215620016a65760008081fd5b620016b06200107a565b620016bb8362001367565b815261020080601f1984011215620016d35760008081fd5b620016dd620010ca565b9250620016ec88850162001392565b83526040620016fd8186016200137f565b8985015260606200171081870162001140565b82860152608091506200172582870162001140565b9085015260a06200173886820162001140565b8286015260c091506200174d8287016200137f565b9085015260e06200176086820162001140565b828601526101009150620017768287016200137f565b908501526101206200178a8682016200137f565b828601526101409150620017a08287016200137f565b90850152610160620017b486820162001140565b828601526101809150620017ca82870162001140565b908501526101a0620017de86820162001367565b828601526101c09150620017f482870162001140565b908501526101e06200180886820162001392565b828601526200181983870162001628565b9085015250508087019190915284529284019281016200168b565b6000806000806000806000610120888a0312156200185157600080fd5b6200185d898962001155565b60608901519097506001600160401b03808211156200187b57600080fd5b620018898b838c0162001202565b975060808a0151915080821115620018a057600080fd5b620018ae8b838c0162001202565b965060a08a0151915080821115620018c557600080fd5b620018d38b838c0162001282565b955060c08a0151915080821115620018ea57600080fd5b620018f88b838c01620013a3565b945060e08a01519150808211156200190f57600080fd5b6200191d8b838c016200158d565b93506101008a01519150808211156200193557600080fd5b50620019448a828b0162001641565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610200810160208301516200198a602084018261ffff169052565b506040830151620019a3604084018263ffffffff169052565b506060830151620019bc606084018263ffffffff169052565b506080830151620019d5608084018263ffffffff169052565b5060a0830151620019ec60a084018261ffff169052565b5060c083015162001a0560c084018263ffffffff169052565b5060e083015162001a1c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a080850151909116908301526101c0808401511515908301526101e0928301516001600160e01b031916929091019190915290565b8181038181111562000e7957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615c1b62001b46600039600081816102fa0152818161184d01528181611ee90152611f520152600081816102be01528181610e900152610ef001526000818161028a01528181610f190152610f890152615c1b6000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806379ba509711610104578063a69c64c0116100a2578063d63d3af211610071578063d63d3af214610a88578063d8694ccd14610a90578063f2fde38b14610aa3578063ffdb4b3714610ab657600080fd5b8063a69c64c0146109ad578063bf78e03f146109c0578063cdc73d5114610a6d578063d02641a014610a7557600080fd5b806382b49eb0116100de57806382b49eb0146107ef5780638da5cb5b1461095f57806391a2749a146109875780639ea600261461099a57600080fd5b806379ba5097146107c15780637afac322146107c9578063805f2132146107dc57600080fd5b8063407e10861161017c5780634ab35b0b1161014b5780634ab35b0b14610457578063514e8cff146104975780636def4ce71461053a578063770e2dc4146107ae57600080fd5b8063407e1086146103ee57806341ed29e714610401578063430d138c1461041457806345ac924d1461043757600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec36600461431b565b610afe565b6040519081526020015b60405180910390f35b610244610212366004614357565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb91906143d6565b6103c4610b6c565b6040516101fb91906143e9565b6101f1602481565b6103ec6103e7366004614443565b610b7d565b005b6103ec6103fc3660046145e5565b610e32565b6103ec61040f366004614717565b610e46565b6104276104223660046148f1565b610e88565b6040516101fb94939291906149e5565b61044a610445366004614a84565b611098565b6040516101fb9190614ac6565b61046a610465366004614357565b611163565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61052d6104a5366004614b41565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614b5c565b6107a1610548366004614b41565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161020081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a085015271010000000000000000000000000000000000808404881660c086015275010000000000000000000000000000000000000000008404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c0100000000000000000000000086049094166101a0820152700100000000000000000000000000000000850490911615156101c08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b166101e082015290565b6040516101fb9190614b97565b6103ec6107bc366004614dae565b61116e565b6103ec611180565b6103ec6107d73660046150c8565b61127d565b6103ec6107ea36600461512c565b61128f565b6108ff6107fd366004615198565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109953660046151c2565b611777565b6103ec6109a8366004615283565b611788565b6103ec6109bb366004615490565b611799565b610a396109ce366004614357565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101fb565b6103c46117aa565b61052d610a83366004614357565b6117b6565b6101f1601281565b6101f1610a9e366004615555565b6118fa565b6103ec610ab1366004614357565b611e04565b610ac9610ac43660046155aa565b611e15565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b0982611fa0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b3085611fa0565b610b58907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685615603565b610b62919061561a565b90505b9392505050565b6060610b78600261203a565b905090565b610b85612047565b6000610b918280615655565b9050905060005b81811015610cdb576000610bac8480615655565b83818110610bbc57610bbc6156bd565b905060400201803603810190610bd29190615718565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610cca9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b98565b506000610ceb6020840184615655565b9050905060005b81811015610e2c576000610d096020860186615655565b83818110610d1957610d196156bd565b905060400201803603810190610d2f9190615755565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e1b9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cf2565b50505050565b610e3a61208c565b610e438161210d565b50565b610e4e61208c565b60005b8151811015610e8457610e7c828281518110610e6f57610e6f6156bd565b602002602001015161220b565b600101610e51565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610ee9578a9350610f17565b610f148c8c7f0000000000000000000000000000000000000000000000000000000000000000610afe565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115610fbb576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff1690610fea8c8c846123dd565b9050806020015194506110008f8b8b8b8b612586565b92508585611080836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110b6576110b661447e565b6040519080825280602002602001820160405280156110fb57816020015b60408051808201909152600080825260208201528152602001906001900390816110d45790505b50905060005b828110156111585761113386868381811061111e5761111e6156bd565b9050602002016020810190610a839190614357565b828281518110611145576111456156bd565b6020908102919091010152600101611101565b509150505b92915050565b600061115d82611fa0565b61117661208c565b610e8482826128f3565b60015473ffffffffffffffffffffffffffffffffffffffff163314611201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610fb2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61128561208c565b610e848282612d05565b60008060006112d387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e4c92505050565b9250925092506112e533838584612e67565b60006112f385870187615778565b905060005b815181101561176c57600060076000848481518110611319576113196156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff1691508190036113da57828281518110611383576113836156bd565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fb2565b60006114236012838686815181106113f4576113f46156bd565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612fbf565b90506006600085858151811061143b5761143b6156bd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106114ad576114ad6156bd565b60200260200101516040015163ffffffff1610156115b7578383815181106114d7576114d76156bd565b6020026020010151600001518484815181106114f5576114f56156bd565b60200260200101516040015160066000878781518110611517576115176156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610fb2565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020018585815181106115f8576115f86156bd565b60200260200101516040015163ffffffff1681525060066000868681518110611623576116236156bd565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106116bb576116bb6156bd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a82868681518110611711576117116156bd565b60200260200101516040015160405161175a9291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a250506001016112f8565b505050505050505050565b61177f61208c565b610e438161308b565b61179061208c565b610e4381613217565b6117a161208c565b610e43816136bd565b6060610b78600b61203a565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f00000000000000000000000000000000000000000000000000000000000000001690611878904261583f565b10156118845792915050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff1690820152906118e9575092915050565b6118f2816137a7565b949350505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161020081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a086015271010000000000000000000000000000000000808504881660c087015275010000000000000000000000000000000000000000008504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c0100000000000000000000000088049094166101a0830152700100000000000000000000000000000000870490931615156101c08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b166101e0840152909190611b14576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fb2565b611b2f611b276080850160608601614357565b600b90613936565b611b8e57611b436080840160608501614357565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610fb2565b6000611b9d6040850185615655565b9150611bf9905082611bb26020870187615852565b905083611bbf8880615852565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061396592505050565b600080611c15611c0f6080880160608901614357565b88611e15565b9092509050600080808515611c5857611c4c878b611c3960808d0160608e01614357565b88611c4760408f018f615655565b613a0f565b91945092509050611c78565b6101a0870151611c759063ffffffff16662386f26fc10000615603565b92505b61010087015160009061ffff1615611cbc57611cb9886dffffffffffffffffffffffffffff607088901c16611cb060208e018e615852565b90508a86613ce7565b90505b61018088015160009067ffffffffffffffff16611ce5611cdf60808e018e615852565b8c613d97565b600001518563ffffffff168b60a0015161ffff168e8060200190611d099190615852565b611d14929150615603565b8c6080015163ffffffff16611d2991906158b7565b611d3391906158b7565b611d3d91906158b7565b611d57906dffffffffffffffffffffffffffff8916615603565b611d619190615603565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611d9b9190614357565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611dd69067ffffffffffffffff1689615603565b611de091906158b7565b611dea91906158b7565b611df4919061561a565b9c9b505050505050505050505050565b611e0c61208c565b610e4381613e58565b67ffffffffffffffff811660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ecd576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610fb2565b6000816020015163ffffffff1642611ee5919061583f565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611f86576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610fb2565b611f8f86611fa0565b9151919350909150505b9250929050565b600080611fac836117b6565b9050806020015163ffffffff1660001480611fe4575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612033576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fb2565b5192915050565b60606000610b6583613f4d565b612052600233613936565b61208a576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610fb2565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610fb2565b60005b8151811015610e8457600082828151811061212d5761212d6156bd565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050612110565b60006122c482600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a3906123d1908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361241e57506040805180820190915267ffffffffffffffff8216815260006020820152610b65565b600061242a84866158ca565b9050600061243b8560048189615910565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016124d857808060200190518101906124cf919061593a565b92505050610b65565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612554576040518060400160405280828060200190518101906125409190615966565b815260006020909101529250610b65915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8086166000908152600960205260409020600101546060917101000000000000000000000000000000000090910460e01b9085908111156125d2576125d261447e565b60405190808252806020026020018201604052801561260557816020015b60608152602001906001900390816125f05790505b50915060005b858110156128e8576000858583818110612627576126276156bd565b61263d9260206040909202019081019150614357565b90506000888884818110612653576126536156bd565b9050602002810190612665919061597f565b612673906040810190615852565b91505060208111156127235767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115612723576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610fb2565b612793848a8a86818110612739576127396156bd565b905060200281019061274b919061597f565b612759906020810190615852565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613fa992505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b01000000000000000000000000000000000000000000000000000000900490911691906128925781612898565b82606001515b6040805163ffffffff83166020820152919250016040516020818303038152906040528887815181106128cd576128cd6156bd565b6020026020010181905250505050505080600101905061260b565b505095945050505050565b60005b8251811015612c1c576000838281518110612913576129136156bd565b6020026020010151905060008160000151905060005b826020015151811015612c0e5760008360200151828151811061294e5761294e6156bd565b6020026020010151602001519050600084602001518381518110612974576129746156bd565b6020026020010151600001519050602063ffffffff16826080015163ffffffff1610156129f75760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610fb2565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590612bfc908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612929565b5050508060010190506128f6565b5060005b8151811015612d00576000828281518110612c3d57612c3d6156bd565b60200260200101516000015190506000838381518110612c5f57612c5f6156bd565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612c20565b505050565b60005b8251811015612da857612d3e838281518110612d2657612d266156bd565b6020026020010151600b613ffb90919063ffffffff16565b15612da057828181518110612d5557612d556156bd565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612d08565b5060005b8151811015612d0057612de2828281518110612dca57612dca6156bd565b6020026020010151600b61401d90919063ffffffff16565b15612e4457818181518110612df957612df96156bd565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101612dac565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16612fb8576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610fb2565b5050505050565b600080612fcc84866159bd565b9050600060248260ff16111561300657612fea602460ff841661583f565b612ff590600a615af6565b612fff908561561a565b905061302c565b61301460ff8316602461583f565b61301f90600a615af6565b6130299085615603565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115613082576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b81518110156131265760008282815181106130b0576130b06156bd565b602002602001015190506130ce81600261403f90919063ffffffff16565b1561311d5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101613093565b50815160005b8151811015610e2c576000828281518110613149576131496156bd565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131b9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131c4600282613ffb565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161312c565b60005b8151811015610e84576000828281518110613237576132376156bd565b602002602001015190506000838381518110613255576132556156bd565b60200260200101516000015190506000826020015190508167ffffffffffffffff166000148061328e575061016081015163ffffffff16155b806132e057506101e08101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806132ff5750806060015163ffffffff1681610160015163ffffffff16115b15613342576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610fb2565b67ffffffffffffffff821660009081526009602052604081206001015471010000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036133e6578167ffffffffffffffff167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724826040516133d99190614b97565b60405180910390a2613429565b8167ffffffffffffffff167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab20826040516134209190614b97565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c021790555090505050505080600101905061321a565b60005b8151811015610e845760008282815181106136dd576136dd6156bd565b602002602001015160000151905060008383815181106136ff576136ff6156bd565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016136c0565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138359190615b1c565b5050509150506000811215613876576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138f58373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ea9190615b6c565b866020015184612fbf565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b65565b836040015163ffffffff168311156139be5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610fb2565b836020015161ffff16821115613a00576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e2c846101e0015182613fa9565b6000808083815b81811015613cd9576000878783818110613a3257613a326156bd565b905060400201803603810190613a489190615b89565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613b68576101208d0151613b359061ffff16662386f26fc10000615603565b613b3f90886158b7565b96508c610140015186613b529190615bc2565b9550613b5f602086615bc2565b94505050613cd1565b604081015160009061ffff1615613c215760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613bc4578351613bbd90611fa0565b9050613bc7565b508a5b620186a0836040015161ffff16613c098660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661406190919063ffffffff16565b613c139190615603565b613c1d919061561a565b9150505b6060820151613c309088615bc2565b9650816080015186613c429190615bc2565b8251909650600090613c619063ffffffff16662386f26fc10000615603565b905080821015613c8057613c75818a6158b7565b985050505050613cd1565b6000836020015163ffffffff16662386f26fc10000613c9f9190615603565b905080831115613cbf57613cb3818b6158b7565b99505050505050613cd1565b613cc9838b6158b7565b995050505050505b600101613a16565b505096509650969350505050565b60008063ffffffff8316613cfd61012086615603565b613d09876101c06158b7565b613d1391906158b7565b613d1d91906158b7565b905060008760c0015163ffffffff168860e0015161ffff1683613d409190615603565b613d4a91906158b7565b61010089015190915061ffff16613d716dffffffffffffffffffffffffffff891683615603565b613d7b9190615603565b613d8b90655af3107a4000615603565b98975050505050505050565b60408051808201909152600080825260208201526000613dc3858585610160015163ffffffff166123dd565b9050826060015163ffffffff1681600001511115613e0d576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101c001518015613e2157508060200151155b15610b62576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610fb2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b606081600001805480602002602001604051908101604052809291908181526020018280548015613f9d57602002820191906000526020600020905b815481526020019060010190808311613f89575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610e8457612d008161409e565b6000610b658373ffffffffffffffffffffffffffffffffffffffff8416614151565b6000610b658373ffffffffffffffffffffffffffffffffffffffff84166141a0565b6000610b658373ffffffffffffffffffffffffffffffffffffffff841661429a565b6000670de0b6b3a7640000614094837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615603565b610b65919061561a565b600081516020146140dd57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fb291906143d6565b6000828060200190518101906140f39190615966565b905073ffffffffffffffffffffffffffffffffffffffff811180614118575061040081105b1561115d57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610fb291906143d6565b60008181526001830160205260408120546141985750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561115d565b50600061115d565b600081815260018301602052604081205480156142895760006141c460018361583f565b85549091506000906141d89060019061583f565b905080821461423d5760008660000182815481106141f8576141f86156bd565b906000526020600020015490508087600001848154811061421b5761421b6156bd565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061424e5761424e615bdf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061115d565b600091505061115d565b5092915050565b600081815260018301602052604081205480156142895760006142be60018361583f565b85549091506000906142d29060019061583f565b905081811461423d5760008660000182815481106141f8576141f86156bd565b803573ffffffffffffffffffffffffffffffffffffffff8116811461431657600080fd5b919050565b60008060006060848603121561433057600080fd5b614339846142f2565b92506020840135915061434e604085016142f2565b90509250925092565b60006020828403121561436957600080fd5b610b65826142f2565b6000815180845260005b818110156143985760208185018101518683018201520161437c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b656020830184614372565b6020808252825182820181905260009190848201906040850190845b8181101561443757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614405565b50909695505050505050565b60006020828403121561445557600080fd5b813567ffffffffffffffff81111561446c57600080fd5b820160408185031215610b6557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156144d0576144d061447e565b60405290565b60405160a0810167ffffffffffffffff811182821017156144d0576144d061447e565b60405160c0810167ffffffffffffffff811182821017156144d0576144d061447e565b604051610200810167ffffffffffffffff811182821017156144d0576144d061447e565b6040516060810167ffffffffffffffff811182821017156144d0576144d061447e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145aa576145aa61447e565b604052919050565b600067ffffffffffffffff8211156145cc576145cc61447e565b5060051b60200190565b60ff81168114610e4357600080fd5b600060208083850312156145f857600080fd5b823567ffffffffffffffff81111561460f57600080fd5b8301601f8101851361462057600080fd5b803561463361462e826145b2565b614563565b8181526060918202830184019184820191908884111561465257600080fd5b938501935b838510156146f257848903818112156146705760008081fd5b6146786144ad565b614681876142f2565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156146b55760008081fd5b6146bd6144ad565b92506146ca8989016142f2565b83528701356146d8816145d6565b828901528088019190915283529384019391850191614657565b50979650505050505050565b8015158114610e4357600080fd5b8035614316816146fe565b6000602080838503121561472a57600080fd5b823567ffffffffffffffff81111561474157600080fd5b8301601f8101851361475257600080fd5b803561476061462e826145b2565b81815260a0918202830184019184820191908884111561477f57600080fd5b938501935b838510156146f25780858a03121561479c5760008081fd5b6147a46144d6565b6147ad866142f2565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146147e25760008081fd5b818801526040868101357fffff0000000000000000000000000000000000000000000000000000000000008116811461481b5760008081fd5b90820152606061482c8782016142f2565b9082015260808681013561483f816146fe565b9082015283529384019391850191614784565b803567ffffffffffffffff8116811461431657600080fd5b60008083601f84011261487c57600080fd5b50813567ffffffffffffffff81111561489457600080fd5b602083019150836020828501011115611f9957600080fd5b60008083601f8401126148be57600080fd5b50813567ffffffffffffffff8111156148d657600080fd5b6020830191508360208260051b8501011115611f9957600080fd5b600080600080600080600080600060c08a8c03121561490f57600080fd5b6149188a614852565b985061492660208b016142f2565b975060408a0135965060608a013567ffffffffffffffff8082111561494a57600080fd5b6149568d838e0161486a565b909850965060808c013591508082111561496f57600080fd5b61497b8d838e016148ac565b909650945060a08c013591508082111561499457600080fd5b818c0191508c601f8301126149a857600080fd5b8135818111156149b757600080fd5b8d60208260061b85010111156149cc57600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614a076080840186614372565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614a73577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614a61838351614372565b94870194925090860190600101614a27565b50909b9a5050505050505050505050565b60008060208385031215614a9757600080fd5b823567ffffffffffffffff811115614aae57600080fd5b614aba858286016148ac565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614b3457614b2484835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614ae3565b5091979650505050505050565b600060208284031215614b5357600080fd5b610b6582614852565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff16908201526040810161115d565b81511515815261020081016020830151614bb7602084018261ffff169052565b506040830151614bcf604084018263ffffffff169052565b506060830151614be7606084018263ffffffff169052565b506080830151614bff608084018263ffffffff169052565b5060a0830151614c1560a084018261ffff169052565b5060c0830151614c2d60c084018263ffffffff169052565b5060e0830151614c4360e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a080850151909116908301526101c0808401511515908301526101e0808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff8116811461431657600080fd5b803561ffff8116811461431657600080fd5b600082601f830112614d2757600080fd5b81356020614d3761462e836145b2565b82815260069290921b84018101918181019086841115614d5657600080fd5b8286015b84811015614da35760408189031215614d735760008081fd5b614d7b6144ad565b614d8482614852565b8152614d918583016142f2565b81860152835291830191604001614d5a565b509695505050505050565b60008060408385031215614dc157600080fd5b67ffffffffffffffff83351115614dd757600080fd5b83601f843585010112614de957600080fd5b614df961462e84358501356145b2565b8335840180358083526020808401939260059290921b90910101861015614e1f57600080fd5b602085358601015b85358601803560051b0160200181101561502c5767ffffffffffffffff81351115614e5157600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a03011215614e8a57600080fd5b614e926144ad565b614e9e60208301614852565b815267ffffffffffffffff60408301351115614eb957600080fd5b88603f604084013584010112614ece57600080fd5b614ee461462e60206040850135850101356145b2565b6020604084810135850182810135808552928401939260e00201018b1015614f0b57600080fd5b6040808501358501015b6040858101358601602081013560e002010181101561500d5760e0818d031215614f3e57600080fd5b614f466144ad565b614f4f826142f2565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215614f8357600080fd5b614f8b6144f9565b614f9760208401614cf0565b8152614fa560408401614cf0565b6020820152614fb660608401614d04565b6040820152614fc760808401614cf0565b6060820152614fd860a08401614cf0565b6080820152614fea60c08401356146fe565b60c083013560a0820152602082810191909152908452929092019160e001614f15565b5080602084015250508085525050602083019250602081019050614e27565b5092505067ffffffffffffffff6020840135111561504957600080fd5b6150598460208501358501614d16565b90509250929050565b600082601f83011261507357600080fd5b8135602061508361462e836145b2565b8083825260208201915060208460051b8701019350868411156150a557600080fd5b602086015b84811015614da3576150bb816142f2565b83529183019183016150aa565b600080604083850312156150db57600080fd5b823567ffffffffffffffff808211156150f357600080fd5b6150ff86838701615062565b9350602085013591508082111561511557600080fd5b5061512285828601615062565b9150509250929050565b6000806000806040858703121561514257600080fd5b843567ffffffffffffffff8082111561515a57600080fd5b6151668883890161486a565b9096509450602087013591508082111561517f57600080fd5b5061518c8782880161486a565b95989497509550505050565b600080604083850312156151ab57600080fd5b6151b483614852565b9150615059602084016142f2565b6000602082840312156151d457600080fd5b813567ffffffffffffffff808211156151ec57600080fd5b908301906040828603121561520057600080fd5b6152086144ad565b82358281111561521757600080fd5b61522387828601615062565b82525060208301358281111561523857600080fd5b61524487828601615062565b60208301525095945050505050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461431657600080fd5b6000602080838503121561529657600080fd5b823567ffffffffffffffff8111156152ad57600080fd5b8301601f810185136152be57600080fd5b80356152cc61462e826145b2565b81815261022091820283018401918482019190888411156152ec57600080fd5b938501935b838510156146f2578489038181121561530a5760008081fd5b6153126144ad565b61531b87614852565b8152610200807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156153505760008081fd5b61535861451c565b925061536589890161470c565b83526040615374818a01614d04565b8a8501526060615385818b01614cf0565b8286015260809150615398828b01614cf0565b9085015260a06153a98a8201614cf0565b8286015260c091506153bc828b01614d04565b9085015260e06153cd8a8201614cf0565b8286015261010091506153e1828b01614d04565b908501526101206153f38a8201614d04565b828601526101409150615407828b01614d04565b908501526101606154198a8201614cf0565b82860152610180915061542d828b01614cf0565b908501526101a061543f8a8201614852565b828601526101c09150615453828b01614cf0565b908501526101e06154658a820161470c565b82860152615474838b01615253565b90850152505080880191909152835293840193918501916152f1565b600060208083850312156154a357600080fd5b823567ffffffffffffffff8111156154ba57600080fd5b8301601f810185136154cb57600080fd5b80356154d961462e826145b2565b81815260069190911b820183019083810190878311156154f857600080fd5b928401925b8284101561554a57604084890312156155165760008081fd5b61551e6144ad565b615527856142f2565b8152615534868601614852565b81870152825260409390930192908401906154fd565b979650505050505050565b6000806040838503121561556857600080fd5b61557183614852565b9150602083013567ffffffffffffffff81111561558d57600080fd5b830160a0818603121561559f57600080fd5b809150509250929050565b600080604083850312156155bd57600080fd5b6155c6836142f2565b915061505960208401614852565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761115d5761115d6155d4565b600082615650577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261568a57600080fd5b83018035915067ffffffffffffffff8211156156a557600080fd5b6020019150600681901b3603821315611f9957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461431657600080fd5b60006040828403121561572a57600080fd5b6157326144ad565b61573b836142f2565b8152615749602084016156ec565b60208201529392505050565b60006040828403121561576757600080fd5b61576f6144ad565b61573b83614852565b6000602080838503121561578b57600080fd5b823567ffffffffffffffff8111156157a257600080fd5b8301601f810185136157b357600080fd5b80356157c161462e826145b2565b818152606091820283018401918482019190888411156157e057600080fd5b938501935b838510156146f25780858a0312156157fd5760008081fd5b615805614540565b61580e866142f2565b815261581b8787016156ec565b87820152604061582c818801614cf0565b90820152835293840193918501916157e5565b8181038181111561115d5761115d6155d4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261588757600080fd5b83018035915067ffffffffffffffff8211156158a257600080fd5b602001915036819003821315611f9957600080fd5b8082018082111561115d5761115d6155d4565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614ce85760049490940360031b84901b1690921692915050565b6000808585111561592057600080fd5b8386111561592d57600080fd5b5050820193919092039150565b60006040828403121561594c57600080fd5b6159546144ad565b825181526020830151615749816146fe565b60006020828403121561597857600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126159b357600080fd5b9190910192915050565b60ff818116838216019081111561115d5761115d6155d4565b600181815b80851115615a2f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a1557615a156155d4565b80851615615a2257918102915b93841c93908002906159db565b509250929050565b600082615a465750600161115d565b81615a535750600061115d565b8160018114615a695760028114615a7357615a8f565b600191505061115d565b60ff841115615a8457615a846155d4565b50506001821b61115d565b5060208310610133831016604e8410600b8410161715615ab2575081810a61115d565b615abc83836159d6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aee57615aee6155d4565b029392505050565b6000610b658383615a37565b805169ffffffffffffffffffff8116811461431657600080fd5b600080600080600060a08688031215615b3457600080fd5b615b3d86615b02565b9450602086015193506040860151925060608601519150615b6060808701615b02565b90509295509295909350565b600060208284031215615b7e57600080fd5b8151610b65816145d6565b600060408284031215615b9b57600080fd5b615ba36144ad565b615bac836142f2565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614293576142936155d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var FeeQuoterABI = FeeQuoterMetaData.ABI @@ -294,6 +294,50 @@ func (_FeeQuoter *FeeQuoterTransactorRaw) Transact(opts *bind.TransactOpts, meth return _FeeQuoter.Contract.contract.Transact(opts, method, params...) } +func (_FeeQuoter *FeeQuoterCaller) FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "FEE_BASE_DECIMALS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) FEEBASEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.FEEBASEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) FEEBASEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.FEEBASEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "KEYSTONE_PRICE_DECIMALS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) KEYSTONEPRICEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.KEYSTONEPRICEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) KEYSTONEPRICEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.KEYSTONEPRICEDECIMALS(&_FeeQuoter.CallOpts) +} + func (_FeeQuoter *FeeQuoterCaller) ConvertTokenAmount(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) { var out []interface{} err := _FeeQuoter.contract.Call(opts, &out, "convertTokenAmount", fromToken, fromTokenAmount, toToken) @@ -500,25 +544,25 @@ func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPrice(token common.Address) (I return _FeeQuoter.Contract.GetTokenPrice(&_FeeQuoter.CallOpts, token) } -func (_FeeQuoter *FeeQuoterCaller) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (IFeeQuoterTokenPriceFeedConfig, error) { +func (_FeeQuoter *FeeQuoterCaller) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { var out []interface{} err := _FeeQuoter.contract.Call(opts, &out, "getTokenPriceFeedConfig", token) if err != nil { - return *new(IFeeQuoterTokenPriceFeedConfig), err + return *new(FeeQuoterTokenPriceFeedConfig), err } - out0 := *abi.ConvertType(out[0], new(IFeeQuoterTokenPriceFeedConfig)).(*IFeeQuoterTokenPriceFeedConfig) + out0 := *abi.ConvertType(out[0], new(FeeQuoterTokenPriceFeedConfig)).(*FeeQuoterTokenPriceFeedConfig) return out0, err } -func (_FeeQuoter *FeeQuoterSession) GetTokenPriceFeedConfig(token common.Address) (IFeeQuoterTokenPriceFeedConfig, error) { +func (_FeeQuoter *FeeQuoterSession) GetTokenPriceFeedConfig(token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { return _FeeQuoter.Contract.GetTokenPriceFeedConfig(&_FeeQuoter.CallOpts, token) } -func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPriceFeedConfig(token common.Address) (IFeeQuoterTokenPriceFeedConfig, error) { +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPriceFeedConfig(token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { return _FeeQuoter.Contract.GetTokenPriceFeedConfig(&_FeeQuoter.CallOpts, token) } @@ -632,11 +676,11 @@ func (_FeeQuoter *FeeQuoterCallerSession) Owner() (common.Address, error) { return _FeeQuoter.Contract.Owner(&_FeeQuoter.CallOpts) } -func (_FeeQuoter *FeeQuoterCaller) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte) (ProcessMessageArgs, +func (_FeeQuoter *FeeQuoterCaller) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) (ProcessMessageArgs, error) { var out []interface{} - err := _FeeQuoter.contract.Call(opts, &out, "processMessageArgs", destChainSelector, feeToken, feeTokenAmount, extraArgs) + err := _FeeQuoter.contract.Call(opts, &out, "processMessageArgs", destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) outstruct := new(ProcessMessageArgs) if err != nil { @@ -646,43 +690,22 @@ func (_FeeQuoter *FeeQuoterCaller) ProcessMessageArgs(opts *bind.CallOpts, destC outstruct.MsgFeeJuels = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) outstruct.IsOutOfOrderExecution = *abi.ConvertType(out[1], new(bool)).(*bool) outstruct.ConvertedExtraArgs = *abi.ConvertType(out[2], new([]byte)).(*[]byte) + outstruct.DestExecDataPerToken = *abi.ConvertType(out[3], new([][]byte)).(*[][]byte) return *outstruct, err } -func (_FeeQuoter *FeeQuoterSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte) (ProcessMessageArgs, +func (_FeeQuoter *FeeQuoterSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) (ProcessMessageArgs, error) { - return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs) + return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) } -func (_FeeQuoter *FeeQuoterCallerSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte) (ProcessMessageArgs, +func (_FeeQuoter *FeeQuoterCallerSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) (ProcessMessageArgs, error) { - return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs) -} - -func (_FeeQuoter *FeeQuoterCaller) ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, rampTokenAmounts []InternalRampTokenAmount, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { - var out []interface{} - err := _FeeQuoter.contract.Call(opts, &out, "processPoolReturnData", destChainSelector, rampTokenAmounts, sourceTokenAmounts) - - if err != nil { - return *new([][]byte), err - } - - out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) - - return out0, err - -} - -func (_FeeQuoter *FeeQuoterSession) ProcessPoolReturnData(destChainSelector uint64, rampTokenAmounts []InternalRampTokenAmount, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { - return _FeeQuoter.Contract.ProcessPoolReturnData(&_FeeQuoter.CallOpts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) -} - -func (_FeeQuoter *FeeQuoterCallerSession) ProcessPoolReturnData(destChainSelector uint64, rampTokenAmounts []InternalRampTokenAmount, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { - return _FeeQuoter.Contract.ProcessPoolReturnData(&_FeeQuoter.CallOpts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) + return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) } func (_FeeQuoter *FeeQuoterCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -2045,7 +2068,7 @@ func (it *FeeQuoterPriceFeedPerTokenUpdatedIterator) Close() error { type FeeQuoterPriceFeedPerTokenUpdated struct { Token common.Address - PriceFeedConfig IFeeQuoterTokenPriceFeedConfig + PriceFeedConfig FeeQuoterTokenPriceFeedConfig Raw types.Log } @@ -2778,6 +2801,7 @@ type ProcessMessageArgs struct { MsgFeeJuels *big.Int IsOutOfOrderExecution bool ConvertedExtraArgs []byte + DestExecDataPerToken [][]byte } func (_FeeQuoter *FeeQuoter) ParseLog(log types.Log) (generated.AbigenLog, error) { @@ -2883,6 +2907,10 @@ func (_FeeQuoter *FeeQuoter) Address() common.Address { } type FeeQuoterInterface interface { + FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) + + KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) + ConvertTokenAmount(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) @@ -2903,7 +2931,7 @@ type FeeQuoterInterface interface { GetTokenPrice(opts *bind.CallOpts, token common.Address) (InternalTimestampedPackedUint224, error) - GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (IFeeQuoterTokenPriceFeedConfig, error) + GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (FeeQuoterTokenPriceFeedConfig, error) GetTokenPrices(opts *bind.CallOpts, tokens []common.Address) ([]InternalTimestampedPackedUint224, error) @@ -2915,12 +2943,10 @@ type FeeQuoterInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte) (ProcessMessageArgs, + ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) (ProcessMessageArgs, error) - ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, rampTokenAmounts []InternalRampTokenAmount, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go b/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go index 1d95e757781..5b482517191 100644 --- a/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go +++ b/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go @@ -43,28 +43,36 @@ type InternalAny2EVMRampMessage struct { Data []byte Receiver common.Address GasLimit *big.Int - TokenAmounts []InternalRampTokenAmount + TokenAmounts []InternalAny2EVMTokenTransfer } -type InternalRampMessageHeader struct { - MessageId [32]byte - SourceChainSelector uint64 - DestChainSelector uint64 - SequenceNumber uint64 - Nonce uint64 +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address DestTokenAddress []byte ExtraData []byte Amount *big.Int DestExecData []byte } +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + var MessageHasherMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"decodeEVMExtraArgsV1\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"decodeEVMExtraArgsV2\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV1\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV2\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafDomainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"implicitMetadataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"fixedSizeFieldsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAmountsHash\",\"type\":\"bytes32\"}],\"name\":\"encodeFinalHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"encodeFixedSizeFieldsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"any2EVMMessageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"name\":\"encodeMetadataHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"encodeTokenAmountsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50610e08806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a91d3aeb11610076578063c63641bd1161005b578063c63641bd1461019e578063c7ca9a18146101f5578063e733d2091461020857600080fd5b8063a91d3aeb14610150578063b17df7141461016357600080fd5b80632d6d4c5e146100a85780632efb5ac2146100d157806399df8d05146100f2578063a1e747df1461013d575b600080fd5b6100bb6100b63660046107ff565b61021b565b6040516100c891906108a0565b60405180910390f35b6100e46100df36600461095e565b610244565b6040519081526020016100c8565b6100bb610100366004610a68565b604080516020810196909652858101949094526060850192909252608084015260a0808401919091528151808403909101815260c0909201905290565b6100bb61014b366004610aa3565b610257565b6100bb61015e366004610b0b565b610289565b61018f610171366004610b8c565b60408051602080820183526000909152815190810190915290815290565b604051905181526020016100c8565b6101d86101ac366004610bb5565b604080518082019091526000808252602082015250604080518082019091529182521515602082015290565b6040805182518152602092830151151592810192909252016100c8565b6100bb610203366004610be1565b6102c1565b6100bb610216366004610c35565b6102d2565b60608160405160200161022e9190610c77565b6040516020818303038152906040529050919050565b600061025083836102dd565b9392505050565b6060848484846040516020016102709493929190610d5e565b6040516020818303038152906040529050949350505050565b60608686868686866040516020016102a696959493929190610d9b565b60405160208183030381529060405290509695505050505050565b60606102cc8261043a565b92915050565b60606102cc826104fc565b815160208082015160409283015192516000938493610323937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101610d5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052805160209182012086518051888401516060808b0151908401516080808d0151950151959761038a9794969395929491939101610d9b565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016103c19190610c77565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c00160405160208183030381529060405280519060200120905092915050565b604051815160248201526020820151151560448201526060907f181dcf1000000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915292915050565b604051815160248201526060907f97a657c90000000000000000000000000000000000000000000000000000000090604401610479565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561058557610585610533565b60405290565b60405160c0810167ffffffffffffffff8111828210171561058557610585610533565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156105f5576105f5610533565b604052919050565b600082601f83011261060e57600080fd5b813567ffffffffffffffff81111561062857610628610533565b61065960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016105ae565b81815284602083860101111561066e57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261069c57600080fd5b8135602067ffffffffffffffff808311156106b9576106b9610533565b8260051b6106c88382016105ae565b93845285810183019383810190888611156106e257600080fd5b84880192505b858310156107f3578235848111156107005760008081fd5b880160a0818b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018113156107365760008081fd5b61073e610562565b87830135878111156107505760008081fd5b61075e8d8a838701016105fd565b825250604080840135888111156107755760008081fd5b6107838e8b838801016105fd565b8a840152506060808501358981111561079c5760008081fd5b6107aa8f8c838901016105fd565b838501525060809150818501358184015250828401359250878311156107d05760008081fd5b6107de8d8a858701016105fd565b908201528452505091840191908401906106e8565b98975050505050505050565b60006020828403121561081157600080fd5b813567ffffffffffffffff81111561082857600080fd5b6108348482850161068b565b949350505050565b6000815180845260005b8181101561086257602081850181015186830182015201610846565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610250602083018461083c565b803567ffffffffffffffff811681146108cb57600080fd5b919050565b600060a082840312156108e257600080fd5b6108ea610562565b9050813581526108fc602083016108b3565b602082015261090d604083016108b3565b604082015261091e606083016108b3565b606082015261092f608083016108b3565b608082015292915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108cb57600080fd5b6000806040838503121561097157600080fd5b823567ffffffffffffffff8082111561098957600080fd5b90840190610140828703121561099e57600080fd5b6109a661058b565b6109b087846108d0565b815260a0830135828111156109c457600080fd5b6109d0888286016105fd565b60208301525060c0830135828111156109e857600080fd5b6109f4888286016105fd565b604083015250610a0660e0840161093a565b6060820152610100830135608082015261012083013582811115610a2957600080fd5b610a358882860161068b565b60a08301525093506020850135915080821115610a5157600080fd5b50610a5e858286016105fd565b9150509250929050565b600080600080600060a08688031215610a8057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060808587031215610ab957600080fd5b84359350610ac9602086016108b3565b9250610ad7604086016108b3565b9150606085013567ffffffffffffffff811115610af357600080fd5b610aff878288016105fd565b91505092959194509250565b60008060008060008060c08789031215610b2457600080fd5b86359550602087013567ffffffffffffffff811115610b4257600080fd5b610b4e89828a016105fd565b955050610b5d6040880161093a565b9350610b6b606088016108b3565b925060808701359150610b8060a088016108b3565b90509295509295509295565b600060208284031215610b9e57600080fd5b5035919050565b803580151581146108cb57600080fd5b60008060408385031215610bc857600080fd5b82359150610bd860208401610ba5565b90509250929050565b600060408284031215610bf357600080fd5b6040516040810181811067ffffffffffffffff82111715610c1657610c16610533565b60405282358152610c2960208401610ba5565b60208201529392505050565b600060208284031215610c4757600080fd5b6040516020810181811067ffffffffffffffff82111715610c6a57610c6a610533565b6040529135825250919050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015610d50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160a08151818652610ce48287018261083c565b915050888201518582038a870152610cfc828261083c565b9150508782015185820389870152610d14828261083c565b915050606080830151818701525060808083015192508582038187015250610d3c818361083c565b968901969450505090860190600101610ca0565b509098975050505050505050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152610d91608083018461083c565b9695505050505050565b86815260c060208201526000610db460c083018861083c565b73ffffffffffffffffffffffffffffffffffffffff9690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a0909101529291505056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"decodeEVMExtraArgsV1\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"decodeEVMExtraArgsV2\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"encodeAny2EVMTokenAmountsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmount\",\"type\":\"tuple[]\"}],\"name\":\"encodeEVM2AnyTokenAmountsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV1\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV2\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafDomainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"metaDataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"fixedSizeFieldsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"senderHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAmountsHash\",\"type\":\"bytes32\"}],\"name\":\"encodeFinalHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"encodeFixedSizeFieldsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"any2EVMMessageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"onRampHash\",\"type\":\"bytes32\"}],\"name\":\"encodeMetadataHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b50611053806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063bf0619ad11610076578063c7ca9a181161005b578063c7ca9a1814610273578063e04767b814610286578063e733d2091461029957600080fd5b8063bf0619ad146101c9578063c63641bd1461021c57600080fd5b806394b6624b116100a757806394b6624b14610168578063ae5663d71461017b578063b17df7141461018e57600080fd5b80633ec7c377146100c35780638503839d14610147575b600080fd5b6101316100d136600461065b565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff949094168585015267ffffffffffffffff928316606086015260808501919091521660a0808401919091528151808403909101815260c0909201905290565b60405161013e9190610716565b60405180910390f35b61015a610155366004610a5b565b6102ac565b60405190815260200161013e565b610131610176366004610b65565b610343565b610131610189366004610cd5565b61036c565b6101ba61019c366004610d12565b60408051602080820183526000909152815190810190915290815290565b6040519051815260200161013e565b6101316101d7366004610d2b565b604080516020810197909752868101959095526060860193909352608085019190915260a084015260c0808401919091528151808403909101815260e0909201905290565b61025661022a366004610d7e565b604080518082019091526000808252602082015250604080518082019091529182521515602082015290565b60408051825181526020928301511515928101929092520161013e565b610131610281366004610daa565b61037f565b610131610294366004610dfe565b610390565b6101316102a7366004610e42565b6103e3565b600061033c837f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f8560000151602001518660000151604001518680519060200120604051602001610321949392919093845267ffffffffffffffff928316602085015291166040830152606082015260800190565b604051602081830303815290604052805190602001206103ee565b9392505050565b6060816040516020016103569190610e84565b6040516020818303038152906040529050919050565b6060816040516020016103569190610f71565b606061038a82610521565b92915050565b6060848484846040516020016103ca949392919093845267ffffffffffffffff928316602085015291166040830152606082015260800190565b6040516020818303038152906040529050949350505050565b606061038a826105e3565b815180516060808501519083015160808087015194015160405160009586958895610460959194909391929160200194855273ffffffffffffffffffffffffffffffffffffffff93909316602085015267ffffffffffffffff9182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016104a39190610f71565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b604051815160248201526020820151151560448201526060907f181dcf1000000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915292915050565b604051815160248201526060907f97a657c90000000000000000000000000000000000000000000000000000000090604401610560565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063e57600080fd5b919050565b803567ffffffffffffffff8116811461063e57600080fd5b600080600080600060a0868803121561067357600080fd5b853594506106836020870161061a565b935061069160408701610643565b9250606086013591506106a660808701610643565b90509295509295909350565b6000815180845260005b818110156106d8576020818501810151868301820152016106bc565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061033c60208301846106b2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561077b5761077b610729565b60405290565b60405160c0810167ffffffffffffffff8111828210171561077b5761077b610729565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107eb576107eb610729565b604052919050565b600060a0828403121561080557600080fd5b61080d610758565b90508135815261081f60208301610643565b602082015261083060408301610643565b604082015261084160608301610643565b606082015261085260808301610643565b608082015292915050565b600082601f83011261086e57600080fd5b813567ffffffffffffffff81111561088857610888610729565b6108b960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016107a4565b8181528460208386010111156108ce57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561090557610905610729565b5060051b60200190565b600082601f83011261092057600080fd5b81356020610935610930836108eb565b6107a4565b82815260059290921b8401810191818101908684111561095457600080fd5b8286015b84811015610a5057803567ffffffffffffffff808211156109795760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156109b25760008081fd5b6109ba610758565b87840135838111156109cc5760008081fd5b6109da8d8a8388010161085d565b82525060406109ea81860161061a565b8983015260608086013563ffffffff81168114610a075760008081fd5b808385015250608091508186013585811115610a235760008081fd5b610a318f8c838a010161085d565b9184019190915250919093013590830152508352918301918301610958565b509695505050505050565b60008060408385031215610a6e57600080fd5b823567ffffffffffffffff80821115610a8657600080fd5b908401906101408287031215610a9b57600080fd5b610aa3610781565b610aad87846107f3565b815260a083013582811115610ac157600080fd5b610acd8882860161085d565b60208301525060c083013582811115610ae557600080fd5b610af18882860161085d565b604083015250610b0360e0840161061a565b6060820152610100830135608082015261012083013582811115610b2657600080fd5b610b328882860161090f565b60a08301525093506020850135915080821115610b4e57600080fd5b50610b5b8582860161085d565b9150509250929050565b60006020808385031215610b7857600080fd5b823567ffffffffffffffff80821115610b9057600080fd5b818501915085601f830112610ba457600080fd5b8135610bb2610930826108eb565b81815260059190911b83018401908481019088831115610bd157600080fd5b8585015b83811015610cc857803585811115610bec57600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610c215760008081fd5b610c29610758565b610c3489830161061a565b815260408083013588811115610c4a5760008081fd5b610c588e8c8387010161085d565b8b8401525060608084013589811115610c715760008081fd5b610c7f8f8d8388010161085d565b83850152506080915081840135818401525060a083013588811115610ca45760008081fd5b610cb28e8c8387010161085d565b9183019190915250845250918601918601610bd5565b5098975050505050505050565b600060208284031215610ce757600080fd5b813567ffffffffffffffff811115610cfe57600080fd5b610d0a8482850161090f565b949350505050565b600060208284031215610d2457600080fd5b5035919050565b60008060008060008060c08789031215610d4457600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b8035801515811461063e57600080fd5b60008060408385031215610d9157600080fd5b82359150610da160208401610d6e565b90509250929050565b600060408284031215610dbc57600080fd5b6040516040810181811067ffffffffffffffff82111715610ddf57610ddf610729565b60405282358152610df260208401610d6e565b60208201529392505050565b60008060008060808587031215610e1457600080fd5b84359350610e2460208601610643565b9250610e3260408601610643565b9396929550929360600135925050565b600060208284031215610e5457600080fd5b6040516020810181811067ffffffffffffffff82111715610e7757610e77610729565b6040529135825250919050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015610f63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160a073ffffffffffffffffffffffffffffffffffffffff825116855288820151818a870152610f0f828701826106b2565b9150508782015185820389870152610f2782826106b2565b915050606080830151818701525060808083015192508582038187015250610f4f81836106b2565b968901969450505090860190600101610ead565b509098975050505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015610f63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160a08151818652610fde828701826106b2565b91505073ffffffffffffffffffffffffffffffffffffffff89830151168986015263ffffffff8883015116888601526060808301518683038288015261102483826106b2565b6080948501519790940196909652505094870194925090860190600101610f9a56fea164736f6c6343000818000a", } var MessageHasherABI = MessageHasherMetaData.ABI @@ -247,9 +255,9 @@ func (_MessageHasher *MessageHasherCallerSession) DecodeEVMExtraArgsV2(gasLimit return _MessageHasher.Contract.DecodeEVMExtraArgsV2(&_MessageHasher.CallOpts, gasLimit, allowOutOfOrderExecution) } -func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV1) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeAny2EVMTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV1", extraArgs) + err := _MessageHasher.contract.Call(opts, &out, "encodeAny2EVMTokenAmountsHashPreimage", tokenAmounts) if err != nil { return *new([]byte), err @@ -261,17 +269,17 @@ func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV1(opts *bind.CallO } -func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { - return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +func (_MessageHasher *MessageHasherSession) EncodeAny2EVMTokenAmountsHashPreimage(tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeAny2EVMTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmounts) } -func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { - return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +func (_MessageHasher *MessageHasherCallerSession) EncodeAny2EVMTokenAmountsHashPreimage(tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeAny2EVMTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmounts) } -func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV2(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV2) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeEVM2AnyTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV2", extraArgs) + err := _MessageHasher.contract.Call(opts, &out, "encodeEVM2AnyTokenAmountsHashPreimage", tokenAmount) if err != nil { return *new([]byte), err @@ -283,17 +291,39 @@ func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV2(opts *bind.CallO } -func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { - return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) +func (_MessageHasher *MessageHasherSession) EncodeEVM2AnyTokenAmountsHashPreimage(tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVM2AnyTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmount) } -func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { - return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) +func (_MessageHasher *MessageHasherCallerSession) EncodeEVM2AnyTokenAmountsHashPreimage(tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVM2AnyTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmount) } -func (_MessageHasher *MessageHasherCaller) EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, implicitMetadataHash [32]byte, fixedSizeFieldsHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV1) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeFinalHashPreimage", leafDomainSeparator, implicitMetadataHash, fixedSizeFieldsHash, dataHash, tokenAmountsHash) + err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV1", extraArgs) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV2(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV2", extraArgs) if err != nil { return *new([]byte), err @@ -305,17 +335,17 @@ func (_MessageHasher *MessageHasherCaller) EncodeFinalHashPreimage(opts *bind.Ca } -func (_MessageHasher *MessageHasherSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, implicitMetadataHash [32]byte, fixedSizeFieldsHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { - return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, implicitMetadataHash, fixedSizeFieldsHash, dataHash, tokenAmountsHash) +func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) } -func (_MessageHasher *MessageHasherCallerSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, implicitMetadataHash [32]byte, fixedSizeFieldsHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { - return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, implicitMetadataHash, fixedSizeFieldsHash, dataHash, tokenAmountsHash) +func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) } -func (_MessageHasher *MessageHasherCaller) EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, sender []byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeFixedSizeFieldsHashPreimage", messageId, sender, receiver, sequenceNumber, gasLimit, nonce) + err := _MessageHasher.contract.Call(opts, &out, "encodeFinalHashPreimage", leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) if err != nil { return *new([]byte), err @@ -327,17 +357,17 @@ func (_MessageHasher *MessageHasherCaller) EncodeFixedSizeFieldsHashPreimage(opt } -func (_MessageHasher *MessageHasherSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, sender []byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { - return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, sender, receiver, sequenceNumber, gasLimit, nonce) +func (_MessageHasher *MessageHasherSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) } -func (_MessageHasher *MessageHasherCallerSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, sender []byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { - return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, sender, receiver, sequenceNumber, gasLimit, nonce) +func (_MessageHasher *MessageHasherCallerSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) } -func (_MessageHasher *MessageHasherCaller) EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRamp []byte) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeMetadataHashPreimage", any2EVMMessageHash, sourceChainSelector, destChainSelector, onRamp) + err := _MessageHasher.contract.Call(opts, &out, "encodeFixedSizeFieldsHashPreimage", messageId, receiver, sequenceNumber, gasLimit, nonce) if err != nil { return *new([]byte), err @@ -349,17 +379,17 @@ func (_MessageHasher *MessageHasherCaller) EncodeMetadataHashPreimage(opts *bind } -func (_MessageHasher *MessageHasherSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRamp []byte) ([]byte, error) { - return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRamp) +func (_MessageHasher *MessageHasherSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { + return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, receiver, sequenceNumber, gasLimit, nonce) } -func (_MessageHasher *MessageHasherCallerSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRamp []byte) ([]byte, error) { - return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRamp) +func (_MessageHasher *MessageHasherCallerSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { + return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, receiver, sequenceNumber, gasLimit, nonce) } -func (_MessageHasher *MessageHasherCaller) EncodeTokenAmountsHashPreimage(opts *bind.CallOpts, rampTokenAmounts []InternalRampTokenAmount) ([]byte, error) { +func (_MessageHasher *MessageHasherCaller) EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { var out []interface{} - err := _MessageHasher.contract.Call(opts, &out, "encodeTokenAmountsHashPreimage", rampTokenAmounts) + err := _MessageHasher.contract.Call(opts, &out, "encodeMetadataHashPreimage", any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) if err != nil { return *new([]byte), err @@ -371,12 +401,12 @@ func (_MessageHasher *MessageHasherCaller) EncodeTokenAmountsHashPreimage(opts * } -func (_MessageHasher *MessageHasherSession) EncodeTokenAmountsHashPreimage(rampTokenAmounts []InternalRampTokenAmount) ([]byte, error) { - return _MessageHasher.Contract.EncodeTokenAmountsHashPreimage(&_MessageHasher.CallOpts, rampTokenAmounts) +func (_MessageHasher *MessageHasherSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) } -func (_MessageHasher *MessageHasherCallerSession) EncodeTokenAmountsHashPreimage(rampTokenAmounts []InternalRampTokenAmount) ([]byte, error) { - return _MessageHasher.Contract.EncodeTokenAmountsHashPreimage(&_MessageHasher.CallOpts, rampTokenAmounts) +func (_MessageHasher *MessageHasherCallerSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) } func (_MessageHasher *MessageHasherCaller) Hash(opts *bind.CallOpts, message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) { @@ -410,17 +440,19 @@ type MessageHasherInterface interface { DecodeEVMExtraArgsV2(opts *bind.CallOpts, gasLimit *big.Int, allowOutOfOrderExecution bool) (ClientEVMExtraArgsV2, error) + EncodeAny2EVMTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) + + EncodeEVM2AnyTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) + EncodeEVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV1) ([]byte, error) EncodeEVMExtraArgsV2(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV2) ([]byte, error) - EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, implicitMetadataHash [32]byte, fixedSizeFieldsHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) - - EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, sender []byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) + EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) - EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRamp []byte) ([]byte, error) + EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) - EncodeTokenAmountsHashPreimage(opts *bind.CallOpts, rampTokenAmounts []InternalRampTokenAmount) ([]byte, error) + EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) Hash(opts *bind.CallOpts, message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) diff --git a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go index 285aaaa338a..bd0cb8898df 100644 --- a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go +++ b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go @@ -59,7 +59,7 @@ type MultiOCR3BaseOracle struct { var MultiOCR3HelperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"AfterConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"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\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"getOracle\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"enumMultiOCR3Base.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"structMultiOCR3Base.Oracle\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"setTransmitOcrPluginType\",\"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\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmitWithSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"transmitWithoutSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000a9565b5050466080525062000154565b336001600160a01b03821603620001035760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b608051611d386200017760003960008181610ef00152610f3c0152611d386000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637ac0aa1a11610076578063c673e5841161005b578063c673e584146101c5578063f2fde38b146101e5578063f716f99f146101f857600080fd5b80637ac0aa1a1461015b5780638da5cb5b1461019d57600080fd5b806334a9c92e116100a757806334a9c92e1461012057806344e65e551461014057806379ba50971461015357600080fd5b8063181f5a77146100c357806326bf9d261461010b575b600080fd5b604080518082018252601981527f4d756c74694f4352334261736548656c70657220312e302e30000000000000006020820152905161010291906114dd565b60405180910390f35b61011e6101193660046115a4565b61020b565b005b61013361012e366004611632565b61023a565b6040516101029190611694565b61011e61014e366004611707565b6102ca565b61011e61034d565b61011e6101693660046117ba565b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101d86101d33660046117ba565b61044f565b604051610102919061182e565b61011e6101f33660046118c1565b6105c7565b61011e610206366004611a2d565b6105db565b604080516000808252602082019092526004549091506102349060ff168585858580600061061d565b50505050565b6040805180820182526000808252602080830182905260ff86811683526003825284832073ffffffffffffffffffffffffffffffffffffffff871684528252918490208451808601909552805480841686529394939092918401916101009091041660028111156102ad576102ad611665565b60028111156102be576102be611665565b90525090505b92915050565b60045460408051602080880282810182019093528782526103439360ff16928c928c928c928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a925061061d915050565b5050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6104926040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561054857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161051d575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156105b757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161058c575b5050505050815250509050919050565b6105cf6109a1565b6105d881610a24565b50565b6105e36109a1565b60005b81518110156106195761061182828151811061060457610604611b96565b6020026020010151610b19565b6001016105e6565b5050565b60ff8781166000908152600260209081526040808320815160808101835281548152600190910154808616938201939093526101008304851691810191909152620100009091049092161515606083015287359061067c8760a4611bf4565b90508260600151156106c4578451610695906020611c07565b86516106a2906020611c07565b6106ad9060a0611bf4565b6106b79190611bf4565b6106c19082611bf4565b90505b368114610706576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016103ca565b508151811461074e5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016103ca565b610756610eed565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156107a4576107a4611665565b60028111156107b5576107b5611665565b90525090506002816020015160028111156107d2576107d2611665565b1480156108335750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061080e5761080e611b96565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b610869576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561094b576020820151610884906001611c1e565b60ff168551146108c0576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146108fb576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000878760405161090d929190611c37565b604051908190038120610924918b90602001611c47565b6040516020818303038152906040528051906020012090506109498a82888888610f6e565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016103ca565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016103ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003610b5d5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003610bca57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055610c1f565b6060840151600182015460ff6201000090910416151590151514610c1f576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016103ca565b60a084015180516101001015610c645760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b610cd78484600301805480602002602001604051908101604052809291908181526020018280548015610ccd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca2575b505050505061117e565b846060015115610e3d57610d528484600201805480602002602001604051908101604052809291908181526020018280548015610ccd5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca257505050505061117e565b608085015180516101001015610d975760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b6040860151610da7906003611c75565b60ff16815111610de65760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841602179055610e2e906002860190602084019061143e565b50610e3b85826001611216565b505b610e4984826002611216565b8051610e5e906003850190602084019061143e565b506040858101516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793610ed59389939260028a01929190611c98565b60405180910390a1610ee684611405565b5050505050565b467f000000000000000000000000000000000000000000000000000000000000000014610a22576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016103ca565b8251600090815b81811015610343576000600188868460208110610f9457610f94611b96565b610fa191901a601b611c1e565b898581518110610fb357610fb3611b96565b6020026020010151898681518110610fcd57610fcd611b96565b60200260200101516040516000815260200160405260405161100b949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561102d573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff8516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156110b9576110b9611665565b60028111156110ca576110ca611665565b90525090506001816020015160028111156110e7576110e7611665565b1461111e576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615611161576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050610f75565b60005b81518110156112115760ff8316600090815260036020526040812083519091908490849081106111b3576111b3611b96565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101611181565b505050565b60005b825181101561023457600083828151811061123657611236611b96565b602002602001015190506000600281111561125357611253611665565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561129f5761129f611665565b146112d95760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b73ffffffffffffffffffffffffffffffffffffffff8116611326576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561134c5761134c611665565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156113f1576113f1611665565b021790555090505050806001019050611219565b60405160ff821681527f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b539060200160405180910390a150565b8280548282559060005260206000209081019282156114b8579160200282015b828111156114b857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061145e565b506114c49291506114c8565b5090565b5b808211156114c457600081556001016114c9565b60006020808352835180602085015260005b8181101561150b578581018301518582016040015282016114ef565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b80606081018310156102c457600080fd5b60008083601f84011261156d57600080fd5b50813567ffffffffffffffff81111561158557600080fd5b60208301915083602082850101111561159d57600080fd5b9250929050565b6000806000608084860312156115b957600080fd5b6115c3858561154a565b9250606084013567ffffffffffffffff8111156115df57600080fd5b6115eb8682870161155b565b9497909650939450505050565b803560ff8116811461160957600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461160957600080fd5b6000806040838503121561164557600080fd5b61164e836115f8565b915061165c6020840161160e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815160ff16815260208201516040820190600381106116b5576116b5611665565b8060208401525092915050565b60008083601f8401126116d457600080fd5b50813567ffffffffffffffff8111156116ec57600080fd5b6020830191508360208260051b850101111561159d57600080fd5b60008060008060008060008060e0898b03121561172357600080fd5b61172d8a8a61154a565b9750606089013567ffffffffffffffff8082111561174a57600080fd5b6117568c838d0161155b565b909950975060808b013591508082111561176f57600080fd5b61177b8c838d016116c2565b909750955060a08b013591508082111561179457600080fd5b506117a18b828c016116c2565b999c989b50969995989497949560c00135949350505050565b6000602082840312156117cc57600080fd5b6117d5826115f8565b9392505050565b60008151808452602080850194506020840160005b8381101561182357815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016117f1565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a084015261187d60e08401826117dc565b905060408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c08501526118b882826117dc565b95945050505050565b6000602082840312156118d357600080fd5b6117d58261160e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561192e5761192e6118dc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561197b5761197b6118dc565b604052919050565b600067ffffffffffffffff82111561199d5761199d6118dc565b5060051b60200190565b8035801515811461160957600080fd5b600082601f8301126119c857600080fd5b813560206119dd6119d883611983565b611934565b8083825260208201915060208460051b8701019350868411156119ff57600080fd5b602086015b84811015611a2257611a158161160e565b8352918301918301611a04565b509695505050505050565b60006020808385031215611a4057600080fd5b823567ffffffffffffffff80821115611a5857600080fd5b818501915085601f830112611a6c57600080fd5b8135611a7a6119d882611983565b81815260059190911b83018401908481019088831115611a9957600080fd5b8585015b83811015611b8957803585811115611ab457600080fd5b860160c0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215611ae95760008081fd5b611af161190b565b8882013581526040611b048184016115f8565b8a8301526060611b158185016115f8565b8284015260809150611b288285016119a7565b9083015260a08381013589811115611b405760008081fd5b611b4e8f8d838801016119b7565b838501525060c0840135915088821115611b685760008081fd5b611b768e8c848701016119b7565b9083015250845250918601918601611a9d565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102c4576102c4611bc5565b80820281158282048414176102c4576102c4611bc5565b60ff81811683821601908111156102c4576102c4611bc5565b8183823760009101908152919050565b828152606082602083013760800192915050565b6020810160058310611c6f57611c6f611665565b91905290565b60ff8181168382160290811690818114611c9157611c91611bc5565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015611cff57845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201611ccd565b50508481036060860152611d1381886117dc565b935050505060ff83166080830152969550505050505056fea164736f6c6343000818000a", + Bin: "0x60a06040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000a9565b5050466080525062000154565b336001600160a01b03821603620001035760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b608051611db56200017760003960008181610f6d0152610fb90152611db56000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637ac0aa1a11610076578063c673e5841161005b578063c673e584146101c5578063f2fde38b146101e5578063f716f99f146101f857600080fd5b80637ac0aa1a1461015b5780638da5cb5b1461019d57600080fd5b806334a9c92e116100a757806334a9c92e1461012057806344e65e551461014057806379ba50971461015357600080fd5b8063181f5a77146100c357806326bf9d261461010b575b600080fd5b604080518082018252601981527f4d756c74694f4352334261736548656c70657220312e302e300000000000000060208201529051610102919061155a565b60405180910390f35b61011e610119366004611621565b61020b565b005b61013361012e3660046116af565b61023a565b6040516101029190611711565b61011e61014e366004611784565b6102ca565b61011e61034d565b61011e610169366004611837565b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101d86101d3366004611837565b61044f565b60405161010291906118ab565b61011e6101f336600461193e565b6105c7565b61011e610206366004611aaa565b6105db565b604080516000808252602082019092526004549091506102349060ff168585858580600061061d565b50505050565b6040805180820182526000808252602080830182905260ff86811683526003825284832073ffffffffffffffffffffffffffffffffffffffff871684528252918490208451808601909552805480841686529394939092918401916101009091041660028111156102ad576102ad6116e2565b60028111156102be576102be6116e2565b90525090505b92915050565b60045460408051602080880282810182019093528782526103439360ff16928c928c928c928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a925061061d915050565b5050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6104926040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561054857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161051d575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156105b757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161058c575b5050505050815250509050919050565b6105cf6109a1565b6105d881610a24565b50565b6105e36109a1565b60005b81518110156106195761061182828151811061060457610604611c13565b6020026020010151610b19565b6001016105e6565b5050565b60ff8781166000908152600260209081526040808320815160808101835281548152600190910154808616938201939093526101008304851691810191909152620100009091049092161515606083015287359061067c8760a4611c71565b90508260600151156106c4578451610695906020611c84565b86516106a2906020611c84565b6106ad9060a0611c71565b6106b79190611c71565b6106c19082611c71565b90505b368114610706576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016103ca565b508151811461074e5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016103ca565b610756610f6a565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156107a4576107a46116e2565b60028111156107b5576107b56116e2565b90525090506002816020015160028111156107d2576107d26116e2565b1480156108335750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061080e5761080e611c13565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b610869576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561094b576020820151610884906001611c9b565b60ff168551146108c0576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146108fb576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000878760405161090d929190611cb4565b604051908190038120610924918b90602001611cc4565b6040516020818303038152906040528051906020012090506109498a82888888610feb565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016103ca565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016103ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003610b5d5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003610bca57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055610c1f565b6060840151600182015460ff6201000090910416151590151514610c1f576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016103ca565b60a084015180516101001015610c645760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b8051600003610ca25760056040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b610d158484600301805480602002602001604051908101604052809291908181526020018280548015610d0b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ce0575b50505050506111fb565b846060015115610eba57610d908484600201805480602002602001604051908101604052809291908181526020018280548015610d0b5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ce05750505050506111fb565b608085015180516101001015610dd55760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b6040860151610de5906003611cf2565b60ff16815111610e245760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b815181511015610e635760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841602179055610eab90600286019060208401906114bb565b50610eb885826001611293565b505b610ec684826002611293565b8051610edb90600385019060208401906114bb565b506040858101516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793610f529389939260028a01929190611d15565b60405180910390a1610f6384611482565b5050505050565b467f000000000000000000000000000000000000000000000000000000000000000014610a22576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016103ca565b8251600090815b8181101561034357600060018886846020811061101157611011611c13565b61101e91901a601b611c9b565b89858151811061103057611030611c13565b602002602001015189868151811061104a5761104a611c13565b602002602001015160405160008152602001604052604051611088949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156110aa573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115611136576111366116e2565b6002811115611147576111476116e2565b9052509050600181602001516002811115611164576111646116e2565b1461119b576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b8516156111de576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050610ff2565b60005b815181101561128e5760ff83166000908152600360205260408120835190919084908490811061123057611230611c13565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556001016111fe565b505050565b60005b82518110156102345760008382815181106112b3576112b3611c13565b60200260200101519050600060028111156112d0576112d06116e2565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561131c5761131c6116e2565b146113565760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cd8565b73ffffffffffffffffffffffffffffffffffffffff81166113a3576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156113c9576113c96116e2565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561146e5761146e6116e2565b021790555090505050806001019050611296565b60405160ff821681527f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b539060200160405180910390a150565b828054828255906000526020600020908101928215611535579160200282015b8281111561153557825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906114db565b50611541929150611545565b5090565b5b808211156115415760008155600101611546565b60006020808352835180602085015260005b818110156115885785810183015185820160400152820161156c565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b80606081018310156102c457600080fd5b60008083601f8401126115ea57600080fd5b50813567ffffffffffffffff81111561160257600080fd5b60208301915083602082850101111561161a57600080fd5b9250929050565b60008060006080848603121561163657600080fd5b61164085856115c7565b9250606084013567ffffffffffffffff81111561165c57600080fd5b611668868287016115d8565b9497909650939450505050565b803560ff8116811461168657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461168657600080fd5b600080604083850312156116c257600080fd5b6116cb83611675565b91506116d96020840161168b565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815160ff1681526020820151604082019060038110611732576117326116e2565b8060208401525092915050565b60008083601f84011261175157600080fd5b50813567ffffffffffffffff81111561176957600080fd5b6020830191508360208260051b850101111561161a57600080fd5b60008060008060008060008060e0898b0312156117a057600080fd5b6117aa8a8a6115c7565b9750606089013567ffffffffffffffff808211156117c757600080fd5b6117d38c838d016115d8565b909950975060808b01359150808211156117ec57600080fd5b6117f88c838d0161173f565b909750955060a08b013591508082111561181157600080fd5b5061181e8b828c0161173f565b999c989b50969995989497949560c00135949350505050565b60006020828403121561184957600080fd5b61185282611675565b9392505050565b60008151808452602080850194506020840160005b838110156118a057815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161186e565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526118fa60e0840182611859565b905060408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c08501526119358282611859565b95945050505050565b60006020828403121561195057600080fd5b6118528261168b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156119ab576119ab611959565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156119f8576119f8611959565b604052919050565b600067ffffffffffffffff821115611a1a57611a1a611959565b5060051b60200190565b8035801515811461168657600080fd5b600082601f830112611a4557600080fd5b81356020611a5a611a5583611a00565b6119b1565b8083825260208201915060208460051b870101935086841115611a7c57600080fd5b602086015b84811015611a9f57611a928161168b565b8352918301918301611a81565b509695505050505050565b60006020808385031215611abd57600080fd5b823567ffffffffffffffff80821115611ad557600080fd5b818501915085601f830112611ae957600080fd5b8135611af7611a5582611a00565b81815260059190911b83018401908481019088831115611b1657600080fd5b8585015b83811015611c0657803585811115611b3157600080fd5b860160c0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215611b665760008081fd5b611b6e611988565b8882013581526040611b81818401611675565b8a8301526060611b92818501611675565b8284015260809150611ba5828501611a24565b9083015260a08381013589811115611bbd5760008081fd5b611bcb8f8d83880101611a34565b838501525060c0840135915088821115611be55760008081fd5b611bf38e8c84870101611a34565b9083015250845250918601918601611b1a565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102c4576102c4611c42565b80820281158282048414176102c4576102c4611c42565b60ff81811683821601908111156102c4576102c4611c42565b8183823760009101908152919050565b828152606082602083013760800192915050565b6020810160068310611cec57611cec6116e2565b91905290565b60ff8181168382160290811690818114611d0e57611d0e611c42565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015611d7c57845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201611d4a565b50508481036060860152611d908188611859565b935050505060ff83166080830152969550505050505056fea164736f6c6343000818000a", } var MultiOCR3HelperABI = MultiOCR3HelperMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go b/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go deleted file mode 100644 index 737a768dbea..00000000000 --- a/core/gethwrappers/ccip/generated/ocr3_config_encoder/ocr3_config_encoder.go +++ /dev/null @@ -1,195 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package ocr3_config_encoder - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "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" -) - -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -type CCIPConfigTypesOCR3Config struct { - PluginType uint8 - ChainSelector uint64 - F uint8 - OffchainConfigVersion uint64 - OfframpAddress []byte - P2pIds [][32]byte - Signers [][]byte - Transmitters [][]byte - OffchainConfig []byte -} - -var IOCR3ConfigEncoderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", -} - -var IOCR3ConfigEncoderABI = IOCR3ConfigEncoderMetaData.ABI - -type IOCR3ConfigEncoder struct { - address common.Address - abi abi.ABI - IOCR3ConfigEncoderCaller - IOCR3ConfigEncoderTransactor - IOCR3ConfigEncoderFilterer -} - -type IOCR3ConfigEncoderCaller struct { - contract *bind.BoundContract -} - -type IOCR3ConfigEncoderTransactor struct { - contract *bind.BoundContract -} - -type IOCR3ConfigEncoderFilterer struct { - contract *bind.BoundContract -} - -type IOCR3ConfigEncoderSession struct { - Contract *IOCR3ConfigEncoder - CallOpts bind.CallOpts - TransactOpts bind.TransactOpts -} - -type IOCR3ConfigEncoderCallerSession struct { - Contract *IOCR3ConfigEncoderCaller - CallOpts bind.CallOpts -} - -type IOCR3ConfigEncoderTransactorSession struct { - Contract *IOCR3ConfigEncoderTransactor - TransactOpts bind.TransactOpts -} - -type IOCR3ConfigEncoderRaw struct { - Contract *IOCR3ConfigEncoder -} - -type IOCR3ConfigEncoderCallerRaw struct { - Contract *IOCR3ConfigEncoderCaller -} - -type IOCR3ConfigEncoderTransactorRaw struct { - Contract *IOCR3ConfigEncoderTransactor -} - -func NewIOCR3ConfigEncoder(address common.Address, backend bind.ContractBackend) (*IOCR3ConfigEncoder, error) { - abi, err := abi.JSON(strings.NewReader(IOCR3ConfigEncoderABI)) - if err != nil { - return nil, err - } - contract, err := bindIOCR3ConfigEncoder(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &IOCR3ConfigEncoder{address: address, abi: abi, IOCR3ConfigEncoderCaller: IOCR3ConfigEncoderCaller{contract: contract}, IOCR3ConfigEncoderTransactor: IOCR3ConfigEncoderTransactor{contract: contract}, IOCR3ConfigEncoderFilterer: IOCR3ConfigEncoderFilterer{contract: contract}}, nil -} - -func NewIOCR3ConfigEncoderCaller(address common.Address, caller bind.ContractCaller) (*IOCR3ConfigEncoderCaller, error) { - contract, err := bindIOCR3ConfigEncoder(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &IOCR3ConfigEncoderCaller{contract: contract}, nil -} - -func NewIOCR3ConfigEncoderTransactor(address common.Address, transactor bind.ContractTransactor) (*IOCR3ConfigEncoderTransactor, error) { - contract, err := bindIOCR3ConfigEncoder(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &IOCR3ConfigEncoderTransactor{contract: contract}, nil -} - -func NewIOCR3ConfigEncoderFilterer(address common.Address, filterer bind.ContractFilterer) (*IOCR3ConfigEncoderFilterer, error) { - contract, err := bindIOCR3ConfigEncoder(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &IOCR3ConfigEncoderFilterer{contract: contract}, nil -} - -func bindIOCR3ConfigEncoder(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := IOCR3ConfigEncoderMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderCaller.contract.Call(opts, result, method, params...) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderTransactor.contract.Transfer(opts) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IOCR3ConfigEncoder.Contract.IOCR3ConfigEncoderTransactor.contract.Transact(opts, method, params...) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IOCR3ConfigEncoder.Contract.contract.Call(opts, result, method, params...) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IOCR3ConfigEncoder.Contract.contract.Transfer(opts) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IOCR3ConfigEncoder.Contract.contract.Transact(opts, method, params...) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCaller) ExposeOCR3Config(opts *bind.CallOpts, config []CCIPConfigTypesOCR3Config) ([]byte, error) { - var out []interface{} - err := _IOCR3ConfigEncoder.contract.Call(opts, &out, "exposeOCR3Config", config) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderSession) ExposeOCR3Config(config []CCIPConfigTypesOCR3Config) ([]byte, error) { - return _IOCR3ConfigEncoder.Contract.ExposeOCR3Config(&_IOCR3ConfigEncoder.CallOpts, config) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoderCallerSession) ExposeOCR3Config(config []CCIPConfigTypesOCR3Config) ([]byte, error) { - return _IOCR3ConfigEncoder.Contract.ExposeOCR3Config(&_IOCR3ConfigEncoder.CallOpts, config) -} - -func (_IOCR3ConfigEncoder *IOCR3ConfigEncoder) Address() common.Address { - return _IOCR3ConfigEncoder.address -} - -type IOCR3ConfigEncoderInterface interface { - ExposeOCR3Config(opts *bind.CallOpts, config []CCIPConfigTypesOCR3Config) ([]byte, error) - - Address() common.Address -} diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go index 51edddf9541..9ef94b601b8 100644 --- a/core/gethwrappers/ccip/generated/offramp/offramp.go +++ b/core/gethwrappers/ccip/generated/offramp/offramp.go @@ -43,18 +43,21 @@ type ClientEVMTokenAmount struct { Amount *big.Int } -type IRMNV2Signature struct { - R [32]byte - S [32]byte -} - type InternalAny2EVMRampMessage struct { Header InternalRampMessageHeader Sender []byte Data []byte Receiver common.Address GasLimit *big.Int - TokenAmounts []InternalRampTokenAmount + TokenAmounts []InternalAny2EVMTokenTransfer +} + +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int } type InternalExecutionReportSingleChain struct { @@ -72,10 +75,10 @@ type InternalGasPriceUpdate struct { type InternalMerkleRoot struct { SourceChainSelector uint64 + OnRampAddress []byte MinSeqNr uint64 MaxSeqNr uint64 MerkleRoot [32]byte - OnRampAddress []byte } type InternalPriceUpdates struct { @@ -91,14 +94,6 @@ type InternalRampMessageHeader struct { Nonce uint64 } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte - DestTokenAddress []byte - ExtraData []byte - Amount *big.Int - DestExecData []byte -} - type InternalTokenPriceUpdate struct { SourceToken common.Address UsdPerToken *big.Int @@ -126,18 +121,15 @@ type MultiOCR3BaseOCRConfigArgs struct { Transmitters []common.Address } -type OffRampCommitReport struct { - PriceUpdates InternalPriceUpdates - MerkleRoots []InternalMerkleRoot - RmnSignatures []IRMNV2Signature -} - type OffRampDynamicConfig struct { FeeQuoter common.Address PermissionLessExecutionThresholdSeconds uint32 - MaxTokenTransferGas uint32 - MaxPoolReleaseOrMintGas uint32 - MessageValidator common.Address + MessageInterceptor common.Address +} + +type OffRampGasLimitOverride struct { + ReceiverExecutionGasLimit *big.Int + TokenGasOverrides []uint32 } type OffRampSourceChainConfig struct { @@ -162,8 +154,8 @@ type OffRampStaticConfig struct { } var OffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"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\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"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\":[{\"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\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"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\"}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162006c2638038062006c268339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615f4962000cdd600039600081816102400152612a1a0152600081816102110152612f0e0152600081816101e20152818161077f01528181610986015261240c0152600081816101b201526126990152600081816117dd01526118290152615f496000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e1461052a578063f2fde38b1461054a578063f716f99f1461055d57600080fd5b8063c673e584146104c5578063ccd37ba3146104e557600080fd5b80638da5cb5b116100b25780638da5cb5b14610484578063991a50181461049f578063a80036b4146104b257600080fd5b806379ba50971461046e57806385572ffb1461047657600080fd5b80632d04ab76116101245780633f4b04aa116101095780633f4b04aa146103365780635e36480c146103525780637437ff9f1461037257600080fd5b80632d04ab7614610310578063311cd5131461032357600080fd5b806304666f9c1461015657806305d938b51461016b57806306285c691461017e578063181f5a77146102c7575b600080fd5b610169610164366004614086565b610570565b005b610169610179366004614710565b610584565b61027060408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102be9190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103036040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102be919061488b565b61016961031e366004614936565b610729565b6101696103313660046149e9565b610cc1565b60095460405167ffffffffffffffff90911681526020016102be565b610365610360366004614a3d565b610d2a565b6040516102be9190614a9a565b6104116040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526004546001600160a01b03808216835263ffffffff600160a01b83048116602085015278010000000000000000000000000000000000000000000000008304811694840194909452600160e01b9091049092166060820152600554909116608082015290565b6040516102be9190600060a0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b610169610d80565b610169610151366004614aa8565b6000546040516001600160a01b0390911681526020016102be565b6101696104ad366004614af7565b610e3e565b6101696104c0366004614b6b565b610e4f565b6104d86104d3366004614bd8565b6111c2565b6040516102be9190614c38565b61051c6104f3366004614cad565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102be565b61053d610538366004614cd7565b611320565b6040516102be9190614cf2565b610169610558366004614d40565b61142d565b61016961056b366004614dc5565b61143e565b610578611480565b610581816114dc565b50565b61058c6117da565b8151815181146105c8576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156107195760008482815181106105e7576105e7614f03565b6020026020010151905060008160200151519050600085848151811061060f5761060f614f03565b6020026020010151905080518214610653576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8281101561070a57600082828151811061067257610672614f03565b6020026020010151905080600014610701578460200151828151811061069a5761069a614f03565b6020026020010151608001518110156107015784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b50600101610656565b505050508060010190506105cb565b50610724838361185b565b505050565b600061073787890189615135565b602081015151909150156107e357602081015160408083015190517f30dfc3080000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926330dfc308926107b292600401615399565b60006040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050505b805151511515806107f957508051602001515115155b156108f95760095460208a01359067ffffffffffffffff808316911610156108b8576009805467ffffffffffffffff191667ffffffffffffffff83161790556004805483516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921692633937306f9261088192910161547b565b600060405180830381600087803b15801561089b57600080fd5b505af11580156108af573d6000803e3d6000fd5b505050506108f7565b8160200151516000036108f7576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610c0a5760008260200151828151811061092157610921614f03565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061548e565b15610a34576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106f8565b6000610a3f8261190b565b6020840151815491925067ffffffffffffffff908116600160a81b90920416141580610a865750826040015167ffffffffffffffff16836020015167ffffffffffffffff16115b15610ae7578251602084015160408086015190517fd5e0f0d600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff938416600482015291831660248301529190911660448201526064016106f8565b606083015180610b23576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610b965783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016106f8565b6040840151610ba69060016154c1565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b67ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016108fc565b507fd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e181604051610c3a91906154e9565b60405180910390a1610cb660008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611972915050565b505050505050505050565b610d01610cd082840184615541565b6040805160008082526020820190925290610cfb565b6060815260200190600190039081610ce65790505b5061185b565b604080516000808252602082019092529050610d24600185858585866000611972565b50505050565b6000610d3860016004615576565b6002610d4560808561559f565b67ffffffffffffffff16610d5991906155c6565b610d638585611ce9565b901c166003811115610d7757610d77614a70565b90505b92915050565b6001546001600160a01b03163314610dda5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106f8565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e46611480565b61058181611d30565b333014610e88576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610ec5565b6040805180820190915260008082526020820152815260200190600190039081610e9e5790505b5060a08501515190915015610ef957610ef68460a00151856020015186606001518760000151602001518787611e96565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff1681830152808701518351600094840192610f3592910161488b565b60408051601f19818403018152918152908252878101516020830152018390526005549091506001600160a01b03168015611042576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a190610faf90859060040161567f565b600060405180830381600087803b158015610fc957600080fd5b505af1925050508015610fda575060015b611042573d808015611008576040519150601f19603f3d011682016040523d82523d6000602084013e61100d565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b60408601515115801561105757506080860151155b8061106e575060608601516001600160a01b03163b155b806110ae575060608601516110ac906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611fb5565b155b156110bb57505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf9798300000000000000000000000000000000000000000000000000000000815284936001600160a01b0390931692633cf97983926111339289926113889291600401615692565b6000604051808303816000875af1158015611152573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261117a91908101906156ce565b5091509150816111b857806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b5050505050505050565b6112056040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156112ae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611290575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561131057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112f2575b5050505050815250509050919050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916113ad90615764565b80601f01602080910402602001604051908101604052809291908181526020018280546113d990615764565b80156113105780601f106113fb57610100808354040283529160200191611310565b820191906000526020600020905b81548152906001019060200180831161140957505050919092525091949350505050565b611435611480565b61058181611fd1565b611446611480565b60005b815181101561147c5761147482828151811061146757611467614f03565b6020026020010151612087565b600101611449565b5050565b6000546001600160a01b031633146114da5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106f8565b565b60005b815181101561147c5760008282815181106114fc576114fc614f03565b602002602001015190506000816020015190508067ffffffffffffffff16600003611553576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81516001600160a01b031661157b576040516342bcdf7f60e11b815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916115a690615764565b80601f01602080910402602001604051908101604052809291908181526020018280546115d290615764565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b5050505050905060008460600151905081516000036116d757805160000361165a576040516342bcdf7f60e11b815260040160405180910390fd5b6001830161166882826157ee565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b17835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a161172a565b808051906020012082805190602001201461172a576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106f8565b604080860151845487516001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906117c29086906158ae565b60405180910390a250505050508060010190506114df565b467f0000000000000000000000000000000000000000000000000000000000000000146114da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106f8565b8151600003611895576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611904576118fc8582815181106118ca576118ca614f03565b6020026020010151846118f6578583815181106118e9576118e9614f03565b60200260200101516123b8565b836123b8565b6001016118ac565b5050505050565b67ffffffffffffffff811660009081526006602052604081208054600160a01b900460ff16610d7a576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016106f8565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906119d18760a461597c565b9050826060015115611a195784516119ea9060206155c6565b86516119f79060206155c6565b611a029060a061597c565b611a0c919061597c565b611a16908261597c565b90505b368114611a5b576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106f8565b5081518114611aa35781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016106f8565b611aab6117da565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611af957611af9614a70565b6002811115611b0a57611b0a614a70565b9052509050600281602001516002811115611b2757611b27614a70565b148015611b7b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611b6357611b63614f03565b6000918252602090912001546001600160a01b031633145b611bb1576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611c93576020820151611bcc90600161598f565b60ff16855114611c08576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611c43576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611c559291906159a8565b604051908190038120611c6c918b906020016159b8565b604051602081830303815290604052805190602001209050611c918a82888888612cc8565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611d0e6080856159cc565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b80516001600160a01b0316611d58576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a17600160a01b63ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff1916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff811115611eb257611eb2613e9d565b604051908082528060200260200182016040528015611ef757816020015b6040805180820190915260008082526020820152815260200190600190039081611ed05790505b50905060005b8751811015611fa957611f84888281518110611f1b57611f1b614f03565b6020026020010151888888888887818110611f3857611f38614f03565b9050602002810190611f4a91906159f3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ead92505050565b828281518110611f9657611f96614f03565b6020908102919091010152600101611efd565b505b9695505050505050565b6000611fc083613252565b8015610d775750610d7783836132b6565b336001600160a01b038216036120295760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106f8565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036120b2576000604051631b3fab5160e11b81526004016106f89190615a3a565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361211f57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055612174565b6060840151600182015460ff6201000090910416151590151514612174576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016106f8565b60a0840151805161010010156121a0576001604051631b3fab5160e11b81526004016106f89190615a3a565b61220684846003018054806020026020016040519081016040528092919081815260200182805480156121fc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121de575b5050505050613371565b84606001511561232d5761227484846002018054806020026020016040519081016040528092919081815260200182805480156121fc576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121de575050505050613371565b6080850151805161010010156122a0576002604051631b3fab5160e11b81526004016106f89190615a3a565b60408601516122b0906003615a54565b60ff168151116122d6576003604051631b3fab5160e11b81526004016106f89190615a3a565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff84160217905561231e9060028601906020840190613e16565b5061232b858260016133da565b505b612339848260026133da565b805161234e9060038501906020840190613e16565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936123a79389939260028a01929190615a70565b60405180910390a16119048461354e565b815181516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608083901b77ffffffffffffffff00000000000000000000000000000000166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f919061548e565b1561250b5780156124c8576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016106f8565b60405167ffffffffffffffff831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b60006125168361190b565b600101805461252490615764565b80601f016020809104026020016040519081016040528092919081815260200182805461255090615764565b801561259d5780601f106125725761010080835404028352916020019161259d565b820191906000526020600020905b81548152906001019060200180831161258057829003601f168201915b505050602088015151929350505060008190036125e5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560400151518114612623576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561263e5761263e613e9d565b604051908082528060200260200182016040528015612667578160200160208202803683370190505b50905060005b828110156127505760008860200151828151811061268d5761268d614f03565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461272057805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106f8565b61272a818661356a565b83838151811061273c5761273c614f03565b60209081029190910101525060010161266d565b50600061276786838a606001518b6080015161368c565b9050806000036127af576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff871660048201526024016106f8565b60005b83811015610cb65760005a905060008a6020015183815181106127d7576127d7614f03565b6020026020010151905060006127f58a836000015160600151610d2a565b9050600081600381111561280b5761280b614a70565b14806128285750600381600381111561282657612826614a70565b145b612880578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050612cc0565b881561295057600454600090600160a01b900463ffffffff166128a38742615576565b11905080806128c3575060038260038111156128c1576128c1614a70565b145b612905576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c1660048201526024016106f8565b8b858151811061291757612917614f03565b602002602001015160001461294a578b858151811061293857612938614f03565b60200260200101518360800181815250505b506129b1565b600081600381111561296457612964614a70565b146129b1578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209101612870565b81516080015167ffffffffffffffff1615612aa05760008160038111156129da576129da614a70565b03612aa05781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612a51928f929190600401615b1c565b6020604051808303816000875af1158015612a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a94919061548e565b612aa057505050612cc0565b60008c604001518581518110612ab857612ab8614f03565b6020026020010151905080518360a001515114612b1c578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e16600483015290911660248201526044016106f8565b612b308b84600001516060015160016136ca565b600080612b3d8584613772565b91509150612b548d866000015160600151846136ca565b8b15612bc4576003826003811115612b6e57612b6e614a70565b03612bc4576000846003811115612b8757612b87614a70565b14612bc4578451516040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526106f891908390600401615b49565b6002826003811115612bd857612bd8614a70565b14612c32576003826003811115612bf157612bf1614a70565b14612c32578451606001516040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526106f8918f918590600401615b62565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8c8b81518110612c8c57612c8c614f03565b602002602001015186865a612ca1908e615576565b604051612cb19493929190615b88565b60405180910390a45050505050505b6001016127b2565b8251600090815b818110156111b8576000600188868460208110612cee57612cee614f03565b612cfb91901a601b61598f565b898581518110612d0d57612d0d614f03565b6020026020010151898681518110612d2757612d27614f03565b602002602001015160405160008152602001604052604051612d65949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612d87573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b03851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115612de857612de8614a70565b6002811115612df957612df9614a70565b9052509050600181602001516002811115612e1657612e16614a70565b14612e4d576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615612e90576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050612ccf565b60408051808201909152600080825260208201526000612ed0876020015161383c565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f799190615bbf565b90506001600160a01b0381161580612fc15750612fbf6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611fb5565b155b15613003576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106f8565b60045460009081906130259089908690600160e01b900463ffffffff166138e2565b9150915060008060006130f26040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b8152506040516024016130a39190615bdc565b60408051601f198184030181529190526020810180516001600160e01b03167f390775370000000000000000000000000000000000000000000000000000000017905287866113886084613a10565b9250925092508261313157816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b81516020146131795781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b60008280602001905181019061318f9190615ca9565b9050866001600160a01b03168c6001600160a01b0316146132245760006131c08d8a6131bb868a615576565b6138e2565b509050868110806131da5750816131d78883615576565b14155b15613222576040517fa966e21f0000000000000000000000000000000000000000000000000000000081526004810183905260248101889052604481018290526064016106f8565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b600061327e827f01ffc9a7000000000000000000000000000000000000000000000000000000006132b6565b8015610d7a57506132af827fffffffff000000000000000000000000000000000000000000000000000000006132b6565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d9150600051905082801561335a575060208210155b80156133665750600081115b979650505050505050565b60005b81518110156107245760ff8316600090815260036020526040812083519091908490849081106133a6576133a6614f03565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613374565b60005b8251811015610d245760008382815181106133fa576133fa614f03565b602002602001015190506000600281111561341757613417614a70565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561345657613456614a70565b14613477576004604051631b3fab5160e11b81526004016106f89190615a3a565b6001600160a01b0381166134b7576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156134dd576134dd614a70565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561353a5761353a614a70565b0217905550905050508060010190506133dd565b60ff8116610581576009805467ffffffffffffffff1916905550565b8151602080820151604092830151925160009384936135b0937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615cc2565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976135f99794969395929491939101615cf5565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016136309190615dfa565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b60008061369a858585613b36565b67ffffffffffffffff8716600090815260086020908152604080832093835292905220549150505b949350505050565b600060026136d960808561559f565b67ffffffffffffffff166136ed91906155c6565b905060006136fb8585611ce9565b90508161370a60016004615576565b901b19168183600381111561372157613721614a70565b67ffffffffffffffff871660009081526007602052604081209190921b929092179182916137506080886159cc565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b4906137b69087908790600401615e5a565b600060405180830381600087803b1580156137d057600080fd5b505af19250505080156137e1575060015b613820573d80801561380f576040519150601f19603f3d011682016040523d82523d6000602084013e613814565b606091505b50600392509050613835565b50506040805160208101909152600081526002905b9250929050565b6000815160201461387b57816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b6000828060200190518101906138919190615ca9565b90506001600160a01b038111806138a9575061040081105b15610d7a57826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b600080600080600061395c8860405160240161390d91906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03167f70a082310000000000000000000000000000000000000000000000000000000017905288886113886084613a10565b9250925092508261399b57816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f8919061488b565b60208251146139e35781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b818060200190518101906139f79190615ca9565b613a018288615576565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff811115613a3357613a33613e9d565b6040519080825280601f01601f191660200182016040528015613a5d576020820181803683370190505b509150863b613a90577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613ac3577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613afc577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613b1f5750835b808352806000602085013e50955095509592505050565b8251825160009190818303613b77576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613b8b57506101018111155b613ba8576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613bd2576040516309bde33960e01b815260040160405180910390fd5b80600003613bff5786600081518110613bed57613bed614f03565b60200260200101519350505050613dce565b60008167ffffffffffffffff811115613c1a57613c1a613e9d565b604051908082528060200260200182016040528015613c43578160200160208202803683370190505b50905060008080805b85811015613d6d5760006001821b8b811603613ca75788851015613c90578c5160018601958e918110613c8157613c81614f03565b60200260200101519050613cc9565b8551600185019487918110613c8157613c81614f03565b8b5160018401938d918110613cbe57613cbe614f03565b602002602001015190505b600089861015613cf9578d5160018701968f918110613cea57613cea614f03565b60200260200101519050613d1b565b8651600186019588918110613d1057613d10614f03565b602002602001015190505b82851115613d3c576040516309bde33960e01b815260040160405180910390fd5b613d468282613dd5565b878481518110613d5857613d58614f03565b60209081029190910101525050600101613c4c565b506001850382148015613d7f57508683145b8015613d8a57508581145b613da7576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613dbc57613dbc614f03565b60200260200101519750505050505050505b9392505050565b6000818310613ded57613de88284613df3565b610d77565b610d7783835b60408051600160208201529081018390526060810182905260009060800161366e565b828054828255906000526020600020908101928215613e78579160200282015b82811115613e78578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613e36565b50613e84929150613e88565b5090565b5b80821115613e845760008155600101613e89565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613ed657613ed6613e9d565b60405290565b60405160a0810167ffffffffffffffff81118282101715613ed657613ed6613e9d565b60405160c0810167ffffffffffffffff81118282101715613ed657613ed6613e9d565b6040805190810167ffffffffffffffff81118282101715613ed657613ed6613e9d565b6040516060810167ffffffffffffffff81118282101715613ed657613ed6613e9d565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f9157613f91613e9d565b604052919050565b600067ffffffffffffffff821115613fb357613fb3613e9d565b5060051b60200190565b6001600160a01b038116811461058157600080fd5b803567ffffffffffffffff81168114613fea57600080fd5b919050565b801515811461058157600080fd5b8035613fea81613fef565b600067ffffffffffffffff82111561402257614022613e9d565b50601f01601f191660200190565b600082601f83011261404157600080fd5b813561405461404f82614008565b613f68565b81815284602083860101111561406957600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561409957600080fd5b823567ffffffffffffffff808211156140b157600080fd5b818501915085601f8301126140c557600080fd5b81356140d361404f82613f99565b81815260059190911b830184019084810190888311156140f257600080fd5b8585015b838110156141985780358581111561410e5760008081fd5b86016080818c03601f19018113156141265760008081fd5b61412e613eb3565b8983013561413b81613fbd565b8152604061414a848201613fd2565b8b83015260608085013561415d81613fef565b8383015292840135928984111561417657600091508182fd5b6141848f8d86880101614030565b9083015250855250509186019186016140f6565b5098975050505050505050565b600060a082840312156141b757600080fd5b6141bf613edc565b9050813581526141d160208301613fd2565b60208201526141e260408301613fd2565b60408201526141f360608301613fd2565b606082015261420460808301613fd2565b608082015292915050565b8035613fea81613fbd565b600082601f83011261422b57600080fd5b8135602061423b61404f83613f99565b82815260059290921b8401810191818101908684111561425a57600080fd5b8286015b84811015611fa957803567ffffffffffffffff8082111561427f5760008081fd5b9088019060a0828b03601f19018113156142995760008081fd5b6142a1613edc565b87840135838111156142b35760008081fd5b6142c18d8a83880101614030565b825250604080850135848111156142d85760008081fd5b6142e68e8b83890101614030565b8a84015250606080860135858111156142ff5760008081fd5b61430d8f8c838a0101614030565b838501525060809150818601358184015250828501359250838311156143335760008081fd5b6143418d8a85880101614030565b90820152865250505091830191830161425e565b6000610140828403121561436857600080fd5b614370613eff565b905061437c83836141a5565b815260a082013567ffffffffffffffff8082111561439957600080fd5b6143a585838601614030565b602084015260c08401359150808211156143be57600080fd5b6143ca85838601614030565b60408401526143db60e0850161420f565b6060840152610100840135608084015261012084013591508082111561440057600080fd5b5061440d8482850161421a565b60a08301525092915050565b600082601f83011261442a57600080fd5b8135602061443a61404f83613f99565b82815260059290921b8401810191818101908684111561445957600080fd5b8286015b84811015611fa957803567ffffffffffffffff81111561447d5760008081fd5b61448b8986838b0101614355565b84525091830191830161445d565b600082601f8301126144aa57600080fd5b813560206144ba61404f83613f99565b82815260059290921b840181019181810190868411156144d957600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156144fd57600080fd5b818901915089603f83011261451157600080fd5b8582013561452161404f82613f99565b81815260059190911b830160400190878101908c83111561454157600080fd5b604085015b8381101561457a5780358581111561455d57600080fd5b61456c8f6040838a0101614030565b845250918901918901614546565b508752505050928401925083016144dd565b600082601f83011261459d57600080fd5b813560206145ad61404f83613f99565b8083825260208201915060208460051b8701019350868411156145cf57600080fd5b602086015b84811015611fa957803583529183019183016145d4565b600082601f8301126145fc57600080fd5b8135602061460c61404f83613f99565b82815260059290921b8401810191818101908684111561462b57600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156146505760008081fd5b9088019060a0828b03601f190181131561466a5760008081fd5b614672613edc565b61467d888501613fd2565b8152604080850135848111156146935760008081fd5b6146a18e8b83890101614419565b8a84015250606080860135858111156146ba5760008081fd5b6146c88f8c838a0101614499565b83850152506080915081860135858111156146e35760008081fd5b6146f18f8c838a010161458c565b918401919091525091909301359083015250835291830191830161462f565b600080604080848603121561472457600080fd5b833567ffffffffffffffff8082111561473c57600080fd5b614748878388016145eb565b945060209150818601358181111561475f57600080fd5b8601601f8101881361477057600080fd5b803561477e61404f82613f99565b81815260059190911b8201840190848101908a83111561479d57600080fd5b8584015b83811015614829578035868111156147b95760008081fd5b8501603f81018d136147cb5760008081fd5b878101356147db61404f82613f99565b81815260059190911b82018a0190898101908f8311156147fb5760008081fd5b928b01925b828410156148195783358252928a0192908a0190614800565b86525050509186019186016147a1565b50809750505050505050509250929050565b60005b8381101561485657818101518382015260200161483e565b50506000910152565b6000815180845261487781602086016020860161483b565b601f01601f19169290920160200192915050565b602081526000610d77602083018461485f565b8060608101831015610d7a57600080fd5b60008083601f8401126148c157600080fd5b50813567ffffffffffffffff8111156148d957600080fd5b60208301915083602082850101111561383557600080fd5b60008083601f84011261490357600080fd5b50813567ffffffffffffffff81111561491b57600080fd5b6020830191508360208260051b850101111561383557600080fd5b60008060008060008060008060e0898b03121561495257600080fd5b61495c8a8a61489e565b9750606089013567ffffffffffffffff8082111561497957600080fd5b6149858c838d016148af565b909950975060808b013591508082111561499e57600080fd5b6149aa8c838d016148f1565b909750955060a08b01359150808211156149c357600080fd5b506149d08b828c016148f1565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156149fe57600080fd5b614a08858561489e565b9250606084013567ffffffffffffffff811115614a2457600080fd5b614a30868287016148af565b9497909650939450505050565b60008060408385031215614a5057600080fd5b614a5983613fd2565b9150614a6760208401613fd2565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614a9657614a96614a70565b9052565b60208101610d7a8284614a86565b600060208284031215614aba57600080fd5b813567ffffffffffffffff811115614ad157600080fd5b820160a08185031215613dce57600080fd5b803563ffffffff81168114613fea57600080fd5b600060a08284031215614b0957600080fd5b614b11613edc565b8235614b1c81613fbd565b8152614b2a60208401614ae3565b6020820152614b3b60408401614ae3565b6040820152614b4c60608401614ae3565b60608201526080830135614b5f81613fbd565b60808201529392505050565b600080600060408486031215614b8057600080fd5b833567ffffffffffffffff80821115614b9857600080fd5b614ba487838801614355565b94506020860135915080821115614bba57600080fd5b50614a30868287016148f1565b803560ff81168114613fea57600080fd5b600060208284031215614bea57600080fd5b610d7782614bc7565b60008151808452602080850194506020840160005b83811015614c2d5781516001600160a01b031687529582019590820190600101614c08565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614c8760e0840182614bf3565b90506040840151601f198483030160c0850152614ca48282614bf3565b95945050505050565b60008060408385031215614cc057600080fd5b614cc983613fd2565b946020939093013593505050565b600060208284031215614ce957600080fd5b610d7782613fd2565b602081526001600160a01b03825116602082015260208201511515604082015267ffffffffffffffff6040830151166060820152600060608301516080808401526136c260a084018261485f565b600060208284031215614d5257600080fd5b8135613dce81613fbd565b600082601f830112614d6e57600080fd5b81356020614d7e61404f83613f99565b8083825260208201915060208460051b870101935086841115614da057600080fd5b602086015b84811015611fa9578035614db881613fbd565b8352918301918301614da5565b60006020808385031215614dd857600080fd5b823567ffffffffffffffff80821115614df057600080fd5b818501915085601f830112614e0457600080fd5b8135614e1261404f82613f99565b81815260059190911b83018401908481019088831115614e3157600080fd5b8585015b8381101561419857803585811115614e4c57600080fd5b860160c0818c03601f19011215614e635760008081fd5b614e6b613eff565b8882013581526040614e7e818401614bc7565b8a8301526060614e8f818501614bc7565b8284015260809150614ea2828501613ffd565b9083015260a08381013589811115614eba5760008081fd5b614ec88f8d83880101614d5d565b838501525060c0840135915088821115614ee25760008081fd5b614ef08e8c84870101614d5d565b9083015250845250918601918601614e35565b634e487b7160e01b600052603260045260246000fd5b80356001600160e01b0381168114613fea57600080fd5b600082601f830112614f4157600080fd5b81356020614f5161404f83613f99565b82815260069290921b84018101918181019086841115614f7057600080fd5b8286015b84811015611fa95760408189031215614f8d5760008081fd5b614f95613f22565b614f9e82613fd2565b8152614fab858301614f19565b81860152835291830191604001614f74565b600082601f830112614fce57600080fd5b81356020614fde61404f83613f99565b82815260059290921b84018101918181019086841115614ffd57600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156150225760008081fd5b9088019060a0828b03601f190181131561503c5760008081fd5b615044613edc565b61504f888501613fd2565b8152604061505e818601613fd2565b89830152606061506f818701613fd2565b8284015260809150818601358184015250828501359250838311156150945760008081fd5b6150a28d8a85880101614030565b908201528652505050918301918301615001565b600082601f8301126150c757600080fd5b813560206150d761404f83613f99565b82815260069290921b840181019181810190868411156150f657600080fd5b8286015b84811015611fa957604081890312156151135760008081fd5b61511b613f22565b8135815284820135858201528352918301916040016150fa565b6000602080838503121561514857600080fd5b823567ffffffffffffffff8082111561516057600080fd5b908401906060828703121561517457600080fd5b61517c613f45565b82358281111561518b57600080fd5b8301604081890381131561519e57600080fd5b6151a6613f22565b8235858111156151b557600080fd5b8301601f81018b136151c657600080fd5b80356151d461404f82613f99565b81815260069190911b8201890190898101908d8311156151f357600080fd5b928a01925b828410156152435785848f0312156152105760008081fd5b615218613f22565b843561522381613fbd565b8152615230858d01614f19565b818d0152825292850192908a01906151f8565b84525050508287013591508482111561525b57600080fd5b6152678a838501614f30565b8188015283525050828401358281111561528057600080fd5b61528c88828601614fbd565b858301525060408301359350818411156152a557600080fd5b6152b1878585016150b6565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561535057858303601f190189528151805167ffffffffffffffff908116855285820151811686860152604080830151909116908501526060808201519085015260809081015160a09185018290529061533c8186018361485f565b9a86019a94505050908301906001016152dd565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015614c2d578151805188528301518388015260409096019590820190600101615372565b6040815260006153ac60408301856152c0565b8281036020840152614ca4818561535d565b805160408084528151848201819052600092602091908201906060870190855b8181101561541557835180516001600160a01b031684528501516001600160e01b03168584015292840192918501916001016153de565b50508583015187820388850152805180835290840192506000918401905b8083101561546f578351805167ffffffffffffffff1683528501516001600160e01b031685830152928401926001929092019190850190615433565b50979650505050505050565b602081526000610d7760208301846153be565b6000602082840312156154a057600080fd5b8151613dce81613fef565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156154e2576154e26154ab565b5092915050565b60208152600082516060602084015261550560808401826153be565b90506020840151601f198085840301604086015261552383836152c0565b9250604086015191508085840301606086015250614ca4828261535d565b60006020828403121561555357600080fd5b813567ffffffffffffffff81111561556a57600080fd5b6136c2848285016145eb565b81810381811115610d7a57610d7a6154ab565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806155ba576155ba615589565b92169190910692915050565b8082028115828204841417610d7a57610d7a6154ab565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261561160a087018261485f565b90506060850151868203606088015261562a828261485f565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561546f57835180516001600160a01b031683528601518683015292850192600192909201919084019061564d565b602081526000610d7760208301846155dd565b6080815260006156a560808301876155dd565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b6000806000606084860312156156e357600080fd5b83516156ee81613fef565b602085015190935067ffffffffffffffff81111561570b57600080fd5b8401601f8101861361571c57600080fd5b805161572a61404f82614008565b81815287602083850101111561573f57600080fd5b61575082602083016020860161483b565b809450505050604084015190509250925092565b600181811c9082168061577857607f821691505b60208210810361579857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610724576000816000526020600020601f850160051c810160208610156157c75750805b601f850160051c820191505b818110156157e6578281556001016157d3565b505050505050565b815167ffffffffffffffff81111561580857615808613e9d565b61581c816158168454615764565b8461579e565b602080601f83116001811461585157600084156158395750858301515b600019600386901b1c1916600185901b1785556157e6565b600085815260208120601f198616915b8281101561588057888601518255948401946001909101908401615861565b508582101561589e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c1660608501525060018085016080808601526000815461590081615764565b8060a089015260c06001831660008114615921576001811461593d5761596d565b60ff19841660c08b015260c083151560051b8b0101945061596d565b85600052602060002060005b848110156159645781548c8201850152908801908901615949565b8b0160c0019550505b50929998505050505050505050565b80820180821115610d7a57610d7a6154ab565b60ff8181168382160190811115610d7a57610d7a6154ab565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff808416806159e7576159e7615589565b92169190910492915050565b6000808335601e19843603018112615a0a57600080fd5b83018035915067ffffffffffffffff821115615a2557600080fd5b60200191503681900382131561383557600080fd5b6020810160058310615a4e57615a4e614a70565b91905290565b60ff81811683821602908116908181146154e2576154e26154ab565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615ac85784546001600160a01b031683526001948501949284019201615aa3565b50508481036060860152865180825290820192508187019060005b81811015615b085782516001600160a01b031685529383019391830191600101615ae3565b50505060ff85166080850152509050611fab565b600067ffffffffffffffff808616835280851660208401525060606040830152614ca4606083018461485f565b8281526040602082015260006136c2604083018461485f565b67ffffffffffffffff848116825283166020820152606081016136c26040830184614a86565b848152615b986020820185614a86565b608060408201526000615bae608083018561485f565b905082606083015295945050505050565b600060208284031215615bd157600080fd5b8151613dce81613fbd565b6020815260008251610100806020850152615bfb61012085018361485f565b91506020850151615c18604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615c5260a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615c6f848361485f565b935060c08701519150808685030160e0870152615c8c848361485f565b935060e0870151915080868503018387015250611fab838261485f565b600060208284031215615cbb57600080fd5b5051919050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152611fab608083018461485f565b86815260c060208201526000615d0e60c083018861485f565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b8481101561535057601f19868403018952815160a08151818652615d8b8287018261485f565b9150508582015185820387870152615da3828261485f565b91505060408083015186830382880152615dbd838261485f565b92505050606080830151818701525060808083015192508582038187015250615de6818361485f565b9a86019a9450505090830190600101615d65565b602081526000610d776020830184615d48565b60008282518085526020808601955060208260051b8401016020860160005b8481101561535057601f19868403018952615e4883835161485f565b98840198925090830190600101615e2c565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615ec261018085018361485f565b91506040860151603f198086850301610100870152615ee1848361485f565b935060608801519150615f006101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615f278282615d48565b9150508281036020840152614ca48185615e0d56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reportOnRamp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"configOnRamp\",\"type\":\"bytes\"}],\"name\":\"CommitOnRampMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"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\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokenIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"oldLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenGasOverride\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionTokenGasOverride\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"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\":\"InvalidOnRampUpdate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionGasAmountCountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"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\":[{\"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\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"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\"}]", + Bin: "0x6101206040523480156200001257600080fd5b50604051620067de380380620067de833981016040819052620000359162000806565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f1816200036d565b50505062000b8d565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586166001600160c01b03199094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b60005b8151811015620005ba57600082828151811062000391576200039162000943565b60200260200101519050600081602001519050806001600160401b0316600003620003cf5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003f8576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526006602052604090206060830151600182018054620004269062000959565b905060000362000489578154600160a81b600160e81b031916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004c8565b8154600160a81b90046001600160401b0316600114620004c857604051632105803760e11b81526001600160401b038416600482015260240162000083565b80511580620004fe5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156200051d576040516342bcdf7f60e11b815260040160405180910390fd5b600182016200052d8282620009ea565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90620005a290859062000ab6565b60405180910390a25050505080600101905062000370565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620005f957620005f9620005be565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a620005be565b604052919050565b80516001600160401b03811681146200064a57600080fd5b919050565b6001600160a01b03811681146200066557600080fd5b50565b6000601f83601f8401126200067c57600080fd5b825160206001600160401b03808311156200069b576200069b620005be565b8260051b620006ac838201620005ff565b9384528681018301938381019089861115620006c757600080fd5b84890192505b85831015620007f957825184811115620006e75760008081fd5b89016080601f19828d038101821315620007015760008081fd5b6200070b620005d4565b888401516200071a816200064f565b815260406200072b85820162000632565b8a8301526060808601518015158114620007455760008081fd5b838301529385015193898511156200075d5760008081fd5b84860195508f603f8701126200077557600094508485fd5b8a8601519450898511156200078e576200078e620005be565b6200079f8b858f88011601620005ff565b93508484528f82868801011115620007b75760008081fd5b60005b85811015620007d7578681018301518582018d01528b01620007ba565b5060009484018b019490945250918201528352509184019190840190620006cd565b9998505050505050505050565b60008060008385036101008112156200081e57600080fd5b60808112156200082d57600080fd5b62000837620005d4565b620008428662000632565b8152602086015162000854816200064f565b6020820152604086015162000869816200064f565b604082015260608601516200087e816200064f565b606082810191909152909450607f19820112156200089b57600080fd5b50604051606081016001600160401b038082118383101715620008c257620008c2620005be565b8160405260808701519150620008d8826200064f565b90825260a08601519063ffffffff82168214620008f457600080fd5b81602084015260c087015191506200090c826200064f565b6040830182905260e0870151929450808311156200092957600080fd5b5050620009398682870162000668565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200096e57607f821691505b6020821081036200098f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009e5576000816000526020600020601f850160051c81016020861015620009c05750805b601f850160051c820191505b81811015620009e157828155600101620009cc565b5050505b505050565b81516001600160401b0381111562000a065762000a06620005be565b62000a1e8162000a17845462000959565b8462000995565b602080601f83116001811462000a56576000841562000a3d5750858301515b600019600386901b1c1916600185901b178555620009e1565b600085815260208120601f198616915b8281101562000a875788860151825594840194600190910190840162000a66565b508582101562000aa65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000b0b8162000959565b8060a089015260c0600183166000811462000b2f576001811462000b4c5762000b7e565b60ff19841660c08b015260c083151560051b8b0101945062000b7e565b85600052602060002060005b8481101562000b755781548c820185015290880190890162000b58565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615bdb62000c036000396000818161022c01526129d50152600081816101fd0152612c9a0152600081816101ce015281816105580152818161070a015261239601526000818161019f01526125d5015260008181611ac70152611afa0152615bdb6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80636f9e320f116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e146104bc578063f2fde38b146104dc578063f716f99f146104ef57600080fd5b8063c673e58414610458578063ccd37ba31461047857600080fd5b806379ba5097116100b257806379ba50971461042757806385572ffb1461042f5780638da5cb5b1461043d57600080fd5b80636f9e320f146103825780637437ff9f1461039557600080fd5b8063311cd513116101245780635e36480c116101095780635e36480c1461033c5780635e7bb0081461035c57806360987c201461036f57600080fd5b8063311cd5131461030e5780633f4b04aa1461032157600080fd5b806304666f9c1461015657806306285c691461016b578063181f5a77146102b25780632d04ab76146102fb575b600080fd5b610169610164366004613ba0565b610502565b005b61025c60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102a9919081516001600160401b031681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6102ee6040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102a99190613d0e565b610169610309366004613dbe565b610516565b61016961031c366004613e70565b610a1d565b6009546040516001600160401b0390911681526020016102a9565b61034f61034a366004613ec3565b610a86565b6040516102a99190613f20565b61016961036a366004614489565b610adb565b61016961037d3660046146cd565b610d6a565b610169610390366004614761565b61104a565b6103f1604080516060810182526000808252602082018190529181019190915250604080516060810182526004546001600160a01b038082168352600160a01b90910463ffffffff166020830152600554169181019190915290565b6040805182516001600160a01b03908116825260208085015163ffffffff169083015292820151909216908201526060016102a9565b61016961105b565b6101696101513660046147d0565b6000546040516001600160a01b0390911681526020016102a9565b61046b61046636600461481b565b61110c565b6040516102a9919061487b565b6104ae6104863660046148f0565b6001600160401b03919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102a9565b6104cf6104ca36600461491a565b61126a565b6040516102a99190614935565b6101696104ea366004614982565b611376565b6101696104fd366004614a07565b611387565b61050a6113c9565b61051381611425565b50565b600061052487890189614d5c565b602081015151909150156105c157602081015160408083015160608401519151638d8741cb60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693638d8741cb93610590933093909190600401614f91565b60006040518083038186803b1580156105a857600080fd5b505afa1580156105bc573d6000803e3d6000fd5b505050505b805151511515806105d757508051602001515115155b156106a35760095460208a0135906001600160401b038083169116101561067b576009805467ffffffffffffffff19166001600160401b038316179055600480548351604051633937306f60e01b81526001600160a01b0390921692633937306f926106449291016150de565b600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b505050506106a1565b8160200151516000036106a157604051632261116760e01b815260040160405180910390fd5b505b60005b81602001515181101561095e576000826020015182815181106106cb576106cb61500c565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077591906150f1565b156107a357604051637edeb53960e11b81526001600160401b03821660048201526024015b60405180910390fd5b60006107ae82611678565b9050806001016040516107c19190615148565b6040518091039020836020015180519060200120146107fe5782602001518160010160405163b80d8fa960e01b815260040161079a92919061523b565b60408301518154600160a81b90046001600160401b03908116911614158061083f575082606001516001600160401b031683604001516001600160401b0316115b1561088457825160408085015160608601519151636af0786b60e11b81526001600160401b03938416600482015290831660248201529116604482015260640161079a565b6080830151806108a75760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600860209081526040808320848452909152902054156108ff5783516040516332cf0cbf60e01b81526001600160401b0390911660048201526024810182905260440161079a565b606084015161090f906001615276565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b039283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016106a6565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e49261099692909161529d565b60405180910390a1610a1260008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506116c4915050565b505050505050505050565b610a5d610a2c828401846152c2565b6040805160008082526020820190925290610a57565b6060815260200190600190039081610a425790505b506119bd565b604080516000808252602082019092529050610a806001858585858660006116c4565b50505050565b6000610a94600160046152f6565b6002610aa160808561531f565b6001600160401b0316610ab49190615345565b610abe8585611a7f565b901c166003811115610ad257610ad2613ef6565b90505b92915050565b610ae3611ac4565b815181518114610b06576040516320f8fd5960e21b815260040160405180910390fd5b60005b81811015610d5a576000848281518110610b2557610b2561500c565b60200260200101519050600081602001515190506000858481518110610b4d57610b4d61500c565b6020026020010151905080518214610b78576040516320f8fd5960e21b815260040160405180910390fd5b60005b82811015610d4b576000828281518110610b9757610b9761500c565b6020026020010151600001519050600085602001518381518110610bbd57610bbd61500c565b6020026020010151905081600014610c11578060800151821015610c11578551815151604051633a98d46360e11b81526001600160401b03909216600483015260248201526044810183905260640161079a565b838381518110610c2357610c2361500c565b602002602001015160200151518160a001515114610c7057805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b0316602482015260440161079a565b60005b8160a0015151811015610d3d576000858581518110610c9457610c9461500c565b6020026020010151602001518281518110610cb157610cb161500c565b602002602001015163ffffffff16905080600014610d345760008360a001518381518110610ce157610ce161500c565b60200260200101516040015163ffffffff16905080821015610d32578351516040516348e617b360e01b8152600481019190915260248101849052604481018290526064810183905260840161079a565b505b50600101610c73565b505050806001019050610b7b565b50505050806001019050610b09565b50610d6583836119bd565b505050565b333014610d8a576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281610dc7565b6040805180820190915260008082526020820152815260200190600190039081610da05790505b5060a08701515190915015610dfd57610dfa8660a001518760200151886060015189600001516020015189898989611b2c565b90505b6040805160a081018252875151815287516020908101516001600160401b031681830152808901518351600094840192610e38929101613d0e565b60408051601f19818403018152918152908252898101516020830152018390526005549091506001600160a01b03168015610f13576040516308d450a160e01b81526001600160a01b038216906308d450a190610e999085906004016153fd565b600060405180830381600087803b158015610eb357600080fd5b505af1925050508015610ec4575060015b610f13573d808015610ef2576040519150601f19603f3d011682016040523d82523d6000602084013e610ef7565b606091505b50806040516309c2532560e01b815260040161079a9190613d0e565b604088015151158015610f2857506080880151155b80610f3f575060608801516001600160a01b03163b155b80610f6657506060880151610f64906001600160a01b03166385572ffb60e01b611cdd565b155b15610f7357505050611043565b87516020908101516001600160401b03166000908152600690915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf9798392610fd19289926113889291600401615410565b6000604051808303816000875af1158015610ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611018919081019061544c565b50915091508161103d57806040516302a35ba360e21b815260040161079a9190613d0e565b50505050505b5050505050565b6110526113c9565b61051381611cf9565b6001546001600160a01b031633146110b55760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161079a565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61114f6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156111f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111da575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561125a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123c575b5050505050815250509050919050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916112f69061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546113229061510e565b801561125a5780601f106113445761010080835404028352916020019161125a565b820191906000526020600020905b81548152906001019060200180831161135257505050919092525091949350505050565b61137e6113c9565b61051381611dd8565b61138f6113c9565b60005b81518110156113c5576113bd8282815181106113b0576113b061500c565b6020026020010151611e81565b600101611392565b5050565b6000546001600160a01b031633146114235760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161079a565b565b60005b81518110156113c55760008282815181106114455761144561500c565b60200260200101519050600081602001519050806001600160401b03166000036114825760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166114aa576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260066020526040902060608301516001820180546114d69061510e565b905060000361153857815467ffffffffffffffff60a81b1916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611575565b8154600160a81b90046001600160401b031660011461157557604051632105803760e11b81526001600160401b038416600482015260240161079a565b805115806115aa5750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b156115c8576040516342bcdf7f60e11b815260040160405180910390fd5b600182016115d68282615531565b50604080850151835486516001600160a01b03166001600160a01b0319921515600160a01b02929092167fffffffffffffffffffffff00000000000000000000000000000000000000000090911617178355516001600160401b038416907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906116619085906155f0565b60405180910390a250505050806001019050611428565b6001600160401b03811660009081526006602052604081208054600160a01b900460ff16610ad55760405163ed053c5960e01b81526001600160401b038416600482015260240161079a565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906117238760a461563e565b905082606001511561176b57845161173c906020615345565b8651611749906020615345565b6117549060a061563e565b61175e919061563e565b611768908261563e565b90505b36811461179457604051638e1192e160e01b81526004810182905236602482015260440161079a565b50815181146117c35781516040516324f7d61360e21b815260048101919091526024810182905260440161079a565b6117cb611ac4565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561181957611819613ef6565b600281111561182a5761182a613ef6565b905250905060028160200151600281111561184757611847613ef6565b14801561189b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106118835761188361500c565b6000918252602090912001546001600160a01b031633145b6118b857604051631b41e11d60e31b815260040160405180910390fd5b508160600151156119685760208201516118d3906001615651565b60ff168551146118f6576040516371253a2560e01b815260040160405180910390fd5b83518551146119185760405163a75d88af60e01b815260040160405180910390fd5b6000878760405161192a92919061566a565b604051908190038120611941918b9060200161567a565b6040516020818303038152906040528051906020012090506119668a828888886121ab565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b81516000036119de5760405162bf199760e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611a21565b6040805180820190915260008152606060208201528152602001906001900390816119f95790505b50905060005b845181101561104357611a77858281518110611a4557611a4561500c565b602002602001015184611a7157858381518110611a6457611a6461500c565b6020026020010151612368565b83612368565b600101611a27565b6001600160401b038216600090815260076020526040812081611aa360808561568e565b6001600160401b031681526020810191909152604001600020549392505050565b467f00000000000000000000000000000000000000000000000000000000000000001461142357604051630f01ce8560e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161079a565b606088516001600160401b03811115611b4757611b476139e2565b604051908082528060200260200182016040528015611b8c57816020015b6040805180820190915260008082526020820152815260200190600190039081611b655790505b509050811560005b8a51811015611ccf5781611c2c57848482818110611bb457611bb461500c565b9050602002016020810190611bc991906156b4565b63ffffffff1615611c2c57848482818110611be657611be661500c565b9050602002016020810190611bfb91906156b4565b8b8281518110611c0d57611c0d61500c565b60200260200101516040019063ffffffff16908163ffffffff16815250505b611caa8b8281518110611c4157611c4161500c565b60200260200101518b8b8b8b8b87818110611c5e57611c5e61500c565b9050602002810190611c7091906156cf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c5f92505050565b838281518110611cbc57611cbc61500c565b6020908102919091010152600101611b94565b505098975050505050505050565b6000611ce883612f3f565b8015610ad25750610ad28383612f8a565b80516001600160a01b0316611d21576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586167fffffffffffffffff0000000000000000000000000000000000000000000000009094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b336001600160a01b03821603611e305760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161079a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003611eac576000604051631b3fab5160e11b815260040161079a9190615715565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003611efd576060840151600182018054911515620100000262ff000019909216919091179055611f39565b6060840151600182015460ff6201000090910416151590151514611f39576040516321fd80df60e21b815260ff8416600482015260240161079a565b60a084015180516101001015611f65576001604051631b3fab5160e11b815260040161079a9190615715565b8051600003611f8a576005604051631b3fab5160e11b815260040161079a9190615715565b611ff08484600301805480602002602001604051908101604052809291908181526020018280548015611fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fc8575b505050505061302c565b8460600151156121205761205e8484600201805480602002602001604051908101604052809291908181526020018280548015611fe6576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fc857505050505061302c565b60808501518051610100101561208a576002604051631b3fab5160e11b815260040161079a9190615715565b604086015161209a90600361572f565b60ff168151116120c0576003604051631b3fab5160e11b815260040161079a9190615715565b8151815110156120e6576001604051631b3fab5160e11b815260040161079a9190615715565b805160018401805461ff00191661010060ff8416021790556121119060028601906020840190613968565b5061211e85826001613095565b505b61212c84826002613095565b80516121419060038501906020840190613968565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361219a9389939260028a0192919061574b565b60405180910390a1611043846131f0565b8251600090815b8181101561235e5760006001888684602081106121d1576121d161500c565b6121de91901a601b615651565b8985815181106121f0576121f061500c565b602002602001015189868151811061220a5761220a61500c565b602002602001015160405160008152602001604052604051612248949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561226a573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156122cb576122cb613ef6565b60028111156122dc576122dc613ef6565b90525090506001816020015160028111156122f9576122f9613ef6565b1461231757604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561234157604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b8517945050508060010190506121b2565b5050505050505050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240991906150f1565b1561247a57801561243857604051637edeb53960e11b81526001600160401b038316600482015260240161079a565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b600061248583611678565b60010180546124939061510e565b80601f01602080910402602001604051908101604052809291908181526020018280546124bf9061510e565b801561250c5780601f106124e15761010080835404028352916020019161250c565b820191906000526020600020905b8154815290600101906020018083116124ef57829003601f168201915b5050506020880151519293505050600081900361253b5760405162bf199760e01b815260040160405180910390fd5b8560400151518114612560576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b0381111561257a5761257a6139e2565b6040519080825280602002602001820160405280156125a3578160200160208202803683370190505b50905060005b82811015612747576000886020015182815181106125c9576125c961500c565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b0316146126405780516040908101519051631c21951160e11b81526001600160401b03909116600482015260240161079a565b866001600160401b03168160000151602001516001600160401b03161461269457805160200151604051636c95f1eb60e01b81526001600160401b03808a166004830152909116602482015260440161079a565b612721817f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f836000015160200151846000015160400151898051906020012060405160200161270694939291909384526001600160401b03928316602085015291166040830152606082015260800190565b60405160208183030381529060405280519060200120613247565b8383815181106127335761273361500c565b6020908102919091010152506001016125a9565b50600061275e86838a606001518b6080015161334f565b90508060000361278c57604051633ee8bd3f60e11b81526001600160401b038716600482015260240161079a565b60005b83811015610a125760005a905060008a6020015183815181106127b4576127b461500c565b6020026020010151905060006127d28a836000015160600151610a86565b905060008160038111156127e8576127e8613ef6565b14806128055750600381600381111561280357612803613ef6565b145b61285b57815160600151604080516001600160401b03808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612c57565b6060891561293a578b85815181106128755761287561500c565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff166128a388426152f6565b11905080806128c3575060038360038111156128c1576128c1613ef6565b145b6128eb576040516354e7e43160e11b81526001600160401b038d16600482015260240161079a565b8c86815181106128fd576128fd61500c565b602002602001015160000151600014612934578c86815181106129225761292261500c565b60209081029190910101515160808501525b506129a6565b600082600381111561294e5761294e613ef6565b146129a657825160600151604080516001600160401b03808f16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612c57565b8251608001516001600160401b031615612a7f5760008260038111156129ce576129ce613ef6565b03612a7f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0e03cae8c85600001516080015186602001516040518463ffffffff1660e01b8152600401612a2f939291906157fd565b6020604051808303816000875af1158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7291906150f1565b612a7f5750505050612c57565b60008d604001518681518110612a9757612a9761500c565b6020026020010151905080518460a001515114612ae157835160600151604051631cfe6d8b60e01b81526001600160401b03808f166004830152909116602482015260440161079a565b612af58c856000015160600151600161338c565b600080612b03868486613431565b91509150612b1a8e8760000151606001518461338c565b8c15612b71576003826003811115612b3457612b34613ef6565b03612b71576000856003811115612b4d57612b4d613ef6565b14612b7157855151604051632b11b8d960e01b815261079a91908390600401615829565b6002826003811115612b8557612b85613ef6565b14612bca576003826003811115612b9e57612b9e613ef6565b14612bca578d866000015160600151836040516349362d1f60e11b815260040161079a93929190615842565b8560000151600001518660000151606001516001600160401b03168f6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612c2257612c2261500c565b602002602001015186865a612c37908f6152f6565b604051612c479493929190615867565b60405180910390a4505050505050505b60010161278f565b6040805180820190915260008082526020820152602086015160405163bbe4f6db60e01b81526001600160a01b0380831660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015612ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d07919061589e565b90506001600160a01b0381161580612d365750612d346001600160a01b03821663aff2afbf60e01b611cdd565b155b15612d5f5760405163ae9b4ce960e01b81526001600160a01b038216600482015260240161079a565b600080612d7788858c6040015163ffffffff166134e5565b915091506000806000612e2a6040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f608001518152602001896001600160a01b031681526020018f6000015181526020018f6060015181526020018b815250604051602401612df491906158bb565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b179052878661138860846135c8565b92509250925082612e50578160405163e1cd550960e01b815260040161079a9190613d0e565b8151602014612e7f578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b600082806020019051810190612e959190615987565b9050866001600160a01b03168c6001600160a01b031614612f11576000612ec68d8a612ec1868a6152f6565b6134e5565b50905086811080612ee0575081612edd88836152f6565b14155b15612f0f5760405163a966e21f60e01b815260048101839052602481018890526044810182905260640161079a565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000612f52826301ffc9a760e01b612f8a565b8015610ad55750612f83827fffffffff00000000000000000000000000000000000000000000000000000000612f8a565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d91506000519050828015613015575060208210155b80156130215750600081115b979650505050505050565b60005b8151811015610d655760ff8316600090815260036020526040812083519091908490849081106130615761306161500c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff1916905560010161302f565b60005b8251811015610a805760008382815181106130b5576130b561500c565b60200260200101519050600060028111156130d2576130d2613ef6565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561311157613111613ef6565b14613132576004604051631b3fab5160e11b815260040161079a9190615715565b6001600160a01b0381166131595760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561317f5761317f613ef6565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156131dc576131dc613ef6565b021790555090505050806001019050613098565b60ff81166105135760ff8082166000908152600260205260409020600101546201000090041661323357604051631e8ed32560e21b815260040160405180910390fd5b6009805467ffffffffffffffff1916905550565b8151805160608085015190830151608080870151940151604051600095869588956132ab95919490939192916020019485526001600160a01b039390931660208501526001600160401b039182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016132ee9190615a41565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b60008061335d8585856136a2565b6001600160401b038716600090815260086020908152604080832093835292905220549150505b949350505050565b6000600261339b60808561531f565b6001600160401b03166133ae9190615345565b905060006133bc8585611a7f565b9050816133cb600160046152f6565b901b1916818360038111156133e2576133e2613ef6565b6001600160401b03871660009081526007602052604081209190921b9290921791829161341060808861568e565b6001600160401b031681526020810191909152604001600020555050505050565b604051630304c3e160e51b815260009060609030906360987c209061345e90889088908890600401615ad8565b600060405180830381600087803b15801561347857600080fd5b505af1925050508015613489575060015b6134c8573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b506003925090506134dd565b50506040805160208101909152600081526002905b935093915050565b60008060008060006135468860405160240161351091906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052888861138860846135c8565b9250925092508261356c578160405163e1cd550960e01b815260040161079a9190613d0e565b602082511461359b578151604051631e3be00960e21b815260206004820152602481019190915260440161079a565b818060200190518101906135af9190615987565b6135b982886152f6565b94509450505050935093915050565b6000606060008361ffff166001600160401b038111156135ea576135ea6139e2565b6040519080825280601f01601f191660200182016040528015613614576020820181803683370190505b509150863b61362e5763030ed58f60e21b60005260046000fd5b5a8581101561364857632be8ca8b60e21b60005260046000fd5b8590036040810481038710613668576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561368b5750835b808352806000602085013e50955095509592505050565b82518251600091908183036136ca57604051630469ac9960e21b815260040160405180910390fd5b61010182118015906136de57506101018111155b6136fb576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613725576040516309bde33960e01b815260040160405180910390fd5b8060000361375257866000815181106137405761374061500c565b60200260200101519350505050613920565b6000816001600160401b0381111561376c5761376c6139e2565b604051908082528060200260200182016040528015613795578160200160208202803683370190505b50905060008080805b858110156138bf5760006001821b8b8116036137f957888510156137e2578c5160018601958e9181106137d3576137d361500c565b6020026020010151905061381b565b85516001850194879181106137d3576137d361500c565b8b5160018401938d9181106138105761381061500c565b602002602001015190505b60008986101561384b578d5160018701968f91811061383c5761383c61500c565b6020026020010151905061386d565b86516001860195889181106138625761386261500c565b602002602001015190505b8285111561388e576040516309bde33960e01b815260040160405180910390fd5b6138988282613927565b8784815181106138aa576138aa61500c565b6020908102919091010152505060010161379e565b5060018503821480156138d157508683145b80156138dc57508581145b6138f9576040516309bde33960e01b815260040160405180910390fd5b83600186038151811061390e5761390e61500c565b60200260200101519750505050505050505b9392505050565b600081831061393f5761393a8284613945565b610ad2565b610ad283835b604080516001602082015290810183905260608101829052600090608001613331565b8280548282559060005260206000209081019282156139bd579160200282015b828111156139bd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613988565b506139c99291506139cd565b5090565b5b808211156139c957600081556001016139ce565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405290565b60405160a081016001600160401b0381118282101715613a1a57613a1a6139e2565b60405160c081016001600160401b0381118282101715613a1a57613a1a6139e2565b604080519081016001600160401b0381118282101715613a1a57613a1a6139e2565b604051601f8201601f191681016001600160401b0381118282101715613aae57613aae6139e2565b604052919050565b60006001600160401b03821115613acf57613acf6139e2565b5060051b60200190565b6001600160a01b038116811461051357600080fd5b80356001600160401b0381168114613b0557600080fd5b919050565b801515811461051357600080fd5b8035613b0581613b0a565b60006001600160401b03821115613b3c57613b3c6139e2565b50601f01601f191660200190565b600082601f830112613b5b57600080fd5b8135613b6e613b6982613b23565b613a86565b818152846020838601011115613b8357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613bb357600080fd5b82356001600160401b0380821115613bca57600080fd5b818501915085601f830112613bde57600080fd5b8135613bec613b6982613ab6565b81815260059190911b83018401908481019088831115613c0b57600080fd5b8585015b83811015613cb157803585811115613c275760008081fd5b86016080818c03601f1901811315613c3f5760008081fd5b613c476139f8565b89830135613c5481613ad9565b81526040613c63848201613aee565b8b830152606080850135613c7681613b0a565b83830152928401359289841115613c8f57600091508182fd5b613c9d8f8d86880101613b4a565b908301525085525050918601918601613c0f565b5098975050505050505050565b60005b83811015613cd9578181015183820152602001613cc1565b50506000910152565b60008151808452613cfa816020860160208601613cbe565b601f01601f19169290920160200192915050565b602081526000610ad26020830184613ce2565b8060608101831015610ad557600080fd5b60008083601f840112613d4457600080fd5b5081356001600160401b03811115613d5b57600080fd5b602083019150836020828501011115613d7357600080fd5b9250929050565b60008083601f840112613d8c57600080fd5b5081356001600160401b03811115613da357600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b60008060008060008060008060e0898b031215613dda57600080fd5b613de48a8a613d21565b975060608901356001600160401b0380821115613e0057600080fd5b613e0c8c838d01613d32565b909950975060808b0135915080821115613e2557600080fd5b613e318c838d01613d7a565b909750955060a08b0135915080821115613e4a57600080fd5b50613e578b828c01613d7a565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215613e8557600080fd5b613e8f8585613d21565b925060608401356001600160401b03811115613eaa57600080fd5b613eb686828701613d32565b9497909650939450505050565b60008060408385031215613ed657600080fd5b613edf83613aee565b9150613eed60208401613aee565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110613f1c57613f1c613ef6565b9052565b60208101610ad58284613f0c565b600060a08284031215613f4057600080fd5b613f48613a20565b905081358152613f5a60208301613aee565b6020820152613f6b60408301613aee565b6040820152613f7c60608301613aee565b6060820152613f8d60808301613aee565b608082015292915050565b8035613b0581613ad9565b803563ffffffff81168114613b0557600080fd5b600082601f830112613fc857600080fd5b81356020613fd8613b6983613ab6565b82815260059290921b84018101918181019086841115613ff757600080fd5b8286015b848110156140c75780356001600160401b038082111561401b5760008081fd5b9088019060a0828b03601f19018113156140355760008081fd5b61403d613a20565b878401358381111561404f5760008081fd5b61405d8d8a83880101613b4a565b82525060408085013561406f81613ad9565b828a01526060614080868201613fa3565b8284015260809150818601358581111561409a5760008081fd5b6140a88f8c838a0101613b4a565b9184019190915250919093013590830152508352918301918301613ffb565b509695505050505050565b600061014082840312156140e557600080fd5b6140ed613a42565b90506140f98383613f2e565b815260a08201356001600160401b038082111561411557600080fd5b61412185838601613b4a565b602084015260c084013591508082111561413a57600080fd5b61414685838601613b4a565b604084015261415760e08501613f98565b6060840152610100840135608084015261012084013591508082111561417c57600080fd5b5061418984828501613fb7565b60a08301525092915050565b600082601f8301126141a657600080fd5b813560206141b6613b6983613ab6565b82815260059290921b840181019181810190868411156141d557600080fd5b8286015b848110156140c75780356001600160401b038111156141f85760008081fd5b6142068986838b01016140d2565b8452509183019183016141d9565b600082601f83011261422557600080fd5b81356020614235613b6983613ab6565b82815260059290921b8401810191818101908684111561425457600080fd5b8286015b848110156140c75780356001600160401b038082111561427757600080fd5b818901915089603f83011261428b57600080fd5b8582013561429b613b6982613ab6565b81815260059190911b830160400190878101908c8311156142bb57600080fd5b604085015b838110156142f4578035858111156142d757600080fd5b6142e68f6040838a0101613b4a565b8452509189019189016142c0565b50875250505092840192508301614258565b600082601f83011261431757600080fd5b81356020614327613b6983613ab6565b8083825260208201915060208460051b87010193508684111561434957600080fd5b602086015b848110156140c7578035835291830191830161434e565b600082601f83011261437657600080fd5b81356020614386613b6983613ab6565b82815260059290921b840181019181810190868411156143a557600080fd5b8286015b848110156140c75780356001600160401b03808211156143c95760008081fd5b9088019060a0828b03601f19018113156143e35760008081fd5b6143eb613a20565b6143f6888501613aee565b81526040808501358481111561440c5760008081fd5b61441a8e8b83890101614195565b8a84015250606080860135858111156144335760008081fd5b6144418f8c838a0101614214565b838501525060809150818601358581111561445c5760008081fd5b61446a8f8c838a0101614306565b91840191909152509190930135908301525083529183019183016143a9565b6000806040838503121561449c57600080fd5b6001600160401b03833511156144b157600080fd5b6144be8484358501614365565b91506001600160401b03602084013511156144d857600080fd5b6020830135830184601f8201126144ee57600080fd5b6144fb613b698235613ab6565b81358082526020808301929160051b84010187101561451957600080fd5b602083015b6020843560051b8501018110156146bf576001600160401b038135111561454457600080fd5b87603f82358601011261455657600080fd5b614569613b696020833587010135613ab6565b81358501602081810135808452908301929160059190911b016040018a101561459157600080fd5b604083358701015b83358701602081013560051b016040018110156146af576001600160401b03813511156145c557600080fd5b833587018135016040818d03603f190112156145e057600080fd5b6145e8613a64565b604082013581526001600160401b036060830135111561460757600080fd5b8c605f60608401358401011261461c57600080fd5b6040606083013583010135614633613b6982613ab6565b808282526020820191508f60608460051b606088013588010101111561465857600080fd5b6060808601358601015b60608460051b60608801358801010181101561468f5761468181613fa3565b835260209283019201614662565b508060208501525050508085525050602083019250602081019050614599565b508452506020928301920161451e565b508093505050509250929050565b6000806000806000606086880312156146e557600080fd5b85356001600160401b03808211156146fc57600080fd5b61470889838a016140d2565b9650602088013591508082111561471e57600080fd5b61472a89838a01613d7a565b9096509450604088013591508082111561474357600080fd5b5061475088828901613d7a565b969995985093965092949392505050565b60006060828403121561477357600080fd5b604051606081018181106001600160401b0382111715614795576147956139e2565b60405282356147a381613ad9565b81526147b160208401613fa3565b602082015260408301356147c481613ad9565b60408201529392505050565b6000602082840312156147e257600080fd5b81356001600160401b038111156147f857600080fd5b820160a0818503121561392057600080fd5b803560ff81168114613b0557600080fd5b60006020828403121561482d57600080fd5b610ad28261480a565b60008151808452602080850194506020840160005b838110156148705781516001600160a01b03168752958201959082019060010161484b565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526148ca60e0840182614836565b90506040840151601f198483030160c08501526148e78282614836565b95945050505050565b6000806040838503121561490357600080fd5b61490c83613aee565b946020939093013593505050565b60006020828403121561492c57600080fd5b610ad282613aee565b602081526001600160a01b0382511660208201526020820151151560408201526001600160401b0360408301511660608201526000606083015160808084015261338460a0840182613ce2565b60006020828403121561499457600080fd5b813561392081613ad9565b600082601f8301126149b057600080fd5b813560206149c0613b6983613ab6565b8083825260208201915060208460051b8701019350868411156149e257600080fd5b602086015b848110156140c75780356149fa81613ad9565b83529183019183016149e7565b60006020808385031215614a1a57600080fd5b82356001600160401b0380821115614a3157600080fd5b818501915085601f830112614a4557600080fd5b8135614a53613b6982613ab6565b81815260059190911b83018401908481019088831115614a7257600080fd5b8585015b83811015613cb157803585811115614a8d57600080fd5b860160c0818c03601f19011215614aa45760008081fd5b614aac613a42565b8882013581526040614abf81840161480a565b8a8301526060614ad081850161480a565b8284015260809150614ae3828501613b18565b9083015260a08381013589811115614afb5760008081fd5b614b098f8d8388010161499f565b838501525060c0840135915088821115614b235760008081fd5b614b318e8c8487010161499f565b9083015250845250918601918601614a76565b80356001600160e01b0381168114613b0557600080fd5b600082601f830112614b6c57600080fd5b81356020614b7c613b6983613ab6565b82815260069290921b84018101918181019086841115614b9b57600080fd5b8286015b848110156140c75760408189031215614bb85760008081fd5b614bc0613a64565b614bc982613aee565b8152614bd6858301614b44565b81860152835291830191604001614b9f565b600082601f830112614bf957600080fd5b81356020614c09613b6983613ab6565b82815260059290921b84018101918181019086841115614c2857600080fd5b8286015b848110156140c75780356001600160401b0380821115614c4c5760008081fd5b9088019060a0828b03601f1901811315614c665760008081fd5b614c6e613a20565b614c79888501613aee565b815260408085013584811115614c8f5760008081fd5b614c9d8e8b83890101613b4a565b8a8401525060609350614cb1848601613aee565b908201526080614cc2858201613aee565b93820193909352920135908201528352918301918301614c2c565b600082601f830112614cee57600080fd5b81356020614cfe613b6983613ab6565b82815260069290921b84018101918181019086841115614d1d57600080fd5b8286015b848110156140c75760408189031215614d3a5760008081fd5b614d42613a64565b813581528482013585820152835291830191604001614d21565b60006020808385031215614d6f57600080fd5b82356001600160401b0380821115614d8657600080fd5b9084019060808287031215614d9a57600080fd5b614da26139f8565b823582811115614db157600080fd5b83016040818903811315614dc457600080fd5b614dcc613a64565b823585811115614ddb57600080fd5b8301601f81018b13614dec57600080fd5b8035614dfa613b6982613ab6565b81815260069190911b8201890190898101908d831115614e1957600080fd5b928a01925b82841015614e695785848f031215614e365760008081fd5b614e3e613a64565b8435614e4981613ad9565b8152614e56858d01614b44565b818d0152825292850192908a0190614e1e565b845250505082870135915084821115614e8157600080fd5b614e8d8a838501614b5b565b81880152835250508284013582811115614ea657600080fd5b614eb288828601614be8565b85830152506040830135935081841115614ecb57600080fd5b614ed787858501614cdd565b6040820152606083013560608201528094505050505092915050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a06001600160401b03808351168652868301518288880152614f4883880182613ce2565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101614f10565b5090979650505050505050565b6001600160a01b038516815260006020608081840152614fb46080840187614ef3565b83810360408581019190915286518083528388019284019060005b81811015614ff457845180518452860151868401529385019391830191600101614fcf565b50508094505050505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561507957835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615042565b50508583015187820388850152805180835290840192506000918401905b808310156150d257835180516001600160401b031683528501516001600160e01b031685830152928401926001929092019190850190615097565b50979650505050505050565b602081526000610ad26020830184615022565b60006020828403121561510357600080fd5b815161392081613b0a565b600181811c9082168061512257607f821691505b60208210810361514257634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546151568161510e565b6001828116801561516e5760018114615183576151b2565b60ff19841687528215158302870194506151b2565b8760005260208060002060005b858110156151a95781548a820152908401908201615190565b50505082870194505b50929695505050505050565b600081546151cb8161510e565b8085526020600183811680156151e8576001811461520257615230565b60ff1985168884015283151560051b880183019550615230565b866000528260002060005b858110156152285781548a820186015290830190840161520d565b890184019650505b505050505092915050565b60408152600061524e6040830185613ce2565b82810360208401526148e781856151be565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561529657615296615260565b5092915050565b6040815260006152b06040830185614ef3565b82810360208401526148e78185615022565b6000602082840312156152d457600080fd5b81356001600160401b038111156152ea57600080fd5b61338484828501614365565b81810381811115610ad557610ad5615260565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b038084168061533957615339615309565b92169190910692915050565b8082028115828204841417610ad557610ad5615260565b80518252600060206001600160401b0381840151168185015260408084015160a0604087015261538f60a0870182613ce2565b9050606085015186820360608801526153a88282613ce2565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156150d257835180516001600160a01b03168352860151868301529285019260019290920191908401906153cb565b602081526000610ad2602083018461535c565b608081526000615423608083018761535c565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561546157600080fd5b835161546c81613b0a565b60208501519093506001600160401b0381111561548857600080fd5b8401601f8101861361549957600080fd5b80516154a7613b6982613b23565b8181528760208385010111156154bc57600080fd5b6154cd826020830160208601613cbe565b809450505050604084015190509250925092565b601f821115610d65576000816000526020600020601f850160051c8101602086101561550a5750805b601f850160051c820191505b8181101561552957828155600101615516565b505050505050565b81516001600160401b0381111561554a5761554a6139e2565b61555e81615558845461510e565b846154e1565b602080601f831160018114615593576000841561557b5750858301515b600019600386901b1c1916600185901b178555615529565b600085815260208120601f198616915b828110156155c2578886015182559484019460019091019084016155a3565b50858210156155e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082546001600160a01b038116602084015260ff8160a01c16151560408401526001600160401b038160a81c16606084015250608080830152610ad260a08301600185016151be565b80820180821115610ad557610ad5615260565b60ff8181168382160190811115610ad557610ad5615260565b8183823760009101908152919050565b828152606082602083013760800192915050565b60006001600160401b03808416806156a8576156a8615309565b92169190910492915050565b6000602082840312156156c657600080fd5b610ad282613fa3565b6000808335601e198436030181126156e657600080fd5b8301803591506001600160401b0382111561570057600080fd5b602001915036819003821315613d7357600080fd5b602081016006831061572957615729613ef6565b91905290565b60ff818116838216029081169081811461529657615296615260565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156157a35784546001600160a01b03168352600194850194928401920161577e565b50508481036060860152865180825290820192508187019060005b818110156157e35782516001600160a01b0316855293830193918301916001016157be565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b038086168352808516602084015250606060408301526148e76060830184613ce2565b8281526040602082015260006133846040830184613ce2565b6001600160401b03848116825283166020820152606081016133846040830184613f0c565b8481526158776020820185613f0c565b60806040820152600061588d6080830185613ce2565b905082606083015295945050505050565b6000602082840312156158b057600080fd5b815161392081613ad9565b60208152600082516101008060208501526158da610120850183613ce2565b915060208501516158f660408601826001600160401b03169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161593060a08601826001600160a01b03169052565b5060a0850151601f19808685030160c087015261594d8483613ce2565b935060c08701519150808685030160e087015261596a8483613ce2565b935060e08701519150808685030183870152506157f38382613ce2565b60006020828403121561599957600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b84811015614f8457601f19868403018952815160a081518186526159e382870182613ce2565b9150506001600160a01b03868301511686860152604063ffffffff8184015116818701525060608083015186830382880152615a1f8382613ce2565b60809485015197909401969096525050988401989250908301906001016159bd565b602081526000610ad260208301846159a0565b60008282518085526020808601955060208260051b8401016020860160005b84811015614f8457601f19868403018952615a8f838351613ce2565b98840198925090830190600101615a73565b60008151808452602080850194506020840160005b8381101561487057815163ffffffff1687529582019590820190600101615ab6565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615b406101a0850183613ce2565b91506040870151605f198086850301610120870152615b5f8483613ce2565b935060608901519150615b7c838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615ba582826159a0565b9150508281036020840152615bba8186615a54565b905082810360408401526157f38185615aa156fea164736f6c6343000818000a", } var OffRampABI = OffRampMetaData.ABI @@ -568,27 +560,27 @@ func (_OffRamp *OffRampTransactorSession) Execute(reportContext [3][32]byte, rep return _OffRamp.Contract.Execute(&_OffRamp.TransactOpts, reportContext, report) } -func (_OffRamp *OffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData) +func (_OffRamp *OffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData) +func (_OffRamp *OffRampSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampTransactorSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData) +func (_OffRamp *OffRampTransactorSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.contract.Transact(opts, "manuallyExecute", reports, gasLimitOverrides) } -func (_OffRamp *OffRampSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) } -func (_OffRamp *OffRampTransactorSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampTransactorSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) } @@ -807,8 +799,9 @@ func (it *OffRampCommitReportAcceptedIterator) Close() error { } type OffRampCommitReportAccepted struct { - Report OffRampCommitReport - Raw types.Log + MerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log } func (_OffRamp *OffRampFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*OffRampCommitReportAcceptedIterator, error) { @@ -2406,7 +2399,7 @@ func (OffRampAlreadyAttempted) Topic() common.Hash { } func (OffRampCommitReportAccepted) Topic() common.Hash { - return common.HexToHash("0xd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e1") + return common.HexToHash("0x35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4") } func (OffRampConfigSet) Topic() common.Hash { @@ -2414,7 +2407,7 @@ func (OffRampConfigSet) Topic() common.Hash { } func (OffRampDynamicConfigSet) Topic() common.Hash { - return common.HexToHash("0xa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d") + return common.HexToHash("0xa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d") } func (OffRampExecutionStateChanged) Topic() common.Hash { @@ -2490,9 +2483,9 @@ type OffRampInterface interface { Execute(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte) (*types.Transaction, error) - ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) + ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) - ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) + ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OffRampDynamicConfig) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go index 776f9456503..71d25dec614 100644 --- a/core/gethwrappers/ccip/generated/onramp/onramp.go +++ b/core/gethwrappers/ccip/generated/onramp/onramp.go @@ -51,7 +51,16 @@ type InternalEVM2AnyRampMessage struct { ExtraArgs []byte FeeToken common.Address FeeTokenAmount *big.Int - TokenAmounts []InternalRampTokenAmount + FeeValueJuels *big.Int + TokenAmounts []InternalEVM2AnyTokenTransfer +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte } type InternalRampMessageHeader struct { @@ -62,14 +71,6 @@ type InternalRampMessageHeader struct { Nonce uint64 } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte - DestTokenAddress []byte - ExtraData []byte - Amount *big.Int - DestExecData []byte -} - type OnRampAllowListConfigArgs struct { DestChainSelector uint64 AllowListEnabled bool @@ -83,10 +84,11 @@ type OnRampDestChainConfigArgs struct { } type OnRampDynamicConfig struct { - FeeQuoter common.Address - MessageValidator common.Address - FeeAggregator common.Address - AllowListAdmin common.Address + FeeQuoter common.Address + ReentrancyGuardEntered bool + MessageInterceptor common.Address + FeeAggregator common.Address + AllowListAdmin common.Address } type OnRampStaticConfig struct { @@ -97,8 +99,8 @@ type OnRampStaticConfig struct { } var OnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"name\":\"AllowListAdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"}],\"name\":\"DestChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\"}],\"internalType\":\"structOnRamp.AllowListConfigArgs[]\",\"name\":\"allowListConfigArgsItems\",\"type\":\"tuple[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200402938038062004029833981016040819052620000359162000665565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d8162000390565b5050506200079f565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060408101516001600160a01b0316155b1562000273576040516306b7c75960e31b815260040160405180910390fd5b8051600280546001600160a01b03199081166001600160a01b0393841617909155602080840180516003805485169186169190911790556040808601805160048054871691881691909117905560608088018051600580549098169089161790965582516080808201855280516001600160401b031680835260a080518b16848a0190815260c080518d16868a0190815260e080518f169789019788528a5195865292518e169b85019b909b5299518c169783019790975292518a169381019390935289518916908301529351871693810193909352518516928201929092529151909216918101919091527f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32906101000160405180910390a150565b60005b8151811015620004cf576000828281518110620003b457620003b462000789565b602002602001015190506000838381518110620003d557620003d562000789565b6020026020010151600001519050806001600160401b03166000036200041a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a250505080600101905062000393565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200050e576200050e620004d3565b60405290565b604080519081016001600160401b03811182821017156200050e576200050e620004d3565b604051601f8201601f191681016001600160401b0381118282101715620005645762000564620004d3565b604052919050565b80516001600160401b03811681146200058457600080fd5b919050565b6001600160a01b03811681146200059f57600080fd5b50565b600082601f830112620005b457600080fd5b815160206001600160401b03821115620005d257620005d2620004d3565b620005e2818360051b0162000539565b82815260069290921b840181019181810190868411156200060257600080fd5b8286015b848110156200065a5760408189031215620006215760008081fd5b6200062b62000514565b62000636826200056c565b815284820151620006478162000589565b8186015283529183019160400162000606565b509695505050505050565b60008060008385036101208112156200067d57600080fd5b60808112156200068c57600080fd5b62000696620004e9565b620006a1866200056c565b81526020860151620006b38162000589565b60208201526040860151620006c88162000589565b60408201526060860151620006dd8162000589565b606082015293506080607f1982011215620006f757600080fd5b5062000702620004e9565b6080850151620007128162000589565b815260a0850151620007248162000589565b602082015260c0850151620007398162000589565b604082015260e08501516200074e8162000589565b60608201526101008501519092506001600160401b038111156200077157600080fd5b6200077f86828701620005a2565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613811620008186000396000818161022c01528181610c790152611ba10152600081816101f0015281816112480152611b7a0152600081816101b4015281816105de0152611b500152600081816101840152818161116e0152818161164b0152611b2301526138116000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806379ba5097116100b2578063a6f3ab6c11610081578063df0aa9e911610066578063df0aa9e91461052d578063f2fde38b14610540578063fbca3b741461055357600080fd5b8063a6f3ab6c146104cd578063d77d5ed0146104e057600080fd5b806379ba50971461045b5780638da5cb5b146104635780639041be3d14610481578063972b4612146104ad57600080fd5b806334adf4941161010957806348a98aa4116100ee57806348a98aa4146103045780636def4ce71461033c5780637437ff9f146103db57600080fd5b806334adf494146102e95780633a019940146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e610149366004612696565b610566565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102769190612759565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610276919061281e565b6102db6102d6366004612849565b61057a565b604051908152602001610276565b61014e6102f7366004612899565b610733565b61014e610a06565b61031761031236600461290e565b610c31565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b61039f61034a366004612947565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61044e604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260025473ffffffffffffffffffffffffffffffffffffffff908116825260035481166020830152600454811692820192909252600554909116606082015290565b6040516102769190612964565b61014e610ce6565b60005473ffffffffffffffffffffffffffffffffffffffff16610317565b61049461048f366004612947565b610de3565b60405167ffffffffffffffff9091168152602001610276565b6104c06104bb366004612947565b610e0c565b60405161027691906129ad565b61014e6104db366004612a17565b610e34565b6103176104ee366004612947565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db61053b366004612a7e565b610e45565b61014e61054e366004612aea565b6116fe565b6104c0610561366004612947565b61170f565b61056e611743565b610577816117c6565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106499190612b15565b15610691576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906106e99086908690600401612c46565b602060405180830381865afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612d8f565b90505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107a35760055473ffffffffffffffffffffffffffffffffffffffff1633146107a3576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a015760008383838181106107c2576107c2612da8565b90506020028101906107d49190612dd7565b6107dd90612e88565b805167ffffffffffffffff1660009081526006602090815260409091209082015181547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000009115801592909202178255919250906109545760005b8260400151518110156108fd5760008360400151828151811061086757610867612da8565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e65783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610688565b6108f3600184018261193d565b5050600101610842565b506040820151511561095457816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161094b91906129ad565b60405180910390a25b60005b8260600151518110156109a0576109978360600151828151811061097d5761097d612da8565b60200260200101518360010161195f90919063ffffffff16565b50600101610957565b50606082015151156109f757816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158683606001516040516109ee91906129ad565b60405180910390a25b50506001016107a6565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610a75573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610abb9190810190612f1b565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a01576000838281518110610af757610af7612da8565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b969190612d8f565b90508015610c2757610bbf73ffffffffffffffffffffffffffffffffffffffff83168583611981565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610c1e91815260200190565b60405180910390a35b5050600101610ada565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612faa565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610688565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161072d91166001612ff6565b67ffffffffffffffff8116600090815260066020526040902060609061072d90600101611a0e565b610e3c611743565b61057781611a22565b67ffffffffffffffff8416600090815260066020526040812073ffffffffffffffffffffffffffffffffffffffff8316610eab576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff1615610f1c57610ece6001820184611c04565b610f1c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610688565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f79576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff16801561101f576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e50690610fec908a908a90600401612c46565b600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b506002546000908190819073ffffffffffffffffffffffffffffffffffffffff1663c4276bfc8a61105660808c0160608d01612aea565b8a61106460808e018e613017565b6040518663ffffffff1660e01b815260040161108495949392919061307c565b600060405180830381865afa1580156110a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110e79190810190613144565b919450925090506110fe6080890160608a01612aea565b73ffffffffffffffffffffffffffffffffffffffff167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f8460405161114591815260200190565b60405180910390a2604080516101a081019091526000610100820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101208501528c811661014085015287549293928392916101608401918a9187916111ba911661319e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001866112ba576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8f16600482015273ffffffffffffffffffffffffffffffffffffffff8c811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b591906131c5565b6112bd565b60005b67ffffffffffffffff1681525081526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018a80602001906112fb9190613017565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161133f8b80613017565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020810184905260400161139060808c0160608d01612aea565b73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018a80604001906113c191906131e2565b905067ffffffffffffffff8111156113db576113db612570565b60405190808252806020026020018201604052801561143e57816020015b61142b6040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8152602001906001900390816113f95790505b509052905060005b61145360408b018b6131e2565b9050811015611502576114d961146c60408c018c6131e2565b8381811061147c5761147c612da8565b905060400201803603810190611492919061324a565b8c61149d8d80613017565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e9250611c33915050565b8260e0015182815181106114ef576114ef612da8565b6020908102919091010152600101611446565b5060025460e082015160009173ffffffffffffffffffffffffffffffffffffffff169063085318f8908d9061153a60408f018f6131e2565b6040518563ffffffff1660e01b81526004016115599493929190613361565b600060405180830381865afa158015611576573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115bc9190810190613397565b905060005b8260e0015151811015611615578181815181106115e0576115e0612da8565b60200260200101518360e0015182815181106115fe576115fe612da8565b6020908102919091010151608001526001016115c1565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c1660608201523060808201526116a590839060a00160405160208183030381529060405280519060200120611f59565b82515260405167ffffffffffffffff8c16907ff6e86ef8896c7a0d629406168f396e883280680c99e649b9e2d36466fbc9f9e5906116e4908590613448565b60405180910390a25051519450505050505b949350505050565b611706611743565b61057781612059565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146117c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610688565b565b60005b81518110156119395760008282815181106117e6576117e6612da8565b60200260200101519050600083838151811061180457611804612da8565b60200260200101516000015190508067ffffffffffffffff16600003611862576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610688565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a25050508060010190506117c9565b5050565b600061072a8373ffffffffffffffffffffffffffffffffffffffff841661214e565b600061072a8373ffffffffffffffffffffffffffffffffffffffff841661219d565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a01908490612297565b60606000611a1b836123a3565b9392505050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a5e5750604081015173ffffffffffffffffffffffffffffffffffffffff16155b15611a95576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff93841617909155602080840151600380548416918516919091179055604080850151600480548516918616919091179055606080860151600580549095169086161790935580516080810182527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681527f00000000000000000000000000000000000000000000000000000000000000008516928101929092527f00000000000000000000000000000000000000000000000000000000000000008416828201527f00000000000000000000000000000000000000000000000000000000000000009093169181019190915290517f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e3291611bf9918490613596565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561072a565b611c656040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611ca3576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cb3858760000151610c31565b905073ffffffffffffffffffffffffffffffffffffffff81161580611d8357506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d819190612b15565b155b15611dd55785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610688565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611e749190613635565b6000604051808303816000875af1158015611e93573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ed991908101906136ab565b6040805160a0810190915273ffffffffffffffffffffffffffffffffffffffff841660c08201529091508060e0810160405160208183030381529060405281526020018260000151815260200182602001518152602001886020015181526020016040518060200160405280600081525081525092505050949350505050565b60008060001b82846020015185606001518660000151606001518760000151608001518860a001518960c00151604051602001611f9b9695949392919061373c565b604051602081830303815290604052805190602001208560400151805190602001208660e00151604051602001611fd2919061379d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808c0151805190840120928501989098529183019590955260608201939093529384015260a083015260c082015260e00160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff8216036120d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610688565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546121955750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072d565b50600061072d565b600081815260018301602052604081205480156122865760006121c16001836137b0565b85549091506000906121d5906001906137b0565b905080821461223a5760008660000182815481106121f5576121f5612da8565b906000526020600020015490508087600001848154811061221857612218612da8565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061224b5761224b6137c3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061072d565b600091505061072d565b5092915050565b60006122f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123ff9092919063ffffffff16565b805190915015610a0157808060200190518101906123179190612b15565b610a01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610688565b6060816000018054806020026020016040519081016040528092919081815260200182805480156123f357602002820191906000526020600020905b8154815260200190600101908083116123df575b50505050509050919050565b60606116f68484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161243391906137f2565b60006040518083038185875af1925050503d8060008114612470576040519150601f19603f3d011682016040523d82523d6000602084013e612475565b606091505b509150915061248687838387612491565b979650505050505050565b606083156125275782516000036125205773ffffffffffffffffffffffffffffffffffffffff85163b612520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610688565b50816116f6565b6116f6838381511561253c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610688919061281e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156125c2576125c2612570565b60405290565b6040516080810167ffffffffffffffff811182821017156125c2576125c2612570565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561263257612632612570565b604052919050565b600067ffffffffffffffff82111561265457612654612570565b5060051b60200190565b67ffffffffffffffff8116811461057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461057757600080fd5b600060208083850312156126a957600080fd5b823567ffffffffffffffff8111156126c057600080fd5b8301601f810185136126d157600080fd5b80356126e46126df8261263a565b6125eb565b81815260069190911b8201830190838101908783111561270357600080fd5b928401925b8284101561248657604084890312156127215760008081fd5b61272961259f565b84356127348161265e565b81528486013561274381612674565b8187015282526040939093019290840190612708565b6080810161072d828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156127cb5781810151838201526020016127b3565b50506000910152565b600081518084526127ec8160208601602086016127b0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061072a60208301846127d4565b600060a0828403121561284357600080fd5b50919050565b6000806040838503121561285c57600080fd5b82356128678161265e565b9150602083013567ffffffffffffffff81111561288357600080fd5b61288f85828601612831565b9150509250929050565b600080602083850312156128ac57600080fd5b823567ffffffffffffffff808211156128c457600080fd5b818501915085601f8301126128d857600080fd5b8135818111156128e757600080fd5b8660208260051b85010111156128fc57600080fd5b60209290920196919550909350505050565b6000806040838503121561292157600080fd5b823561292c8161265e565b9150602083013561293c81612674565b809150509250929050565b60006020828403121561295957600080fd5b8135611a1b8161265e565b6080810161072d8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015182169084015260408083015182169084015260609182015116910152565b6020808252825182820181905260009190848201906040850190845b818110156129fb57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016129c9565b50909695505050505050565b8035612a1281612674565b919050565b600060808284031215612a2957600080fd5b612a316125c8565b8235612a3c81612674565b81526020830135612a4c81612674565b60208201526040830135612a5f81612674565b60408201526060830135612a7281612674565b60608201529392505050565b60008060008060808587031215612a9457600080fd5b8435612a9f8161265e565b9350602085013567ffffffffffffffff811115612abb57600080fd5b612ac787828801612831565b935050604085013591506060850135612adf81612674565b939692955090935050565b600060208284031215612afc57600080fd5b8135611a1b81612674565b801515811461057757600080fd5b600060208284031215612b2757600080fd5b8151611a1b81612b07565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b6757600080fd5b830160208101925035905067ffffffffffffffff811115612b8757600080fd5b803603821315612b9657600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612c3b578135612c0981612674565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612bf6565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612c678485612b32565b60a06040860152612c7c60e086018284612b9d565b915050612c8c6020860186612b32565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612cc2848385612b9d565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612cfb57600080fd5b60209288019283019235915084821115612d1457600080fd5b8160061b3603831315612d2657600080fd5b80878503016080880152612d3b848385612be6565b9450612d4960608901612a07565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612d746080890189612b32565b94509250808786030160c08801525050612486838383612b9d565b600060208284031215612da157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612e0b57600080fd5b9190910192915050565b600082601f830112612e2657600080fd5b81356020612e366126df8361263a565b8083825260208201915060208460051b870101935086841115612e5857600080fd5b602086015b84811015612e7d578035612e7081612674565b8352918301918301612e5d565b509695505050505050565b600060808236031215612e9a57600080fd5b612ea26125c8565b8235612ead8161265e565b81526020830135612ebd81612b07565b6020820152604083013567ffffffffffffffff80821115612edd57600080fd5b612ee936838701612e15565b60408401526060850135915080821115612f0257600080fd5b50612f0f36828601612e15565b60608301525092915050565b60006020808385031215612f2e57600080fd5b825167ffffffffffffffff811115612f4557600080fd5b8301601f81018513612f5657600080fd5b8051612f646126df8261263a565b81815260059190911b82018301908381019087831115612f8357600080fd5b928401925b82841015612486578351612f9b81612674565b82529284019290840190612f88565b600060208284031215612fbc57600080fd5b8151611a1b81612674565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561229057612290612fc7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261304c57600080fd5b83018035915067ffffffffffffffff82111561306757600080fd5b602001915036819003821315612b9657600080fd5b67ffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152608060608201526000612486608083018486612b9d565b600082601f8301126130d357600080fd5b815167ffffffffffffffff8111156130ed576130ed612570565b61311e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125eb565b81815284602083860101111561313357600080fd5b6116f68260208301602087016127b0565b60008060006060848603121561315957600080fd5b83519250602084015161316b81612b07565b604085015190925067ffffffffffffffff81111561318857600080fd5b613194868287016130c2565b9150509250925092565b600067ffffffffffffffff8083168181036131bb576131bb612fc7565b6001019392505050565b6000602082840312156131d757600080fd5b8151611a1b8161265e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261321757600080fd5b83018035915067ffffffffffffffff82111561323257600080fd5b6020019150600681901b3603821315612b9657600080fd5b60006040828403121561325c57600080fd5b61326461259f565b823561326f81612674565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b84811015613354577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a081518186526132e5828701826127d4565b91505085820151858203878701526132fd82826127d4565b9150506040808301518683038288015261331783826127d4565b9250505060608083015181870152506080808301519250858203818701525061334081836127d4565b9a86019a94505050908301906001016132a1565b5090979650505050505050565b67ffffffffffffffff851681526060602082015260006133846060830186613284565b8281036040840152612486818587612be6565b600060208083850312156133aa57600080fd5b825167ffffffffffffffff808211156133c257600080fd5b818501915085601f8301126133d657600080fd5b81516133e46126df8261263a565b81815260059190911b8301840190848101908883111561340357600080fd5b8585015b8381101561343b5780518581111561341f5760008081fd5b61342d8b89838a01016130c2565b845250918601918601613407565b5098975050505050505050565b6020815261349960208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b600060208301516134c260c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e08501526134df6101a08501836127d4565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030161010087015261351c84836127d4565b935060808701519150808685030161012087015261353a84836127d4565b935060a0870151915061356661014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e087015191508086850301838701525061358c8382613284565b9695505050505050565b61010081016135ee828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff90811660808401526020840151811660a08401526040840151811660c084015260608401511660e0830152611a1b565b602081526000825160a0602084015261365160c08401826127d4565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b6000602082840312156136bd57600080fd5b815167ffffffffffffffff808211156136d557600080fd5b90830190604082860312156136e957600080fd5b6136f161259f565b82518281111561370057600080fd5b61370c878286016130c2565b82525060208301518281111561372157600080fd5b61372d878286016130c2565b60208301525095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260c0602084015261376c60c08401896127d4565b67ffffffffffffffff97881660408501529590961660608301525091909316608082015260a0019190915292915050565b60208152600061072a6020830184613284565b8181038181111561072d5761072d612fc7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612e0b8184602087016127b056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"name\":\"AllowListAdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"}],\"name\":\"DestChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\"}],\"internalType\":\"structOnRamp.AllowListConfigArgs[]\",\"name\":\"allowListConfigArgsItems\",\"type\":\"tuple[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"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\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"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\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101006040523480156200001257600080fd5b506040516200422f3803806200422f83398101604081905262000035916200073f565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d81620003e0565b50505062000840565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060608101516001600160a01b0316155b8062000261575080602001515b1562000280576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191620003d591849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b81518110156200051f5760008282815181106200040457620004046200082a565b6020026020010151905060008383815181106200042557620004256200082a565b6020026020010151600001519050806001600160401b03166000036200046a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050620003e3565b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200055e576200055e62000523565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f62000523565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b6001600160a01b0381168114620005ca57600080fd5b50565b600060a08284031215620005e057600080fd5b60405160a081016001600160401b038111828210171562000605576200060562000523565b806040525080915082516200061a81620005b4565b8152602083015180151581146200063057600080fd5b602082015260408301516200064581620005b4565b604082015260608301516200065a81620005b4565b606082015260808301516200066f81620005b4565b6080919091015292915050565b600082601f8301126200068e57600080fd5b815160206001600160401b03821115620006ac57620006ac62000523565b620006bc818360051b0162000564565b82815260069290921b84018101918181019086841115620006dc57600080fd5b8286015b84811015620007345760408189031215620006fb5760008081fd5b6200070562000539565b620007108262000597565b8152848201516200072181620005b4565b81860152835291830191604001620006e0565b509695505050505050565b60008060008385036101408112156200075757600080fd5b60808112156200076657600080fd5b50604051608081016001600160401b0380821183831017156200078d576200078d62000523565b816040526200079c8762000597565b835260208701519150620007b082620005b4565b81602084015260408701519150620007c882620005b4565b81604084015260608701519150620007e082620005b4565b816060840152829550620007f88860808901620005cd565b94506101208701519250808311156200081057600080fd5b505062000820868287016200067c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613976620008b96000396000818161022c01528181610cfd0152611bc90152600081816101f0015281816115c40152611ba20152600081816101b4015281816106080152611b780152600081816101840152818161114b015281816116e10152611b5401526139766000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e914610557578063f2fde38b1461056a578063fbca3b741461057d57600080fd5b8063972b4612146104ea578063d77d5ed01461050a57600080fd5b80637437ff9f146103ee57806379ba5097146104985780638da5cb5b146104a05780639041be3d146104be57600080fd5b806327e936f1116101095780633a019940116100ee5780633a0199401461030f57806348a98aa4146103175780636def4ce71461034f57600080fd5b806327e936f1146102e957806334adf494146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046127c2565b610590565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102769190612885565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610276919061294a565b6102db6102d6366004612975565b6105a4565b604051908152602001610276565b61014e6102f73660046129e3565b61075d565b61014e61030a366004612a7b565b61076e565b61014e610a8a565b61032a610325366004612af0565b610cb5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b6103b261035d366004612b29565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61048b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102769190612b46565b61014e610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff1661032a565b6104d16104cc366004612b29565b610e67565b60405167ffffffffffffffff9091168152602001610276565b6104fd6104f8366004612b29565b610e90565b6040516102769190612b9f565b61032a610518366004612b29565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db610565366004612bf9565b610eb8565b61014e610578366004612c65565b6117bc565b6104fd61058b366004612b29565b6117cd565b610598611801565b6105a181611884565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612c82565b156106bb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906107139086908690600401612db3565b602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612efc565b90505b92915050565b610765611801565b6105a1816119fb565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107de5760055473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a855760008383838181106107fd576107fd612f15565b905060200281019061080f9190612f44565b61081890612ff5565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909116178155908201515191925090156109d8578160200151156109975760005b826040015151811015610947576000836040015182815181106108b1576108b1612f15565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109305783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b61093d6001840182611c2b565b505060010161088c565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161098a9190612b9f565b60405180910390a26109d8565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106b2565b60005b826060015151811015610a2457610a1b83606001518281518110610a0157610a01612f15565b602002602001015183600101611c4d90919063ffffffff16565b506001016109db565b5060608201515115610a7b57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610a729190612b9f565b60405180910390a25b50506001016107e1565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f91908101906130a6565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a85576000838281518110610b7b57610b7b612f15565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612efc565b90508015610cab57610c4373ffffffffffffffffffffffffffffffffffffffff83168583611c6f565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610ca291815260200190565b60405180910390a35b5050600101610b5e565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190613135565b60015473ffffffffffffffffffffffffffffffffffffffff163314610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106b2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161075791166001613181565b67ffffffffffffffff8116600090815260066020526040902060609061075790600101611cfc565b60025460009074010000000000000000000000000000000000000000900460ff1615610f10576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610fb5576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff161561102657610fd86001820184611d10565b611026576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106b2565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611083576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff168015611129576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e506906110f6908a908a90600401612db3565b600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161119791166131a2565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187806020019061120b91906131c9565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161124f88806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016112ab6080890160608a01612c65565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906112e3919061322e565b905067ffffffffffffffff8111156112fd576112fd6126bf565b60405190808252806020026020018201604052801561137657816020015b6113636040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b81526020019060019003908161131b5790505b5090529050600061138a604088018861322e565b808060200260200160405190810160405280939291908181526020016000905b828210156113d6576113c760408302860136819003810190613296565b815260200190600101906113aa565b5050505050905060005b6113ed604089018961322e565b90508110156114875761145d82828151811061140b5761140b612f15565b60209081029190910101518a6114218b806131c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611d3f915050565b836101000151828151811061147457611474612f15565b60209081029190910101526001016113e0565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6114be60808e018e8601612c65565b8c8e80608001906114cf91906131c9565b8b61010001518b6040518863ffffffff1660e01b81526004016114f897969594939291906133b3565b600060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155b91908101906134e5565b60e08901939093529094509250905082611636576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163191906135d8565b611639565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156116ab5781818151811061167557611675612f15565b6020026020010151866101000151828151811061169457611694612f15565b602090810291909101015160800152600101611655565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261173b90869060a00160405160208183030381529060405280519060200120612056565b85515260405167ffffffffffffffff8c16907f8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed9061177a9088906135f5565b60405180910390a25050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6117c4611801565b6105a1816121a8565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106b2565b565b60005b81518110156119f75760008282815181106118a4576118a4612f15565b6020026020010151905060008383815181106118c2576118c2612f15565b60200260200101516000015190508067ffffffffffffffff16600003611920576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106b2565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611887565b5050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a375750606081015173ffffffffffffffffffffffffffffffffffffffff16155b80611a43575080602001515b15611a7a576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611c2091849061374d565b60405180910390a150565b60006107548373ffffffffffffffffffffffffffffffffffffffff841661229d565b60006107548373ffffffffffffffffffffffffffffffffffffffff84166122ec565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a859084906123e6565b60606000611d09836124f2565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610754565b611d876040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611dc5576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dd5858760000151610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81161580611ea557506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea39190612c82565b155b15611ef75785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016106b2565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611f9691906137fb565b6000604051808303816000875af1158015611fb5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ffb9190810190613871565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c001516040516020016120d495949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b604051602081830303815290604052805190602001208560600151805190602001208660400151805190602001208761010001516040516020016121189190613902565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106b2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546122e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610757565b506000610757565b600081815260018301602052604081205480156123d5576000612310600183613915565b855490915060009061232490600190613915565b905080821461238957600086600001828154811061234457612344612f15565b906000526020600020015490508087600001848154811061236757612367612f15565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061239a5761239a613928565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610757565b6000915050610757565b5092915050565b6000612448826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661254e9092919063ffffffff16565b805190915015610a8557808060200190518101906124669190612c82565b610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106b2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561254257602002820191906000526020600020905b81548152602001906001019080831161252e575b50505050509050919050565b60606117b48484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125829190613957565b60006040518083038185875af1925050503d80600081146125bf576040519150601f19603f3d011682016040523d82523d6000602084013e6125c4565b606091505b50915091506125d5878383876125e0565b979650505050505050565b6060831561267657825160000361266f5773ffffffffffffffffffffffffffffffffffffffff85163b61266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b2565b50816117b4565b6117b4838381511561268b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b2919061294a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612711576127116126bf565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561275e5761275e6126bf565b604052919050565b600067ffffffffffffffff821115612780576127806126bf565b5060051b60200190565b67ffffffffffffffff811681146105a157600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a157600080fd5b600060208083850312156127d557600080fd5b823567ffffffffffffffff8111156127ec57600080fd5b8301601f810185136127fd57600080fd5b803561281061280b82612766565b612717565b81815260069190911b8201830190838101908783111561282f57600080fd5b928401925b828410156125d5576040848903121561284d5760008081fd5b6128556126ee565b84356128608161278a565b81528486013561286f816127a0565b8187015282526040939093019290840190612834565b60808101610757828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156128f75781810151838201526020016128df565b50506000910152565b600081518084526129188160208601602086016128dc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107546020830184612900565b600060a0828403121561296f57600080fd5b50919050565b6000806040838503121561298857600080fd5b82356129938161278a565b9150602083013567ffffffffffffffff8111156129af57600080fd5b6129bb8582860161295d565b9150509250929050565b80356129d0816127a0565b919050565b80151581146105a157600080fd5b600060a082840312156129f557600080fd5b60405160a0810181811067ffffffffffffffff82111715612a1857612a186126bf565b6040528235612a26816127a0565b81526020830135612a36816129d5565b60208201526040830135612a49816127a0565b60408201526060830135612a5c816127a0565b60608201526080830135612a6f816127a0565b60808201529392505050565b60008060208385031215612a8e57600080fd5b823567ffffffffffffffff80821115612aa657600080fd5b818501915085601f830112612aba57600080fd5b813581811115612ac957600080fd5b8660208260051b8501011115612ade57600080fd5b60209290920196919550909350505050565b60008060408385031215612b0357600080fd5b8235612b0e8161278a565b91506020830135612b1e816127a0565b809150509250929050565b600060208284031215612b3b57600080fd5b8135611d098161278a565b60a08101610757828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b6020808252825182820181905260009190848201906040850190845b81811015612bed57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bbb565b50909695505050505050565b60008060008060808587031215612c0f57600080fd5b8435612c1a8161278a565b9350602085013567ffffffffffffffff811115612c3657600080fd5b612c428782880161295d565b935050604085013591506060850135612c5a816127a0565b939692955090935050565b600060208284031215612c7757600080fd5b8135611d09816127a0565b600060208284031215612c9457600080fd5b8151611d09816129d5565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612cd457600080fd5b830160208101925035905067ffffffffffffffff811115612cf457600080fd5b803603821315612d0357600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612da8578135612d76816127a0565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612d63565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612dd48485612c9f565b60a06040860152612de960e086018284612d0a565b915050612df96020860186612c9f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612e2f848385612d0a565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612e6857600080fd5b60209288019283019235915084821115612e8157600080fd5b8160061b3603831315612e9357600080fd5b80878503016080880152612ea8848385612d53565b9450612eb6606089016129c5565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612ee16080890189612c9f565b94509250808786030160c088015250506125d5838383612d0a565b600060208284031215612f0e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f7857600080fd5b9190910192915050565b600082601f830112612f9357600080fd5b81356020612fa361280b83612766565b8083825260208201915060208460051b870101935086841115612fc557600080fd5b602086015b84811015612fea578035612fdd816127a0565b8352918301918301612fca565b509695505050505050565b60006080823603121561300757600080fd5b6040516080810167ffffffffffffffff828210818311171561302b5761302b6126bf565b816040528435915061303c8261278a565b90825260208401359061304e826129d5565b816020840152604085013591508082111561306857600080fd5b61307436838701612f82565b6040840152606085013591508082111561308d57600080fd5b5061309a36828601612f82565b60608301525092915050565b600060208083850312156130b957600080fd5b825167ffffffffffffffff8111156130d057600080fd5b8301601f810185136130e157600080fd5b80516130ef61280b82612766565b81815260059190911b8201830190838101908783111561310e57600080fd5b928401925b828410156125d5578351613126816127a0565b82529284019290840190613113565b60006020828403121561314757600080fd5b8151611d09816127a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156123df576123df613152565b600067ffffffffffffffff8083168181036131bf576131bf613152565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126131fe57600080fd5b83018035915067ffffffffffffffff82111561321957600080fd5b602001915036819003821315612d0357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326357600080fd5b83018035915067ffffffffffffffff82111561327e57600080fd5b6020019150600681901b3603821315612d0357600080fd5b6000604082840312156132a857600080fd5b6132b06126ee565b82356132bb816127a0565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b848110156133a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff825116855285820151818787015261334f82870182612900565b915050604080830151868303828801526133698382612900565b925050506060808301518187015250608080830151925085820381870152506133928183612900565b9a86019a94505050908301906001016132ed565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c060608601526133fd60c08601898b612d0a565b858103608087015261340f81896132d0565b86810360a0880152875180825285890192509085019060005b8181101561344f578351805187168452870151878401529286019291840191600101613428565b50909e9d5050505050505050505050505050565b600082601f83011261347457600080fd5b815167ffffffffffffffff81111561348e5761348e6126bf565b6134bf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612717565b8181528460208386010111156134d457600080fd5b6117b48260208301602087016128dc565b600080600080608085870312156134fb57600080fd5b8451935060208086015161350e816129d5565b604087015190945067ffffffffffffffff8082111561352c57600080fd5b61353889838a01613463565b9450606088015191508082111561354e57600080fd5b818801915088601f83011261356257600080fd5b815161357061280b82612766565b81815260059190911b8301840190848101908b83111561358f57600080fd5b8585015b838110156135c7578051858111156135ab5760008081fd5b6135b98e89838a0101613463565b845250918601918601613593565b50989b979a50959850505050505050565b6000602082840312156135ea57600080fd5b8151611d098161278a565b6020815261364660208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161366f60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e085015261368c6101c0850183612900565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526136ca8584612900565b94506080880151925081878603016101208801526136e88584612900565b945060a0880151925061371461014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e088015161018088015287015186850390910183870152905061374383826132d0565b9695505050505050565b61012081016137a5828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611d09565b602081526000825160a0602084015261381760c0840182612900565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561388357600080fd5b815167ffffffffffffffff8082111561389b57600080fd5b90830190604082860312156138af57600080fd5b6138b76126ee565b8251828111156138c657600080fd5b6138d287828601613463565b8252506020830151828111156138e757600080fd5b6138f387828601613463565b60208301525095945050505050565b60208152600061075460208301846132d0565b8181038181111561075757610757613152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f788184602087016128dc56fea164736f6c6343000818000a", } var OnRampABI = OnRampMetaData.ABI @@ -1331,134 +1333,6 @@ func (_OnRamp *OnRampFilterer) ParseDestChainConfigSet(log types.Log) (*OnRampDe return event, nil } -type OnRampFeePaidIterator struct { - Event *OnRampFeePaid - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *OnRampFeePaidIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(OnRampFeePaid) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(OnRampFeePaid) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *OnRampFeePaidIterator) Error() error { - return it.fail -} - -func (it *OnRampFeePaidIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type OnRampFeePaid struct { - FeeToken common.Address - FeeValueJuels *big.Int - Raw types.Log -} - -func (_OnRamp *OnRampFilterer) FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*OnRampFeePaidIterator, error) { - - var feeTokenRule []interface{} - for _, feeTokenItem := range feeToken { - feeTokenRule = append(feeTokenRule, feeTokenItem) - } - - logs, sub, err := _OnRamp.contract.FilterLogs(opts, "FeePaid", feeTokenRule) - if err != nil { - return nil, err - } - return &OnRampFeePaidIterator{contract: _OnRamp.contract, event: "FeePaid", logs: logs, sub: sub}, nil -} - -func (_OnRamp *OnRampFilterer) WatchFeePaid(opts *bind.WatchOpts, sink chan<- *OnRampFeePaid, feeToken []common.Address) (event.Subscription, error) { - - var feeTokenRule []interface{} - for _, feeTokenItem := range feeToken { - feeTokenRule = append(feeTokenRule, feeTokenItem) - } - - logs, sub, err := _OnRamp.contract.WatchLogs(opts, "FeePaid", feeTokenRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(OnRampFeePaid) - if err := _OnRamp.contract.UnpackLog(event, "FeePaid", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_OnRamp *OnRampFilterer) ParseFeePaid(log types.Log) (*OnRampFeePaid, error) { - event := new(OnRampFeePaid) - if err := _OnRamp.contract.UnpackLog(event, "FeePaid", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type OnRampFeeTokenWithdrawnIterator struct { Event *OnRampFeeTokenWithdrawn @@ -1888,8 +1762,6 @@ func (_OnRamp *OnRamp) ParseLog(log types.Log) (generated.AbigenLog, error) { return _OnRamp.ParseConfigSet(log) case _OnRamp.abi.Events["DestChainConfigSet"].ID: return _OnRamp.ParseDestChainConfigSet(log) - case _OnRamp.abi.Events["FeePaid"].ID: - return _OnRamp.ParseFeePaid(log) case _OnRamp.abi.Events["FeeTokenWithdrawn"].ID: return _OnRamp.ParseFeeTokenWithdrawn(log) case _OnRamp.abi.Events["OwnershipTransferRequested"].ID: @@ -1915,21 +1787,17 @@ func (OnRampAllowListSendersRemoved) Topic() common.Hash { } func (OnRampCCIPMessageSent) Topic() common.Hash { - return common.HexToHash("0xf6e86ef8896c7a0d629406168f396e883280680c99e649b9e2d36466fbc9f9e5") + return common.HexToHash("0x8cd775d4a25bd349439a70817fd110144d6ab229ae1b9f54a1e5777d2041bfed") } func (OnRampConfigSet) Topic() common.Hash { - return common.HexToHash("0x23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32") + return common.HexToHash("0xc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f1") } func (OnRampDestChainConfigSet) Topic() common.Hash { return common.HexToHash("0xd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5") } -func (OnRampFeePaid) Topic() common.Hash { - return common.HexToHash("0x075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f") -} - func (OnRampFeeTokenWithdrawn) Topic() common.Hash { return common.HexToHash("0x508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e") } @@ -2021,12 +1889,6 @@ type OnRampInterface interface { ParseDestChainConfigSet(log types.Log) (*OnRampDestChainConfigSet, error) - FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*OnRampFeePaidIterator, error) - - WatchFeePaid(opts *bind.WatchOpts, sink chan<- *OnRampFeePaid, feeToken []common.Address) (event.Subscription, error) - - ParseFeePaid(log types.Log) (*OnRampFeePaid, error) - FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*OnRampFeeTokenWithdrawnIterator, error) WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *OnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/report_codec/report_codec.go index 29333984cc3..c693335bc42 100644 --- a/core/gethwrappers/ccip/generated/report_codec/report_codec.go +++ b/core/gethwrappers/ccip/generated/report_codec/report_codec.go @@ -41,7 +41,15 @@ type InternalAny2EVMRampMessage struct { Data []byte Receiver common.Address GasLimit *big.Int - TokenAmounts []InternalRampTokenAmount + TokenAmounts []InternalAny2EVMTokenTransfer +} + +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int } type InternalExecutionReportSingleChain struct { @@ -59,10 +67,10 @@ type InternalGasPriceUpdate struct { type InternalMerkleRoot struct { SourceChainSelector uint64 + OnRampAddress []byte MinSeqNr uint64 MaxSeqNr uint64 MerkleRoot [32]byte - OnRampAddress []byte } type InternalPriceUpdates struct { @@ -78,14 +86,6 @@ type InternalRampMessageHeader struct { Nonce uint64 } -type InternalRampTokenAmount struct { - SourcePoolAddress []byte - DestTokenAddress []byte - ExtraData []byte - Amount *big.Int - DestExecData []byte -} - type InternalTokenPriceUpdate struct { SourceToken common.Address UsdPerToken *big.Int @@ -95,11 +95,12 @@ type OffRampCommitReport struct { PriceUpdates InternalPriceUpdates MerkleRoots []InternalMerkleRoot RmnSignatures []IRMNV2Signature + RmnRawVs *big.Int } var ReportCodecMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportDecoded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"report\",\"type\":\"tuple[]\"}],\"name\":\"ExecuteReportDecoded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeCommitReport\",\"outputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeExecuteReport\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b506113e6806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636fb349561461003b578063f816ec6014610064575b600080fd5b61004e610049366004610231565b610084565b60405161005b91906104f2565b60405180910390f35b610077610072366004610231565b6100a0565b60405161005b9190610835565b60608180602001905181019061009a9190610e8d565b92915050565b6040805160a08101825260608082018181526080830182905282526020808301829052928201528251909161009a9184018101908401611250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561012d5761012d6100db565b60405290565b60405160c0810167ffffffffffffffff8111828210171561012d5761012d6100db565b6040805190810167ffffffffffffffff8111828210171561012d5761012d6100db565b6040516060810167ffffffffffffffff8111828210171561012d5761012d6100db565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101e3576101e36100db565b604052919050565b600067ffffffffffffffff821115610205576102056100db565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561024357600080fd5b813567ffffffffffffffff81111561025a57600080fd5b8201601f8101841361026b57600080fd5b803561027e610279826101eb565b61019c565b81815285602083850101111561029357600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156102cc5781810151838201526020016102b4565b50506000910152565b600081518084526102ed8160208601602086016102b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156103ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a08151818652610380828701826102d5565b915050858201518582038787015261039882826102d5565b915050604080830151868303828801526103b283826102d5565b925050506060808301518187015250608080830151925085820381870152506103db81836102d5565b9a86019a945050509083019060010161033c565b5090979650505050505050565b6000828251808552602080860195506005818360051b8501018287016000805b868110156104a7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088850381018c5283518051808752908801908887019080891b88018a01865b8281101561049057858a830301845261047e8286516102d5565b948c0194938c01939150600101610464565b509e8a019e9750505093870193505060010161041c565b50919998505050505050505050565b60008151808452602080850194506020840160005b838110156104e7578151875295820195908201906001016104cb565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156106da577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452815160a0860167ffffffffffffffff8083511688528883015160a08a8a015282815180855260c08b01915060c08160051b8c010194508b8301925060005b81811015610683577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408c87030183528351805180518852868f820151168f890152866040820151166040890152866060820151166060890152866080820151166080890152508d81015161014060a08901526106066101408901826102d5565b9050604082015188820360c08a015261061f82826102d5565b915050606082015161064960e08a018273ffffffffffffffffffffffffffffffffffffffff169052565b50608082015161010089015260a0820151915087810361012089015261066f818361031f565b97505050928c0192918c0191600101610586565b50505050506040820151878203604089015261069f82826103fc565b915050606082015187820360608901526106b982826104b6565b60809384015198909301979097525094509285019290850190600101610519565b5092979650505050505050565b60008151808452602080850194506020840160005b838110156104e7578151805167ffffffffffffffff1688528301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1683880152604090960195908201906001016106fc565b600082825180855260208086019550808260051b84010181860160005b848110156103ef578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805167ffffffffffffffff908116855285820151811686860152604080830151909116908501526060808201519085015260809081015160a0918501829052906107e5818601836102d5565b9a86019a9450505090830190600101610768565b60008151808452602080850194506020840160005b838110156104e757815180518852830151838801526040909601959082019060010161080e565b602080825282516060838301528051604060808501819052815160c086018190526000949392840191859160e08801905b808410156108c3578451805173ffffffffffffffffffffffffffffffffffffffff1683528701517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1687830152938601936001939093019290820190610866565b50938501518785037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800160a0890152936108fd81866106e7565b9450505050508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085830301604086015261093e828461074b565b925060408601519150808584030160608601525061095c82826107f9565b95945050505050565b600067ffffffffffffffff82111561097f5761097f6100db565b5060051b60200190565b805167ffffffffffffffff811681146109a157600080fd5b919050565b600060a082840312156109b857600080fd5b6109c061010a565b9050815181526109d260208301610989565b60208201526109e360408301610989565b60408201526109f460608301610989565b6060820152610a0560808301610989565b608082015292915050565b600082601f830112610a2157600080fd5b8151610a2f610279826101eb565b818152846020838601011115610a4457600080fd5b610a558260208301602087016102b1565b949350505050565b805173ffffffffffffffffffffffffffffffffffffffff811681146109a157600080fd5b600082601f830112610a9257600080fd5b81516020610aa261027983610965565b82815260059290921b84018101918181019086841115610ac157600080fd5b8286015b84811015610bdb57805167ffffffffffffffff80821115610ae65760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610b1f5760008081fd5b610b2761010a565b8784015183811115610b395760008081fd5b610b478d8a83880101610a10565b82525060408085015184811115610b5e5760008081fd5b610b6c8e8b83890101610a10565b8a8401525060608086015185811115610b855760008081fd5b610b938f8c838a0101610a10565b83850152506080915081860151818401525082850151925083831115610bb95760008081fd5b610bc78d8a85880101610a10565b908201528652505050918301918301610ac5565b509695505050505050565b600082601f830112610bf757600080fd5b81516020610c0761027983610965565b82815260059290921b84018101918181019086841115610c2657600080fd5b8286015b84811015610bdb57805167ffffffffffffffff80821115610c4b5760008081fd5b8189019150610140807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610c855760008081fd5b610c8d610133565b610c998c8986016109a6565b815260c084015183811115610cae5760008081fd5b610cbc8d8a83880101610a10565b898301525060e084015183811115610cd45760008081fd5b610ce28d8a83880101610a10565b604083015250610cf56101008501610a5d565b60608201526101208401516080820152908301519082821115610d185760008081fd5b610d268c8984870101610a81565b60a08201528652505050918301918301610c2a565b600082601f830112610d4c57600080fd5b81516020610d5c61027983610965565b82815260059290921b84018101918181019086841115610d7b57600080fd5b8286015b84811015610bdb57805167ffffffffffffffff80821115610d9f57600080fd5b818901915089603f830112610db357600080fd5b85820151610dc361027982610965565b81815260059190911b830160400190878101908c831115610de357600080fd5b604085015b83811015610e1c57805185811115610dff57600080fd5b610e0e8f6040838a0101610a10565b845250918901918901610de8565b50875250505092840192508301610d7f565b600082601f830112610e3f57600080fd5b81516020610e4f61027983610965565b8083825260208201915060208460051b870101935086841115610e7157600080fd5b602086015b84811015610bdb5780518352918301918301610e76565b60006020808385031215610ea057600080fd5b825167ffffffffffffffff80821115610eb857600080fd5b818501915085601f830112610ecc57600080fd5b8151610eda61027982610965565b81815260059190911b83018401908481019088831115610ef957600080fd5b8585015b83811015610ff357805185811115610f1457600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610f495760008081fd5b610f5161010a565b610f5c898301610989565b815260408083015188811115610f725760008081fd5b610f808e8c83870101610be6565b8b8401525060608084015189811115610f995760008081fd5b610fa78f8d83880101610d3b565b8385015250608091508184015189811115610fc25760008081fd5b610fd08f8d83880101610e2e565b918401919091525060a09290920151918101919091528352918601918601610efd565b5098975050505050505050565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146109a157600080fd5b600082601f83011261103d57600080fd5b8151602061104d61027983610965565b82815260069290921b8401810191818101908684111561106c57600080fd5b8286015b84811015610bdb57604081890312156110895760008081fd5b611091610156565b61109a82610989565b81526110a7858301611000565b81860152835291830191604001611070565b600082601f8301126110ca57600080fd5b815160206110da61027983610965565b82815260059290921b840181019181810190868411156110f957600080fd5b8286015b84811015610bdb57805167ffffffffffffffff8082111561111e5760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156111575760008081fd5b61115f61010a565b61116a888501610989565b81526040611179818601610989565b89830152606061118a818701610989565b8284015260809150818601518184015250828501519250838311156111af5760008081fd5b6111bd8d8a85880101610a10565b9082015286525050509183019183016110fd565b600082601f8301126111e257600080fd5b815160206111f261027983610965565b82815260069290921b8401810191818101908684111561121157600080fd5b8286015b84811015610bdb576040818903121561122e5760008081fd5b611236610156565b815181528482015185820152835291830191604001611215565b6000602080838503121561126357600080fd5b825167ffffffffffffffff8082111561127b57600080fd5b908401906060828703121561128f57600080fd5b611297610179565b8251828111156112a657600080fd5b830160408189038113156112b957600080fd5b6112c1610156565b8251858111156112d057600080fd5b8301601f81018b136112e157600080fd5b80516112ef61027982610965565b81815260069190911b8201890190898101908d83111561130e57600080fd5b928a01925b8284101561135c5785848f03121561132b5760008081fd5b611333610156565b61133c85610a5d565b81526113498c8601611000565b818d0152825292850192908a0190611313565b84525050508287015191508482111561137457600080fd5b6113808a83850161102c565b8188015283525050828401518281111561139957600080fd5b6113a5888286016110b9565b858301525060408301519350818411156113be57600080fd5b6113ca878585016111d1565b6040820152969550505050505056fea164736f6c6343000818000a", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportDecoded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"report\",\"type\":\"tuple[]\"}],\"name\":\"ExecuteReportDecoded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeCommitReport\",\"outputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rmnRawVs\",\"type\":\"uint256\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeExecuteReport\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b506113e8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636fb349561461003b578063f816ec6014610064575b600080fd5b61004e61004936600461023a565b610084565b60405161005b91906104f7565b60405180910390f35b61007761007236600461023a565b6100a0565b60405161005b919061083c565b60608180602001905181019061009a9190610e85565b92915050565b6040805160c08101825260606080820181815260a08301829052825260208083018290529282018190526000908201528251909161009a9184018101908401611245565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715610136576101366100e4565b60405290565b60405160c0810167ffffffffffffffff81118282101715610136576101366100e4565b6040805190810167ffffffffffffffff81118282101715610136576101366100e4565b6040516080810167ffffffffffffffff81118282101715610136576101366100e4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101ec576101ec6100e4565b604052919050565b600067ffffffffffffffff82111561020e5761020e6100e4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561024c57600080fd5b813567ffffffffffffffff81111561026357600080fd5b8201601f8101841361027457600080fd5b8035610287610282826101f4565b6101a5565b81815285602083850101111561029c57600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600081518084526102f68160208601602086016102ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156103f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a08151818652610389828701826102de565b91505073ffffffffffffffffffffffffffffffffffffffff868301511686860152604063ffffffff81840151168187015250606080830151868303828801526103d283826102de565b6080948501519790940196909652505098840198925090830190600101610345565b5090979650505050505050565b6000828251808552602080860195506005818360051b8501018287016000805b868110156104ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088850381018c5283518051808752908801908887019080891b88018a01865b8281101561049557858a83030184526104838286516102de565b948c0194938c01939150600101610469565b509e8a019e97505050938701935050600101610421565b50919998505050505050505050565b60008151808452602080850194506020840160005b838110156104ec578151875295820195908201906001016104d0565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156106df577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452815160a0860167ffffffffffffffff8083511688528883015160a08a8a015282815180855260c08b01915060c08160051b8c010194508b8301925060005b81811015610688577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408c87030183528351805180518852868f820151168f890152866040820151166040890152866060820151166060890152866080820151166080890152508d81015161014060a089015261060b6101408901826102de565b9050604082015188820360c08a015261062482826102de565b915050606082015161064e60e08a018273ffffffffffffffffffffffffffffffffffffffff169052565b50608082015161010089015260a082015191508781036101208901526106748183610328565b97505050928c0192918c019160010161058b565b5050505050604082015187820360408901526106a48282610401565b915050606082015187820360608901526106be82826104bb565b6080938401519890930197909752509450928501929085019060010161051e565b5092979650505050505050565b60008151808452602080850194506020840160005b838110156104ec578151805167ffffffffffffffff1688528301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101610701565b600082825180855260208086019550808260051b84010181860160005b848110156103f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a067ffffffffffffffff8083511686528683015182888801526107c4838801826102de565b6040858101518416908901526060808601519093169288019290925250608092830151929095019190915250978301979083019060010161076d565b60008151808452602080850194506020840160005b838110156104ec578151805188528301518388015260409096019590820190600101610815565b602080825282516080838301528051604060a08501819052815160e08601819052600094939284019185916101008801905b808410156108cb578451805173ffffffffffffffffffffffffffffffffffffffff1683528701517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168783015293860193600193909301929082019061086e565b50938501518785037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160c08901529361090581866106ec565b9450505050508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808583030160408601526109468284610750565b92506040860151915080858403016060860152506109648282610800565b915050606084015160808401528091505092915050565b600067ffffffffffffffff821115610995576109956100e4565b5060051b60200190565b805167ffffffffffffffff811681146109b757600080fd5b919050565b600060a082840312156109ce57600080fd5b6109d6610113565b9050815181526109e86020830161099f565b60208201526109f96040830161099f565b6040820152610a0a6060830161099f565b6060820152610a1b6080830161099f565b608082015292915050565b600082601f830112610a3757600080fd5b8151610a45610282826101f4565b818152846020838601011115610a5a57600080fd5b610a6b8260208301602087016102ba565b949350505050565b805173ffffffffffffffffffffffffffffffffffffffff811681146109b757600080fd5b600082601f830112610aa857600080fd5b81516020610ab86102828361097b565b82815260059290921b84018101918181019086841115610ad757600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610afc5760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610b355760008081fd5b610b3d610113565b8784015183811115610b4f5760008081fd5b610b5d8d8a83880101610a26565b8252506040610b6d818601610a73565b8983015260608086015163ffffffff81168114610b8a5760008081fd5b808385015250608091508186015185811115610ba65760008081fd5b610bb48f8c838a0101610a26565b9184019190915250919093015190830152508352918301918301610adb565b509695505050505050565b600082601f830112610bef57600080fd5b81516020610bff6102828361097b565b82815260059290921b84018101918181019086841115610c1e57600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610c435760008081fd5b8189019150610140807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610c7d5760008081fd5b610c8561013c565b610c918c8986016109bc565b815260c084015183811115610ca65760008081fd5b610cb48d8a83880101610a26565b898301525060e084015183811115610ccc5760008081fd5b610cda8d8a83880101610a26565b604083015250610ced6101008501610a73565b60608201526101208401516080820152908301519082821115610d105760008081fd5b610d1e8c8984870101610a97565b60a08201528652505050918301918301610c22565b600082601f830112610d4457600080fd5b81516020610d546102828361097b565b82815260059290921b84018101918181019086841115610d7357600080fd5b8286015b84811015610bd357805167ffffffffffffffff80821115610d9757600080fd5b818901915089603f830112610dab57600080fd5b85820151610dbb6102828261097b565b81815260059190911b830160400190878101908c831115610ddb57600080fd5b604085015b83811015610e1457805185811115610df757600080fd5b610e068f6040838a0101610a26565b845250918901918901610de0565b50875250505092840192508301610d77565b600082601f830112610e3757600080fd5b81516020610e476102828361097b565b8083825260208201915060208460051b870101935086841115610e6957600080fd5b602086015b84811015610bd35780518352918301918301610e6e565b60006020808385031215610e9857600080fd5b825167ffffffffffffffff80821115610eb057600080fd5b818501915085601f830112610ec457600080fd5b8151610ed26102828261097b565b81815260059190911b83018401908481019088831115610ef157600080fd5b8585015b83811015610feb57805185811115610f0c57600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610f415760008081fd5b610f49610113565b610f5489830161099f565b815260408083015188811115610f6a5760008081fd5b610f788e8c83870101610bde565b8b8401525060608084015189811115610f915760008081fd5b610f9f8f8d83880101610d33565b8385015250608091508184015189811115610fba5760008081fd5b610fc88f8d83880101610e26565b918401919091525060a09290920151918101919091528352918601918601610ef5565b5098975050505050505050565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146109b757600080fd5b600082601f83011261103557600080fd5b815160206110456102828361097b565b82815260069290921b8401810191818101908684111561106457600080fd5b8286015b84811015610bd357604081890312156110815760008081fd5b61108961015f565b6110928261099f565b815261109f858301610ff8565b81860152835291830191604001611068565b600082601f8301126110c257600080fd5b815160206110d26102828361097b565b82815260059290921b840181019181810190868411156110f157600080fd5b8286015b84811015610bd357805167ffffffffffffffff808211156111165760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d0301121561114f5760008081fd5b611157610113565b61116288850161099f565b8152604080850151848111156111785760008081fd5b6111868e8b83890101610a26565b8a840152506060935061119a84860161099f565b9082015260806111ab85820161099f565b938201939093529201519082015283529183019183016110f5565b600082601f8301126111d757600080fd5b815160206111e76102828361097b565b82815260069290921b8401810191818101908684111561120657600080fd5b8286015b84811015610bd357604081890312156112235760008081fd5b61122b61015f565b81518152848201518582015283529183019160400161120a565b6000602080838503121561125857600080fd5b825167ffffffffffffffff8082111561127057600080fd5b908401906080828703121561128457600080fd5b61128c610182565b82518281111561129b57600080fd5b830160408189038113156112ae57600080fd5b6112b661015f565b8251858111156112c557600080fd5b8301601f81018b136112d657600080fd5b80516112e46102828261097b565b81815260069190911b8201890190898101908d83111561130357600080fd5b928a01925b828410156113515785848f0312156113205760008081fd5b61132861015f565b61133185610a73565b815261133e8c8601610ff8565b818d0152825292850192908a0190611308565b84525050508287015191508482111561136957600080fd5b6113758a838501611024565b8188015283525050828401518281111561138e57600080fd5b61139a888286016110b1565b858301525060408301519350818411156113b357600080fd5b6113bf878585016111c6565b604082015260608301516060820152809450505050509291505056fea164736f6c6343000818000a", } var ReportCodecABI = ReportCodecMetaData.ABI @@ -529,11 +530,11 @@ func (_ReportCodec *ReportCodec) ParseLog(log types.Log) (generated.AbigenLog, e } func (ReportCodecCommitReportDecoded) Topic() common.Hash { - return common.HexToHash("0x83099d210b303f78572f4da1af1d1777cbf80cae42cdb9381f310dbdf21e8f89") + return common.HexToHash("0x39ecb9cbf9994ec2d914cd3ec4bff76f953a004c8f16cd9d8fdd5e620b956834") } func (ReportCodecExecuteReportDecoded) Topic() common.Hash { - return common.HexToHash("0x70d042e9d8463eeac7e835e7172c08846ad327fc4eb6fc89f3bb5226e17ad618") + return common.HexToHash("0x9467c8093a35a72f74398d5b6e351d67dc82eddc378efc6177eafb4fc7a01d39") } func (_ReportCodec *ReportCodec) Address() common.Address { diff --git a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go new file mode 100644 index 00000000000..18f1ca488b3 --- /dev/null +++ b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go @@ -0,0 +1,1508 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package rmn_home + +import ( + "errors" + "fmt" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type RMNHomeDynamicConfig struct { + SourceChains []RMNHomeSourceChain + OffchainConfig []byte +} + +type RMNHomeNode struct { + PeerId [32]byte + OffchainPublicKey [32]byte +} + +type RMNHomeSourceChain struct { + ChainSelector uint64 + MinObservers uint64 + ObserverNodesBitmap *big.Int +} + +type RMNHomeStaticConfig struct { + Nodes []RMNHomeNode + OffchainConfig []byte +} + +type RMNHomeVersionedConfig struct { + Version uint32 + ConfigDigest [32]byte + StaticConfig RMNHomeStaticConfig + DynamicConfig RMNHomeDynamicConfig +} + +var RMNHomeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"gotConfigDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOffchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicatePeerId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinObserversTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfBoundsNodesLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfBoundsObserverNodeIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RevokingZeroDigestNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ActiveConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CandidateConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigPromoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"activeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"candidateConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCandidateDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"versionedConfig\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"ok\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfigDigests\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"activeConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"digestToPromote\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digestToRevoke\",\"type\":\"bytes32\"}],\"name\":\"promoteCandidateAndRevokeActive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"revokeCandidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"digestToOverwrite\",\"type\":\"bytes32\"}],\"name\":\"setCandidate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minObservers\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"newDynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"currentDigest\",\"type\":\"bytes32\"}],\"name\":\"setDynamicConfig\",\"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\"}]", + Bin: "0x6080604052600e80546001600160401b03191690553480156200002157600080fd5b503380600081620000795760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ac57620000ac81620000b5565b50505062000160565b336001600160a01b038216036200010f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000070565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6128f180620001706000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80636dd5b69d1161008c5780638c76967f116100665780638c76967f146101d45780638da5cb5b146101e7578063f2fde38b1461020f578063fb4022d41461022257600080fd5b80636dd5b69d14610196578063736be802146101b757806379ba5097146101cc57600080fd5b80633567e6b4116100bd5780633567e6b41461015b57806338354c5c14610178578063635079561461018057600080fd5b8063118dbac5146100e4578063123e65db1461010a578063181f5a7714610112575b600080fd5b6100f76100f23660046118e4565b610235565b6040519081526020015b60405180910390f35b6100f7610418565b61014e6040518060400160405280601181526020017f524d4e486f6d6520312e362e302d64657600000000000000000000000000000081525081565b60405161010191906119bf565b610163610457565b60408051928352602083019190915201610101565b6100f76104d8565b6101886104f7565b604051610101929190611b2a565b6101a96101a4366004611b4f565b610a79565b604051610101929190611b68565b6101ca6101c5366004611b8c565b610d5d565b005b6101ca610e79565b6101ca6101e2366004611bd1565b610f76565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610101565b6101ca61021d366004611bf3565b611189565b6101ca610230366004611b4f565b61119d565b600061023f6112b9565b61025961024b85611da5565b61025485611ea6565b61133c565b60006102636104d8565b90508281146102ad576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044015b60405180910390fd5b80156102df5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b600e80546000919082906102f89063ffffffff16611fbb565b91906101000a81548163ffffffff021916908363ffffffff160217905590506103408660405160200161032b9190612166565b604051602081830303815290604052826114b4565b600e54909350600090600290640100000000900463ffffffff1660011863ffffffff166002811061037357610373612179565b600602016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8416178155905086600282016103bd82826123c6565b50869050600482016103cf82826125c5565b905050837ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf083898960405161040693929190612809565b60405180910390a25050509392505050565b60006002610434600e5463ffffffff6401000000009091041690565b63ffffffff166002811061044a5761044a612179565b6006020160010154905090565b6000806002610474600e5463ffffffff6401000000009091041690565b63ffffffff166002811061048a5761048a612179565b600602016001015460026104b2600e54600163ffffffff640100000000909204919091161890565b63ffffffff16600281106104c8576104c8612179565b6006020160010154915091509091565b600e54600090600290640100000000900463ffffffff16600118610434565b6104ff611866565b610507611866565b60006002610523600e5463ffffffff6401000000009091041690565b63ffffffff166002811061053957610539612179565b6040805160808101825260069290920292909201805463ffffffff16825260018101546020808401919091528351600283018054606093810283018401875282870181815295969495948701949293919284929091849160009085015b828210156105dc57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610596565b5050505081526020016001820180546105f49061220d565b80601f01602080910402602001604051908101604052809291908181526020018280546106209061220d565b801561066d5780601f106106425761010080835404028352916020019161066d565b820191906000526020600020905b81548152906001019060200180831161065057829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561070f5760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff80821685526801000000000000000090910416838501526001908101549183019190915290835290920191016106af565b5050505081526020016001820180546107279061220d565b80601f01602080910402602001604051908101604052809291908181526020018280546107539061220d565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b505050919092525050509052506020810151909150156107be578092505b600e54600090600290640100000000900463ffffffff1660011863ffffffff16600281106107ee576107ee612179565b6040805160808101825260069290920292909201805463ffffffff16825260018101546020808401919091528351600283018054606093810283018401875282870181815295969495948701949293919284929091849160009085015b828210156108915783829060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508152602001906001019061084b565b5050505081526020016001820180546108a99061220d565b80601f01602080910402602001604051908101604052809291908181526020018280546108d59061220d565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b828210156109c45760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff8082168552680100000000000000009091041683850152600190810154918301919091529083529092019101610964565b5050505081526020016001820180546109dc9061220d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a089061220d565b8015610a555780601f10610a2a57610100808354040283529160200191610a55565b820191906000526020600020905b815481529060010190602001808311610a3857829003601f168201915b50505091909252505050905250602081015190915015610a73578092505b50509091565b610a81611866565b6000805b6002811015610d52578360028260028110610aa257610aa2612179565b6006020160010154148015610ab657508315155b15610d4a5760028160028110610ace57610ace612179565b6040805160808101825260069290920292909201805463ffffffff16825260018082015460208085019190915284516002840180546060938102830184018852828801818152959794969588958701948492849160009085015b82821015610b6e57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610b28565b505050508152602001600182018054610b869061220d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb29061220d565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b82821015610ca15760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff8082168552680100000000000000009091041683850152600190810154918301919091529083529092019101610c41565b505050508152602001600182018054610cb99061220d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce59061220d565b8015610d325780601f10610d0757610100808354040283529160200191610d32565b820191906000526020600020905b815481529060010190602001808311610d1557829003601f168201915b50505091909252505050905250969095509350505050565b600101610a85565b509092600092509050565b610d656112b9565b60005b6002811015610e3f578160028260028110610d8557610d85612179565b6006020160010154148015610d9957508115155b15610e3757610dd0610daa84611ea6565b60028360028110610dbd57610dbd612179565b60060201600201600001805490506115bc565b8260028260028110610de457610de4612179565b600602016004018181610df791906125c5565b905050817f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629484604051610e2a9190612844565b60405180910390a2505050565b600101610d68565b506040517fd0b2c031000000000000000000000000000000000000000000000000000000008152600481018290526024016102a4565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016102a4565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f7e6112b9565b81158015610f8a575080155b15610fc1576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600163ffffffff6401000000009092048216181682600282818110610feb57610feb612179565b600602016001015414611051576002816002811061100b5761100b612179565b6006020160010154836040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016102a4929190918252602082015260400190565b6000600261106d600e5463ffffffff6401000000009091041690565b63ffffffff166002811061108357611083612179565b600602019050828160010154146110d65760018101546040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016102a4565b6000600180830191909155600e805463ffffffff6401000000008083048216909418169092027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905582156111585760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a250505050565b6111916112b9565b61119a81611771565b50565b6111a56112b9565b806111dc576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600163ffffffff640100000000909204821618168160028281811061120657611206612179565b60060201600101541461126c576002816002811061122657611226612179565b6006020160010154826040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016102a4929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a2600281600281106112aa576112aa612179565b60060201600101600090555050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016102a4565b565b815151610100101561137a576040517faf26d5e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251518110156114a4576000611394826001612857565b90505b83515181101561149b5783518051829081106113b5576113b5612179565b602002602001015160000151846000015183815181106113d7576113d7612179565b6020026020010151600001510361141a576040517f221a8ae800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835180518290811061142e5761142e612179565b6020026020010151602001518460000151838151811061145057611450612179565b60200260200101516020015103611493576040517fae00651d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611397565b5060010161137d565b50610e75818360000151516115bc565b604080517f45564d00000000000000000000000000000000000000000000000000000000006020820152469181019190915230606082015263ffffffff821660808201526000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261155b91869060200161286a565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0b0000000000000000000000000000000000000000000000000000000000001790505b92915050565b81515160005b8181101561176b576000846000015182815181106115e2576115e2612179565b6020026020010151905060008260016115fb9190612857565b90505b8381101561167e57855180518290811061161a5761161a612179565b60200260200101516000015167ffffffffffffffff16826000015167ffffffffffffffff1603611676576040517f3857f84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001016115fe565b5060408101518061169186610100612899565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff901c8216146116ed576040517f2847b60600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b811561171557611701600183612899565b9091169061170e816128ac565b90506116f0565b80836020015167ffffffffffffffff16111561175d576040517f4ff924ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050508060010190506115c2565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036117f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016102a4565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040518060800160405280600063ffffffff168152602001600080191681526020016118a5604051806040016040528060608152602001606081525090565b81526020016118c7604051806040016040528060608152602001606081525090565b905290565b6000604082840312156118de57600080fd5b50919050565b6000806000606084860312156118f957600080fd5b833567ffffffffffffffff8082111561191157600080fd5b61191d878388016118cc565b9450602086013591508082111561193357600080fd5b50611940868287016118cc565b925050604084013590509250925092565b60005b8381101561196c578181015183820152602001611954565b50506000910152565b6000815180845261198d816020860160208601611951565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119d26020830184611975565b9392505050565b8051604080845281518482018190526000926060916020918201918388019190865b82811015611a35578451805167ffffffffffffffff90811686528382015116838601528701518785015293810193928501926001016119fb565b50808801519550888303818a01525050611a4f8185611975565b979650505050505050565b63ffffffff81511682526000602080830151818501526040808401516080604087015260c0860181516040608089015281815180845260e08a0191508683019350600092505b80831015611ac95783518051835287015187830152928601926001929092019190850190611aa0565b50948301518886037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800160a08a015294611b038187611975565b9550505050505060608301518482036060860152611b2182826119d9565b95945050505050565b604081526000611b3d6040830185611a5a565b8281036020840152611b218185611a5a565b600060208284031215611b6157600080fd5b5035919050565b604081526000611b7b6040830185611a5a565b905082151560208301529392505050565b60008060408385031215611b9f57600080fd5b823567ffffffffffffffff811115611bb657600080fd5b611bc2858286016118cc565b95602094909401359450505050565b60008060408385031215611be457600080fd5b50508035926020909101359150565b600060208284031215611c0557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146119d257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c7b57611c7b611c29565b60405290565b6040516060810167ffffffffffffffff81118282101715611c7b57611c7b611c29565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611ceb57611ceb611c29565b604052919050565b600067ffffffffffffffff821115611d0d57611d0d611c29565b5060051b60200190565b600082601f830112611d2857600080fd5b813567ffffffffffffffff811115611d4257611d42611c29565b611d7360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611ca4565b818152846020838601011115611d8857600080fd5b816020850160208301376000918101602001919091529392505050565b60006040808336031215611db857600080fd5b611dc0611c58565b833567ffffffffffffffff80821115611dd857600080fd5b9085019036601f830112611deb57600080fd5b81356020611e00611dfb83611cf3565b611ca4565b82815260069290921b84018101918181019036841115611e1f57600080fd5b948201945b83861015611e5f57878636031215611e3c5760008081fd5b611e44611c58565b86358152838701358482015282529487019490820190611e24565b86525087810135955082861115611e7557600080fd5b611e8136878a01611d17565b90850152509195945050505050565b67ffffffffffffffff8116811461119a57600080fd5b60006040808336031215611eb957600080fd5b611ec1611c58565b833567ffffffffffffffff80821115611ed957600080fd5b9085019036601f830112611eec57600080fd5b81356020611efc611dfb83611cf3565b82815260609283028501820192828201919036851115611f1b57600080fd5b958301955b84871015611f7557808736031215611f385760008081fd5b611f40611c81565b8735611f4b81611e90565b815287850135611f5a81611e90565b81860152878a01358a82015283529586019591830191611f20565b5086525087810135955082861115611e7557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103611fd457611fd4611f8c565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261201357600080fd5b830160208101925035905067ffffffffffffffff81111561203357600080fd5b80360382131561204257600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6000604080840183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030181126120cb57600080fd5b8401602081810191359067ffffffffffffffff8211156120ea57600080fd5b8160061b36038313156120fc57600080fd5b6040885292819052909160009190606088015b82841015612135578435815281850135828201529385019360019390930192850161210f565b6121426020890189611fde565b9650945088810360208a0152612159818787612049565b9998505050505050505050565b6020815260006119d26020830184612092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121dd57600080fd5b83018035915067ffffffffffffffff8211156121f857600080fd5b60200191503681900382131561204257600080fd5b600181811c9082168061222157607f821691505b6020821081036118de577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f8211156122a6576000816000526020600020601f850160051c810160208610156122835750805b601f850160051c820191505b818110156122a25782815560010161228f565b5050505b505050565b67ffffffffffffffff8311156122c3576122c3611c29565b6122d7836122d1835461220d565b8361225a565b6000601f84116001811461232957600085156122f35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556123bf565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156123785786850135825560209485019460019092019101612358565b50868210156123b3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18336030181126123f857600080fd5b8201803567ffffffffffffffff81111561241157600080fd5b6020820191508060061b360382131561242957600080fd5b6801000000000000000081111561244257612442611c29565b8254818455808210156124cf5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461248357612483611f8c565b808416841461249457612494611f8c565b5060008560005260206000208360011b81018560011b820191505b808210156124ca5782825582848301556002820191506124af565b505050505b5060008381526020902060005b8281101561250857833582556020840135600183015560409390930192600291909101906001016124dc565b5050505061251960208301836121a8565b61176b8183600186016122ab565b813561253281611e90565b67ffffffffffffffff811690508154817fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008216178355602084013561257681611e90565b6fffffffffffffffff00000000000000008160401b16837fffffffffffffffffffffffffffffffff00000000000000000000000000000000841617178455505050604082013560018201555050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18336030181126125f757600080fd5b8201803567ffffffffffffffff81111561261057600080fd5b6020820191506060808202360383131561262957600080fd5b6801000000000000000082111561264257612642611c29565b8354828555808310156126cf5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461268357612683611f8c565b808516851461269457612694611f8c565b5060008660005260206000208360011b81018660011b820191505b808210156126ca5782825582848301556002820191506126af565b505050505b5060008481526020902060005b83811015612701576126ee8583612527565b93820193600291909101906001016126dc565b505050505061251960208301836121a8565b6000604080840183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811261274c57600080fd5b8401602081810191359067ffffffffffffffff8083111561276c57600080fd5b6060808402360385131561277f57600080fd5b60408a529483905292936000939060608a015b848610156127d65786356127a581611e90565b83168152868401356127b681611e90565b831681850152868801358882015295810195600195909501948101612792565b6127e360208b018b611fde565b985096508a810360208c01526127fa818989612049565b9b9a5050505050505050505050565b63ffffffff841681526060602082015260006128286060830185612092565b828103604084015261283a8185612713565b9695505050505050565b6020815260006119d26020830184612713565b808201808211156115b6576115b6611f8c565b6000835161287c818460208801611951565b835190830190612890818360208801611951565b01949350505050565b818103818111156115b6576115b6611f8c565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128dd576128dd611f8c565b506001019056fea164736f6c6343000818000a", +} + +var RMNHomeABI = RMNHomeMetaData.ABI + +var RMNHomeBin = RMNHomeMetaData.Bin + +func DeployRMNHome(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *RMNHome, error) { + parsed, err := RMNHomeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNHomeBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &RMNHome{address: address, abi: *parsed, RMNHomeCaller: RMNHomeCaller{contract: contract}, RMNHomeTransactor: RMNHomeTransactor{contract: contract}, RMNHomeFilterer: RMNHomeFilterer{contract: contract}}, nil +} + +type RMNHome struct { + address common.Address + abi abi.ABI + RMNHomeCaller + RMNHomeTransactor + RMNHomeFilterer +} + +type RMNHomeCaller struct { + contract *bind.BoundContract +} + +type RMNHomeTransactor struct { + contract *bind.BoundContract +} + +type RMNHomeFilterer struct { + contract *bind.BoundContract +} + +type RMNHomeSession struct { + Contract *RMNHome + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RMNHomeCallerSession struct { + Contract *RMNHomeCaller + CallOpts bind.CallOpts +} + +type RMNHomeTransactorSession struct { + Contract *RMNHomeTransactor + TransactOpts bind.TransactOpts +} + +type RMNHomeRaw struct { + Contract *RMNHome +} + +type RMNHomeCallerRaw struct { + Contract *RMNHomeCaller +} + +type RMNHomeTransactorRaw struct { + Contract *RMNHomeTransactor +} + +func NewRMNHome(address common.Address, backend bind.ContractBackend) (*RMNHome, error) { + abi, err := abi.JSON(strings.NewReader(RMNHomeABI)) + if err != nil { + return nil, err + } + contract, err := bindRMNHome(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RMNHome{address: address, abi: abi, RMNHomeCaller: RMNHomeCaller{contract: contract}, RMNHomeTransactor: RMNHomeTransactor{contract: contract}, RMNHomeFilterer: RMNHomeFilterer{contract: contract}}, nil +} + +func NewRMNHomeCaller(address common.Address, caller bind.ContractCaller) (*RMNHomeCaller, error) { + contract, err := bindRMNHome(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RMNHomeCaller{contract: contract}, nil +} + +func NewRMNHomeTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNHomeTransactor, error) { + contract, err := bindRMNHome(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RMNHomeTransactor{contract: contract}, nil +} + +func NewRMNHomeFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNHomeFilterer, error) { + contract, err := bindRMNHome(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RMNHomeFilterer{contract: contract}, nil +} + +func bindRMNHome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RMNHomeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_RMNHome *RMNHomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNHome.Contract.RMNHomeCaller.contract.Call(opts, result, method, params...) +} + +func (_RMNHome *RMNHomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.Contract.RMNHomeTransactor.contract.Transfer(opts) +} + +func (_RMNHome *RMNHomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNHome.Contract.RMNHomeTransactor.contract.Transact(opts, method, params...) +} + +func (_RMNHome *RMNHomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNHome.Contract.contract.Call(opts, result, method, params...) +} + +func (_RMNHome *RMNHomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.Contract.contract.Transfer(opts) +} + +func (_RMNHome *RMNHomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNHome.Contract.contract.Transact(opts, method, params...) +} + +func (_RMNHome *RMNHomeCaller) GetActiveDigest(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getActiveDigest") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) GetActiveDigest() ([32]byte, error) { + return _RMNHome.Contract.GetActiveDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetActiveDigest() ([32]byte, error) { + return _RMNHome.Contract.GetActiveDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetAllConfigs(opts *bind.CallOpts) (GetAllConfigs, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getAllConfigs") + + outstruct := new(GetAllConfigs) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfig = *abi.ConvertType(out[0], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + outstruct.CandidateConfig = *abi.ConvertType(out[1], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetAllConfigs() (GetAllConfigs, + + error) { + return _RMNHome.Contract.GetAllConfigs(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetAllConfigs() (GetAllConfigs, + + error) { + return _RMNHome.Contract.GetAllConfigs(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetCandidateDigest(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getCandidateDigest") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) GetCandidateDigest() ([32]byte, error) { + return _RMNHome.Contract.GetCandidateDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetCandidateDigest() ([32]byte, error) { + return _RMNHome.Contract.GetCandidateDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetConfig(opts *bind.CallOpts, configDigest [32]byte) (GetConfig, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getConfig", configDigest) + + outstruct := new(GetConfig) + if err != nil { + return *outstruct, err + } + + outstruct.VersionedConfig = *abi.ConvertType(out[0], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + outstruct.Ok = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetConfig(configDigest [32]byte) (GetConfig, + + error) { + return _RMNHome.Contract.GetConfig(&_RMNHome.CallOpts, configDigest) +} + +func (_RMNHome *RMNHomeCallerSession) GetConfig(configDigest [32]byte) (GetConfig, + + error) { + return _RMNHome.Contract.GetConfig(&_RMNHome.CallOpts, configDigest) +} + +func (_RMNHome *RMNHomeCaller) GetConfigDigests(opts *bind.CallOpts) (GetConfigDigests, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getConfigDigests") + + outstruct := new(GetConfigDigests) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.CandidateConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetConfigDigests() (GetConfigDigests, + + error) { + return _RMNHome.Contract.GetConfigDigests(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetConfigDigests() (GetConfigDigests, + + error) { + return _RMNHome.Contract.GetConfigDigests(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) Owner() (common.Address, error) { + return _RMNHome.Contract.Owner(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) Owner() (common.Address, error) { + return _RMNHome.Contract.Owner(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) TypeAndVersion() (string, error) { + return _RMNHome.Contract.TypeAndVersion(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) TypeAndVersion() (string, error) { + return _RMNHome.Contract.TypeAndVersion(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "acceptOwnership") +} + +func (_RMNHome *RMNHomeSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNHome.Contract.AcceptOwnership(&_RMNHome.TransactOpts) +} + +func (_RMNHome *RMNHomeTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNHome.Contract.AcceptOwnership(&_RMNHome.TransactOpts) +} + +func (_RMNHome *RMNHomeTransactor) PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "promoteCandidateAndRevokeActive", digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeSession) PromoteCandidateAndRevokeActive(digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.PromoteCandidateAndRevokeActive(&_RMNHome.TransactOpts, digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeTransactorSession) PromoteCandidateAndRevokeActive(digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.PromoteCandidateAndRevokeActive(&_RMNHome.TransactOpts, digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeTransactor) RevokeCandidate(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "revokeCandidate", configDigest) +} + +func (_RMNHome *RMNHomeSession) RevokeCandidate(configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.RevokeCandidate(&_RMNHome.TransactOpts, configDigest) +} + +func (_RMNHome *RMNHomeTransactorSession) RevokeCandidate(configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.RevokeCandidate(&_RMNHome.TransactOpts, configDigest) +} + +func (_RMNHome *RMNHomeTransactor) SetCandidate(opts *bind.TransactOpts, staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "setCandidate", staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeSession) SetCandidate(staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetCandidate(&_RMNHome.TransactOpts, staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeTransactorSession) SetCandidate(staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetCandidate(&_RMNHome.TransactOpts, staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeTransactor) SetDynamicConfig(opts *bind.TransactOpts, newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "setDynamicConfig", newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeSession) SetDynamicConfig(newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetDynamicConfig(&_RMNHome.TransactOpts, newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeTransactorSession) SetDynamicConfig(newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetDynamicConfig(&_RMNHome.TransactOpts, newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "transferOwnership", to) +} + +func (_RMNHome *RMNHomeSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNHome.Contract.TransferOwnership(&_RMNHome.TransactOpts, to) +} + +func (_RMNHome *RMNHomeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNHome.Contract.TransferOwnership(&_RMNHome.TransactOpts, to) +} + +type RMNHomeActiveConfigRevokedIterator struct { + Event *RMNHomeActiveConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeActiveConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeActiveConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeActiveConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeActiveConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeActiveConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeActiveConfigRevokedIterator{contract: _RMNHome.contract, event: "ActiveConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeActiveConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseActiveConfigRevoked(log types.Log) (*RMNHomeActiveConfigRevoked, error) { + event := new(RMNHomeActiveConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeCandidateConfigRevokedIterator struct { + Event *RMNHomeCandidateConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeCandidateConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeCandidateConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeCandidateConfigRevokedIterator{contract: _RMNHome.contract, event: "CandidateConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeCandidateConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseCandidateConfigRevoked(log types.Log) (*RMNHomeCandidateConfigRevoked, error) { + event := new(RMNHomeCandidateConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeConfigPromotedIterator struct { + Event *RMNHomeConfigPromoted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeConfigPromotedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeConfigPromotedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeConfigPromotedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeConfigPromoted struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigPromotedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeConfigPromotedIterator{contract: _RMNHome.contract, event: "ConfigPromoted", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeConfigPromoted) + if err := _RMNHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseConfigPromoted(log types.Log) (*RMNHomeConfigPromoted, error) { + event := new(RMNHomeConfigPromoted) + if err := _RMNHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeConfigSetIterator struct { + Event *RMNHomeConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeConfigSetIterator) Error() error { + return it.fail +} + +func (it *RMNHomeConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeConfigSet struct { + ConfigDigest [32]byte + Version uint32 + StaticConfig RMNHomeStaticConfig + DynamicConfig RMNHomeDynamicConfig + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeConfigSetIterator{contract: _RMNHome.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseConfigSet(log types.Log) (*RMNHomeConfigSet, error) { + event := new(RMNHomeConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeDynamicConfigSetIterator struct { + Event *RMNHomeDynamicConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeDynamicConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeDynamicConfigSetIterator) Error() error { + return it.fail +} + +func (it *RMNHomeDynamicConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeDynamicConfigSet struct { + ConfigDigest [32]byte + DynamicConfig RMNHomeDynamicConfig + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterDynamicConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeDynamicConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "DynamicConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeDynamicConfigSetIterator{contract: _RMNHome.contract, event: "DynamicConfigSet", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeDynamicConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "DynamicConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeDynamicConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseDynamicConfigSet(log types.Log) (*RMNHomeDynamicConfigSet, error) { + event := new(RMNHomeDynamicConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeOwnershipTransferRequestedIterator struct { + Event *RMNHomeOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferRequestedIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNHomeOwnershipTransferRequestedIterator{contract: _RMNHome.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeOwnershipTransferRequested) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNHomeOwnershipTransferRequested, error) { + event := new(RMNHomeOwnershipTransferRequested) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeOwnershipTransferredIterator struct { + Event *RMNHomeOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *RMNHomeOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferredIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNHomeOwnershipTransferredIterator{contract: _RMNHome.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeOwnershipTransferred) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseOwnershipTransferred(log types.Log) (*RMNHomeOwnershipTransferred, error) { + event := new(RMNHomeOwnershipTransferred) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllConfigs struct { + ActiveConfig RMNHomeVersionedConfig + CandidateConfig RMNHomeVersionedConfig +} +type GetConfig struct { + VersionedConfig RMNHomeVersionedConfig + Ok bool +} +type GetConfigDigests struct { + ActiveConfigDigest [32]byte + CandidateConfigDigest [32]byte +} + +func (_RMNHome *RMNHome) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _RMNHome.abi.Events["ActiveConfigRevoked"].ID: + return _RMNHome.ParseActiveConfigRevoked(log) + case _RMNHome.abi.Events["CandidateConfigRevoked"].ID: + return _RMNHome.ParseCandidateConfigRevoked(log) + case _RMNHome.abi.Events["ConfigPromoted"].ID: + return _RMNHome.ParseConfigPromoted(log) + case _RMNHome.abi.Events["ConfigSet"].ID: + return _RMNHome.ParseConfigSet(log) + case _RMNHome.abi.Events["DynamicConfigSet"].ID: + return _RMNHome.ParseDynamicConfigSet(log) + case _RMNHome.abi.Events["OwnershipTransferRequested"].ID: + return _RMNHome.ParseOwnershipTransferRequested(log) + case _RMNHome.abi.Events["OwnershipTransferred"].ID: + return _RMNHome.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RMNHomeActiveConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8") +} + +func (RMNHomeCandidateConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b") +} + +func (RMNHomeConfigPromoted) Topic() common.Hash { + return common.HexToHash("0xfc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e") +} + +func (RMNHomeConfigSet) Topic() common.Hash { + return common.HexToHash("0xf6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf0") +} + +func (RMNHomeDynamicConfigSet) Topic() common.Hash { + return common.HexToHash("0x1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e6294") +} + +func (RMNHomeOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (RMNHomeOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_RMNHome *RMNHome) Address() common.Address { + return _RMNHome.address +} + +type RMNHomeInterface interface { + GetActiveDigest(opts *bind.CallOpts) ([32]byte, error) + + GetAllConfigs(opts *bind.CallOpts) (GetAllConfigs, + + error) + + GetCandidateDigest(opts *bind.CallOpts) ([32]byte, error) + + GetConfig(opts *bind.CallOpts, configDigest [32]byte) (GetConfig, + + error) + + GetConfigDigests(opts *bind.CallOpts) (GetConfigDigests, + + error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) + + RevokeCandidate(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) + + SetCandidate(opts *bind.TransactOpts, staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) + + SetDynamicConfig(opts *bind.TransactOpts, newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeActiveConfigRevokedIterator, error) + + WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseActiveConfigRevoked(log types.Log) (*RMNHomeActiveConfigRevoked, error) + + FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeCandidateConfigRevokedIterator, error) + + WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseCandidateConfigRevoked(log types.Log) (*RMNHomeCandidateConfigRevoked, error) + + FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigPromotedIterator, error) + + WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigPromoted(log types.Log) (*RMNHomeConfigPromoted, error) + + FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*RMNHomeConfigSet, error) + + FilterDynamicConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeDynamicConfigSetIterator, error) + + WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeDynamicConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseDynamicConfigSet(log types.Log) (*RMNHomeDynamicConfigSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*RMNHomeOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*RMNHomeOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go index a380d77e101..71ef173042e 100644 --- a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go +++ b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go @@ -37,10 +37,10 @@ type IRMNV2Signature struct { type InternalMerkleRoot struct { SourceChainSelector uint64 + OnRampAddress []byte MinSeqNr uint64 MaxSeqNr uint64 MerkleRoot [32]byte - OnRampAddress []byte } type RMNRemoteConfig struct { @@ -54,21 +54,16 @@ type RMNRemoteSigner struct { NodeIndex uint64 } -type RMNRemoteVersionedConfig struct { - Version uint32 - Config RMNRemoteConfig -} - var RMNRemoteMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ConfigNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOnchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignerOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinSignersTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"structRMNRemote.VersionedConfig\",\"name\":\"versionedConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVersionedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structRMNRemote.VersionedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"newConfig\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"test\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"destLaneUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200182d3803806200182d83398101604081905262000034916200017e565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d3565b5050506001600160401b0316608052620001b0565b336001600160a01b038216036200012d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019157600080fd5b81516001600160401b0381168114620001a957600080fd5b9392505050565b608051611664620001c9600039600050506116646000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063397796f7116100765780638da5cb5b1161005b5780638da5cb5b14610184578063f2fde38b146101ac578063f8a8fd6d1461012857600080fd5b8063397796f71461017557806379ba50971461017c57600080fd5b80631add205f116100a75780631add205f1461012a5780632cbc26bb1461013f57806330dfc3081461016357600080fd5b8063181f5a77146100c3578063198f0f7714610115575b600080fd5b6100ff6040518060400160405280601381526020017f524d4e52656d6f746520312e362e302d6465760000000000000000000000000081525081565b60405161010c9190610c4b565b60405180910390f35b610128610123366004610c65565b6101bf565b005b6101326105f0565b60405161010c9190610ca0565b61015361014d366004610d58565b50600090565b604051901515815260200161010c565b610128610171366004610f60565b5050565b6000610153565b61012861090b565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010c565b6101286101ba36600461113d565b610a0d565b6101c7610a23565b60015b6101d7602083018361115a565b90508110156102a7576101ed602083018361115a565b828181106101fd576101fd6111c9565b905060400201602001602081019061021591906111f8565b67ffffffffffffffff1661022c602084018461115a565b610237600185611244565b818110610246576102466111c9565b905060400201602001602081019061025e91906111f8565b67ffffffffffffffff161061029f576040517f4485151700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001016101ca565b506102b5602082018261115a565b90506102c760608301604084016111f8565b67ffffffffffffffff161115610309576040517ffba0d9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025b60018101541561040557600180820180546006926000929161032e9190611244565b8154811061033e5761033e6111c9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600181018054806103a8576103a861125d565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffff0000000000000000000000000000000000000000000000000000000016905501905561030c565b5060005b610416602083018361115a565b905081101561054b5760066000610430602085018561115a565b84818110610440576104406111c9565b610456926020604090920201908101915061113d565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16156104b7576040517f28cae27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600660006104ca602086018661115a565b858181106104da576104da6111c9565b6104f0926020604090920201908101915061113d565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610409565b508060026105598282611345565b5050600580546000919082906105749063ffffffff16611480565b91906101000a81548163ffffffff021916908363ffffffff160217905590507f6cc65868ae41a007e6c3ed18ce591c123dd4e5864b421888c68ce92dae98cea460405180604001604052808363ffffffff168152602001846105d5906114a3565b90526040516105e49190610ca0565b60405180910390a15050565b6105f8610b99565b60408051808201825260055463ffffffff1681528151606081018352600280548252600380548551602082810282018101909752818152949580870195858201939092909160009084015b828210156106b1576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff1681830152825260019092019101610643565b505050908252506002919091015467ffffffffffffffff166020909101529052919050565b84518110156108bd5760008582815181106106f3576106f36111c9565b602002602001015190506000600186601b8460000151856020015160405160008152602001604052604051610744949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610766573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166107de576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610843576040517fbbe15e7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460ff166108a2576040517faaaa914100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250826108ae8561161f565b945050508060010190506106d6565b5060045467ffffffffffffffff16821015610904576040517f59fa4a9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a15610a23565b610a1e81610aa4565b50565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610988565b3373ffffffffffffffffffffffffffffffffffffffff821603610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610988565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040518060400160405280600063ffffffff168152602001610be260405180606001604052806000801916815260200160608152602001600067ffffffffffffffff1681525090565b905290565b6000815180845260005b81811015610c0d57602081850181015186830182015201610bf1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610c5e6020830184610be7565b9392505050565b600060208284031215610c7757600080fd5b813567ffffffffffffffff811115610c8e57600080fd5b820160608185031215610c5e57600080fd5b6000602080835263ffffffff8451168184015280840151604080604086015260c0850182516060870152838301516060608088015281815180845260e0890191508683019350600092505b80831015610d34578351805173ffffffffffffffffffffffffffffffffffffffff16835287015167ffffffffffffffff1687830152928601926001929092019190840190610ceb565b50604085015167ffffffffffffffff811660a08a0152955098975050505050505050565b600060208284031215610d6a57600080fd5b81357fffffffffffffffffffffffffffffffff0000000000000000000000000000000081168114610c5e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610dec57610dec610d9a565b60405290565b60405160a0810167ffffffffffffffff81118282101715610dec57610dec610d9a565b6040516060810167ffffffffffffffff81118282101715610dec57610dec610d9a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610e7f57610e7f610d9a565b604052919050565b600067ffffffffffffffff821115610ea157610ea1610d9a565b5060051b60200190565b67ffffffffffffffff81168114610a1e57600080fd5b8035610ecc81610eab565b919050565b600082601f830112610ee257600080fd5b81356020610ef7610ef283610e87565b610e38565b82815260069290921b84018101918181019086841115610f1657600080fd5b8286015b84811015610f555760408189031215610f335760008081fd5b610f3b610dc9565b813581528482013585820152835291830191604001610f1a565b509695505050505050565b60008060408385031215610f7357600080fd5b823567ffffffffffffffff80821115610f8b57600080fd5b818501915085601f830112610f9f57600080fd5b81356020610faf610ef283610e87565b82815260059290921b84018101918181019089841115610fce57600080fd5b8286015b848110156110ed57803586811115610fe957600080fd5b87017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060a0828e038201121561101e57600080fd5b611026610df2565b8683013561103381610eab565b8152604083013561104381610eab565b81880152606083013561105581610eab565b60408201526080830135606082015260a08301358981111561107657600080fd5b8084019350508d603f84011261108b57600080fd5b868301358981111561109f5761109f610d9a565b6110af8884601f84011601610e38565b92508083528e60408286010111156110c657600080fd5b80604085018985013760009083018801526080810191909152845250918301918301610fd2565b509650508601359250508082111561110457600080fd5b5061111185828601610ed1565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a1e57600080fd5b60006020828403121561114f57600080fd5b8135610c5e8161111b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261118f57600080fd5b83018035915067ffffffffffffffff8211156111aa57600080fd5b6020019150600681901b36038213156111c257600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561120a57600080fd5b8135610c5e81610eab565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561125757611257611215565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000813561125781610eab565b81356112a48161111b565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff0000000000000000000000000000000000000000821617835560208401356112f481610eab565b7bffffffffffffffff00000000000000000000000000000000000000008160a01b16837fffffffff000000000000000000000000000000000000000000000000000000008416171784555050505050565b81358155600180820160208401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811261138357600080fd5b8401803567ffffffffffffffff81111561139c57600080fd5b6020820191508060061b36038213156113b457600080fd5b680100000000000000008111156113cd576113cd610d9a565b825481845580821015611402576000848152602081208381019083015b808210156113fe57828255908701906113ea565b5050505b50600092835260208320925b81811015611432576114208385611299565b9284019260409290920191840161140e565b50505050506101716114466040840161128c565b6002830167ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555050565b600063ffffffff80831681810361149957611499611215565b6001019392505050565b6000606082360312156114b557600080fd5b6114bd610e15565b8235815260208084013567ffffffffffffffff8111156114dc57600080fd5b840136601f8201126114ed57600080fd5b80356114fb610ef282610e87565b81815260069190911b8201830190838101903683111561151a57600080fd5b928401925b8284101561157057604084360312156115385760008081fd5b611540610dc9565b843561154b8161111b565b81528486013561155a81610eab565b818701528252604093909301929084019061151f565b8085870152505050505061158660408401610ec1565b604082015292915050565b8181101561160c578c89037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee00184528751805187168a528a81015187168b8b01528b81015187168c8b015287810151888b0152850151858a018490526115f9848b0182610be7565b9950509689019692890192600101611591565b50969d9c50505050505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361165057611650611215565b506001019056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"AlreadyCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOnchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignerOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinSignersTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"NotCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"Cursed\",\"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\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"Uncursed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"curse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"curse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCursedSubjects\",\"outputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLocalChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getReportDigestHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"digestHeader\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVersionedConfig\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"minSigners\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"newConfig\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"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\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"uncurse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"uncurse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"offrampAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"rawVs\",\"type\":\"uint256\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200216a3803806200216a8339810160408190526200003491620001a9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fe565b505050806001600160401b0316600003620000ec5760405163273e150360e21b815260040160405180910390fd5b6001600160401b0316608052620001db565b336001600160a01b03821603620001585760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bc57600080fd5b81516001600160401b0381168114620001d457600080fd5b9392505050565b608051611f6c620001fe6000396000818161027a0152610acb0152611f6c6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806379ba509711610097578063d881e09211610066578063d881e09214610257578063eaa83ddd1461026c578063f2fde38b146102a4578063f8bb876e146102b757600080fd5b806379ba5097146102015780638d8741cb146102095780638da5cb5b1461021c5780639a19b3291461024457600080fd5b8063397796f7116100d3578063397796f7146101a557806362eed415146101ad5780636509a954146101c05780636d2d3993146101ee57600080fd5b8063181f5a7714610105578063198f0f77146101575780631add205f1461016c5780632cbc26bb14610182575b600080fd5b6101416040518060400160405280601381526020017f524d4e52656d6f746520312e362e302d6465760000000000000000000000000081525081565b60405161014e91906113b9565b60405180910390f35b61016a6101653660046113cc565b6102ca565b005b610174610676565b60405161014e929190611407565b6101956101903660046114e5565b61076e565b604051901515815260200161014e565b6101956107cb565b61016a6101bb3660046114e5565b610845565b6040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf53815260200161014e565b61016a6101fc3660046114e5565b6108b9565b61016a610929565b61016a61021736600461156e565b610a2b565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014e565b61016a6102523660046116f5565b610d7f565b61025f610e7c565b60405161014e9190611792565b60405167ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161014e565b61016a6102b23660046117f8565b610e88565b61016a6102c53660046116f5565b610e9c565b6102d2610f8e565b60015b6102e26020830183611815565b90508110156103b2576102f86020830183611815565b828181106103085761030861187d565b905060400201602001602081019061032091906118cd565b67ffffffffffffffff166103376020840184611815565b610342600185611919565b8181106103515761035161187d565b905060400201602001602081019061036991906118cd565b67ffffffffffffffff16106103aa576040517f4485151700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001016102d5565b506103c06020820182611815565b90506103d260608301604084016118cd565b67ffffffffffffffff161115610414576040517ffba0d9e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003545b80156104a65760086000600361042f600185611919565b8154811061043f5761043f61187d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561049f8161192c565b9050610418565b5060005b6104b76020830183611815565b90508110156105ec57600860006104d16020850185611815565b848181106104e1576104e161187d565b6104f792602060409092020190810191506117f8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff1615610558576040517f28cae27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016008600061056b6020860186611815565b8581811061057b5761057b61187d565b61059192602060409092020190810191506117f8565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016104aa565b508060026105fa8282611a1a565b5050600580546000919082906106159063ffffffff16611b55565b91906101000a81548163ffffffff021916908363ffffffff160217905590508063ffffffff167f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c8360405161066a9190611b78565b60405180910390a25050565b6040805160608082018352600080835260208301919091529181018290526005546040805160608101825260028054825260038054845160208281028201810190965281815263ffffffff9096169592948593818601939092909160009084015b82821015610745576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16818301528252600190920191016106d7565b505050908252506002919091015467ffffffffffffffff16602090910152919491935090915050565b600061077a6006611011565b60000361078957506000919050565b61079460068361101b565b806107c557506107c560067f010000000000000000000000000000010000000000000000000000000000000061101b565b92915050565b60006107d76006611011565b6000036107e45750600090565b61080f60067f010000000000000000000000000000000000000000000000000000000000000061101b565b80610840575061084060067f010000000000000000000000000000010000000000000000000000000000000061101b565b905090565b60408051600180825281830190925260009160208083019080368337019050509050818160008151811061087b5761087b61187d565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216602092830291909101909101526108b581610e9c565b5050565b6040805160018082528183019092526000916020808301908036833701905050905081816000815181106108ef576108ef61187d565b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216602092830291909101909101526108b581610d7f565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055463ffffffff16600003610a6d576040517face124bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045467ffffffffffffffff16821015610ab3576040517f59fa4a9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160c08101825246815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020820152309181019190915273ffffffffffffffffffffffffffffffffffffffff8716606082015260025460808201526000907f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf539060a08101610b4f888a611c82565b9052604051610b62929190602001611de2565b60405160208183030381529060405280519060200120905060008060005b85811015610d7357600184610b9a82841b8816601b611f17565b898985818110610bac57610bac61187d565b905060400201600001358a8a86818110610bc857610bc861187d565b9050604002016020013560405160008152602001604052604051610c08949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610c2a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015192505073ffffffffffffffffffffffffffffffffffffffff8216610ca2576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610610d07576040517fbbe15e7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff16610d66576040517faaaa914100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9091508190600101610b80565b50505050505050505050565b610d87610f8e565b60005b8151811015610e4157610dc0828281518110610da857610da861187d565b6020026020010151600661105990919063ffffffff16565b610e3957818181518110610dd657610dd661187d565b60200260200101516040517f73281fa10000000000000000000000000000000000000000000000000000000081526004016109a691907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b600101610d8a565b507f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba181604051610e719190611792565b60405180910390a150565b60606108406006611087565b610e90610f8e565b610e9981611094565b50565b610ea4610f8e565b60005b8151811015610f5e57610edd828281518110610ec557610ec561187d565b6020026020010151600661118990919063ffffffff16565b610f5657818181518110610ef357610ef361187d565b60200260200101516040517f19d5c79b0000000000000000000000000000000000000000000000000000000081526004016109a691907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b600101610ea7565b507f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7481604051610e719190611792565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109a6565b565b60006107c5825490565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008116600090815260018301602052604081205415155b9392505050565b6000611052837fffffffffffffffffffffffffffffffff0000000000000000000000000000000084166111b7565b60606000611052836112aa565b3373ffffffffffffffffffffffffffffffffffffffff821603611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109a6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611052837fffffffffffffffffffffffffffffffff000000000000000000000000000000008416611306565b600081815260018301602052604081205480156112a05760006111db600183611919565b85549091506000906111ef90600190611919565b905080821461125457600086600001828154811061120f5761120f61187d565b90600052602060002001549050808760000184815481106112325761123261187d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061126557611265611f30565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107c5565b60009150506107c5565b6060816000018054806020026020016040519081016040528092919081815260200182805480156112fa57602002820191906000526020600020905b8154815260200190600101908083116112e6575b50505050509050919050565b600081815260018301602052604081205461134d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107c5565b5060006107c5565b6000815180845260005b8181101561137b5760208185018101518683018201520161135f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006110526020830184611355565b6000602082840312156113de57600080fd5b813567ffffffffffffffff8111156113f557600080fd5b82016060818503121561105257600080fd5b63ffffffff831681526040602080830182905283518383015283810151606080850152805160a085018190526000939291820190849060c08701905b8083101561148c578351805173ffffffffffffffffffffffffffffffffffffffff16835285015167ffffffffffffffff1685830152928401926001929092019190850190611443565b50604088015167ffffffffffffffff81166080890152945098975050505050505050565b80357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681146114e057600080fd5b919050565b6000602082840312156114f757600080fd5b611052826114b0565b73ffffffffffffffffffffffffffffffffffffffff81168114610e9957600080fd5b60008083601f84011261153457600080fd5b50813567ffffffffffffffff81111561154c57600080fd5b6020830191508360208260061b850101111561156757600080fd5b9250929050565b6000806000806000806080878903121561158757600080fd5b863561159281611500565b9550602087013567ffffffffffffffff808211156115af57600080fd5b818901915089601f8301126115c357600080fd5b8135818111156115d257600080fd5b8a60208260051b85010111156115e757600080fd5b60208301975080965050604089013591508082111561160557600080fd5b5061161289828a01611522565b979a9699509497949695606090950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561167c5761167c61162a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156116c9576116c961162a565b604052919050565b600067ffffffffffffffff8211156116eb576116eb61162a565b5060051b60200190565b6000602080838503121561170857600080fd5b823567ffffffffffffffff81111561171f57600080fd5b8301601f8101851361173057600080fd5b803561174361173e826116d1565b611682565b81815260059190911b8201830190838101908783111561176257600080fd5b928401925b8284101561178757611778846114b0565b82529284019290840190611767565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156117ec5783517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016835292840192918401916001016117ae565b50909695505050505050565b60006020828403121561180a57600080fd5b813561105281611500565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261184a57600080fd5b83018035915067ffffffffffffffff82111561186557600080fd5b6020019150600681901b360382131561156757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff81168114610e9957600080fd5b80356114e0816118ac565b6000602082840312156118df57600080fd5b8135611052816118ac565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156107c5576107c56118ea565b60008161193b5761193b6118ea565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600081356107c5816118ac565b813561197981611500565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff0000000000000000000000000000000000000000821617835560208401356119c9816118ac565b7bffffffffffffffff00000000000000000000000000000000000000008160a01b16837fffffffff000000000000000000000000000000000000000000000000000000008416171784555050505050565b81358155600180820160208401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112611a5857600080fd5b8401803567ffffffffffffffff811115611a7157600080fd5b6020820191508060061b3603821315611a8957600080fd5b68010000000000000000811115611aa257611aa261162a565b825481845580821015611ad7576000848152602081208381019083015b80821015611ad35782825590870190611abf565b5050505b50600092835260208320925b81811015611b0757611af5838561196e565b92840192604092909201918401611ae3565b50505050506108b5611b1b60408401611961565b6002830167ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555050565b600063ffffffff808316818103611b6e57611b6e6118ea565b6001019392505050565b6000602080835260808301843582850152818501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112611bbd57600080fd5b8501828101903567ffffffffffffffff80821115611bda57600080fd5b8160061b3603831315611bec57600080fd5b6040606060408901528483865260a089019050849550600094505b83851015611c57578535611c1a81611500565b73ffffffffffffffffffffffffffffffffffffffff16815285870135611c3f816118ac565b83168188015294810194600194909401938101611c07565b611c6360408b016118c2565b67ffffffffffffffff811660608b015296509998505050505050505050565b6000611c9061173e846116d1565b80848252602080830192508560051b850136811115611cae57600080fd5b855b81811015611dd657803567ffffffffffffffff80821115611cd15760008081fd5b818901915060a08236031215611ce75760008081fd5b611cef611659565b8235611cfa816118ac565b81528286013582811115611d0e5760008081fd5b8301601f3681830112611d215760008081fd5b813584811115611d3357611d3361162a565b611d62897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08484011601611682565b94508085523689828501011115611d7b57600091508182fd5b808984018a8701376000898287010152505050818682015260409150611da28284016118c2565b8282015260609150611db58284016118c2565b91810191909152608091820135918101919091528552938201938201611cb0565b50919695505050505050565b60006040848352602060408185015261010084018551604086015281860151606067ffffffffffffffff808316606089015260408901519250608073ffffffffffffffffffffffffffffffffffffffff80851660808b015260608b0151945060a081861660a08c015260808c015160c08c015260a08c0151955060c060e08c015286915085518088526101209750878c019250878160051b8d01019750888701965060005b81811015611f04577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08d8a030184528751868151168a528a810151848c8c0152611ed3858c0182611355565b828e015189168c8f01528983015189168a8d0152918701519a87019a909a5298509689019692890192600101611e87565b50969d9c50505050505050505050505050565b60ff81811683821601908111156107c5576107c56118ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var RMNRemoteABI = RMNRemoteMetaData.ABI var RMNRemoteBin = RMNRemoteMetaData.Bin -func DeployRMNRemote(auth *bind.TransactOpts, backend bind.ContractBackend, chainSelector uint64) (common.Address, *types.Transaction, *RMNRemote, error) { +func DeployRMNRemote(auth *bind.TransactOpts, backend bind.ContractBackend, localChainSelector uint64) (common.Address, *types.Transaction, *RMNRemote, error) { parsed, err := RMNRemoteMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -77,7 +72,7 @@ func DeployRMNRemote(auth *bind.TransactOpts, backend bind.ContractBackend, chai return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNRemoteBin), backend, chainSelector) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNRemoteBin), backend, localChainSelector) if err != nil { return common.Address{}, nil, nil, err } @@ -200,25 +195,99 @@ func (_RMNRemote *RMNRemoteTransactorRaw) Transact(opts *bind.TransactOpts, meth return _RMNRemote.Contract.contract.Transact(opts, method, params...) } -func (_RMNRemote *RMNRemoteCaller) GetVersionedConfig(opts *bind.CallOpts) (RMNRemoteVersionedConfig, error) { +func (_RMNRemote *RMNRemoteCaller) GetCursedSubjects(opts *bind.CallOpts) ([][16]byte, error) { var out []interface{} - err := _RMNRemote.contract.Call(opts, &out, "getVersionedConfig") + err := _RMNRemote.contract.Call(opts, &out, "getCursedSubjects") if err != nil { - return *new(RMNRemoteVersionedConfig), err + return *new([][16]byte), err } - out0 := *abi.ConvertType(out[0], new(RMNRemoteVersionedConfig)).(*RMNRemoteVersionedConfig) + out0 := *abi.ConvertType(out[0], new([][16]byte)).(*[][16]byte) return out0, err } -func (_RMNRemote *RMNRemoteSession) GetVersionedConfig() (RMNRemoteVersionedConfig, error) { +func (_RMNRemote *RMNRemoteSession) GetCursedSubjects() ([][16]byte, error) { + return _RMNRemote.Contract.GetCursedSubjects(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetCursedSubjects() ([][16]byte, error) { + return _RMNRemote.Contract.GetCursedSubjects(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetLocalChainSelector(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getLocalChainSelector") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) GetLocalChainSelector() (uint64, error) { + return _RMNRemote.Contract.GetLocalChainSelector(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetLocalChainSelector() (uint64, error) { + return _RMNRemote.Contract.GetLocalChainSelector(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetReportDigestHeader(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getReportDigestHeader") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) GetReportDigestHeader() ([32]byte, error) { + return _RMNRemote.Contract.GetReportDigestHeader(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetReportDigestHeader() ([32]byte, error) { + return _RMNRemote.Contract.GetReportDigestHeader(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetVersionedConfig(opts *bind.CallOpts) (GetVersionedConfig, + + error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getVersionedConfig") + + outstruct := new(GetVersionedConfig) + if err != nil { + return *outstruct, err + } + + outstruct.Version = *abi.ConvertType(out[0], new(uint32)).(*uint32) + outstruct.Config = *abi.ConvertType(out[1], new(RMNRemoteConfig)).(*RMNRemoteConfig) + + return *outstruct, err + +} + +func (_RMNRemote *RMNRemoteSession) GetVersionedConfig() (GetVersionedConfig, + + error) { return _RMNRemote.Contract.GetVersionedConfig(&_RMNRemote.CallOpts) } -func (_RMNRemote *RMNRemoteCallerSession) GetVersionedConfig() (RMNRemoteVersionedConfig, error) { +func (_RMNRemote *RMNRemoteCallerSession) GetVersionedConfig() (GetVersionedConfig, + + error) { return _RMNRemote.Contract.GetVersionedConfig(&_RMNRemote.CallOpts) } @@ -310,9 +379,9 @@ func (_RMNRemote *RMNRemoteCallerSession) TypeAndVersion() (string, error) { return _RMNRemote.Contract.TypeAndVersion(&_RMNRemote.CallOpts) } -func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, destLaneUpdates []InternalMerkleRoot, signatures []IRMNV2Signature) error { +func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error { var out []interface{} - err := _RMNRemote.contract.Call(opts, &out, "verify", destLaneUpdates, signatures) + err := _RMNRemote.contract.Call(opts, &out, "verify", offrampAddress, merkleRoots, signatures, rawVs) if err != nil { return err @@ -322,12 +391,12 @@ func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, destLaneUpdates [ } -func (_RMNRemote *RMNRemoteSession) Verify(destLaneUpdates []InternalMerkleRoot, signatures []IRMNV2Signature) error { - return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, destLaneUpdates, signatures) +func (_RMNRemote *RMNRemoteSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error { + return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures, rawVs) } -func (_RMNRemote *RMNRemoteCallerSession) Verify(destLaneUpdates []InternalMerkleRoot, signatures []IRMNV2Signature) error { - return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, destLaneUpdates, signatures) +func (_RMNRemote *RMNRemoteCallerSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error { + return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures, rawVs) } func (_RMNRemote *RMNRemoteTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -342,28 +411,40 @@ func (_RMNRemote *RMNRemoteTransactorSession) AcceptOwnership() (*types.Transact return _RMNRemote.Contract.AcceptOwnership(&_RMNRemote.TransactOpts) } -func (_RMNRemote *RMNRemoteTransactor) SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) { - return _RMNRemote.contract.Transact(opts, "setConfig", newConfig) +func (_RMNRemote *RMNRemoteTransactor) Curse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "curse", subject) } -func (_RMNRemote *RMNRemoteSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { - return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) +func (_RMNRemote *RMNRemoteSession) Curse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse(&_RMNRemote.TransactOpts, subject) } -func (_RMNRemote *RMNRemoteTransactorSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { - return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) +func (_RMNRemote *RMNRemoteTransactorSession) Curse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse(&_RMNRemote.TransactOpts, subject) } -func (_RMNRemote *RMNRemoteTransactor) Test(opts *bind.TransactOpts) (*types.Transaction, error) { - return _RMNRemote.contract.Transact(opts, "test") +func (_RMNRemote *RMNRemoteTransactor) Curse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "curse0", subjects) } -func (_RMNRemote *RMNRemoteSession) Test() (*types.Transaction, error) { - return _RMNRemote.Contract.Test(&_RMNRemote.TransactOpts) +func (_RMNRemote *RMNRemoteSession) Curse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse0(&_RMNRemote.TransactOpts, subjects) } -func (_RMNRemote *RMNRemoteTransactorSession) Test() (*types.Transaction, error) { - return _RMNRemote.Contract.Test(&_RMNRemote.TransactOpts) +func (_RMNRemote *RMNRemoteTransactorSession) Curse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse0(&_RMNRemote.TransactOpts, subjects) +} + +func (_RMNRemote *RMNRemoteTransactor) SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "setConfig", newConfig) +} + +func (_RMNRemote *RMNRemoteSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) +} + +func (_RMNRemote *RMNRemoteTransactorSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) } func (_RMNRemote *RMNRemoteTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -378,6 +459,30 @@ func (_RMNRemote *RMNRemoteTransactorSession) TransferOwnership(to common.Addres return _RMNRemote.Contract.TransferOwnership(&_RMNRemote.TransactOpts, to) } +func (_RMNRemote *RMNRemoteTransactor) Uncurse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "uncurse", subject) +} + +func (_RMNRemote *RMNRemoteSession) Uncurse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Uncurse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactor) Uncurse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "uncurse0", subjects) +} + +func (_RMNRemote *RMNRemoteSession) Uncurse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse0(&_RMNRemote.TransactOpts, subjects) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Uncurse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse0(&_RMNRemote.TransactOpts, subjects) +} + type RMNRemoteConfigSetIterator struct { Event *RMNRemoteConfigSet @@ -439,22 +544,33 @@ func (it *RMNRemoteConfigSetIterator) Close() error { } type RMNRemoteConfigSet struct { - VersionedConfig RMNRemoteVersionedConfig - Raw types.Log + Version uint32 + Config RMNRemoteConfig + Raw types.Log } -func (_RMNRemote *RMNRemoteFilterer) FilterConfigSet(opts *bind.FilterOpts) (*RMNRemoteConfigSetIterator, error) { +func (_RMNRemote *RMNRemoteFilterer) FilterConfigSet(opts *bind.FilterOpts, version []uint32) (*RMNRemoteConfigSetIterator, error) { - logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "ConfigSet") + var versionRule []interface{} + for _, versionItem := range version { + versionRule = append(versionRule, versionItem) + } + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "ConfigSet", versionRule) if err != nil { return nil, err } return &RMNRemoteConfigSetIterator{contract: _RMNRemote.contract, event: "ConfigSet", logs: logs, sub: sub}, nil } -func (_RMNRemote *RMNRemoteFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet) (event.Subscription, error) { +func (_RMNRemote *RMNRemoteFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet, version []uint32) (event.Subscription, error) { - logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "ConfigSet") + var versionRule []interface{} + for _, versionItem := range version { + versionRule = append(versionRule, versionItem) + } + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "ConfigSet", versionRule) if err != nil { return nil, err } @@ -495,6 +611,123 @@ func (_RMNRemote *RMNRemoteFilterer) ParseConfigSet(log types.Log) (*RMNRemoteCo return event, nil } +type RMNRemoteCursedIterator struct { + Event *RMNRemoteCursed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteCursedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteCursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteCursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteCursedIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteCursedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteCursed struct { + Subjects [][16]byte + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterCursed(opts *bind.FilterOpts) (*RMNRemoteCursedIterator, error) { + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "Cursed") + if err != nil { + return nil, err + } + return &RMNRemoteCursedIterator{contract: _RMNRemote.contract, event: "Cursed", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchCursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteCursed) (event.Subscription, error) { + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "Cursed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNRemoteCursed) + if err := _RMNRemote.contract.UnpackLog(event, "Cursed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNRemote *RMNRemoteFilterer) ParseCursed(log types.Log) (*RMNRemoteCursed, error) { + event := new(RMNRemoteCursed) + if err := _RMNRemote.contract.UnpackLog(event, "Cursed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type RMNRemoteOwnershipTransferRequestedIterator struct { Event *RMNRemoteOwnershipTransferRequested @@ -767,14 +1000,140 @@ func (_RMNRemote *RMNRemoteFilterer) ParseOwnershipTransferred(log types.Log) (* return event, nil } +type RMNRemoteUncursedIterator struct { + Event *RMNRemoteUncursed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteUncursedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteUncursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteUncursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteUncursedIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteUncursedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteUncursed struct { + Subjects [][16]byte + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterUncursed(opts *bind.FilterOpts) (*RMNRemoteUncursedIterator, error) { + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "Uncursed") + if err != nil { + return nil, err + } + return &RMNRemoteUncursedIterator{contract: _RMNRemote.contract, event: "Uncursed", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchUncursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteUncursed) (event.Subscription, error) { + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "Uncursed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNRemoteUncursed) + if err := _RMNRemote.contract.UnpackLog(event, "Uncursed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNRemote *RMNRemoteFilterer) ParseUncursed(log types.Log) (*RMNRemoteUncursed, error) { + event := new(RMNRemoteUncursed) + if err := _RMNRemote.contract.UnpackLog(event, "Uncursed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetVersionedConfig struct { + Version uint32 + Config RMNRemoteConfig +} + func (_RMNRemote *RMNRemote) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _RMNRemote.abi.Events["ConfigSet"].ID: return _RMNRemote.ParseConfigSet(log) + case _RMNRemote.abi.Events["Cursed"].ID: + return _RMNRemote.ParseCursed(log) case _RMNRemote.abi.Events["OwnershipTransferRequested"].ID: return _RMNRemote.ParseOwnershipTransferRequested(log) case _RMNRemote.abi.Events["OwnershipTransferred"].ID: return _RMNRemote.ParseOwnershipTransferred(log) + case _RMNRemote.abi.Events["Uncursed"].ID: + return _RMNRemote.ParseUncursed(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) @@ -782,7 +1141,11 @@ func (_RMNRemote *RMNRemote) ParseLog(log types.Log) (generated.AbigenLog, error } func (RMNRemoteConfigSet) Topic() common.Hash { - return common.HexToHash("0x6cc65868ae41a007e6c3ed18ce591c123dd4e5864b421888c68ce92dae98cea4") + return common.HexToHash("0x7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c") +} + +func (RMNRemoteCursed) Topic() common.Hash { + return common.HexToHash("0x1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f74") } func (RMNRemoteOwnershipTransferRequested) Topic() common.Hash { @@ -793,12 +1156,24 @@ func (RMNRemoteOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (RMNRemoteUncursed) Topic() common.Hash { + return common.HexToHash("0x0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba1") +} + func (_RMNRemote *RMNRemote) Address() common.Address { return _RMNRemote.address } type RMNRemoteInterface interface { - GetVersionedConfig(opts *bind.CallOpts) (RMNRemoteVersionedConfig, error) + GetCursedSubjects(opts *bind.CallOpts) ([][16]byte, error) + + GetLocalChainSelector(opts *bind.CallOpts) (uint64, error) + + GetReportDigestHeader(opts *bind.CallOpts) ([32]byte, error) + + GetVersionedConfig(opts *bind.CallOpts) (GetVersionedConfig, + + error) IsCursed(opts *bind.CallOpts, subject [16]byte) (bool, error) @@ -808,22 +1183,34 @@ type RMNRemoteInterface interface { TypeAndVersion(opts *bind.CallOpts) (string, error) - Verify(opts *bind.CallOpts, destLaneUpdates []InternalMerkleRoot, signatures []IRMNV2Signature) error + Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNV2Signature, rawVs *big.Int) error AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) + Curse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) - Test(opts *bind.TransactOpts) (*types.Transaction, error) + Curse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) + + SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - FilterConfigSet(opts *bind.FilterOpts) (*RMNRemoteConfigSetIterator, error) + Uncurse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) + + Uncurse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) + + FilterConfigSet(opts *bind.FilterOpts, version []uint32) (*RMNRemoteConfigSetIterator, error) - WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet) (event.Subscription, error) + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet, version []uint32) (event.Subscription, error) ParseConfigSet(log types.Log) (*RMNRemoteConfigSet, error) + FilterCursed(opts *bind.FilterOpts) (*RMNRemoteCursedIterator, error) + + WatchCursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteCursed) (event.Subscription, error) + + ParseCursed(log types.Log) (*RMNRemoteCursed, error) + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNRemoteOwnershipTransferRequestedIterator, error) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNRemoteOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) @@ -836,6 +1223,12 @@ type RMNRemoteInterface interface { ParseOwnershipTransferred(log types.Log) (*RMNRemoteOwnershipTransferred, error) + FilterUncursed(opts *bind.FilterOpts) (*RMNRemoteUncursedIterator, error) + + WatchUncursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteUncursed) (event.Subscription, error) + + ParseUncursed(log types.Log) (*RMNRemoteUncursed, error) + ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address 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 ccd0f590f44..02106869ce9 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 @@ -4,34 +4,35 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMint burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8 burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597 -ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin 75955a3dcfd66b308be07eda54d6036cc79e87d3cdcf3c5c3115813c55912af8 -ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 9e8704166df11383257fdc6277adbe94c903d0c9148638fcbd263657ccca9152 +ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 89bca860afc3659dfaca698f0e135198a2a61aa70c9e9b177217f2ad479398b5 +ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin c570b86f8ae7697d3478e70625e06f0f682e75c1f0b7538f4b6f581b0d294b2b +ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 1245e556defe0052e2ef0d6b7e57e4c32db6e011990c9d89a2544f4aef53968e commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801 ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b0d77babbe635cd6ba04c2af049badc9e9d28a4b6ed6bb75f830ad902a618beb evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 5c02c2b167946b3467636ff2bb58594cb4652fc63d8bdfee2488ed562e2a3e50 -fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 7fcb78bfc6f050c9d3bd3396a29fa58c6eceec3be6f9f6e807212e816f881a4c +fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 6806f01f305df73a923361f128b8962e9a8d3e7338a9a5b5fbe0636e6c9fc35f lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin e6a8ec9e8faccb1da7d90e0f702ed72975964f97dc3222b54cfcca0a0ba3fea2 lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin e632b08be0fbd1d013e8b3a9d75293d0d532b83071c531ff2be1deec1fa48ec1 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5 -message_hasher: ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin 5712fbc30cf826c0cf38c68f54f744741b553d98c60e66696b7a845778cb2b3d +message_hasher: ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin ec2d3a92348d8e7b8f0d359b62a45157b9d2c750c01fbcf991826c4392f6e218 mock_usdc_token_messenger: ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.bin d976651d36b33ac2196b32b9d2f4fa6690c6a18d41b621365659fce1c1d1e737 mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin be0dbc3e475741ea0b7a54ec2b935a321b428baa9f4ce18180a87fb38bb87de2 mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4 multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed -multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 6b56e0114a4d50797d30a34aecc2641ef340451d0c3fcb9d729bba4df2435122 +multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 04b6b261dd71925670bf4d904aaf7bf08543452009feefb88e07d4c49d12e969 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536 -ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin 9254b35a86f00fde7b7193a033ca58f6521a66e87b9cf9da6ce5660082e79f5d -offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin e6827d4a39ed916c3ffa5a7d08b6bfa03cf101bee7207e5c96723b6a9fc761b0 -onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin c37096aaa0369ad988e94c300ba62917e17fcc71a3c1aa3e9b8420f21c0591d2 +offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 941b18b4e2aef977195fefba514e17c9475667e6f8513b18cabfb07ff90136ce +onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 4f29f05261bdaf9b99e675c1169c0d5cba841b6dd7ca3a8997cc0d3cae7ba850 ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2 registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353 -report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 4b9252c443c87ceb7f5ac3b9d100e572fead010f7c39543315052677a3a2c597 +report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 7413576693f76bac7c01fbaec4a161d37a1de51b13dcab78455d2c484ed938b1 rmn_contract: ../../../contracts/solc/v0.8.24/RMN/RMN.abi ../../../contracts/solc/v0.8.24/RMN/RMN.bin 8b45b0fb08631c6b582fd3c0b4052a79cc2b4e091e6286af1ab131bef63661f9 +rmn_home: ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.abi ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.bin fc2ba87d987b4e4d6e0c63b3ffb6d515fae1ab27778f6a0a6ed927d8d6aeaf8f rmn_proxy_contract: ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin b048d8e752e3c41113ebb305c1efa06737ad36b4907b93e627fb0a3113023454 -rmn_remote: ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin be6840d9646195c37f6fa3f95e1cb67218d04d2cebf72e698377b0a7b9cd76f4 +rmn_remote: ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin 515b0b7038284f8970edddf58d23cd1492237206dbe047dcbe045248db07e8a5 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 2e4f0a7826c8abb49d882bb49fc5ff20a186dbd3137624b9097ffed903ae4888 self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 8ea5d75dbc3f8afd90d22c4a665a94e02892259cd16520c1c6b4cf0dc80c9148 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin 942be7d1681ac102e0615bee13f76838ebb0b261697cf1270d2bf82c12e57aeb diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index f2a6be21f61..3112510f14f 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -13,10 +13,11 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin EVM2EVMOffRamp evm_2_evm_offramp //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin OffRamp offramp //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin RMNRemote rmn_remote +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.abi ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.bin RMNHome rmn_home //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin MultiAggregateRateLimiter multi_aggregate_rate_limiter //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin Router router //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin FeeQuoter fee_quoter -//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin CCIPConfig ccip_config +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin CCIPHome ccip_home //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin NonceManager nonce_manager // Pools @@ -42,10 +43,12 @@ package ccip //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin ReportCodec report_codec //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin EtherSenderReceiver ether_sender_receiver //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/WETH9/WETH9.abi ../../../contracts/solc/v0.8.24/WETH9/WETH9.bin WETH9 weth9 -//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin IOCR3ConfigEncoder ocr3_config_encoder //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.bin MockE2EUSDCTokenMessenger mock_usdc_token_messenger //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin MockE2EUSDCTransmitter mock_usdc_token_transmitter +// EncodingUtils +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin EncodingUtils ccip_encoding_utils + // To run these commands, you must either install docker, or the correct version // of abigen. The latter can be installed with these commands, at least on linux: // diff --git a/core/gethwrappers/ccip/mocks/fee_quoter_interface.go b/core/gethwrappers/ccip/mocks/fee_quoter_interface.go index 27f53c0bd95..df9d6642cb1 100644 --- a/core/gethwrappers/ccip/mocks/fee_quoter_interface.go +++ b/core/gethwrappers/ccip/mocks/fee_quoter_interface.go @@ -495,6 +495,64 @@ func (_c *FeeQuoterInterface_ConvertTokenAmount_Call) RunAndReturn(run func(*bin return _c } +// FEEBASEDECIMALS provides a mock function with given fields: opts +func (_m *FeeQuoterInterface) FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FEEBASEDECIMALS") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FeeQuoterInterface_FEEBASEDECIMALS_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FEEBASEDECIMALS' +type FeeQuoterInterface_FEEBASEDECIMALS_Call struct { + *mock.Call +} + +// FEEBASEDECIMALS is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *FeeQuoterInterface_Expecter) FEEBASEDECIMALS(opts interface{}) *FeeQuoterInterface_FEEBASEDECIMALS_Call { + return &FeeQuoterInterface_FEEBASEDECIMALS_Call{Call: _e.mock.On("FEEBASEDECIMALS", opts)} +} + +func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_FEEBASEDECIMALS_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_FEEBASEDECIMALS_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *FeeQuoterInterface_FEEBASEDECIMALS_Call { + _c.Call.Return(run) + return _c +} + // FilterAuthorizedCallerAdded provides a mock function with given fields: opts func (_m *FeeQuoterInterface) FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerAddedIterator, error) { ret := _m.Called(opts) @@ -1841,22 +1899,22 @@ func (_c *FeeQuoterInterface_GetTokenPrice_Call) RunAndReturn(run func(*bind.Cal } // GetTokenPriceFeedConfig provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (fee_quoter.IFeeQuoterTokenPriceFeedConfig, error) { +func (_m *FeeQuoterInterface) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error) { ret := _m.Called(opts, token) if len(ret) == 0 { panic("no return value specified for GetTokenPriceFeedConfig") } - var r0 fee_quoter.IFeeQuoterTokenPriceFeedConfig + var r0 fee_quoter.FeeQuoterTokenPriceFeedConfig var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (fee_quoter.IFeeQuoterTokenPriceFeedConfig, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error)); ok { return rf(opts, token) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) fee_quoter.IFeeQuoterTokenPriceFeedConfig); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) fee_quoter.FeeQuoterTokenPriceFeedConfig); ok { r0 = rf(opts, token) } else { - r0 = ret.Get(0).(fee_quoter.IFeeQuoterTokenPriceFeedConfig) + r0 = ret.Get(0).(fee_quoter.FeeQuoterTokenPriceFeedConfig) } if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { @@ -1887,12 +1945,12 @@ func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) Run(run func(opts *bi return _c } -func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) Return(_a0 fee_quoter.IFeeQuoterTokenPriceFeedConfig, _a1 error) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { +func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) Return(_a0 fee_quoter.FeeQuoterTokenPriceFeedConfig, _a1 error) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (fee_quoter.IFeeQuoterTokenPriceFeedConfig, error)) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { +func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error)) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { _c.Call.Return(run) return _c } @@ -2133,6 +2191,64 @@ func (_c *FeeQuoterInterface_GetValidatedTokenPrice_Call) RunAndReturn(run func( return _c } +// KEYSTONEPRICEDECIMALS provides a mock function with given fields: opts +func (_m *FeeQuoterInterface) KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for KEYSTONEPRICEDECIMALS") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'KEYSTONEPRICEDECIMALS' +type FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call struct { + *mock.Call +} + +// KEYSTONEPRICEDECIMALS is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *FeeQuoterInterface_Expecter) KEYSTONEPRICEDECIMALS(opts interface{}) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { + return &FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call{Call: _e.mock.On("KEYSTONEPRICEDECIMALS", opts)} +} + +func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { + _c.Call.Return(run) + return _c +} + // OnReport provides a mock function with given fields: opts, metadata, report func (_m *FeeQuoterInterface) OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) { ret := _m.Called(opts, metadata, report) @@ -3179,9 +3295,9 @@ func (_c *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call) RunAndReturn(run fu return _c } -// ProcessMessageArgs provides a mock function with given fields: opts, destChainSelector, feeToken, feeTokenAmount, extraArgs -func (_m *FeeQuoterInterface) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte) (fee_quoter.ProcessMessageArgs, error) { - ret := _m.Called(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs) +// ProcessMessageArgs provides a mock function with given fields: opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts +func (_m *FeeQuoterInterface) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount) (fee_quoter.ProcessMessageArgs, error) { + ret := _m.Called(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) if len(ret) == 0 { panic("no return value specified for ProcessMessageArgs") @@ -3189,17 +3305,17 @@ func (_m *FeeQuoterInterface) ProcessMessageArgs(opts *bind.CallOpts, destChainS var r0 fee_quoter.ProcessMessageArgs var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte) (fee_quoter.ProcessMessageArgs, error)); ok { - return rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) (fee_quoter.ProcessMessageArgs, error)); ok { + return rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte) fee_quoter.ProcessMessageArgs); ok { - r0 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) fee_quoter.ProcessMessageArgs); ok { + r0 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) } else { r0 = ret.Get(0).(fee_quoter.ProcessMessageArgs) } - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte) error); ok { - r1 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs) + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) error); ok { + r1 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts) } else { r1 = ret.Error(1) } @@ -3218,84 +3334,25 @@ type FeeQuoterInterface_ProcessMessageArgs_Call struct { // - feeToken common.Address // - feeTokenAmount *big.Int // - extraArgs []byte -func (_e *FeeQuoterInterface_Expecter) ProcessMessageArgs(opts interface{}, destChainSelector interface{}, feeToken interface{}, feeTokenAmount interface{}, extraArgs interface{}) *FeeQuoterInterface_ProcessMessageArgs_Call { - return &FeeQuoterInterface_ProcessMessageArgs_Call{Call: _e.mock.On("ProcessMessageArgs", opts, destChainSelector, feeToken, feeTokenAmount, extraArgs)} -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte)) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].(common.Address), args[3].(*big.Int), args[4].([]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Return(_a0 fee_quoter.ProcessMessageArgs, _a1 error) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) RunAndReturn(run func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte) (fee_quoter.ProcessMessageArgs, error)) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Return(run) - return _c -} - -// ProcessPoolReturnData provides a mock function with given fields: opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts -func (_m *FeeQuoterInterface) ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, rampTokenAmounts []fee_quoter.InternalRampTokenAmount, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount) ([][]byte, error) { - ret := _m.Called(opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) - - if len(ret) == 0 { - panic("no return value specified for ProcessPoolReturnData") - } - - var r0 [][]byte - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, []fee_quoter.InternalRampTokenAmount, []fee_quoter.ClientEVMTokenAmount) ([][]byte, error)); ok { - return rf(opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, []fee_quoter.InternalRampTokenAmount, []fee_quoter.ClientEVMTokenAmount) [][]byte); ok { - r0 = rf(opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([][]byte) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, []fee_quoter.InternalRampTokenAmount, []fee_quoter.ClientEVMTokenAmount) error); ok { - r1 = rf(opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ProcessPoolReturnData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessPoolReturnData' -type FeeQuoterInterface_ProcessPoolReturnData_Call struct { - *mock.Call -} - -// ProcessPoolReturnData is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -// - rampTokenAmounts []fee_quoter.InternalRampTokenAmount +// - onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer // - sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount -func (_e *FeeQuoterInterface_Expecter) ProcessPoolReturnData(opts interface{}, destChainSelector interface{}, rampTokenAmounts interface{}, sourceTokenAmounts interface{}) *FeeQuoterInterface_ProcessPoolReturnData_Call { - return &FeeQuoterInterface_ProcessPoolReturnData_Call{Call: _e.mock.On("ProcessPoolReturnData", opts, destChainSelector, rampTokenAmounts, sourceTokenAmounts)} +func (_e *FeeQuoterInterface_Expecter) ProcessMessageArgs(opts interface{}, destChainSelector interface{}, feeToken interface{}, feeTokenAmount interface{}, extraArgs interface{}, onRampTokenTransfers interface{}, sourceTokenAmounts interface{}) *FeeQuoterInterface_ProcessMessageArgs_Call { + return &FeeQuoterInterface_ProcessMessageArgs_Call{Call: _e.mock.On("ProcessMessageArgs", opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, onRampTokenTransfers, sourceTokenAmounts)} } -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, rampTokenAmounts []fee_quoter.InternalRampTokenAmount, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount)) *FeeQuoterInterface_ProcessPoolReturnData_Call { +func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount)) *FeeQuoterInterface_ProcessMessageArgs_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].([]fee_quoter.InternalRampTokenAmount), args[3].([]fee_quoter.ClientEVMTokenAmount)) + run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].(common.Address), args[3].(*big.Int), args[4].([]byte), args[5].([]fee_quoter.InternalEVM2AnyTokenTransfer), args[6].([]fee_quoter.ClientEVMTokenAmount)) }) return _c } -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) Return(_a0 [][]byte, _a1 error) *FeeQuoterInterface_ProcessPoolReturnData_Call { +func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Return(_a0 fee_quoter.ProcessMessageArgs, _a1 error) *FeeQuoterInterface_ProcessMessageArgs_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) RunAndReturn(run func(*bind.CallOpts, uint64, []fee_quoter.InternalRampTokenAmount, []fee_quoter.ClientEVMTokenAmount) ([][]byte, error)) *FeeQuoterInterface_ProcessPoolReturnData_Call { +func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) RunAndReturn(run func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) (fee_quoter.ProcessMessageArgs, error)) *FeeQuoterInterface_ProcessMessageArgs_Call { _c.Call.Return(run) return _c } diff --git a/core/scripts/go.mod b/core/scripts/go.mod index fd395f132b6..8721274c85b 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -24,7 +24,7 @@ require ( github.com/prometheus/client_golang v1.20.0 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v1.0.4 - github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d + github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 github.com/smartcontractkit/chainlink/integration-tests v0.0.0-00010101000000-000000000000 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 @@ -287,7 +287,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 // indirect github.com/smartcontractkit/chain-selectors v1.0.23 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 // indirect github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 // indirect github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 // indirect github.com/smartcontractkit/chainlink-feeds v0.0.0-20240910155501-42f20443189f // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 96394ececab..57510f91fb6 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1412,10 +1412,10 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb h1:bYT7j5syymCtAKv/gGG7CLp4APe/VDWkig9Ph7mc8fQ= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb/go.mod h1:WbtjuYMnDAYojL3CSWmruc1ecSBgSTggzXJ6F1U6bxw= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d h1:GpGKzVtDWSb8cesHSvm+LQpCJpFdfVPk3us5wAY6ixI= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 h1:L8NQPvVl6+vgOvkMCzGqAMn+Ur6c3cg8wVUzOGKt//k= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04/go.mod h1:GnHCwV1ApQaL06YNWFXy2nvN/tpcloqbAZOLZnWTx+I= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 h1:7fSu2ouxcOUrpuyMqia4tUA20LAuFU0IwVDGz+4aTnw= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7/go.mod h1:BMYE1vC/pGmdFSsOJdPrAA0/4gZ0Xo0SxTMdGspBtRo= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 h1:yRk4ektpx/UxwarqAfgxUXLrsYXlaNeP1NOwzHGrK2Q= diff --git a/go.mod b/go.mod index a2c9b1b211f..a1c63c1866e 100644 --- a/go.mod +++ b/go.mod @@ -75,8 +75,8 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.23 github.com/smartcontractkit/chainlink-automation v1.0.4 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb - github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 + github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 github.com/smartcontractkit/chainlink-feeds v0.0.0-20240910155501-42f20443189f diff --git a/go.sum b/go.sum index 8fad9ec97ad..ee66045d82f 100644 --- a/go.sum +++ b/go.sum @@ -1058,10 +1058,10 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb h1:bYT7j5syymCtAKv/gGG7CLp4APe/VDWkig9Ph7mc8fQ= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb/go.mod h1:WbtjuYMnDAYojL3CSWmruc1ecSBgSTggzXJ6F1U6bxw= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d h1:GpGKzVtDWSb8cesHSvm+LQpCJpFdfVPk3us5wAY6ixI= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 h1:L8NQPvVl6+vgOvkMCzGqAMn+Ur6c3cg8wVUzOGKt//k= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04/go.mod h1:GnHCwV1ApQaL06YNWFXy2nvN/tpcloqbAZOLZnWTx+I= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 h1:7fSu2ouxcOUrpuyMqia4tUA20LAuFU0IwVDGz+4aTnw= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7/go.mod h1:BMYE1vC/pGmdFSsOJdPrAA0/4gZ0Xo0SxTMdGspBtRo= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 h1:yRk4ektpx/UxwarqAfgxUXLrsYXlaNeP1NOwzHGrK2Q= diff --git a/integration-tests/deployment/ccip/add_chain.go b/integration-tests/deployment/ccip/add_chain.go index 86faaec167d..1816e55d36e 100644 --- a/integration-tests/deployment/ccip/add_chain.go +++ b/integration-tests/deployment/ccip/add_chain.go @@ -15,10 +15,9 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" ) // NewChainInboundProposal generates a proposal @@ -121,9 +120,10 @@ func NewChainInboundProposal( } chainConfig := SetupConfigInfo(newChainSel, nodes.NonBootstraps().PeerIDs(), nodes.DefaultF(), encodedExtraChainConfig) - addChain, err := state.Chains[homeChainSel].CCIPConfig.ApplyChainConfigUpdates(deployment.SimTransactOpts(), nil, []ccip_config.CCIPConfigTypesChainConfigInfo{ - chainConfig, - }) + addChain, err := state.Chains[homeChainSel].CCIPHome.ApplyChainConfigUpdates( + deployment.SimTransactOpts(), nil, []ccip_home.CCIPHomeChainConfigArgs{ + chainConfig, + }) if err != nil { return nil, err } @@ -139,13 +139,21 @@ func NewChainInboundProposal( if err != nil { return nil, err } - addDON, err := state.Chains[homeChainSel].CapabilityRegistry.AddDON(deployment.SimTransactOpts(), - nodes.NonBootstraps().PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: newDONArgs, - }, - }, false, false, nodes.NonBootstraps().DefaultF()) + mcmsOps, err := CreateDON( + e.Logger, + state.Chains[homeChainSel].CapabilityRegistry, + state.Chains[homeChainSel].CCIPHome, + newDONArgs, + e.Chains[homeChainSel], + nodes, + ) + //addDON, err := state.Chains[homeChainSel].CapabilityRegistry.AddDON(SimTransactOpts(), + // nodes.NonBootstraps().PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + // { + // CapabilityId: CCIPCapabilityID, + // Config: newDONArgs, + // }, + // }, false, false, nodes.NonBootstraps().DefaultF()) if err != nil { return nil, err } @@ -161,19 +169,14 @@ func NewChainInboundProposal( timelockAddresses[mcms.ChainIdentifier(homeChain.Selector)] = state.Chains[homeChainSel].Timelock.Address() batches = append(batches, timelock.BatchChainOperation{ ChainIdentifier: mcms.ChainIdentifier(homeChain.Selector), - Batch: []mcms.Operation{ + Batch: append([]mcms.Operation{ { // Add the chain first, don needs it to be there. - To: state.Chains[homeChainSel].CCIPConfig.Address(), + To: state.Chains[homeChainSel].CCIPHome.Address(), Data: addChain.Data(), Value: big.NewInt(0), }, - { - To: state.Chains[homeChainSel].CapabilityRegistry.Address(), - Data: addDON.Data(), - Value: big.NewInt(0), - }, - }, + }, mcmsOps...), }) return timelock.NewMCMSWithTimelockProposal( "1", diff --git a/integration-tests/deployment/ccip/add_chain_test.go b/integration-tests/deployment/ccip/add_chain_test.go index c1a9571d40d..00147c2b474 100644 --- a/integration-tests/deployment/ccip/add_chain_test.go +++ b/integration-tests/deployment/ccip/add_chain_test.go @@ -23,6 +23,9 @@ import ( ) func TestAddChainInbound(t *testing.T) { + // TODO: fix + t.Skip("Not currently working, need to fix the addChain proposal") + // 4 chains where the 4th is added after initial deployment. e := NewMemoryEnvironmentWithJobs(t, logger.TestLogger(t), 4) state, err := LoadOnchainState(e.Env, e.Ab) @@ -94,7 +97,7 @@ func TestAddChainInbound(t *testing.T) { require.NoError(t, err) _, err = deployment.ConfirmIfNoError(e.Env.Chains[e.HomeChainSel], tx, err) require.NoError(t, err) - tx, err = state.Chains[e.HomeChainSel].CCIPConfig.TransferOwnership(e.Env.Chains[e.HomeChainSel].DeployerKey, state.Chains[e.HomeChainSel].Timelock.Address()) + tx, err = state.Chains[e.HomeChainSel].CCIPHome.TransferOwnership(e.Env.Chains[e.HomeChainSel].DeployerKey, state.Chains[e.HomeChainSel].Timelock.Address()) require.NoError(t, err) _, err = deployment.ConfirmIfNoError(e.Env.Chains[e.HomeChainSel], tx, err) require.NoError(t, err) @@ -111,7 +114,7 @@ func TestAddChainInbound(t *testing.T) { require.NoError(t, err2) require.Equal(t, state.Chains[chain].Timelock.Address(), owner) } - cfgOwner, err := state.Chains[e.HomeChainSel].CCIPConfig.Owner(nil) + cfgOwner, err := state.Chains[e.HomeChainSel].CCIPHome.Owner(nil) require.NoError(t, err) crOwner, err := state.Chains[e.HomeChainSel].CapabilityRegistry.Owner(nil) require.NoError(t, err) @@ -146,7 +149,7 @@ func TestAddChainInbound(t *testing.T) { // Set the OCR3 config on new 4th chain to enable the plugin. latestDON, err := LatestCCIPDON(state.Chains[e.HomeChainSel].CapabilityRegistry) require.NoError(t, err) - ocrConfigs, err := BuildSetOCR3ConfigArgs(latestDON.Id, state.Chains[e.HomeChainSel].CCIPConfig) + ocrConfigs, err := BuildSetOCR3ConfigArgs(latestDON.Id, state.Chains[e.HomeChainSel].CCIPHome, newChain) require.NoError(t, err) tx, err = state.Chains[newChain].OffRamp.SetOCR3Configs(e.Env.Chains[newChain].DeployerKey, ocrConfigs) require.NoError(t, err) diff --git a/integration-tests/deployment/ccip/deploy.go b/integration-tests/deployment/ccip/deploy.go index fa44a07e3f3..7d238e84902 100644 --- a/integration-tests/deployment/ccip/deploy.go +++ b/integration-tests/deployment/ccip/deploy.go @@ -15,11 +15,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface" "github.com/smartcontractkit/chainlink/integration-tests/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" @@ -47,7 +48,8 @@ var ( BypasserManyChainMultisig deployment.ContractType = "BypasserManyChainMultiSig" CancellerManyChainMultisig deployment.ContractType = "CancellerManyChainMultiSig" ProposerManyChainMultisig deployment.ContractType = "ProposerManyChainMultiSig" - CCIPConfig deployment.ContractType = "CCIPConfig" + CCIPHome deployment.ContractType = "CCIPHome" + RMNHome deployment.ContractType = "RMNHome" RBACTimelock deployment.ContractType = "RBACTimelock" OnRamp deployment.ContractType = "OnRamp" OffRamp deployment.ContractType = "OffRamp" @@ -61,7 +63,8 @@ var ( type Contracts interface { *capabilities_registry.CapabilitiesRegistry | *rmn_proxy_contract.RMNProxyContract | - *ccip_config.CCIPConfig | + *ccip_home.CCIPHome | + *rmn_home.RMNHome | *nonce_manager.NonceManager | *fee_quoter.FeeQuoter | *router.Router | @@ -146,14 +149,14 @@ func DeployCCIPContracts(e deployment.Environment, ab deployment.AddressBook, c return err } if cr != CCIPCapabilityID { - return fmt.Errorf("Capability registry does not support CCIP %s %s", hexutil.Encode(cr[:]), hexutil.Encode(CCIPCapabilityID[:])) + return fmt.Errorf("capability registry does not support CCIP %s %s", hexutil.Encode(cr[:]), hexutil.Encode(CCIPCapabilityID[:])) } capability, err := capReg.GetCapability(nil, CCIPCapabilityID) if err != nil { e.Logger.Errorw("Failed to get capability", "err", err) return err } - ccipConfig, err := ccip_config.NewCCIPConfig(capability.ConfigurationContract, e.Chains[c.HomeChainSel].Client) + ccipHome, err := ccip_home.NewCCIPHome(capability.ConfigurationContract, e.Chains[c.HomeChainSel].Client) if err != nil { e.Logger.Errorw("Failed to get ccip config", "err", err) return err @@ -172,11 +175,11 @@ func DeployCCIPContracts(e deployment.Environment, ab deployment.AddressBook, c for _, chainSel := range c.ChainsToDeploy { chain, ok := e.Chains[chainSel] if !ok { - return fmt.Errorf("Chain %d not found", chainSel) + return fmt.Errorf("chain %d not found", chainSel) } chainConfig, ok := c.FeeTokenContracts[chainSel] if !ok { - return fmt.Errorf("Chain %d config not found", chainSel) + return fmt.Errorf("chain %d config not found", chainSel) } err = DeployChainContracts(e, chain, ab, chainConfig, c.MCMSConfig) if err != nil { @@ -199,7 +202,7 @@ func DeployCCIPContracts(e deployment.Environment, ab deployment.AddressBook, c _, err = AddChainConfig( e.Logger, e.Chains[c.HomeChainSel], - ccipConfig, + ccipHome, chain.Selector, nodes.NonBootstraps().PeerIDs()) if err != nil { @@ -210,7 +213,7 @@ func DeployCCIPContracts(e deployment.Environment, ab deployment.AddressBook, c if err := AddDON( e.Logger, capReg, - ccipConfig, + ccipHome, chainState.OffRamp, c.FeedChainSel, tokenInfo, @@ -305,7 +308,7 @@ func DeployMCMSContracts( timelock, err := deployContract(lggr, chain, ab, func(chain deployment.Chain) ContractDeploy[*owner_helpers.RBACTimelock] { - timelock, tx, cc, err2 := owner_helpers.DeployRBACTimelock( + timelock, tx2, cc, err2 := owner_helpers.DeployRBACTimelock( chain.DeployerKey, chain.Client, big.NewInt(0), // minDelay @@ -316,7 +319,7 @@ func DeployMCMSContracts( []common.Address{bypasser.Address}, // bypassers ) return ContractDeploy[*owner_helpers.RBACTimelock]{ - timelock, cc, tx, deployment.NewTypeAndVersion(RBACTimelock, deployment.Version1_0_0), err2, + timelock, cc, tx2, deployment.NewTypeAndVersion(RBACTimelock, deployment.Version1_0_0), err2, } }) if err != nil { @@ -350,12 +353,12 @@ func DeployFeeTokensToChains(lggr logger.Logger, ab deployment.AddressBook, chai func DeployFeeTokens(lggr logger.Logger, chain deployment.Chain, ab deployment.AddressBook) (FeeTokenContracts, error) { weth9, err := deployContract(lggr, chain, ab, func(chain deployment.Chain) ContractDeploy[*weth9.WETH9] { - weth9Addr, tx, weth9c, err2 := weth9.DeployWETH9( + weth9Addr, tx2, weth9c, err2 := weth9.DeployWETH9( chain.DeployerKey, chain.Client, ) return ContractDeploy[*weth9.WETH9]{ - weth9Addr, weth9c, tx, deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0), err2, + weth9Addr, weth9c, tx2, deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0), err2, } }) if err != nil { @@ -366,7 +369,7 @@ func DeployFeeTokens(lggr logger.Logger, chain deployment.Chain, ab deployment.A linkToken, err := deployContract(lggr, chain, ab, func(chain deployment.Chain) ContractDeploy[*burn_mint_erc677.BurnMintERC677] { - linkTokenAddr, tx, linkToken, err2 := burn_mint_erc677.DeployBurnMintERC677( + linkTokenAddr, tx2, linkToken, err2 := burn_mint_erc677.DeployBurnMintERC677( chain.DeployerKey, chain.Client, "Link Token", @@ -375,7 +378,7 @@ func DeployFeeTokens(lggr logger.Logger, chain deployment.Chain, ab deployment.A big.NewInt(0).Mul(big.NewInt(1e9), big.NewInt(1e18)), ) return ContractDeploy[*burn_mint_erc677.BurnMintERC677]{ - linkTokenAddr, linkToken, tx, deployment.NewTypeAndVersion(LinkToken, deployment.Version1_0_0), err2, + linkTokenAddr, linkToken, tx2, deployment.NewTypeAndVersion(LinkToken, deployment.Version1_0_0), err2, } }) if err != nil { @@ -422,7 +425,7 @@ func DeployChainContracts( } e.Logger.Infow("deployed receiver", "addr", ccipReceiver.Address) - // TODO: Still waiting for RMNHome contracts etc. + // TODO: Correctly configure RMN remote. rmnRemote, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*rmn_remote.RMNRemote] { rmnRemoteAddr, tx, rmnRemote, err2 := rmn_remote.DeployRMNRemote( @@ -440,15 +443,26 @@ func DeployChainContracts( } e.Logger.Infow("deployed RMNRemote", "addr", rmnRemote.Address) + // TODO: Correctly configure RMN remote with config digest from RMN home. + tx, err := rmnRemote.Contract.SetConfig(chain.DeployerKey, rmn_remote.RMNRemoteConfig{ + RmnHomeContractConfigDigest: [32]byte{1}, + Signers: []rmn_remote.RMNRemoteSigner{}, + MinSigners: 0, // TODO: update when we have signers + }) + if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil { + e.Logger.Errorw("Failed to confirm RMNRemote config", "err", err) + return err + } + rmnProxy, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*rmn_proxy_contract.RMNProxyContract] { - rmnProxyAddr, tx, rmnProxy, err2 := rmn_proxy_contract.DeployRMNProxyContract( + rmnProxyAddr, tx2, rmnProxy, err2 := rmn_proxy_contract.DeployRMNProxyContract( chain.DeployerKey, chain.Client, rmnRemote.Address, ) return ContractDeploy[*rmn_proxy_contract.RMNProxyContract]{ - rmnProxyAddr, rmnProxy, tx, deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0), err2, + rmnProxyAddr, rmnProxy, tx2, deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0), err2, } }) if err != nil { @@ -459,14 +473,14 @@ func DeployChainContracts( routerContract, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*router.Router] { - routerAddr, tx, routerC, err2 := router.DeployRouter( + routerAddr, tx2, routerC, err2 := router.DeployRouter( chain.DeployerKey, chain.Client, contractConfig.Weth9.Address(), rmnProxy.Address, ) return ContractDeploy[*router.Router]{ - routerAddr, routerC, tx, deployment.NewTypeAndVersion(Router, deployment.Version1_2_0), err2, + routerAddr, routerC, tx2, deployment.NewTypeAndVersion(Router, deployment.Version1_2_0), err2, } }) if err != nil { @@ -477,14 +491,14 @@ func DeployChainContracts( testRouterContract, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*router.Router] { - routerAddr, tx, routerC, err2 := router.DeployRouter( + routerAddr, tx2, routerC, err2 := router.DeployRouter( chain.DeployerKey, chain.Client, contractConfig.Weth9.Address(), rmnProxy.Address, ) return ContractDeploy[*router.Router]{ - routerAddr, routerC, tx, deployment.NewTypeAndVersion(TestRouter, deployment.Version1_2_0), err2, + routerAddr, routerC, tx2, deployment.NewTypeAndVersion(TestRouter, deployment.Version1_2_0), err2, } }) if err != nil { @@ -495,11 +509,11 @@ func DeployChainContracts( tokenAdminRegistry, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*token_admin_registry.TokenAdminRegistry] { - tokenAdminRegistryAddr, tx, tokenAdminRegistry, err2 := token_admin_registry.DeployTokenAdminRegistry( + tokenAdminRegistryAddr, tx2, tokenAdminRegistry, err2 := token_admin_registry.DeployTokenAdminRegistry( chain.DeployerKey, chain.Client) return ContractDeploy[*token_admin_registry.TokenAdminRegistry]{ - tokenAdminRegistryAddr, tokenAdminRegistry, tx, deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0), err2, + tokenAdminRegistryAddr, tokenAdminRegistry, tx2, deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0), err2, } }) if err != nil { @@ -510,13 +524,13 @@ func DeployChainContracts( nonceManager, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*nonce_manager.NonceManager] { - nonceManagerAddr, tx, nonceManager, err2 := nonce_manager.DeployNonceManager( + nonceManagerAddr, tx2, nonceManager, err2 := nonce_manager.DeployNonceManager( chain.DeployerKey, chain.Client, []common.Address{}, // Need to add onRamp after ) return ContractDeploy[*nonce_manager.NonceManager]{ - nonceManagerAddr, nonceManager, tx, deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0_dev), err2, + nonceManagerAddr, nonceManager, tx2, deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0_dev), err2, } }) if err != nil { @@ -527,7 +541,7 @@ func DeployChainContracts( feeQuoter, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*fee_quoter.FeeQuoter] { - prAddr, tx, pr, err2 := fee_quoter.DeployFeeQuoter( + prAddr, tx2, pr, err2 := fee_quoter.DeployFeeQuoter( chain.DeployerKey, chain.Client, fee_quoter.FeeQuoterStaticConfig{ @@ -552,7 +566,7 @@ func DeployChainContracts( []fee_quoter.FeeQuoterDestChainConfigArgs{}, ) return ContractDeploy[*fee_quoter.FeeQuoter]{ - prAddr, pr, tx, deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0_dev), err2, + prAddr, pr, tx2, deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0_dev), err2, } }) if err != nil { @@ -563,7 +577,7 @@ func DeployChainContracts( onRamp, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*onramp.OnRamp] { - onRampAddr, tx, onRamp, err2 := onramp.DeployOnRamp( + onRampAddr, tx2, onRamp, err2 := onramp.DeployOnRamp( chain.DeployerKey, chain.Client, onramp.OnRampStaticConfig{ @@ -579,7 +593,7 @@ func DeployChainContracts( []onramp.OnRampDestChainConfigArgs{}, ) return ContractDeploy[*onramp.OnRamp]{ - onRampAddr, onRamp, tx, deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0_dev), err2, + onRampAddr, onRamp, tx2, deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0_dev), err2, } }) if err != nil { @@ -590,7 +604,7 @@ func DeployChainContracts( offRamp, err := deployContract(e.Logger, chain, ab, func(chain deployment.Chain) ContractDeploy[*offramp.OffRamp] { - offRampAddr, tx, offRamp, err2 := offramp.DeployOffRamp( + offRampAddr, tx2, offRamp, err2 := offramp.DeployOffRamp( chain.DeployerKey, chain.Client, offramp.OffRampStaticConfig{ @@ -602,13 +616,11 @@ func DeployChainContracts( offramp.OffRampDynamicConfig{ FeeQuoter: feeQuoter.Address, PermissionLessExecutionThresholdSeconds: uint32(86400), - MaxTokenTransferGas: uint32(200_000), - MaxPoolReleaseOrMintGas: uint32(200_000), }, []offramp.OffRampSourceChainConfigArgs{}, ) return ContractDeploy[*offramp.OffRamp]{ - offRampAddr, offRamp, tx, deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0_dev), err2, + offRampAddr, offRamp, tx2, deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0_dev), err2, } }) if err != nil { @@ -618,7 +630,7 @@ func DeployChainContracts( e.Logger.Infow("Deployed offramp", "addr", offRamp.Address) // Basic wiring is always needed. - tx, err := feeQuoter.Contract.ApplyAuthorizedCallerUpdates(chain.DeployerKey, fee_quoter.AuthorizedCallersAuthorizedCallerArgs{ + tx, err = feeQuoter.Contract.ApplyAuthorizedCallerUpdates(chain.DeployerKey, fee_quoter.AuthorizedCallersAuthorizedCallerArgs{ // TODO: We enable the deployer initially to set prices // Should be removed after. AddedCallers: []common.Address{offRamp.Contract.Address(), chain.DeployerKey.From}, diff --git a/integration-tests/deployment/ccip/deploy_home_chain.go b/integration-tests/deployment/ccip/deploy_home_chain.go index d5a17f4f878..4e34d01b9c8 100644 --- a/integration-tests/deployment/ccip/deploy_home_chain.go +++ b/integration-tests/deployment/ccip/deploy_home_chain.go @@ -3,18 +3,23 @@ package ccipdeployment import ( "bytes" "context" + "crypto/rand" + "encoding/hex" "fmt" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" "github.com/smartcontractkit/chainlink-ccip/chainconfig" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3" confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" @@ -25,9 +30,9 @@ import ( cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ocr3_config_encoder" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" ) @@ -87,31 +92,86 @@ func DeployCapReg(lggr logger.Logger, ab deployment.AddressBook, chain deploymen } lggr.Infow("deployed capreg", "addr", capReg.Address) - ccipConfig, err := deployContract( + ccipHome, err := deployContract( lggr, chain, ab, - func(chain deployment.Chain) ContractDeploy[*ccip_config.CCIPConfig] { - ccAddr, tx, cc, err2 := ccip_config.DeployCCIPConfig( + func(chain deployment.Chain) ContractDeploy[*ccip_home.CCIPHome] { + ccAddr, tx, cc, err2 := ccip_home.DeployCCIPHome( chain.DeployerKey, chain.Client, capReg.Address, ) - return ContractDeploy[*ccip_config.CCIPConfig]{ - Address: ccAddr, Tv: deployment.NewTypeAndVersion(CCIPConfig, deployment.Version1_6_0_dev), Tx: tx, Err: err2, Contract: cc, + return ContractDeploy[*ccip_home.CCIPHome]{ + Address: ccAddr, Tv: deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0_dev), Tx: tx, Err: err2, Contract: cc, } }) if err != nil { - lggr.Errorw("Failed to deploy ccip config", "err", err) + lggr.Errorw("Failed to deploy CCIPHome", "err", err) return nil, err } - lggr.Infow("deployed ccip config", "addr", ccipConfig.Address) + lggr.Infow("deployed CCIPHome", "addr", ccipHome.Address) - tx, err := capReg.Contract.AddCapabilities(chain.DeployerKey, []capabilities_registry.CapabilitiesRegistryCapability{ + rmnHome, err := deployContract( + lggr, chain, ab, + func(chain deployment.Chain) ContractDeploy[*rmn_home.RMNHome] { + rmnAddr, tx, rmn, err2 := rmn_home.DeployRMNHome( + chain.DeployerKey, + chain.Client, + ) + return ContractDeploy[*rmn_home.RMNHome]{ + Address: rmnAddr, Tv: deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0_dev), Tx: tx, Err: err2, Contract: rmn, + } + }, + ) + if err != nil { + lggr.Errorw("Failed to deploy RMNHome", "err", err) + return nil, err + } + lggr.Infow("deployed RMNHome", "addr", rmnHome.Address) + + // TODO: properly configure RMNHome + tx, err := rmnHome.Contract.SetCandidate(chain.DeployerKey, rmn_home.RMNHomeStaticConfig{ + Nodes: []rmn_home.RMNHomeNode{}, + OffchainConfig: []byte("static config"), + }, rmn_home.RMNHomeDynamicConfig{ + SourceChains: []rmn_home.RMNHomeSourceChain{}, + OffchainConfig: []byte("dynamic config"), + }, [32]byte{}) + if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil { + lggr.Errorw("Failed to set candidate on RMNHome", "err", err) + return nil, err + } + + rmnCandidateDigest, err := rmnHome.Contract.GetCandidateDigest(nil) + if err != nil { + lggr.Errorw("Failed to get RMNHome candidate digest", "err", err) + return nil, err + } + + tx, err = rmnHome.Contract.PromoteCandidateAndRevokeActive(chain.DeployerKey, rmnCandidateDigest, [32]byte{}) + if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil { + lggr.Errorw("Failed to promote candidate and revoke active on RMNHome", "err", err) + return nil, err + } + + rmnActiveDigest, err := rmnHome.Contract.GetActiveDigest(nil) + if err != nil { + lggr.Errorw("Failed to get RMNHome active digest", "err", err) + return nil, err + } + + if rmnActiveDigest != rmnCandidateDigest { + lggr.Errorw("RMNHome active digest does not match previously candidate digest", + "active", rmnActiveDigest, "candidate", rmnCandidateDigest) + return nil, errors.New("RMNHome active digest does not match candidate digest") + } + + tx, err = capReg.Contract.AddCapabilities(chain.DeployerKey, []capabilities_registry.CapabilitiesRegistryCapability{ { LabelledName: CapabilityLabelledName, Version: CapabilityVersion, CapabilityType: 2, // consensus. not used (?) ResponseType: 0, // report. not used (?) - ConfigurationContract: ccipConfig.Address, + ConfigurationContract: ccipHome.Address, }, }) if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil { @@ -161,10 +221,10 @@ func AddNodes( return err } -func SetupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg []byte) ccip_config.CCIPConfigTypesChainConfigInfo { - return ccip_config.CCIPConfigTypesChainConfigInfo{ +func SetupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg []byte) ccip_home.CCIPHomeChainConfigArgs { + return ccip_home.CCIPHomeChainConfigArgs{ ChainSelector: chainSelector, - ChainConfig: ccip_config.CCIPConfigTypesChainConfig{ + ChainConfig: ccip_home.CCIPHomeChainConfig{ Readers: readers, FChain: fChain, Config: cfg, @@ -175,10 +235,10 @@ func SetupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg func AddChainConfig( lggr logger.Logger, h deployment.Chain, - ccipConfig *ccip_config.CCIPConfig, + ccipConfig *ccip_home.CCIPHome, chainSelector uint64, p2pIDs [][32]byte, -) (ccip_config.CCIPConfigTypesChainConfigInfo, error) { +) (ccip_home.CCIPHomeChainConfigArgs, error) { // First Add ChainConfig that includes all p2pIDs as readers encodedExtraChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{ GasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(1000), @@ -186,14 +246,14 @@ func AddChainConfig( OptimisticConfirmations: 1, }) if err != nil { - return ccip_config.CCIPConfigTypesChainConfigInfo{}, err + return ccip_home.CCIPHomeChainConfigArgs{}, err } chainConfig := SetupConfigInfo(chainSelector, p2pIDs, uint8(len(p2pIDs)/3), encodedExtraChainConfig) - tx, err := ccipConfig.ApplyChainConfigUpdates(h.DeployerKey, nil, []ccip_config.CCIPConfigTypesChainConfigInfo{ + tx, err := ccipConfig.ApplyChainConfigUpdates(h.DeployerKey, nil, []ccip_home.CCIPHomeChainConfigArgs{ chainConfig, }) if _, err := deployment.ConfirmIfNoError(h, tx, err); err != nil { - return ccip_config.CCIPConfigTypesChainConfigInfo{}, err + return ccip_home.CCIPHomeChainConfigArgs{}, err } lggr.Infow("Applied chain config updates", "chainConfig", chainConfig) return chainConfig, nil @@ -207,7 +267,7 @@ func BuildAddDONArgs( // Token address on Dest chain to aggregate address on feed chain tokenInfo map[ocrtypes.Account]pluginconfig.TokenInfo, nodes deployment.Nodes, -) ([]byte, error) { +) (map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config, error) { p2pIDs := nodes.PeerIDs() // Get OCR3 Config from helper var schedule []int @@ -225,22 +285,21 @@ func BuildAddDONArgs( }) } - tabi, err := ocr3_config_encoder.IOCR3ConfigEncoderMetaData.GetAbi() - if err != nil { - return nil, err - } - // Add DON on capability registry contract - var ocr3Configs []ocr3_config_encoder.CCIPConfigTypesOCR3Config + ocr3Configs := make(map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config) for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { var encodedOffchainConfig []byte var err2 error if pluginType == cctypes.PluginTypeCCIPCommit { encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(pluginconfig.CommitOffchainConfig{ - RemoteGasPriceBatchWriteFrequency: *commonconfig.MustNewDuration(RemoteGasPriceBatchWriteFrequency), - TokenPriceBatchWriteFrequency: *commonconfig.MustNewDuration(TokenPriceBatchWriteFrequency), - PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel), - TokenInfo: tokenInfo, + RemoteGasPriceBatchWriteFrequency: *commonconfig.MustNewDuration(RemoteGasPriceBatchWriteFrequency), + TokenPriceBatchWriteFrequency: *commonconfig.MustNewDuration(TokenPriceBatchWriteFrequency), + PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel), + TokenInfo: tokenInfo, + NewMsgScanBatchSize: merklemulti.MaxNumberTreeLeaves, + MaxReportTransmissionCheckAttempts: 5, + MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves, + SignObservationPrefix: "chainlink ccip 1.6 rmn observation", }) } else { encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(pluginconfig.ExecuteOffchainConfig{ @@ -292,28 +351,43 @@ func BuildAddDONArgs( transmittersBytes[i] = parsed } - ocr3Configs = append(ocr3Configs, ocr3_config_encoder.CCIPConfigTypesOCR3Config{ + var ocrNodes []ccip_home.CCIPHomeOCR3Node + for i := range nodes { + ocrNodes = append(ocrNodes, ccip_home.CCIPHomeOCR3Node{ + P2pId: p2pIDs[i], + SignerKey: signersBytes[i], + TransmitterKey: transmittersBytes[i], + }) + } + + _, ok := ocr3Configs[pluginType] + if ok { + return nil, fmt.Errorf("pluginType %s already exists in ocr3Configs", pluginType.String()) + } + + ocr3Configs[pluginType] = ccip_home.CCIPHomeOCR3Config{ PluginType: uint8(pluginType), ChainSelector: dest.Selector, - F: configF, + FRoleDON: configF, OffchainConfigVersion: offchainConfigVersion, OfframpAddress: offRamp.Address().Bytes(), - P2pIds: p2pIDs, - Signers: signersBytes, - Transmitters: transmittersBytes, + Nodes: ocrNodes, OffchainConfig: offchainConfig, - }) + // TODO: Deploy RMNHome and set address here + RmnHomeAddress: common.BytesToAddress(randomBytes(20)).Bytes(), + } } - // TODO: Can just use utils.ABIEncode directly here. - encodedCall, err := tabi.Pack("exposeOCR3Config", ocr3Configs) + return ocr3Configs, nil +} + +func randomBytes(n int) []byte { + b := make([]byte, n) + _, err := rand.Read(b) if err != nil { - return nil, err + panic(err) } - - // Trim first four bytes to remove function selector. - encodedConfigs := encodedCall[4:] - return encodedConfigs, nil + return b } func LatestCCIPDON(registry *capabilities_registry.CapabilitiesRegistry) (*capabilities_registry.CapabilitiesRegistryDONInfo, error) { @@ -334,33 +408,38 @@ func LatestCCIPDON(registry *capabilities_registry.CapabilitiesRegistry) (*capab func BuildSetOCR3ConfigArgs( donID uint32, - ccipConfig *ccip_config.CCIPConfig, + ccipHome *ccip_home.CCIPHome, + destSelector uint64, ) ([]offramp.MultiOCR3BaseOCRConfigArgs, error) { var offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - ocrConfig, err2 := ccipConfig.GetOCRConfig(&bind.CallOpts{ + ocrConfig, err2 := ccipHome.GetAllConfigs(&bind.CallOpts{ Context: context.Background(), }, donID, uint8(pluginType)) if err2 != nil { return nil, err2 } - if len(ocrConfig) != 1 { - return nil, errors.New("expected exactly one OCR3 config") - } - var signerAddresses []common.Address - for _, signer := range ocrConfig[0].Config.Signers { - signerAddresses = append(signerAddresses, common.BytesToAddress(signer)) + + fmt.Printf("pluginType: %s, destSelector: %d, donID: %d, activeConfig digest: %x, candidateConfig digest: %x\n", + pluginType.String(), destSelector, donID, ocrConfig.ActiveConfig.ConfigDigest, ocrConfig.CandidateConfig.ConfigDigest) + + // we expect only an active config and no candidate config. + if ocrConfig.ActiveConfig.ConfigDigest == [32]byte{} || ocrConfig.CandidateConfig.ConfigDigest != [32]byte{} { + return nil, fmt.Errorf("invalid OCR3 config state, expected active config and no candidate config, donID: %d", donID) } + activeConfig := ocrConfig.ActiveConfig + var signerAddresses []common.Address var transmitterAddresses []common.Address - for _, transmitter := range ocrConfig[0].Config.Transmitters { - transmitterAddresses = append(transmitterAddresses, common.BytesToAddress(transmitter)) + for _, node := range activeConfig.Config.Nodes { + signerAddresses = append(signerAddresses, common.BytesToAddress(node.SignerKey)) + transmitterAddresses = append(transmitterAddresses, common.BytesToAddress(node.TransmitterKey)) } offrampOCR3Configs = append(offrampOCR3Configs, offramp.MultiOCR3BaseOCRConfigArgs{ - ConfigDigest: ocrConfig[0].ConfigDigest, + ConfigDigest: activeConfig.ConfigDigest, OcrPluginType: uint8(pluginType), - F: ocrConfig[0].Config.F, + F: activeConfig.Config.FRoleDON, IsSignatureVerificationEnabled: pluginType == cctypes.PluginTypeCCIPCommit, Signers: signerAddresses, Transmitters: transmitterAddresses, @@ -369,10 +448,319 @@ func BuildSetOCR3ConfigArgs( return offrampOCR3Configs, nil } +// CreateDON creates one DON with 2 plugins (commit and exec) +// It first set a new candidate for the DON with the first plugin type and AddDON on capReg +// Then for subsequent operations it uses UpdateDON to promote the first plugin to the active deployment +// and to set candidate and promote it for the second plugin +func CreateDON( + lggr logger.Logger, + capReg *capabilities_registry.CapabilitiesRegistry, + ccipHome *ccip_home.CCIPHome, + ocr3Configs map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config, + home deployment.Chain, + nodes deployment.Nodes, +) ([]mcms.Operation, error) { + commitConfig, ok := ocr3Configs[cctypes.PluginTypeCCIPCommit] + if !ok { + return nil, fmt.Errorf("missing commit plugin in ocr3Configs") + } + + execConfig, ok := ocr3Configs[cctypes.PluginTypeCCIPExec] + if !ok { + return nil, fmt.Errorf("missing exec plugin in ocr3Configs") + } + + tabi, err := ccip_home.CCIPHomeMetaData.GetAbi() + if err != nil { + return nil, err + } + latestDon, err := LatestCCIPDON(capReg) + if err != nil { + return nil, err + } + + donID := latestDon.Id + 1 + mcmsOps := []mcms.Operation{} + + err = setupCommitDON(tabi, donID, commitConfig, capReg, home, nodes, ccipHome) + if err != nil { + return nil, fmt.Errorf("setup commit don: %w", err) + } + + // TODO: bug in contract causing this to not work as expected. + err = setupExecDON(tabi, donID, execConfig, capReg, home, nodes, ccipHome) + if err != nil { + return nil, fmt.Errorf("setup exec don: %w", err) + } + + // final sanity checks on configs. + commitConfigs, err := ccipHome.GetAllConfigs(&bind.CallOpts{ + Pending: true, + }, donID, uint8(cctypes.PluginTypeCCIPCommit)) + if err != nil { + return nil, fmt.Errorf("get all commit configs: %w", err) + } + commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) + if err != nil { + return nil, fmt.Errorf("get active commit digest: %w", err) + } + commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) + if err != nil { + return nil, fmt.Errorf("get commit candidate digest: %w", err) + } + if commitConfigs.ActiveConfig.ConfigDigest == [32]byte{} { + return nil, fmt.Errorf( + "active config digest is empty for commit, expected nonempty, donID: %d, cfg: %+v, config digest from GetActiveDigest call: %x, config digest from GetCandidateDigest call: %x", + donID, commitConfigs.ActiveConfig, commitActiveDigest, commitCandidateDigest) + } + if commitConfigs.CandidateConfig.ConfigDigest != [32]byte{} { + return nil, fmt.Errorf( + "candidate config digest is nonempty for commit, expected empty, donID: %d, cfg: %+v, config digest from GetCandidateDigest call: %x, config digest from GetActiveDigest call: %x", + donID, commitConfigs.CandidateConfig, commitCandidateDigest, commitActiveDigest) + } + + execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) + if err != nil { + return nil, fmt.Errorf("get all exec configs: %w", err) + } + if execConfigs.ActiveConfig.ConfigDigest == [32]byte{} { + return nil, fmt.Errorf("active config digest is empty for exec, expected nonempty, cfg: %v", execConfigs.ActiveConfig) + } + if execConfigs.CandidateConfig.ConfigDigest != [32]byte{} { + return nil, fmt.Errorf("candidate config digest is nonempty for exec, expected empty, cfg: %v", execConfigs.CandidateConfig) + } + + return mcmsOps, nil +} + +func setupExecDON( + tabi *abi.ABI, + donID uint32, + execConfig ccip_home.CCIPHomeOCR3Config, + capReg *capabilities_registry.CapabilitiesRegistry, + home deployment.Chain, + nodes deployment.Nodes, + ccipHome *ccip_home.CCIPHome, +) error { + encodedSetCandidateCall, err := tabi.Pack( + "setCandidate", + donID, + execConfig.PluginType, + execConfig, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack set candidate call: %w", err) + } + + // set candidate call + tx, err := capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedSetCandidateCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ exec config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm update don w/ exec config: %w", err) + } + + execCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) + if err != nil { + return fmt.Errorf("get commit candidate digest: %w", err) + } + + if execCandidateDigest == [32]byte{} { + return fmt.Errorf("candidate digest is empty, expected nonempty") + } + + // promote candidate call + encodedPromotionCall, err := tabi.Pack( + "promoteCandidateAndRevokeActive", + donID, + execConfig.PluginType, + execCandidateDigest, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack promotion call: %w", err) + } + + tx, err = capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedPromotionCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ exec config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm update don w/ exec config: %w", err) + } + + // check that candidate digest is empty. + execCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) + if err != nil { + return fmt.Errorf("get exec candidate digest 2nd time: %w", err) + } + + if execCandidateDigest != [32]byte{} { + return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") + } + + // check that active digest is non-empty. + execActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) + if err != nil { + return fmt.Errorf("get active exec digest: %w", err) + } + + if execActiveDigest == [32]byte{} { + return fmt.Errorf("active exec digest is empty, expected nonempty") + } + + execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) + if err != nil { + return fmt.Errorf("get all exec configs 2nd time: %w", err) + } + + // print the above info + fmt.Printf("completed exec DON creation and promotion: donID: %d execCandidateDigest: %x, execActiveDigest: %x, execCandidateDigestFromGetAllConfigs: %x, execActiveDigestFromGetAllConfigs: %x\n", + donID, execCandidateDigest, execActiveDigest, execConfigs.CandidateConfig.ConfigDigest, execConfigs.ActiveConfig.ConfigDigest) + + return nil +} + +func setupCommitDON( + tabi *abi.ABI, + donID uint32, + commitConfig ccip_home.CCIPHomeOCR3Config, + capReg *capabilities_registry.CapabilitiesRegistry, + home deployment.Chain, + nodes deployment.Nodes, + ccipHome *ccip_home.CCIPHome, +) error { + encodedSetCandidateCall, err := tabi.Pack( + "setCandidate", + donID, + commitConfig.PluginType, + commitConfig, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack set candidate call: %w", err) + } + + tx, err := capReg.AddDON(home.DeployerKey, nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedSetCandidateCall, + }, + }, false, false, nodes.DefaultF()) + if err != nil { + return fmt.Errorf("add don w/ commit config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm add don w/ commit config: %w", err) + } + + commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) + if err != nil { + return fmt.Errorf("get commit candidate digest: %w", err) + } + + if commitCandidateDigest == [32]byte{} { + return fmt.Errorf("candidate digest is empty, expected nonempty") + } + fmt.Printf("commit candidate digest after setCandidate: %x\n", commitCandidateDigest) + + encodedPromotionCall, err := tabi.Pack( + "promoteCandidateAndRevokeActive", + donID, + commitConfig.PluginType, + commitCandidateDigest, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack promotion call: %w", err) + } + + tx, err = capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedPromotionCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ commit config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm update don w/ commit config: %w", err) + } + + // check that candidate digest is empty. + commitCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) + if err != nil { + return fmt.Errorf("get commit candidate digest 2nd time: %w", err) + } + + if commitCandidateDigest != [32]byte{} { + return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") + } + + // check that active digest is non-empty. + commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) + if err != nil { + return fmt.Errorf("get active commit digest: %w", err) + } + + if commitActiveDigest == [32]byte{} { + return fmt.Errorf("active commit digest is empty, expected nonempty") + } + + commitConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) + if err != nil { + return fmt.Errorf("get all commit configs 2nd time: %w", err) + } + + // print the above information + fmt.Printf("completed commit DON creation and promotion: donID: %d, commitCandidateDigest: %x, commitActiveDigest: %x, commitCandidateDigestFromGetAllConfigs: %x, commitActiveDigestFromGetAllConfigs: %x\n", + donID, commitCandidateDigest, commitActiveDigest, commitConfigs.CandidateConfig.ConfigDigest, commitConfigs.ActiveConfig.ConfigDigest) + + return nil +} + func AddDON( lggr logger.Logger, capReg *capabilities_registry.CapabilitiesRegistry, - ccipConfig *ccip_config.CCIPConfig, + ccipHome *ccip_home.CCIPHome, offRamp *offramp.OffRamp, feedChainSel uint64, // Token address on Dest chain to aggregate address on feed chain @@ -381,29 +769,32 @@ func AddDON( home deployment.Chain, nodes deployment.Nodes, ) error { - encodedConfigs, err := BuildAddDONArgs(lggr, offRamp, dest, feedChainSel, tokenInfo, nodes) + ocrConfigs, err := BuildAddDONArgs(lggr, offRamp, dest, feedChainSel, tokenInfo, nodes) if err != nil { return err } - tx, err := capReg.AddDON(home.DeployerKey, nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: encodedConfigs, - }, - }, false, false, nodes.DefaultF()) - if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + _, err = CreateDON(lggr, capReg, ccipHome, ocrConfigs, home, nodes) + if err != nil { return err } don, err := LatestCCIPDON(capReg) if err != nil { return err } - offrampOCR3Configs, err := BuildSetOCR3ConfigArgs(don.Id, ccipConfig) + lggr.Infow("Added DON", "donID", don.Id) + + offrampOCR3Configs, err := BuildSetOCR3ConfigArgs(don.Id, ccipHome, dest.Selector) if err != nil { return err } - - tx, err = offRamp.SetOCR3Configs(dest.DeployerKey, offrampOCR3Configs) + lggr.Infow("Setting OCR3 Configs", + "offrampOCR3Configs", offrampOCR3Configs, + "configDigestCommit", hex.EncodeToString(offrampOCR3Configs[cctypes.PluginTypeCCIPCommit].ConfigDigest[:]), + "configDigestExec", hex.EncodeToString(offrampOCR3Configs[cctypes.PluginTypeCCIPExec].ConfigDigest[:]), + "chainSelector", dest.Selector, + ) + + tx, err := offRamp.SetOCR3Configs(dest.DeployerKey, offrampOCR3Configs) if _, err := deployment.ConfirmIfNoError(dest, tx, err); err != nil { return err } diff --git a/integration-tests/deployment/ccip/deploy_test.go b/integration-tests/deployment/ccip/deploy_test.go index f467cfe82b6..6305ac8e069 100644 --- a/integration-tests/deployment/ccip/deploy_test.go +++ b/integration-tests/deployment/ccip/deploy_test.go @@ -30,7 +30,7 @@ func TestDeployCCIPContracts(t *testing.T) { s, err := LoadOnchainState(e, ab) require.NoError(t, err) require.NotNil(t, s.Chains[homeChainSel].CapabilityRegistry) - require.NotNil(t, s.Chains[homeChainSel].CCIPConfig) + require.NotNil(t, s.Chains[homeChainSel].CCIPHome) require.NotNil(t, s.Chains[feedChainSel].USDFeeds) err = DeployCCIPContracts(e, ab, DeployCCIPContractConfig{ diff --git a/integration-tests/deployment/ccip/propose.go b/integration-tests/deployment/ccip/propose.go index 9738ac699fc..87931a4f8f3 100644 --- a/integration-tests/deployment/ccip/propose.go +++ b/integration-tests/deployment/ccip/propose.go @@ -176,7 +176,7 @@ func GenerateAcceptOwnershipProposal( if err != nil { return nil, err } - acceptCCIPConfig, err := state.Chains[homeChain].CCIPConfig.AcceptOwnership(deployment.SimTransactOpts()) + acceptCCIPConfig, err := state.Chains[homeChain].CCIPHome.AcceptOwnership(deployment.SimTransactOpts()) if err != nil { return nil, err } @@ -199,7 +199,7 @@ func GenerateAcceptOwnershipProposal( Value: big.NewInt(0), }, { - To: state.Chains[homeChain].CCIPConfig.Address(), + To: state.Chains[homeChain].CCIPHome.Address(), Data: acceptCCIPConfig.Data(), Value: big.NewInt(0), }, diff --git a/integration-tests/deployment/ccip/state.go b/integration-tests/deployment/ccip/state.go index 75ceb0a878b..4fc46c953b0 100644 --- a/integration-tests/deployment/ccip/state.go +++ b/integration-tests/deployment/ccip/state.go @@ -11,13 +11,14 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/deployment" "github.com/smartcontractkit/chainlink/integration-tests/deployment/ccip/view/v1_0" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" "github.com/smartcontractkit/chainlink/integration-tests/deployment/ccip/view" "github.com/smartcontractkit/chainlink/integration-tests/deployment/ccip/view/v1_2" "github.com/smartcontractkit/chainlink/integration-tests/deployment/ccip/view/v1_5" "github.com/smartcontractkit/chainlink/integration-tests/deployment/ccip/view/v1_6" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" @@ -62,7 +63,8 @@ type CCIPChainState struct { // Note we only expect one of these (on the home chain) CapabilityRegistry *capabilities_registry.CapabilitiesRegistry - CCIPConfig *ccip_config.CCIPConfig + CCIPHome *ccip_home.CCIPHome + RMNHome *rmn_home.RMNHome AdminMcm *owner_wrappers.ManyChainMultiSig BypasserMcm *owner_wrappers.ManyChainMultiSig CancellerMcm *owner_wrappers.ManyChainMultiSig @@ -300,6 +302,12 @@ func LoadChainState(chain deployment.Chain, addresses map[string]deployment.Type return state, err } state.RMNRemote = rmnRemote + case deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0_dev).String(): + rmnHome, err := rmn_home.NewRMNHome(common.HexToAddress(address), chain.Client) + if err != nil { + return state, err + } + state.RMNHome = rmnHome case deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0).String(): weth9, err := weth9.NewWETH9(common.HexToAddress(address), chain.Client) if err != nil { @@ -348,12 +356,12 @@ func LoadChainState(chain deployment.Chain, addresses map[string]deployment.Type return state, err } state.LinkToken = lt - case deployment.NewTypeAndVersion(CCIPConfig, deployment.Version1_6_0_dev).String(): - cc, err := ccip_config.NewCCIPConfig(common.HexToAddress(address), chain.Client) + case deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0_dev).String(): + ccipHome, err := ccip_home.NewCCIPHome(common.HexToAddress(address), chain.Client) if err != nil { return state, err } - state.CCIPConfig = cc + state.CCIPHome = ccipHome case deployment.NewTypeAndVersion(CCIPReceiver, deployment.Version1_0_0).String(): mr, err := maybe_revert_message_receiver.NewMaybeRevertMessageReceiver(common.HexToAddress(address), chain.Client) if err != nil { diff --git a/integration-tests/deployment/ccip/test_assertions.go b/integration-tests/deployment/ccip/test_assertions.go index 256d4bf8b62..62f59f79ebc 100644 --- a/integration-tests/deployment/ccip/test_assertions.go +++ b/integration-tests/deployment/ccip/test_assertions.go @@ -108,15 +108,15 @@ func ConfirmCommitWithExpectedSeqNumRange( return fmt.Errorf("timed out after waiting %s duration for commit report on chain selector %d from source selector %d expected seq nr range %s", duration.String(), dest.Selector, src.Selector, expectedSeqNumRange.String()) case report := <-sink: - if len(report.Report.MerkleRoots) > 0 { + if len(report.MerkleRoots) > 0 { // Check the interval of sequence numbers and make sure it matches // the expected range. - for _, mr := range report.Report.MerkleRoots { + for _, mr := range report.MerkleRoots { if mr.SourceChainSelector == src.Selector && uint64(expectedSeqNumRange.Start()) == mr.MinSeqNr && uint64(expectedSeqNumRange.End()) == mr.MaxSeqNr { t.Logf("Received commit report on selector %d from source selector %d expected seq nr range %s, token prices: %v", - dest.Selector, src.Selector, expectedSeqNumRange.String(), report.Report.PriceUpdates.TokenPriceUpdates) + dest.Selector, src.Selector, expectedSeqNumRange.String(), report.PriceUpdates.TokenPriceUpdates) return nil } } diff --git a/integration-tests/deployment/ccip/test_helpers.go b/integration-tests/deployment/ccip/test_helpers.go index 3b351c1b84f..d28471c42af 100644 --- a/integration-tests/deployment/ccip/test_helpers.go +++ b/integration-tests/deployment/ccip/test_helpers.go @@ -401,7 +401,7 @@ func GenerateTestRMNConfig(t *testing.T, nRMNNodes int, tenv DeployedEnv, rpcMap HomeChain: devenv.HomeChain{ Name: MustCCIPNameToRMNName(hc.Name), CapabilitiesRegistry: state.Chains[tenv.HomeChainSel].CapabilityRegistry.Address().String(), - CCIPConfig: state.Chains[tenv.HomeChainSel].CCIPConfig.Address().String(), + CCIPHome: state.Chains[tenv.HomeChainSel].CCIPHome.Address().String(), // TODO: RMNHome }, RemoteChains: remoteChains, diff --git a/integration-tests/deployment/devenv/rmn_config.go b/integration-tests/deployment/devenv/rmn_config.go index 798a988a5e8..3902ddbdcff 100644 --- a/integration-tests/deployment/devenv/rmn_config.go +++ b/integration-tests/deployment/devenv/rmn_config.go @@ -34,7 +34,7 @@ type Networking struct { type HomeChain struct { Name string `toml:"name"` CapabilitiesRegistry string `toml:"capabilities_registry"` - CCIPConfig string `toml:"ccip_config"` + CCIPHome string `toml:"ccip_home"` RMNHome string `toml:"rmn_home"` } diff --git a/integration-tests/go.mod b/integration-tests/go.mod index b6bfe36b9b5..b31e0c702a1 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -39,8 +39,8 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 github.com/smartcontractkit/chain-selectors v1.0.23 github.com/smartcontractkit/chainlink-automation v1.0.4 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb - github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 + github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.9 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 490a5903a64..b73dc525d2e 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1467,10 +1467,10 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb h1:bYT7j5syymCtAKv/gGG7CLp4APe/VDWkig9Ph7mc8fQ= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb/go.mod h1:WbtjuYMnDAYojL3CSWmruc1ecSBgSTggzXJ6F1U6bxw= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d h1:GpGKzVtDWSb8cesHSvm+LQpCJpFdfVPk3us5wAY6ixI= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 h1:L8NQPvVl6+vgOvkMCzGqAMn+Ur6c3cg8wVUzOGKt//k= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04/go.mod h1:GnHCwV1ApQaL06YNWFXy2nvN/tpcloqbAZOLZnWTx+I= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 h1:7fSu2ouxcOUrpuyMqia4tUA20LAuFU0IwVDGz+4aTnw= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7/go.mod h1:BMYE1vC/pGmdFSsOJdPrAA0/4gZ0Xo0SxTMdGspBtRo= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 h1:yRk4ektpx/UxwarqAfgxUXLrsYXlaNeP1NOwzHGrK2Q= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 7badf1b15a3..1745b26d2b0 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -15,7 +15,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.12.2 - github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d + github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.9 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.1 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.0 @@ -30,8 +30,12 @@ require ( require github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect require ( + github.com/AlekSi/pointer v1.1.0 // indirect github.com/andybalholm/brotli v1.1.0 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect + github.com/smartcontractkit/chainlink-automation v1.0.4 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 // indirect + github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 // indirect ) require ( @@ -45,7 +49,6 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/AlekSi/pointer v1.1.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -390,8 +393,6 @@ require ( github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/chain-selectors v1.0.23 // indirect - github.com/smartcontractkit/chainlink-automation v1.0.4 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb // indirect github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 // indirect github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 // indirect github.com/smartcontractkit/chainlink-feeds v0.0.0-20240910155501-42f20443189f // indirect @@ -400,7 +401,6 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 // indirect github.com/smartcontractkit/wsrpc v0.8.2 // indirect github.com/soheilhy/cmux v0.1.5 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 882950e5e9d..326ca1b8136 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1413,10 +1413,10 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb h1:bYT7j5syymCtAKv/gGG7CLp4APe/VDWkig9Ph7mc8fQ= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb/go.mod h1:WbtjuYMnDAYojL3CSWmruc1ecSBgSTggzXJ6F1U6bxw= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d h1:GpGKzVtDWSb8cesHSvm+LQpCJpFdfVPk3us5wAY6ixI= -github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04 h1:L8NQPvVl6+vgOvkMCzGqAMn+Ur6c3cg8wVUzOGKt//k= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009131440-a2f97042cc04/go.mod h1:GnHCwV1ApQaL06YNWFXy2nvN/tpcloqbAZOLZnWTx+I= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613 h1:7fSu2ouxcOUrpuyMqia4tUA20LAuFU0IwVDGz+4aTnw= +github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008175210-167715aa8613/go.mod h1:+yz2So1Lp90C3ATfMmqMEJaIr3zfG8e4xHa/3u1kIDk= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7/go.mod h1:BMYE1vC/pGmdFSsOJdPrAA0/4gZ0Xo0SxTMdGspBtRo= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 h1:yRk4ektpx/UxwarqAfgxUXLrsYXlaNeP1NOwzHGrK2Q= diff --git a/tools/ci/ccip_lcov_prune b/tools/ci/ccip_lcov_prune new file mode 100755 index 00000000000..9ec51e53536 --- /dev/null +++ b/tools/ci/ccip_lcov_prune @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -e + +# src/v0.8/ccip/libraries/Internal.sol +# src/v0.8/ccip/libraries/RateLimiter.sol +# src/v0.8/ccip/libraries/USDPriceWith18Decimals.sol +# src/v0.8/ccip/libraries/MerkleMultiProof.sol +# src/v0.8/ccip/libraries/Pool.sol +# excluded because Foundry doesn't support coverage on library files + +# BurnWithFromMintTokenPool is excluded because Forge doesn't seem to +# register coverage, even though it is 100% covered. + + +lcov --remove $1 -o $2 \ + '*/ccip/test/*' \ + '*/vendor/*' \ + '*/shared/*' \ + 'src/v0.8/ccip/ocr/OCR2Abstract.sol' \ + 'src/v0.8/ccip/libraries/Internal.sol' \ + 'src/v0.8/ccip/libraries/RateLimiter.sol' \ + 'src/v0.8/ccip/libraries/USDPriceWith18Decimals.sol' \ + 'src/v0.8/ccip/libraries/MerkleMultiProof.sol' \ + 'src/v0.8/ccip/libraries/Pool.sol' \ + 'src/v0.8/ConfirmedOwnerWithProposal.sol' \ + 'src/v0.8/tests/MockV3Aggregator.sol' \ + 'src/v0.8/ccip/applications/CCIPClientExample.sol' \ + 'src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol' \ + 'src/v0.8/ccip/rmn/RMNHome.sol' \ + --rc lcov_branch_coverage=1 \ No newline at end of file