From a2e52974e1de1a7eef92199a3c53df272e852f22 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Thu, 19 Sep 2024 09:37:06 +0200 Subject: [PATCH 1/8] Use paritytech polkadot-sdk with optional personal fork override (#1290) * test on Snowfork branch * fix checkout * remove check * use parity sdk by default * suggestions * config polkadot-sdk dir --- .envrc-example | 2 ++ scripts/init.sh | 19 ++++++++++++------- web/packages/test/scripts/build-binary.sh | 4 +++- web/packages/test/scripts/set-env.sh | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.envrc-example b/.envrc-example index 4c92382679..2b44b9e3af 100644 --- a/.envrc-example +++ b/.envrc-example @@ -3,3 +3,5 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then fi use flake + +export POLKADOT_SDK_REPO=https://github.com/paritytech/polkadot-sdk.git diff --git a/scripts/init.sh b/scripts/init.sh index 8a02ccf677..779c6f5525 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -2,15 +2,20 @@ set -eux -echo "Checkout polkadot-sdk Snowfork fork" +echo "Checkout polkadot-sdk" pushd .. - if [ ! -d "polkadot-sdk" ]; then - git clone https://github.com/Snowfork/polkadot-sdk.git - cd snowbridge && ln -sf ../polkadot-sdk polkadot-sdk + if [[ -d ../polkadot-sdk ]] && (cd ../polkadot-sdk && git rev-parse --is-inside-work-tree) 2>&1 >/dev/nu + ls; then + echo "polkadot-sdk already exists" + else + repoURL="${POLKADOT_SDK_REPO:-https://github.com/paritytech/polkadot-sdk.git}" + + git clone "$repoURL" polkadot-sdk + + pushd polkadot-sdk + git pull origin master + popd fi - pushd polkadot-sdk - git fetch && git checkout snowbridge - popd popd echo "Checkout lodestar Snowfork fork" diff --git a/web/packages/test/scripts/build-binary.sh b/web/packages/test/scripts/build-binary.sh index e3a4eb2fa0..4009b37163 100755 --- a/web/packages/test/scripts/build-binary.sh +++ b/web/packages/test/scripts/build-binary.sh @@ -4,7 +4,8 @@ set -eu source scripts/set-env.sh build_binaries() { - pushd $root_dir/polkadot-sdk + pushd $root_dir + pushd $polkadot_sdk_dir local features='' if [ "$eth_network" == "localhost" ]; then @@ -33,6 +34,7 @@ build_binaries() { cp target/release/polkadot-parachain $output_bin_dir/polkadot-parachain popd + popd } changes_detected=0 diff --git a/web/packages/test/scripts/set-env.sh b/web/packages/test/scripts/set-env.sh index a63621c5e4..1ab1d6c278 100755 --- a/web/packages/test/scripts/set-env.sh +++ b/web/packages/test/scripts/set-env.sh @@ -10,6 +10,7 @@ export output_bin_dir="$output_dir/bin" ethereum_data_dir="$output_dir/ethereum" zombienet_data_dir="$output_dir/zombienet" export PATH="$output_bin_dir:$PATH" +export polkadot_sdk_dir="${POLKADOT_SDK_DIR:-../polkadot-sdk}" eth_network="${ETH_NETWORK:-localhost}" eth_endpoint_http="${ETH_RPC_ENDPOINT:-http://127.0.0.1:8545}/${INFURA_PROJECT_ID:-}" From 581fb3af82cb350f5ba2ac4de295ce2778ba7236 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Thu, 19 Sep 2024 10:21:54 +0200 Subject: [PATCH 2/8] fix clone (#1293) --- scripts/init.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/init.sh b/scripts/init.sh index 779c6f5525..78df75494e 100755 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -4,8 +4,7 @@ set -eux echo "Checkout polkadot-sdk" pushd .. - if [[ -d ../polkadot-sdk ]] && (cd ../polkadot-sdk && git rev-parse --is-inside-work-tree) 2>&1 >/dev/nu - ls; then + if [[ -d polkadot-sdk ]] && (cd polkadot-sdk && git rev-parse --is-inside-work-tree > /dev/null 2>&1); then echo "polkadot-sdk already exists" else repoURL="${POLKADOT_SDK_REPO:-https://github.com/paritytech/polkadot-sdk.git}" From 325cdae8865c3f57e0259de59143f4ada9d803fa Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 20 Sep 2024 08:02:54 +0200 Subject: [PATCH 3/8] relayer improvements (#1285) --- relayer/relays/beacon/header/header.go | 6 ++++-- relayer/relays/beacon/header/syncer/syncer.go | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/relayer/relays/beacon/header/header.go b/relayer/relays/beacon/header/header.go index 031578122c..d65f75ebca 100644 --- a/relayer/relays/beacon/header/header.go +++ b/relayer/relays/beacon/header/header.go @@ -95,8 +95,10 @@ func (h *Header) Sync(ctx context.Context, eg *errgroup.Group) error { log.WithFields(logFields).WithError(err).Warn("SyncCommittee latency found") case errors.Is(err, ErrExecutionHeaderNotImported): log.WithFields(logFields).WithError(err).Warn("ExecutionHeader not imported") - case errors.Is(err, syncer.ErrBeaconStateAvailableYet): + case errors.Is(err, syncer.ErrBeaconStateUnavailable): log.WithFields(logFields).WithError(err).Warn("beacon state not available for finalized state yet") + case errors.Is(err, syncer.ErrSyncCommitteeNotSuperMajority): + log.WithFields(logFields).WithError(err).Warn("update received was not signed by supermajority") case err != nil: return err } @@ -348,7 +350,7 @@ func (h *Header) populateFinalizedCheckpoint(slot uint64) error { } blockRootsProof, err := h.syncer.GetBlockRoots(slot) - if err != nil && !errors.Is(err, syncer.ErrBeaconStateAvailableYet) { + if err != nil && !errors.Is(err, syncer.ErrBeaconStateUnavailable) { return fmt.Errorf("fetch block roots for slot %d: %w", slot, err) } diff --git a/relayer/relays/beacon/header/syncer/syncer.go b/relayer/relays/beacon/header/syncer/syncer.go index 7f23cb66e8..8016ed4ba1 100644 --- a/relayer/relays/beacon/header/syncer/syncer.go +++ b/relayer/relays/beacon/header/syncer/syncer.go @@ -32,7 +32,8 @@ const ( var ( ErrCommitteeUpdateHeaderInDifferentSyncPeriod = errors.New("sync committee in different sync period") - ErrBeaconStateAvailableYet = errors.New("beacon state object not available yet") + ErrBeaconStateUnavailable = errors.New("beacon state object not available yet") + ErrSyncCommitteeNotSuperMajority = errors.New("update received was not signed by supermajority") ) type Syncer struct { @@ -436,7 +437,7 @@ func (s *Syncer) GetFinalizedUpdate() (scale.Update, error) { return scale.Update{}, fmt.Errorf("compute sync committee supermajority: %d err: %w", signatureSlot, err) } if !superMajority { - return scale.Update{}, fmt.Errorf("sync committee at slot not supermajority: %d", signatureSlot) + return scale.Update{}, ErrSyncCommitteeNotSuperMajority } updatePayload := scale.UpdatePayload{ @@ -967,12 +968,13 @@ func (s *Syncer) getBestMatchBeaconDataFromStore(minSlot, maxSlot uint64) (final } func (s *Syncer) getBeaconState(slot uint64) ([]byte, error) { - data, err := s.Client.GetBeaconState(strconv.FormatUint(slot, 10)) - if err != nil { - log.WithError(err).Warn("unable to fetch beacon state from API, trying beacon store") - data, err = s.store.GetBeaconStateData(slot) - if err != nil { - return nil, fmt.Errorf("fetch beacon state from store: %w", err) + data, apiErr := s.Client.GetBeaconState(strconv.FormatUint(slot, 10)) + if apiErr != nil { + var storeErr error + data, storeErr = s.store.GetBeaconStateData(slot) + if storeErr != nil { + log.WithFields(log.Fields{"apiError": apiErr, "storeErr": storeErr}).Warn("fetch beacon state from api and store failed") + return nil, ErrBeaconStateUnavailable } } return data, nil From 17afdaf287294da654f64ca15bcf916652629e1c Mon Sep 17 00:00:00 2001 From: Ron Date: Fri, 20 Sep 2024 15:23:54 +0800 Subject: [PATCH 4/8] Initialize for westend (#1286) * Initialize for westend * Update beacon checkpoint * Move checkpoint to data folder --- contracts/scripts/westend/UpgradeShell.sol | 82 +++ control/Cargo.lock | 36 ++ control/Cargo.toml | 3 + control/README.md | 21 +- control/data/sepolia/initial-checkpoint.json | 542 ++++++++++++++++++ control/preimage/Cargo.toml | 11 +- control/preimage/src/asset_hub_runtime.rs | 5 + control/preimage/src/bridge_hub_runtime.rs | 5 + control/preimage/src/commands.rs | 83 ++- control/preimage/src/constants.rs | 14 + control/preimage/src/helpers.rs | 14 +- control/preimage/src/main.rs | 4 +- control/preimage/src/relay_runtime.rs | 7 +- control/preimage/src/treasury_commands.rs | 2 +- control/runtimes/asset-hub-westend/Cargo.toml | 11 + .../asset-hub-westend/asset-hub-metadata.bin | Bin 0 -> 323007 bytes control/runtimes/asset-hub-westend/build.rs | 3 + control/runtimes/asset-hub-westend/src/lib.rs | 7 + .../runtimes/bridge-hub-westend/Cargo.toml | 12 + .../bridge-hub-metadata.bin | Bin 0 -> 385682 bytes control/runtimes/bridge-hub-westend/build.rs | 3 + .../runtimes/bridge-hub-westend/src/lib.rs | 17 + control/runtimes/polkadot/src/lib.rs | 6 +- control/runtimes/westend/Cargo.toml | 10 + control/runtimes/westend/build.rs | 3 + .../runtimes/westend/polkadot-metadata.bin | Bin 0 -> 427287 bytes control/runtimes/westend/src/lib.rs | 7 + 27 files changed, 862 insertions(+), 46 deletions(-) create mode 100644 contracts/scripts/westend/UpgradeShell.sol create mode 100755 control/data/sepolia/initial-checkpoint.json create mode 100644 control/runtimes/asset-hub-westend/Cargo.toml create mode 100644 control/runtimes/asset-hub-westend/asset-hub-metadata.bin create mode 100644 control/runtimes/asset-hub-westend/build.rs create mode 100644 control/runtimes/asset-hub-westend/src/lib.rs create mode 100644 control/runtimes/bridge-hub-westend/Cargo.toml create mode 100644 control/runtimes/bridge-hub-westend/bridge-hub-metadata.bin create mode 100644 control/runtimes/bridge-hub-westend/build.rs create mode 100644 control/runtimes/bridge-hub-westend/src/lib.rs create mode 100644 control/runtimes/westend/Cargo.toml create mode 100644 control/runtimes/westend/build.rs create mode 100644 control/runtimes/westend/polkadot-metadata.bin create mode 100644 control/runtimes/westend/src/lib.rs diff --git a/contracts/scripts/westend/UpgradeShell.sol b/contracts/scripts/westend/UpgradeShell.sol new file mode 100644 index 0000000000..01b9cc0cf4 --- /dev/null +++ b/contracts/scripts/westend/UpgradeShell.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pragma solidity 0.8.25; + +import {WETH9} from "canonical-weth/WETH9.sol"; +import {Script} from "forge-std/Script.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {UD60x18, ud60x18} from "prb/math/src/UD60x18.sol"; + +import {BeefyClient} from "../../src/BeefyClient.sol"; +import {IGateway} from "../../src/interfaces/IGateway.sol"; +import {IShell} from "../../src/interfaces/IShell.sol"; +import {GatewayProxy} from "../../src/GatewayProxy.sol"; +import {Gateway} from "../../src/Gateway.sol"; +import {MockGatewayV2} from "../../test/mocks/MockGatewayV2.sol"; +import {Agent} from "../../src/Agent.sol"; +import {AgentExecutor} from "../../src/AgentExecutor.sol"; +import {ChannelID, ParaID, OperatingMode} from "../../src/Types.sol"; +import {SafeNativeTransfer} from "../../src/utils/SafeTransfer.sol"; + +contract UpgradeShell is Script { + using SafeNativeTransfer for address payable; + using stdJson for string; + + struct Config { + address gatewayProxy; + address beefyClient; + ParaID bridgeHubParaID; + bytes32 bridgeHubAgentID; + uint8 foreignTokenDecimals; + uint128 maxDestinationFee; + Gateway.Config initializerParams; + } + + function readConfig() internal pure returns (Config memory config) { + config = Config({ + gatewayProxy: 0x9Ed8b47Bc3417e3BD0507ADC06E56e2Fa360A4E9, + beefyClient: 0x6DFaD3D73A28c48E4F4c616ECda80885b415283a, + bridgeHubParaID: ParaID.wrap(1002), + bridgeHubAgentID: 0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314, + foreignTokenDecimals: 12, + maxDestinationFee: 2000000000000, + initializerParams: Gateway.Config({ + mode: OperatingMode.Normal, + deliveryCost: 200000000000, // 0.2 Wnd + registerTokenFee: 0.002 ether, + assetHubParaID: ParaID.wrap(1000), + assetHubAgentID: 0x81c5ab2571199e3188135178f3c2c8e2d268be1313d029b30f534fa579b69b79, + assetHubCreateAssetFee: 200000000000, // 0.2 Wnd + assetHubReserveTransferFee: 200000000000, // 0.2 Wnd + exchangeRate: ud60x18(2400000000000000), + multiplier: ud60x18(1330000000000000000), + rescueOperator: 0x302F0B71B8aD3CF6dD90aDb668E49b2168d652fd + }) + }); + } + + function run() public { + vm.startBroadcast(); + + Config memory config = readConfig(); + + // AgentExecutor + AgentExecutor executor = new AgentExecutor(); + + // Gateway implementation + Gateway gatewayLogic = new Gateway( + config.beefyClient, + address(executor), + config.bridgeHubParaID, + config.bridgeHubAgentID, + config.foreignTokenDecimals, + config.maxDestinationFee + ); + + IShell shell = IShell(config.gatewayProxy); + + shell.upgrade(address(gatewayLogic), address(gatewayLogic).codehash, abi.encode(config.initializerParams)); + + vm.stopBroadcast(); + } +} diff --git a/control/Cargo.lock b/control/Cargo.lock index 41714e3c02..6bf98b1a10 100644 --- a/control/Cargo.lock +++ b/control/Cargo.lock @@ -476,6 +476,17 @@ dependencies = [ "subxt", ] +[[package]] +name = "asset-hub-westend-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic 24.0.0", + "subxt", +] + [[package]] name = "async-channel" version = "2.2.0" @@ -916,6 +927,18 @@ dependencies = [ "subxt", ] +[[package]] +name = "bridge-hub-westend-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "sp-arithmetic 24.0.0", + "subxt", +] + [[package]] name = "bs58" version = "0.5.0" @@ -5626,8 +5649,10 @@ dependencies = [ "alloy-primitives", "asset-hub-polkadot-runtime", "asset-hub-rococo-runtime", + "asset-hub-westend-runtime", "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", + "bridge-hub-westend-runtime", "clap", "futures", "handlebars", @@ -5646,6 +5671,7 @@ dependencies = [ "sp-crypto-hashing", "subxt", "tokio", + "westend-runtime", ] [[package]] @@ -8098,6 +8124,16 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "westend-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "subxt", +] + [[package]] name = "wide" version = "0.7.24" diff --git a/control/Cargo.toml b/control/Cargo.toml index cd634329fd..03c1efc1f2 100644 --- a/control/Cargo.toml +++ b/control/Cargo.toml @@ -7,6 +7,9 @@ members = [ "runtimes/polkadot", "runtimes/bridge-hub-polkadot", "runtimes/asset-hub-polkadot", + "runtimes/westend", + "runtimes/bridge-hub-westend", + "runtimes/asset-hub-westend", "preimage", ] diff --git a/control/README.md b/control/README.md index eda0e483c7..2017119f39 100644 --- a/control/README.md +++ b/control/README.md @@ -5,9 +5,7 @@ Tools for generating governance proposals ## Example: Generate bridge activation preimage ```shell -cargo run --bin snowbridge-preimage -- \ - --bridge-hub-api ws://localhost:8001 \ - --asset-hub-api ws://localhost:8000 \ +cargo run --features polkadot --bin snowbridge-preimage -- \ initialize \ --exchange-rate-numerator 1 \ --exchange-rate-denominator 400 \ @@ -16,11 +14,26 @@ cargo run --bin snowbridge-preimage -- \ --fee-per-gas 80 \ --local-reward 0.01 \ --remote-reward 0.0001 \ - --checkpoint initial-checkpoint.json \ + --checkpoint data/mainnet/initial-checkpoint.json \ --gateway-address 0x1F98431c8aD98523631AE4a59f267346ea31F984 \ --gateway-operating-mode normal ``` +```shell +cargo run --features westend --bin snowbridge-preimage -- \ + initialize \ + --exchange-rate-numerator 1 \ + --exchange-rate-denominator 400 \ + --multiplier-numerator 4 \ + --multiplier-denominator 3 \ + --fee-per-gas 80 \ + --local-reward 0.01 \ + --remote-reward 0.0001 \ + --checkpoint data/sepolia/initial-checkpoint.json \ + --gateway-address 0x9ed8b47bc3417e3bd0507adc06e56e2fa360a4e9 \ + --gateway-operating-mode normal +``` + The preimage can be tested using the generated `chopsticks-execute-upgrade.js` script NOTE: Since the 1.2.0 upgrade has not executed yet on mainnet Polkadot, I tested the tool using a local zombienet or chopsticks environment. Pass the `--bridge-hub-api` the `--asset-hub-api` params to override the default API endpoints. diff --git a/control/data/sepolia/initial-checkpoint.json b/control/data/sepolia/initial-checkpoint.json new file mode 100755 index 0000000000..20e9822de0 --- /dev/null +++ b/control/data/sepolia/initial-checkpoint.json @@ -0,0 +1,542 @@ +{ + "header": { + "slot": 5871744, + "proposer_index": 1209, + "parent_root": "0x7ae1809f20473ff5a19471fe07f262254eae3c73c555be847624d424fcc105e8", + "state_root": "0x4aef57ce071de83d3834a406f8aaaec29fc7492cfb73ef2db7e309a0a3acf24c", + "body_root": "0xcd4212211c07486339aca6858b396cd9bdbb42e738fb1fc255ce8c0d64b59686" + }, + "current_sync_committee": { + "pubkeys": [ + "0xa8151dc5a9995a660759e36a9f82ed3be6956395866edcd1413ba15ce96e3210da40d364516a50f87ff78e9de9d59657", + "0xa70874a0fbca7cb43cbac450e1a749b4a7f455618daed827eb8d03acfc8326717293aca5220e165f41d0ef2156bdeece", + "0xa0ebae60a998907a19baa396ae5a82bfe6aa22cf71bfca4e1b4df7d297bd9367bbeb2463bda37aa852ad8fd51803e482", + "0x95c98e3b6b62f84edf7f297cae93ee5f82593478877f92fb5bf43fd4422c3c78e37d48c1ee7ca474f807ab3e848d4496", + "0xb800be1788175a01a9228b0d3e7eb4302484a2654eb2a86c0f0900b593da0a436ef031ac230e2b05e968b33e90a342ce", + "0x9348cf0fbd4414944935b61d9c99a9ad4c1b1825a7059e698a2709b0f07adaa26b32db557f32388b44461285959d25d3", + "0xb46a818f3e492e231d8fa8de8848c16f0d648a2e0d1c816adf9306a8596fdf45922e59cbf745430570a19e54f45e28f7", + "0xa8f2572a2cc2ecba151a3d5f4040a70172067ddadd8c12ba9d60f993eb0eab6698cb35932949c9a42e45b36a822af40e", + "0x8c06d7798d0892d47e400e4621178dda34a4b302f0ac236cd8704a1ec888b6601999508e159d717014fdbf6b8a660e0b", + "0x8085c60b6b12ac8a5be8a7e24977663125c34827842aa3b2730854ab199dd0d2eaa93084c9599f0939be8db6758b198b", + "0x840a53b12c5bb26dfcbfbc6f6ec4b1520547382b704ba545c65adcbf80eddfa0ac3cfa25eb44707608435f8cbbd07aa4", + "0x876561bba29e656b7122f1cb51a02dff1ac7d470217d8a4799c01e61816c4660eea91843a5a42502ddf842d2daeb0586", + "0x8b6bc5b51ba51ba6cd8925766b9266c59f5c1af2e029fe5c51d9332cbde1d0399afa967aca5119fafca623ed0f465354", + "0x89e19b665ce7f6617884afaf854e88bb7b501ecdd195a5662c79802d721f5340eca8c48341ad1d6c78f519f82e5a9836", + "0xa3fd9e1b5b61d2e0b9d66c46eecfc18f3745f35cda59994bf97144bdab6832c1f79b1068d2e8799bb7baf9f282c9380b", + "0xb7e18647b9d147a620b4905caf4a535a5b98e6ff0de5cc95a7dbe9c32bf1ac195a788baf9f51a6d7d0d2233d75af6e85", + "0x91b0ac6cd2c9dcd2ffe3022b477c3490be344e9fadd15716157237b95625b77c67e59021687c54a0ec87625be0d1631e", + "0x982691766a549df56436acd0fe76da78132e027515f27174c10d117bfcc20ed73fc31f5465bd7a22a101094fe913e221", + "0x8c65aa29a9ee9066b81cf24cf9e0beca3e8e8926e3df22d5ff1236297e158cc8bc7970a2c7016009cc4efa8f14b14347", + "0xa9ee291de5997232c68c9f6c3b568b05f46bfedfa18eb3776699d98cc7c6320003b7d862564d07fd28fc3691d1d28b21", + "0xb5d6f664ec92e5343792d5d6b629919c5fd8cfb874677df2264daf02bcd9d12facf9b859d5402839c9022396e20d260b", + "0x806efb61d1c948efc10dbf9bef30197d1c269e5e7fcf20a84367b26223d33fade413a0bbf4e33f0d1f1a00967289015e", + "0xb08857244c85129a3445af862afff77473664a1d808dd1510bf04dae0098903b2bcd0aa5c9e1d5be4bdae29d4964a912", + "0x96af0573e16dcf0b6d787ff45749b65737afc23b95ff2bb367a48440f9ed53a44e23edd13e9708acc6fd37db8ec8953e", + "0x8bc66e370296649989a27117c17fbc705d5ac2bda37c5dad0e4990d44fcc40d3e1872945f8b11195538af97961b5c496", + "0xb3285148b91dab139b053442bdd14d627ba1e1250fe469f0f2df854b6e6ff4a18671ae3879ec9f7d8091f99f092162e9", + "0xb8d68610fdee190ec5a1f4be4c4f750b00ad78d3e9c96b576c6913eab9e7a81e1d6d6a675ee3c6efac5d02ed4b3c093a", + "0xac1af27a7c67b1c6c082f0fe733046f8b155a7d66caa8ccc40a53ac5a55a4903d598b5f80543ea52c25205b02959f4f5", + "0xb5726aee939d8aee0d50bf15565f99e6d0c4df7388073b4534f581f572ad55893c5566eab1a7e22db8feeb8a90175b7d", + "0x952cbd8e9d5e9d23139e8f3e979a89b54206188e627f8e06cdfb3e38aa5159e610629bf79713954110bfa6f450c6e55a", + "0xac8436e33619e2907659741d66082acbda32612d245fcc8ae31e55f99703fac1a15657342fa66751d3be44fc35d71c36", + "0xb397ed7134f447d9bf1c511bf92f2d27d7b6d425b8b411365fbef696cff95c2175461cf5dd83d93bb700e50ebb99b949", + "0xb9eed89e003894ad2cc9d9b93a45247e1367ac69a00b0ed5e3280c1188b4cb90eb870d449b83a852a798bd02f9d0c813", + "0xad9e1b4579bc335d176f2d1cb700b3e9cf74acc31a5ea9fbb9a9c3071963648017aa2e9331dac0c42e6482f9141657a5", + "0xb1289ab2fd3070ba49b0cebc9cdfff1e8241414af022ea58b7a59aa7fdb066fd060b299796bbc811dec1bee81507d788", + "0xaf17532b35bcb373ce1deebce1c84abe34f88a412082b97795b0c73570cb6b88ea4ba52e7f5eb5ca181277cdba7a2d6d", + "0x95c0a30943ef34ef0a644439d857446e1c1736e18360f3f41803b0ca118e79af3fb9c608ec440a8de0f79d2c245b583c", + "0xa102c2ade15ea2f2b0cbc7dbd8c1171de0c8092fc4ecef84b5fd2bae7424aea8be1629f851c75e4d1d0e96104e54bfbc", + "0xa6f0d5053bfb37588a8b06ebee8c84a7f55b943c04075abbed5000ac6c16d9404d40976f6197ee1b313590750df93721", + "0x980a54f9e9d88a7ec08d04edbdd7c9222e99f270b1e978ce7140cc67e38a2e60cc1034dc5b0deb5b60e10697d3bc7295", + "0x9022541f84e48b655e74bf3da484179e0e0040827fc71e777b68f19bcfd0e103d385ef957692e7091fe713561f38035c", + "0xa5bf4aae622b58a37e722c3d1322b402907f10eec372a42c38c027b95f8ceba0b7b6f9b08956b9c3fdfedaa83d57a217", + "0x8e8f63ec8f4f1f7fcc61f893b671710c3c17f9d2d26c5c6ca40e671bd4b252bc0cc1655e6780d2ddcf2915d8f623b9a4", + "0xa5b213f1d8ddcd9e42570f61f57c0e59cd6379740e50239257395f2fe7fac982c9861685e0fbee6c75bced5aa6b64849", + "0xb897fa90529458bdf3cede5ced3f3823dfb9b6d93b96b81429bf05e8f1a80f7c857d458045cfee58296b3ccbc4119abb", + "0x97b43a6d1a47a1c415278344dba0cdfa952663a71fdcaf58d313c161e479ab5d1b980d8870055cc8f0d283bec8f97425", + "0xb973f9c3d3faf641badf533ec36165a665759e0ae9ba45f9190fc44b1cdad78ca90ef6298dbe1dc0ee95ff58531cd0b3", + "0xa24d05b51c7c128bb49979cbd9019e6618545d95275a44b5c3d1d03e71bf2ebffdf43fff50c30846ec27d279043cef4e", + "0xb01ee30d120b97e7b60ea89b9b6c537cdf20b6e36337e70d289ed5949355dd32679dc0a747525d6f2076f5be051d3a89", + "0x8e2e9a1a8bae9fffa594324a2c643ba0609f291146a104ceb9fc1f26d4a25604b97e9fb392c01689c88cac90c310333c", + "0xa02883d525e251708bcecf6cfaf7d07fc5e1be92fba24ca8f805e96b7dfe385af449f5687de1dc6707a62ccb08c1d590", + "0xac9f0b44105cf77ad721b97b0f04a37fddb2bb62c345b0d22a29e2870b8964d7484aad30e454c74608ce9901043501a5", + "0xb746447b0c0d7165f965672d71c318f2c1052a5ac6ebe320b14165c9276c839ed822a9183ea6e6dae63a4f826d421d65", + "0x8ae9585caa3c73e679fe9b00f2c691732f7b7ca096e22d88c475a89d4d55cb9fba3cd0fe0cedd64ce75c591211664955", + "0xa639bdcc6f167b3d488cf2d28ebe4782c4f37a5de4ee3d8f4845eef50c81ab7ee421db99c02c6404fa9d45a948b6d37f", + "0xb15460725c0d6bc3a6a7006dcf3c3e3561d9acd674c52d4199daa8598ee29eef053ae521f1271aebc66943938c9f4b7e", + "0xb2c191d34c9d09efb42164be35cd04f26d795d2558b0894286e455f8e8b0977d0714e5c8d3596282a434a5efa5248fc5", + "0x93f03495d53c781be8b76e37e68b64aa260523004eff6455ddc8a8552af39854e5181f8c5365812b1f65926534fba5dd", + "0xaa318e541c171104c94abd4110f9269efc88ce98ed472aa52ed877634291f6355314b915230723da00069eebefda97aa", + "0xb7e5497eda543c02a7b3245eece98d21dd4c587b5a05f21b5c785756a0b875715782f706fbbfeaa0edaa6faa6b03d8eb", + "0x946e508e1d399f22ae69a42102574c3d2827adfa47796c4c1b947f6ab84812f1474fd667c9491f13d4511cca3e8fffc7", + "0xb72c93827b8cbcbde357a04ceae87554db9d283ef535fdb7bca45460ea567edf7c1b82d96c7df679e64e01e501e0b450", + "0x94467242dbd62a3a64175663b6e51a330e8d5aeea5d85cb4ef33f412c41f24b9f49b06f5ea1c076dd4ccbf10a2fa4ab7", + "0x88b49b1130f9df26407ff3f6ac10539a6a67b6ddcc73eaf27fe2a18fb69aa2aff0581a5b0eef96b9ddd3cb761bdbbf51", + "0xaad9577501d7f3a5dbac329f2c1fe711710869cc825740f365488fc55a278d687bb72423560f7cb2cbd60546a82ea1e6", + "0x8df8b35861e00e82826b3a39069e9f3f0fcba18da2370e2fd792b4fbeec8a27111c7dd7e0acef5f4bd9b7a5cc2d6ece9", + "0x80414adc7e0a9cb961b1f31682c33d8e01e3b8cf2aa2c2a911ab9b1f54d5c4bf92e18466cacf9b80333112ab015136d2", + "0x89d356593ec09d838cd89306ce83c060ee797bf9eec8523f581cf263925699ef0f7161a790bd00bb09681534ed05ac82", + "0xad2456725ac3aeb0e4ca5c0502a8abb4dbd8a8897d9d91e673fea6a0cffd64d907b714b662d73c0877b98d4ab3ce6a89", + "0x841d9c04009af59c646e65cb79be10bff240fec75d756c8b8b9c4f54a2463561510f5b2f3d09eacce57cfa4a856d72f7", + "0xa35d9d6d5dd5428cce7616842203b5fa3721cb4b20f50c0113f138604954fe0cf214ca3d065b578f921054b9efe823df", + "0xafe779a9ca4edc032fed08ee0dd069be277d7663e898dceaba6001399b0b77bbce653c9dc90f27137b4278d754c1551a", + "0xa798a0371e8cc4dc42ccd79934b0db5a3a59f18a0ae09f2eb172596428fcb3f00312e783d6fd21cbc1610317f44e08cb", + "0x88158d759eafd2205c770f166829fd61e8f17b2c13f440777eaf45f4d88a6e2028bc507680ff435882d5fb462f813735", + "0x927c030d5a69f0908c08f95715f7a8d1e33bed5e95fc4cfb17f7743cb0262755b1e6b56d409adcfb7351b2706c964d3b", + "0x8499a8c3d67d1f6eccf1c69274393dc498cff862ea8e6c11ffb8107ae190d258ddc1d294f2a8f050488df0212063ece2", + "0xa031d95cdf2853d2d72f3efe2feeeb9f409f51f3b708f726be0096acccef3b247fbe4370c58b4b891cf156234221e0ee", + "0x85f2ed3ffb03e50c8f22553b8e6349be6244d893aa37a7c6dbd221e9e121579e5a04466e60d6b4d3567bc747b1fc1e9f", + "0x87e39895ee4bcf83f007c7e8c560304d55674cdfef16e3fb5a309061dd97f37b12da2acf5b2f05c0d07fd594277d49ff", + "0x89cd9f6ae7d9a9ff2b4db916ba3af9fe700fcfbd16577bf73a965af938e8cf633020466b0298d3c31300360aa6851af2", + "0xa57bacada151d6521c6f40371e80cc8e44bb76389dfa7da5deba7675bb9a253c59a901df26c6f1069205b37f18048b1c", + "0xa9760afaa51002be0948acf7aebd90ec4e60e0dba8456e445aea93408a0468b62bb6da4984b92f8f6061561c9d56f4c4", + "0xa649208372f44f32eb1cd895de458ca1b8be782746356f08ac8ef629429d0780a0799fcff85736e19aead0b79bfff261", + "0xad2b1ab32161e37ee553e3787f05f9281073d7ef7d0ae035daa353bc83da8ef8c76c99ad2928463c7c708f7404020476", + "0x91c3e8d2a65af7a31e24445afe9393e53f47b91167818210f2d8b9847ff76687ebc1107f52183ebadbafdaaaf72bd951", + "0xa16c910646638c4a57e94129a333ea61b8586d7fcedcd522904c9d019befd6e58344fd5e8f71819cfa841c34b3c812f5", + "0xacdaa6263cb7ffa0fa159983888348fef7f0514abd4d897884bb6eaeb57c68e61044047215ccb0f32face09b0a72ea3b", + "0xb45b285863f7303a234173b06e8eb63c8e2b70efe0dfb9872e3efddd31d52accf0f1292cfd1239b5a57492f3617a19e8", + "0xa019370ca799c2c98a605850910cf43531bfb616393039fdfc370848feedd3339b2427b750ccc91952b03a09f690e9ed", + "0xa2f61cdc267bc1c7c328571b09a058fd9d2ecb70236d735fc50289a10ff35bc8721f32cd0e9f4ebcf09f176bd51e1899", + "0xa6b434ac201b511dceeed63b731111d2b985934884f07d65c9d7642075b581604e8a66afc7164fbc0eb556282e8d83d2", + "0x87fdca39618051c4b3f03c816b13df2d4cd4c7c564e3d8693dcb58145b7b3b3db7884b0125b1e84d9bb82e91bed8bba3", + "0x93121aa60f904a48e624e00f5410cf8c8925d2b0719f90c20e00cba584626f833de7c8a18dbfa6a07df24b916156bfc0", + "0x9529ea4a51324ed4ecd855faea43846a223da8cbb494e5854cef700ebbcf4d76119cef16192e6b7c51f82ab79371756e", + "0x838733220d1559c800cf1714db8a43a67a0c0d1d3a9fc1e2cdcf615d20406501e5146fe8b59bf64f4c5daa1a6d74f15c", + "0xacfbac397ae2ff23b31bb27b90788fd0fd51a50f8e8c9f4b31be8499194252014f0b1972b204aeb9c2836a20beb3c868", + "0xa356e5b70bc478c625e32a38d29f0a619fdeb665503eedc304d1bf34562d4b6814dfc30aee5aee94ca4bc6394e412765", + "0x946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0", + "0x91b49de13c51177527656ec1ab0ad74ce8666550f7e14bb3e19199b5bc7ee81c72f1fdd7593a1148d1d07407085c585a", + "0xb15e1b4ac64bafbc4fdfead9aeff126bf102fdd125c1c914f7979680ec1715fbeccf3dc35c77d284421ec1371ed8bc32", + "0x8ae80eeaed3fc456f8a25c2176bd09f52a2546d45d77a70f48a9e30aa29e35ff561c510ae1f64e476e4a0f330b9fdbdd", + "0x974a5180e55eab23d4c973fbee6ad1010335161ecdb849fe6520b34c1f96530a4faff80bd738fe281019b79d968c472c", + "0xa95bec86a7c8417a8df3a0158199327ba0924d3b7dd94cd7c1ef8489b10270ae64b8537ed39cd3699a48942bfc80c35d", + "0xa42bcc5012a8b87caac4ec279f8cf7e43f88e36b65c321a835fd8a5ba427a635de79b93d2460f5e15258f09d8d51c7ce", + "0xabeb50e9b72dda934df8f032ecd0221826cb988bda6713ca0429b7c40fd2829804fdba8da13700cabba05e945380b753", + "0x963a298fc8876b702424a697929c7a1938d298075e38b616c8711f1c7116f74868113a7617e0b4783fc00f88c614e72d", + "0x85554235ceabfc4e432bb1804daf45ae47b90b8dfaf33d0a85565394dd1e122dc5efdf3427a7e1b288c78c24e8ad9809", + "0xa8e03a26e88e4ed03751ccf6eeed6215becbf4c2d58be27361f61d1cc4ac9b692fc6ecdb839f9b3c17f54fc2f2f4756e", + "0xa09f11d2bc6000d12a42b545ddc29c1973944a39787c5f27c96d4f6aa0d9c8fa9c479f2ed327fbd30376df3fa5b7d2a8", + "0xb0922acd6da2a95b36de6d0755316594a7e2e32ea774792dc314e8c3cd76d9f1d69df38231e166e24bd42c664f4fbac7", + "0x8465bd8be9bd9c2c6116d4ae44ec6618c109cb9aaee2d241e7a6ed906d398ef15a6fc18bc8b1d3398184241405954bba", + "0xaa19a75f21a14ad5f170e336a0bd07e0c98b9f5d71f91e784d1dc28a5f5eb6870a4eb35bb41edcf9e6efe982ae5c2c5b", + "0xad9725114b01152fff134c1a8ccb8d171b8cd11685ef6815b76f442d757d130bab9ef4c9845e66f4aa0237ee2b525c20", + "0x871656153e1f359ea1cf77914a76de34b77cb62e670c99f3584e7cb2c500c04f65f36bcb5321f4630df5c3de9245a7c0", + "0x90fc170529bcc0b80c46a53fffd8323fd2cc5cfa9b75ea4d36db21bd1f198335ad2bfa87f8990cf9cd9fd7989ecca718", + "0x85822227f6a96d3b6d6f5cf943e9fb819c8eaf42a9aa0bdd1527055442b1caf672522762831b2dac397af37a1c5ed702", + "0x93e4d7740847caeeaca68e0b8f9a81b9475435108861506e3d3ccd3d716e05ced294ac30743eb9f45496acd6438b255d", + "0xa5c0e42851b769d2d822e39222e708068455aae3bdf782975b59d3201e67a58fd66e16d380558bf2086bcab890a92dd5", + "0xb544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170", + "0xaeeedb3c73a9eadef14396a474ca83ca9e3885fd5f2c1018652360481d0be49524de22fc1ea18bb7abca66df5dc7d309", + "0x80e58680edb62d6ef04727a36e41e5ba63fe787aa173171486caee061dcb6323f8b2de07fc0f1f229c0a838ed00e3e31", + "0xb6d6482ad7b9b412ffbefbbdcc28eb3d091b1291f54f77bdd53c4ac85f705c454940f466dc272dde7b03c26f0cd6ecb3", + "0xb6c7360054cf250ac48c41fce8da7a15b4c6f226688a60da737ea2e19b00c94ba728aa588ee72a7ac65f2d63f216285a", + "0xb1809f9fa306d63c6cef586a74de6373fb2fac0cd10c5cffa6559cf1a16a99502c16c204f803139d4f2fba5161f90a6d", + "0xb924bdde49acbc8d9213301f5dd3e218950c1677008db7a8c830ecec0203a79fbc61d536d5a0079f2072b03f86eb3356", + "0xac4b39bb8f0f62666a50574632764f8b6a1dc98afba5a5dad4409c920a0c0d5d2b5c2506c3a0d2f8727b7b7dce2ba1a8", + "0x8368a0f17c8427beb71dbf11a09a2fe8495a33f08c29c74a9a996a88aa01c0a09f9555abeb1ef1592cab99a9e05875cf", + "0x9779987412977476a6b4c6cea3f2e08b5960d0a12bc27033b2ffe23792ba6f0ae3167ea6c6962077990cd1c7c4c220c7", + "0x91a812d377edddac3c848f65bc8fbb8a1692507dc699e353621df83440b8e463862057a2596c6c6a5c36b2a4888fdae5", + "0xa5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d", + "0xb919391ac60e21fbf25cb2d6a3ce6edf9ddc493073e5e19c43d319cc488ea7fa2b4c6c9fcae5477d83065edb7f92b7f1", + "0xa69f0a66173645ebda4f0be19235c620c1a1024c66f90e76715068804b0d86a23dc68b60bca5a3e685cce2501d76de97", + "0xa9f6b6b04e36850d2dbbc390a9614013da239375f105b0f3738138431f0a3a8c685445f6c518e0b0e72fb3244ddc0d9e", + "0x8a501497cdebd72f9b192c8601caa425072e8e6ef438c2e9493675482808522e488779dcb670367cf6d68edea02a12af", + "0xb63fd45023f850985813a3f54eceaccb523d98d4c2ba77310a21f396e19a47c4f655f906783b4891de32b61a05dc7933", + "0xaa458aaca6ecb43b6e45ea72d02682e5a7dc8dc22782669a0628e1638e73999319f011803f4ec8cf072467bf2c49c629", + "0x8e9bccb749e66fbe47296f5dec33bd86e52987516263240f35ce9a212dbcf71348b60a016f830f2acd05482962403542", + "0xabf19b2cb84bcc87d15e12844d053237a139d76a35ca14250cee2415ee646d98bf97c42bd2645f0790ebb388dd561d59", + "0xa1beb9f673409ec678020ea4dcbe65177aa18e2932ceb9cfb33fccb94b9a8ccb664f71647d58b3c8b2bdbbffbc02d5f7", + "0xa076ea1084b7a1a33115ef62d6524f36e7820579868763a6ed1f8bce468f150cbfbf0ed04be2487aaa34100d828b0db6", + "0xab1334a1dc4a34fac334e1d637de204da18783d8573f216d9d24c853555d79877682b43af02345f6695d87f6549aa72e", + "0x8f71f8edae59d6936846d8b50da29520f69b339f574ba9156d3d5f0cd4a279d36bad7ca7eb724dd48aefc4ca9ce26bdc", + "0x919b5187af7dae210f151dc64a9cbd396d1ae04acadebf542a7123004efc7ce00d6e14c170d876fbc64dc1b5d141a5f4", + "0x825359cfe68ad6a75578a94be6419179e0aa088170b6c20fc5c249dc3be7a260d687c93d8d8a343c7c72c2ed6a716de3", + "0xb504cb87a024fd71b7ee7bed2833115567461d1ae8902cccd26809005c4a56078617ec5d3fa5b29a1c5954adc3867a26", + "0x80b61f545f9756a2b4431f1a2690adc7b351dd82edc1eb1bb0f3ec2e730b1484da690ba636701059e51e59f34e124983", + "0xa17b0040b4e8549acbcfcb5cc3100230e50a0289f54f5b6df39dbae22cde97eab0b13ad4aedcd21bc685bdd0afdc1ca7", + "0xabf28b692bed19ee9152d5f8ade776f0a42a9762ea5f37d80f47ff219fc0a8ebe5e6eb920453e1ced3ea5bba19ae5be7", + "0xb7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d", + "0xa958987c2b3c84df8176b600f5b75a8badef9653c71eff967e76648937def38826eaab4027a639f4f300b20019166250", + "0x89cdbd610e7f57e86438e50874c3c7ba85afa63f5adcab9e454b5c203e4da65d74bb7cac5995a8652d10a6e438a1c2b8", + "0xb7f146a357e02a63cd79ca47bf93998b193ce1174446953f12fa751f85dc2a54c9ed00c01a9308509152b3bad21d7230", + "0x87ac804ccfe7f1fa156b8666664a397236832569f8945e11d4688a9e43ada4d4104efb3fda750f48ef655a29357c5e7d", + "0xb526f40d519e7a8f2c81b69f71b3e2ef079028004c0448ba0608296c2787972491ec6d05ed6a8fbd5ef2da76325a93cb", + "0xb201b0546f19c5db88df9c684cf55ed623bdb43927d06051bd595497df741feb1485961f64e8d3d1811d9e2e9e1e54ad", + "0xb58396bce7d32ba6c70adbd37156d859e153c1932d2b0c7c874a1182ba831439e80d6fc6d7d88a870e193f515aef2264", + "0xa6e1951cbbb19c0aad6e9251c2c4dcae1d2e50550a32813a47dde9f41e42e2dd0433cddf7e63ab3d320edca48a6d34fb", + "0xb0a32f5ee1e22853d6557c59517234abf7af5bd5984274fc084f25dbd8a07d026715b23b776fe47f8a3686c69a77cb8c", + "0x998a653dba837c4484ad5090ea32919dfb2ed647d4bfb7578c1901e3b77ba7fe275c00c8ea560d6505dc2f1cd689733b", + "0xa4eb903990bee2374b14fa66fc262d6821669537e9ba241c87b4b5c9e2b89b32fff4bfc28ab8471ef52e8eebc3e743d1", + "0x8097b13908662d245820f3b045d8c2c665fe9a054e9c661323924ec86dfa713b36b0c787ad4dfdeb979318810e687a48", + "0x87ca4fa85a257adf7e21af302437e0fa094e09efced2d7ebab6cf848e6a77ae7bfc7cf76079117f6ed6eded9d79ce9cb", + "0x907a3a9522479f6101b3ddb28517e220f842b32d14bd2ab80fc1005bc7e6a101b7bb08e72e6c1a8d050dfcf4792a3620", + "0xa6dd7816a96af369540013a456722434a5a918673564519a253ae5669ea3afeef509e29f35c6cd3ca7fd29f97987cfe3", + "0x97f1a7370b4f5acf83b466f519da361c366915f560385dd7eff9d53700ad81b25c9862bc71d35428e82372a5ae555ea0", + "0x84f43aa4e2a9d10e6590314981b5eb2a5e486c1593a4f82bc3a82b67f6ccc29652ab82a689a9454bcb6c1f9bf7a10e2b", + "0xa57d5de556853484b1d88808d2529450238bc467376ded84cfd7b4a1ba258f6d43b5958220f962c57b033abcef1d5158", + "0xb5e1edbcd8f2c557bcd0d425fd3b3d2ba26c010f456a27abd208608db9a981e3b90b482691fcb3fb2ba8997b6543dc94", + "0xb9ee3b7b95db0122edd90b641de3c07fbf63a4f70fee5f72051cbe25c92d88444314d0489a5ecdb1805f4f149f462ee6", + "0x8253e3b0b85538d01b0ca90b0a1656ad80ee576d0c3fa6349df58df92683b510e56c524fa6144f79a5525f41e4a2ed34", + "0x94fab50e1f826709bca45da6574aeeaae0b2b6e172c30798bbd886720e18dcfa0be4c46b43cb14219b172b6afe70c062", + "0xa02f7fec0661394399a82b2e3151009160b3f5392017ba579b301ed42c85100c295acbfed46b6c58a9d71796ed0930e6", + "0xb65e8b290bdec2fda05cd1c09f8508f662aa46d7d19556d0a4e3244b4ec20093aa37088105ea4c2b1e5b245410241445", + "0x936f7e20c96b97548fef667aa9fa9e6cfdc578f392774586abe124e7afc36be3a484735e88cc0d6de6d69cf4548b1227", + "0x8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b", + "0x8117fbcf61d946bee1ce3dff9e568b83716907acfde9b352c3521cfed44158874af8dd5b3906b4a6b49da2fb212ef802", + "0xb5f69b7614fe07889b58142d7b438186d70214ff4cb209b6f271a3bf2bcdef5e6f1c7e95dbf5f2785aa471f0294cd029", + "0x9888c250b4b60306f4ecb1babbf95d0b6dbf6186503b2024b134478d721fb782d801bafd126cc3247bcdb1ee9d66de85", + "0x94d4a1e3a3d28a948f14d1507372701ac6fc884a4905405a63663e170831578a2719714ef56f920baa0ca27954823e39", + "0x9405a2882279c691a42eb71c928ecc1c1a054927471e5ec7ea1f95283235349ad0c9888803e2fac748c73d241931eaa3", + "0xb04061bd8e98080d0e1338fba5c30cfc726c268d5927852a14674d7c289941fed5835a24313c82b19dc2368b8d445926", + "0x8cf06b34e7021e9401eb705dde411ecf7e7e7185f8c0b0aeed949097df31812a9fdd4db7d18f9383a8a5a8d2d58fa176", + "0xb7eba9659ad46354f710b94476e8fcad4ecf74c584c1b6252960e7e7759c8a064127929bbec71f2b868d098140b3de40", + "0x934fa8d9bc9cd0ff2492c5c97e63a98bdef63a6e8889c9ba7009d6c6472441750ab37ce5d1ac3bc0d73d074af223e446", + "0x84a6edac5ac68a7ca837c46d5ada8fab136748b6c3a3b9165dbbc231ec386b15328e4ef7d69a15d4cf354135348a4ee4", + "0xb33de3de106be61481ccb7f07a7a63cf4d1674010e462388fb8ab5ea08f444ed7a277905207e0b3aa2f00bb9efca984f", + "0xb471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753", + "0x983fc1ddf17f9756c9cecc00b39bb2ad432587a5c6d1c3296a383b9f539c9afe84c6c818447a709c0b686ba26ce5ea3e", + "0xab4119eef94133198adb684b81f5e90070d3ca8f578c4c6c3d07de592a9af4e9fa18314db825f4c31cea1e2c7c62ed87", + "0x8e8e48992d0394fcb9a0c56bbd3797400128e28fe395ad9acf582919d66d11a4811a7187897e60ee2ab4842800c8c36c", + "0x88e1e459ee5aeb8b36ed004f6d03da296101106fbe1b18f9bbf63e92321db51670c34050fd3b7dc56a4bad76403823ee", + "0x85e2013728a13c41601d4f984f0420a124db40154a98bbe8fddc99e87188b4a1272d20360406a9dbae9e49bfe3f1c11c", + "0x95718b06017ba9d45894867fd67148645d25d9db2229aa89971f444641ba9db4c5c6f0785f3b25cf2cd7fadaa6adc5eb", + "0xa19e7db50604f6b82cc28bc97135025459c8eac107a1c482919df10b8be2e4f24fceb93b963c0b8ac9f402e2f6ebf387", + "0x9920c52effcbd2a54502957fabc7c560250c08941bc30fba42d1a5101cd987359ab5725152e3638f6fb3b675e12d1060", + "0x9366d86243f9d53bdd15d4cd6bf5dd348c2b89012c633b73a35d42fa08950073158ca0a1cfc32d64f56692c2374a020f", + "0xb3bd2fedbca3e0185bd4920bc0b9279da7d7031e39df2886a4c969b28df97181ad37ca4bab2b79f44d7bc4acb32b14ab", + "0xaafe14dd3b680f096010788226d8413ca628feedad79a2bc78cb04d47c6ad910f7f46ca87b8f8281744625d8f42d5eea", + "0xa03c1e287ccc4d457f5e71e9dc769294835945561e6f236ac7de210d2e614eee8a85e21dfb46e2143c68de22ccee8660", + "0xa94ccbf61b3a857744aa1540fc6d633afb8ab3c92d07fceef90a0dc54ecd2133490cbaac8832b26cf2f4b956471f36fe", + "0xabd7248ae069d3a3a45b0ef4dd5d7d54b62994e578ea20bdd3b7876596673953b94c5b109a6e4b953b517544b915368f", + "0xa3cf8e318958bdb19eff3f4840d453f13b0edba8b5a8754ddf803d82a8f97c3c6c60733288d7ebe5c5b6934379c7feb9", + "0xb1c56f028f31f0ff86bdf55788703b4d809becaf3e4d9d349f1b660a07d2f15e127eb72a0e2a5a2742313785a3de43a5", + "0x860d581af35d522b5eb5fddd92a98a6b4cc483fda00820d1ce4530e07892890c096e99b33976ca3550bb900e830ad3b6", + "0x87a8480c87603031ffe58a4e3aa7b3305748424219b6b1f1ad480ed2a473fedde4c79b8cc5b6be244f6848eb66e9d9d8", + "0xb102107527690d9324e9f121aad6b01f15d70140ff3b54e88a6743af913e95df9756f46c88c2525b6468f79497e1903e", + "0x880f51ddfd824ce64b336ce26993249c9d05263def782a8246e87ec335042b0a81d2b91782a6cbbc9911f8208e1de704", + "0x8ef9b456c6abbc1b912e4b5c9420e8af1a5860eb670894d3ac250ee57f2421f2e4eaa1a7f85df0f3f9b34a24169195fe", + "0x855474478de6f0f17168294a676f5a92db8d7f87b3e7e66f5ceee66dadeb5c94d740f0e0997e532409c2934175b6131c", + "0xb2a4000ce0ddd3f0543ebfe4906570853a85350d75418a1ff2608099c069f03510df576ea0cbb406b7ae8e4f21576811", + "0xae47b31c5b62b38ee886ee04945649054369018dd6543c91f0138464af489a32c1fea339e0e0cbe82e3e8b9f2ef3918c", + "0x8cf3c29531a17489a5f8232d56c5251ffddc95be3ff7ff61472e19fb38c5eaec841ef3b1ee36756b3dd8ff71ae199982", + "0x96e7d1bbd42195360267c2a324b4d9bccad3231ed8a7f070278472a90371867e2ef2c29c9979a1ec6e194893afd992df", + "0xa76adeddf2454d131c91d5e2e3a464ef5d3c40ee6a2ab95e70ef2e49e0920d24f9b09276250ed7b29851affbdbc7885a", + "0xb1afaefc9fb0e436c8fb93ba69feb5282e9f672c62cbb3a9fc56e5377985e9d8d1b8a068936a1007efa52ef8be55ce9c", + "0xa4b507a4bc2bc424297bf8968bf385fae3acc686cff4b7933b4f5b6ef3149995393d5331dbac4b629e8adce01a91a4cc", + "0x99dc48a054f448792523dcdeec819e1b928b1bd66f60f457261f0554f8532eedd7152792df70ae5316ab2f9c02a57cdc", + "0x87144976cb0d55de66f612725c6d89ab35a5222e8b003329b898e732629f5b7022a7223c9cc9ec820d3d1553e7b2267e", + "0xa60642ede2da19e9e4a2fe5a31360fba2c871c25ceb8a867c8189fc62c191a5494cbe59a4a53f643d3025ab264e9cee8", + "0x8dd55efbf4f9cf6aba47c16730bbc5dc3d332bf2e9f1be8695f755362ad2f8e6f6e2426e52cdf0ba9feb9e17533c4b06", + "0xb42f22b81ae0f8bdcbfde4cc9a882eb46c80b0959895ea3c1fe3979550bbcf3f179ea3925fec5b1ad0503c07e7a1148c", + "0x84926cf2265981e5531d90d8f2da1041cb73bdb1a7e11eb8ab21dbe94fefad5bbd674f6cafbcaa597480567edf0b2029", + "0xa8b593de2c6c90392325b2d7a6cb3f54ec441b33ed584076cc9da4ec6012e3aaf02cec64cc1fd222df32bf1c452cc024", + "0xa16938f556b8c11d110d95b8584cecef8b95ef349ea64b59df806cc62c52ee48074d0b3f18d84533e41583aefd6a9d43", + "0xa62c2e7c692403e874a16e08e46a067e19dd561993ca07ff79cecb53c753763b3e49d372638c96c0a8c921bfa0798a0c", + "0xa2248409026f35c3da8bc4d5c02315066df8fca44ff5a358cc42b5c88bdf6866dc133617c697bff004b1ef20ec4b5748", + "0x91215fc3f7243638733fe293dab7029e0c4275550102acf5f1638773cf8f8ef2c53ffa5bdfc1b602c269a2b5ab164b7a", + "0xb900a55013d0427e5da6b21611d6ae3e648f54f794cb099b2d2beebae0a957477a94dc415e8ec5e68e9029ce50d43843", + "0x99289672bfc48d2fbfd51a32d0d7f9d03fff37b8269ce45cbae1e9a091ee3983774d053efe8eae2f2d3f22a9eb532457", + "0xb8137fd57ce7d3cfaf8bdbaa28704734d567d0e7a2d87fb84716722c524bb93acb2c1284249027f3c87bccc264c01f4e", + "0xac56dbae1e290ad35dc14eee30c6cea441cb7d2cc64b8407b83df5e07ce4a8677983b45458c0127ec0d01f31bdd61a15", + "0xaf18cf1e3d094b4d8423da072f98b3023d296f6a1f2a35d500f02bde522bb81dc65e9741c5bc74f7d5613bd78ce6bc03", + "0xb40a3bae2b08c13db00f993db49e2042be99cde3d6f4f03d9991e42297933d6049394c659e31f316fcb081b60461dabf", + "0xaf6e6cad67e54efe92976851bb789d79debfa2c78757103b69e43d1aac3d768d496017b8402ebc6e0b176be5aa6eecdb", + "0xad19e38fbc31a1f99e8ead1437016333ba9b15dffa43fe617d410fe82775f06fe5abd2d5f2118802914903d2c2301748", + "0x81cfea085de08a39ecb888831381c4e60d2ece13caa69a1da2ade95841311f0e6e958863fe834f8ac70e358f730a9dcd", + "0xa7b86e4f1366da44fd59a3ee68018a99c23ba3588789463bd88b0177a9b94030b58cb879a506e64421af966f261eaa86", + "0xb182d697922451befc875237db4a3b656dc36aabba71d4e6bf21d59608541352b077a92da04a91ec2345ef41d54dc201", + "0x8a98cc2fd044f6749775001dc8209349547d19dc56e1da2e4de1c953e7e36f15740cdbb5e8c6e4238bf216c1f7f9f02b", + "0x912bcfe28f56098d7f75f90fa419232787905e1a26170f274d2cfeac25636a21081b07065a7f515188233575cd85cb4a", + "0x86be44888e8208c167097d7d535c04090eaaa61472b4c6b2d5899d7eda8d3f804ae1708c0653d47e965897038d4e13d7", + "0x8f7e58a9ae0cd9d52bbfdecc11347a78e12af25fdbc7487e9be206c11257f19befdeef47be0a7d7d1486b9bb5ad8499e", + "0x875133b542cd93b7ca5c236a14dec59d2e2fadcdf7673f09fcbb2282ec50b81410de244229701501d2a33802f751b458", + "0x978299430079ea9a0868eb1289ea175e133e9f604129d56b1b1d0f768930bc4c64db921e08f352bfe6ad2296123e6ba7", + "0x9337558dde89640d62984bb0fc12ea5f934c2258d4ce06b187364b9a646bb90966851dacf3be0156b2956cf46d4d8d27", + "0x99daf03fa434a482d9aa4d090884c99b7208c1f5380b9acbf304e1bc33d3d6902afa5d248d20ccf03795e26901356ede", + "0xa59a20a570769bd011a64917c77a134b7a741a202e3f08123354d1c2dfa8577d00b29dcb75ba65b983a9b628e887ea24", + "0x91066bac5341cead3d2cb168fde7da62b3dcf933ff5c1d379a4dd424b218c4e2ebcce038cc342e758795ecd4dbb8b790", + "0xab2053c376c6bd113b89fdb2ae3b8401aa891135345885730c61cac7813f69ea7d906c531be752e28657f73af92d1f4e", + "0xa5fe3dfb5031517bb8db0d5ade1e9f438e84bcf23221de003b03d2a2f4ea97629e81c79abc3769bdb8c69a512c189b91", + "0xb9691fb57be7aeb9d43995b8022051f199978d6ad635e1623a1bc1754b250fb8a94985cdc1e623e98767690a417e92a0", + "0xae78b7743d919518bc674f3deac5ea3d0ab05ff0a5494417f5fa91b19413bad5d669fda2f5e630e360d42e2c49597796", + "0x971882d02ad64729cc87251b49effc0b8db9880c25083bfa0ff34e7394e691288c7cefbb5cfdc76d6677ffb9da765dba", + "0xae96dc808c316a677977831bad1e529ef965dadb5d6aea25ab008fe7bb1543e596e33052cfbe4279fa060201199d2c34", + "0xafdc091a224486e7bfac169e6a7b4e008d2d04144508a337fd93b6f4d385ee3f0d927b1f5c1cd79a15e0fd6078e45dd4", + "0xab6366a7c6da8ca8ea43a3479e50ecf9a1f3b20ec01b8eae1d2a21ba2223a4ce62615836377c6395580a079c284947d3", + "0xa222ec6b756b0533dce7e903c24a69b3d48db0d1e93c4c41a882461b8939b9cc90645745d89fa0873739f812dd3b2cb3", + "0xb0d4231814e40e53ab4eed8333d418a6e2e4bd3910148b610dec5f91961df1ad63f4661d533137a503d809ea1ad576fa", + "0xa3e91428c65209d182cc6b95b6d6ab6ed9d6ee915a992760e29a0c99c19b2caeefdfb87803d0f675c5c5362ca367a4ab", + "0xa4bf094dcd71e1a8dccca76dc7887476154e673551f25b0ca90d6dac8b3b3a2241bc601afeeb1564bde0432db1972999", + "0x8a7b3516e5e10cfb6f5d3882464ca4d5e3437ed70a65f60b3bc586e49ec9ffab1c61dd23ab03ad7806353066a816be61", + "0x94ffda31c9e7cca085dd988092d72e5ae78befbb14a85179fac7bcd6e89628a8f70f586c1fedd81be34d8577a0f66fd7", + "0xab01a7b13c967620d98de736b8ff23d856daa26d5cd8576993ee02a5d694332c0464ed018ebffcd5c71bab5cada850ce", + "0x8eafbb7002f5bc4cea23e7b1ba1ec10558de447c7b3e209b77f4df7b042804a07bb27c85d76aea591fa5693542c070de", + "0x80e44d3577f12cabaed7074feeb57162ff80b61f86cce8f41d1d1250bc455070b09f6ea9d0c263b7b4824701480f4c14", + "0x91babaea18cf8f1e56feb0b89f0a3956c6469bb963d63312431057093b0ea0240a36abc3b7ac160e644e826cceb62530", + "0xa9b0a06469c7746a0a23c459a2fe75dd474e2cb1e9806afe872febf054e6f13c2c183761ccb890c6bb4d87abe597de1e", + "0xafbb939073c28492a46f8028a010297e395c7449fd8a1e24322e605c1db6cda1581f2810cdb45c273189084b82e74b22", + "0x860c0eaee51b7de26e99033f352aa09c093943b59237f1313ecc35b0d711509bbe9f939c4bd646deb7de8103eea9ea13", + "0xa333abf3cfa6b46599e210f7ae33cb6bd378ffa4e11fb5bf9d2cdc2787cc34e6e088e010321c193ce46495009e88b780", + "0x820f164a16c02e136911dadbc61b9f6859a7c53d0ea17b8f64b783f7f2f4f549775d3f16e21634dc6d54aef8d56517b2", + "0x897d7a19b70dcef1af006df3365981d73068c81f18017f32fb9966599481496efd5f6caceef943b31c52750c46d9590d", + "0x95cf2e038c790ce7a2960add7ab44804375f04ec6829f8cc63793dfe9fc48c7471079f81b932726509394fd3d46a52e9", + "0xa8b742cb7f497adfb99bdc6bcaf7f4bdadded2a6d5958680406b3b00545e1812d78e03e20be42b471b1daba84587d574", + "0xa3969926aa2e52f1a48ac53074b764648b4c71bd43430944679628463cd68398f700d874c14503b53756be451c8ba284", + "0x85c9217b6f7b8baffda06ffead7174ab9d1d9ec4b10b78d99e742835796a522d6e2b5ddc5c7282757dd896c76698eafb", + "0x952ae6ce5beb7900cc492b255c44faa7810d70d9490af794f52d0f03f3dbd54fb9a7b940f07f5e6d4dc61dba708c7fc9", + "0xa92dfa798798ba9e92f9886bfeb6d659b11ddc1228c3e4b8dd804bffa089d648173dc286846679df30acb4b5b5f4fd11", + "0x871e70f0446749e5d48d0c113a27e2e2a13e88e703764dfbdc2bd31e921e6a549c54afab53968ec3d856c5e4e6d029fb", + "0xaf861bb21f84c3e7cab55370839d18ac24c475a9e833607fcd7e65c773ee9d64bea203ee9e8fd9d337f1cd28d5ca0d90", + "0xb5d7e0f09806db08f6b1eb31ec543670475f46bb08df0781e7fe39e7cd4d5b0c442783a9a2d56da767c9685e27112a54", + "0x93fda62b785757b465e6f396f74674d5b95a08c938cf694e66beed7d2f317a4c9d736cb54d7c221d61e8cb3d64dca3ab", + "0x8cc453954fb40a01929d529edca1cecdd162f1c7bf0bba99ff85e2b309cf46a04fcc817eb9c4837927f95b54d2aa816c", + "0xa698b04227e8593a6fed6a1f6f6d1eafe186b9e73f87e42e7997f264d97225165c3f76e929a3c562ec93ee2babe953ed", + "0x8eebee05702bf1574b12597b72a86d5badef064879fa9d1b9aff5ab75e5c71d81d8bc404f2614085855d6ed87f581238", + "0x97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699", + "0x8302ad0f2234535b55b975c5dd752c8a555d278b85b9e04e83b1db3bb2ae06f082f134d55216b5cacbf80444e1d0af84", + "0xac66f3a7041586ac1576e33598f01921e16d99afbf4249c3350f0ee1654de98bd37a61c243eb6a18a942db529e36af0d", + "0xb0ed68167a67490bd7d7d49e83341606d6e6fdd99b82e46747c2190d270719f81c5f5f8733646c246260f438a695aa3a", + "0xb28df3e04bde4ec373171401dbd0546f4cb6fa8e9a4a8019aadc653d4e05e0b5b9a64417715dd87f6df9e7b3145f6659", + "0x917c4fd52538d34c26ccdd816e54ebea09517712aa74cec68a2e3d759c6a69b5ccb4089ad1e0b988e916b2ce9f5c8918", + "0xa60c4db2f208cda284b2a2def60024f3d88873191a88f6b71cea186a79c8c2af4e84692f619b17d9dc2f5f3dd20c7e35", + "0xb5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266", + "0x8804338968d999be8bc1466b29a928a7a52dad4e8332599d38879c0d7d202c248ebde96fab8b00efaf196c67263bb481", + "0x88ad79a0320a896415e15b827a89969b4590d4dfa269b662bdc8f4633618f67b249f7e35a35884b131772d08025bfc32", + "0xab26861b907d0ea03ab1888555d5d6786d7231b8e4b60f8d6545b48220e65248576f11878efb2e87d7e04fc482f72e3d", + "0xb8a6c999068c13fb71a99d75eabadf7edd2d32e28607baf001a0aeec412fdd3575602c68d3feb4d743b90396705e37f3", + "0x8f44c43b80a3c5f488118859fab054745cfe5b0824821944b82fcf870fda6d93489ea9ca4220c24db2f4ad09c6080cb7", + "0xb455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839", + "0xa80ac2a197002879ef4db6e2b1e1b9c239e4f6c0f0abf1cc9b9b7bf3da7e078a21893c01eaaab236a7e8618ac146b4a6", + "0x8cd9d7e953c7ae07ee785d68a999e702565960d376692d9ea468556ad141229b1f3bc97926818c078901f73ecc578e93", + "0xabed4c86ffc31393f53cc0880ded0c2865df897a56a98a5ab04736623957bf489fb174d9dd8cfcae17c2abc2a77d6914", + "0xac7983d50ec447b65e62ed38054d8e8242c31b40030f630098ce0a4e93536da9179c3f3ae0b34a0b02aad427a97ee60d", + "0x8bdb7d92915d1019732a095d962b0ca56bdd15ba22611170ed44c880ea0170cd2bff0dff388a1fed467a92fd756aa5ee", + "0x815922ad356f490910e8cc3b0f7d3934b5e28c09711b5151ae8329876670f3de6d7a3a298fd97b580ac8f693305afb21", + "0xa3615114600b4e805a45a04b16aa53c2ca5d8a39fe6efb3d359d8436583cb94719be750ee2fb4bb29823b4f2184258c2", + "0x95614544f65808f096c8297d7cf45b274fc9b2b1bd63f8c3a95d84393f1d0784d18cacb59a7ddd2caf2764b675fba272", + "0x90f4476224b64c2a5333198a4300ece8b3a59ae315469b23fd98dadcdceaaf38642d2076e9cd0bfacc515306f807819f", + "0xb4790910e2cbef848448f24f63e9dd4a1b122cf65feecf152d5fde282ad6fcc6ea3f9cc23178baf85612020795e4b13a", + "0x831d72bcd210b8ba3cf93029473ac297f0bac9eded0d873e4b9990973434f9132584a66edaf651512235fb1875370ca5", + "0xa32a5bd9b7bec31dd138c44d8365186b9323afbba359550414a01e1cdb529426bfa0b6f7daaf3536e9402821faa80003", + "0xb77416ea9a6b819e63ae427057d5741788bd6301b02d180083c7aa662200f5ebed14a486efae63c3de81572fe0d92a9c", + "0xb2574396e4360c971ebd71aa7e50d1683bd899fb1f404497c2a97129ea9d7e0a2642dfa8e0bd232ffb6ca443dd7a9683", + "0xa48b1031ca2f5a5acb4dbdd0e9a2b4e9add5ccfc0b17d94818273c8df11e825193fade364e0aec10f1ff91d57d03a52f", + "0x8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01", + "0x8c016e86b7aa752edd697c022116713d6a6b61538c7e46f4d76c99c29313615ec18cd21f48d99d495db3d9ed09fe946d", + "0x9604da21e23c994a0a875ad5e0d279c79210f7a7de5c9699fac4aebbd76d39b703eeec5dd5efc9ad6b9dc58936089ddc", + "0xa54e104339286d3ce8271828fbac20f6cf7afd3b72d9b194b7cbaf65f6612416117be492bf4aa88faf6ada56cf4b6462", + "0xa020404547407be6d42856780a1b9cf46b5bc48122902880909bdcf45b204c083f3b03447c6e90d97fd241975566e9bf", + "0x86b1cdd26ea9a3ae04d31a0b34aa3edc9e8d038437152214d195381173e79e4ccf7f8f0ce9801086724a1c927c20e4c8", + "0xb576c49c2a7b7c3445bbf9ba8eac10e685cc3760d6819de43b7d1e20769772bcab9f557df96f28fd24409ac8c84d05c4", + "0x98eccc5eeacef24188409d380b772cd5c72f376c461032cf2852fb8ce2afb37567c059e5b004395ebb5d97fd31028407", + "0x8a978ee4be90254fd7003ee1e76e5257462cbb14a64dbca0b32cea078908d7da47588a40ffeb42af11a83a304608c0f7", + "0xb6652440bd01316523feefceb460158cd9ba268dd8dbe860a0271f0176230f057767597e4197885ba907318ca202ba06", + "0x8027bc62b59f9f15613e38da74ccc71fc3eaee26f096d187c613068195ce6eb64176013f2d86b00c4b0b6a7c11b9a9e5", + "0x930f71b09a368b8643583bba5181e0074b1ad465f9bc4cf37e222b940412b4e09e1f2172226fc5a6fcd6d50cbc9625e8", + "0xb67146b202afec0132ac0070c005cf664081e860339f8f4d45ac3e630dda05560936e646673e652d08cecd8d18fc64da", + "0xb0a4c136fb93594913ffcebba98ee1cdf7bc60ad175af0bc2fb1afe7314524bbb85f620dd101e9af765588b7b4bf51d0", + "0xadbc658d54f46fc805767257f5e87d013112f0c6335605e9e763cd4745a1271b0e0b83902d5aaea6f8b46485d2e82042", + "0xaa5312e04adcb3b3d2264ecc9571ce861da7668fe7cd43dabd7ba9e7194a4d5fa7c8d4db3d25c4dac4a1d4f419959186", + "0x836075979eaf386ff6cb459cfd48fed171ae812b0ac3b38dc24dd8ca905cac1c600be717d4a0defa0a854f40cfaf8c33", + "0x87ae7d29e5e2f0ad0fb347c2977b256d70861f505edae4adff37e07552d55fe87e9c240d82b96e114517ee4d9f178737", + "0x95fa868db7592c5fb651d5d9971fc4e354dff969d6b05085f5d01fb4da1abb420ecad5ecb0e886e0ced1c9de8f3d5cfe", + "0xb3b7af9258af054362d461a74fcfeb6dcf3a37b6e33b6df32f8317d50d8be8e1970818a6e41c8232b89e1c8f964c6c1d", + "0xa4c665a3e4e25a7af51e433c978573841bfa2c75c075e17dd1f43b2f0369249f3d3a46ff51051e8ce7da528b0fa98d16", + "0xadc806dfa5fbf8ce659aab56fe6cfe0b9162ddd5874b6dcf6d658bd2a626379baeb7df80d765846fa16ad6aad0320540", + "0xaace45334070c51cc8b3579598d4cd8cda2153bba51f56e3b1fe5e135c83ef70503c322756b9cad9d3cd28f1ecfc8227", + "0x9427579975e81128057097972bedda9f0240c97233631a23c50ce1a007c0d0d5898deb0daccf4e1518dfb9abba81bf71", + "0x980d3c8ee365a5393fba1a90bf4e1b9c8558cfb51fccbe25837b06e44f5fc80ec90b9b14266098c7ddeed3d4e20a7581", + "0x98d6d46f603afebcbc561c130e416d5a588a7e6c1f17f89ed6e30538b7f8dbf4b3c75b8a3331425c4ca21e03fe8b57f3", + "0xb4aa92a60de61ad089cb027ef19a211c720ec0e51743b1166e3d71bac08a9ffff2f0687e250c6a7e1db866f7c4ae8f29", + "0xb87a03970caa520f0026a0320c6c687dd50c22a7a59cca13275852c3c78e77f3c381ba23fc92d36b262c6e8544f7c8dd", + "0xad287ead156048967ee1f166f023defcd756681f7fcb24d4eb643a2e2f17a102392fc5f60fb4027805ab1631084cdcc2", + "0x8ed7790f87f6975e0f3e501901b0bec1778c88bf39588989014c5dda76c2163732e7e5703c9cb2c1a6144ffdac5dcbab", + "0x80bdb82b7d583bf1e41653966b0ba3b4fec0e7df2ff08e3fa06fd9064bca0364263e075e1582741a5243bde786c9c32e", + "0x9467b7d5d90b8653b8a2f248f30475856e28407dd3fbc4e1a84445a8f2da5e181796e1cc5c293aab60a6f8a8aba1f4e3", + "0xaa24c5f9572e24e9b209ff761382e263047eba12532b9fdf7372d33e2f232c1a5916dc8217929dbf0118a9045596f79a", + "0x8d47a7c2c62b459b91e8f67e9841b34a282ceb11e2c4b0549883b627c8526d9e0ebd7333ba70630bc0ec2478114b6ae8", + "0x93042dd42e56671155bb40d85d9d56f42caf27bd965c6a7a7948b39089dba8487d4d5fd30522dba6ba392964e3ffd590", + "0x8862887763e3d310e6cab9bfedc8004098287bc96a116db16373002eb34484c166d8fe87e1a76783eb68e1e27508870b", + "0xa38c974b57da968f0c4611f5d85d8014fd48594c8cd763ef2f721cfd2c738e828d41ff029e3591d7447e3125641db8ef", + "0x8bfd6a173a56b73480cc950ef266a18933ecafc86915a7453ded09efd8a0cf4466101f1373f05d48eae3e7fc5c0f7f54", + "0xa927cd0d253d91d7d3de7b0a70a3d307596c6e019dee8e5dde03c3e182460b5677f6f17c82f5e3eff38cb6d0006242ab", + "0x8effe3fb27c9f76bbd78687b743b52e6f3330eddc81bc9006ca81fd640f149d73630af578694f4530833c2151522dcc1", + "0x86c53fc078846c3d9bc47682506f8285ba4551475921fd388b96291741970c34b8de4210202e40d2de4acb6e2892072b", + "0x8962afddcb1a26cc8ccd3c993109e79a4dd747ca473b8b5ef93d9c2e71d29623b834ac945074acf118248e3ae7878a6c", + "0x907054244ae66504bdf29bd5bd0389d20687264d19d4b36272ef7762c00c1ef7a32e2c5ed04a2cc5f2403ecaca764f20", + "0xb3acfe8f25eb5153b880a03e07760f7fa30beca475843581b4878ac0412cd2038117f25a48c152e6d60ec16e4b1e9a45", + "0xad8e8e3b82f5b8c1a39efe704b0d1eddb6e2275a990aaccad0c509f3109e42ac49aeea6c2f6da02d2d0af6cfbe5598bc", + "0x845982c2672fdd44b33d2e56ad676e704c02f756b09e8765bea42b924c14724484567b55f0db42ac20cb70a7f5201c14", + "0x845a4a09941f48677e6c03699770f9a56ba72695089e432a6f232294dd8da6d34e394116a9a87f3b0902c78332af9439", + "0x8be8d356bbf35ccd5980848662b5d6361eef583b535da90cef6c07904ccfb5963aaa230ac30ad63441f60e807434497f", + "0x991a7c93f06d50ec6a4340c6751b73eb5825bad02a954e44e1e2d424af928819ebbb590c6129ce35b3f1e908e2152f33", + "0xa910ab63aef54d8da04a839995ef38893d2cf884539ec81f97b8a4dde1061a27f6d3fe41186d1b7af872c12d44f36397", + "0x82d2b1053f6610064f838b3aeec585878f86323cac357c4aed054d87595c7734729a737b29b57940884ee839e984d612", + "0xb659c05488f778fca3c918505d2d849c667471af03369ad9fa29e37bac4cc9caa18e749c62fcff22856945a74ef51356", + "0xa41cf5d678a007044005d62f5368b55958b733e3fdde302ba699842b1c4ecc000036eda22174a8e0c6d3e7ef93663659", + "0xb96e3ff8bdae47aa13067c29318b1e96a7fe3941869c17ce6662183b7b064bf261e1cea03e2a4643c993728a2606b5b5", + "0xae89e41d8cfbf26057a4078f8a5146978e658801b08814190cbce017d79beaeb71558231a72bde726fa592fb0828c01c", + "0xb30faf88fe203495aa268503bc82576f76a27f8bc8c4125b4c6f6e5e7b6880d495481cc9454713e0833317fa07da9b5f", + "0x8910f41db6952c25dfbf6b6b5ba252a2d999c51537d35a0d86b7688bb54dcb6f11eb755a5dce366113dfb2f6b56802b7", + "0xa6d9f67ca319ea9de50c3fed513269b83fa067977adfd1e9d9ee07ad61b2ac1de64a39d7b6897ab55870cf982fe481dd", + "0xa6d6ef51a361df2e8f1d993980e4df93dbbb32248a8608e3e2b724093936f013edabb2e3374842b7cce9630e57c7e4dd", + "0x8f4eba540bae99599ec8d23102894362bfb72533d8ce415901576346345d16ce4fbc5abc68f9d16251d5121431774d25", + "0x824fde65f1ff4f1f83207d0045137070e0facc8e70070422369a3b72bbf486a9387375c5ef33f4cb6c658a04c3f2bd7e", + "0xb1a3e6baed1cc37b9a67f38648f4fe365d23fb982027ab4202c3392d5459d7995264c2e9bb8e821a3e75e71390b6dc7c", + "0x8d797819318cdf7b26405d1a327d80d4c289e56f830b28d4e303bcb019aeb0b3d69bfed58adcde8a2445dd5281b86af1", + "0xb4bf70468eff528bf8815a8d07080a7e98d1b03da1b499573e0dbbd9846408654535657062e7a87a54773d5493fc5079", + "0x8acf2c566ab7a822dbfc1e535443cd1b634d0048829cf1a77421a26997ae062cd34de318ffa543528646d7732d4d5b7b", + "0xaf49306611cc619a146b04fb3b8f2a9aeab1194cc9631c04e45e37fda35cc2676ff5f29f07b492574ad7d53627132908", + "0xad83b3c5e9a08161950b1df9261d332dda2602cc68e0f5ee75bfa7e03bbef9edfb4945ca1f139df1bcb8affe8ae025da", + "0x9267c0e9c176eefab67362ddfcd423a3986b5301c9a7c1c8c0dab93fdb15e562d343a7a9884a0a3378818b1aa1e4091a", + "0x8175b420d8d4f052ae7f627490d2255c1481085ac9eecadbb49e00d828d6f93a98afa9695a30e60f35933c75920b3748", + "0x8dca376df4847cb8fc2e54a31894c820860c30b5e123b76670a37435e950f53312f089a8e9bd713f68f59fd1bf09202f", + "0xb49c45d9da4aaa64967c28f1fd77b7f709f5a331b58823eb1613856fd8f92635135981830a287e8dbda3a0e0fc481c5b", + "0xab1abf9cf630d6cbcac0c503df44603142ac81acd647784ae0e8fc97800ef04378bc9d7f2087f959ad4bbbeec65b8dfe", + "0xab88f81dc77f09a2b62078e7baf4b6c7503925a7a077bb30d72f4baeff8225039c5333242e325e824f7192d4d132b596", + "0xab9e752b54153015d503be81810be498089612b6b2f45dc197ce0b46681496001336eaeb4a12d8b878dff9eb7bc48fab", + "0x83460a65269134c7626506d8c446d8929ed704469875a3ac2342290f63639fec7a62d6fb75bf55e60a1a953e6f621e2d", + "0xa90cc5b9c4d84f36962d0d55d5bc123dbe5ec5f4fe7b6bf0d009028b3cf14e36c11bc5365391cb4ae548d5eb04fe371b", + "0x972cfaefda96f5edfe0614c01533b76153118712c1c02c505008204a5be2aa438675d97f43384199517b1c08c7c9fdb2", + "0x910fd030feb5538f538e5ba74b9bd017d889ed6d2a797be9c26d2be8caeba7a473006102de27e87755742ba34e445bca", + "0x8675d210e67eddb3cefeed200b9e205679d36d8dcad70f09e678d8d1b3eb1059d12542f3aca300f384504458a881dd60", + "0xb0a47515752c15e4dbeaf9ee27fab3b5c0db82f5c685e8f716fd7d8764164944340430fe3db1a5679e6ffea5a16dd919", + "0x8461c5b96d19b63b5872275f4ffc15e1749d2dbc9a7650cdd5a0f7c8ec64b0049c681ebaec1141e49f4dbe82a18f70b3", + "0x941c8962debd2756f92a6a0451a2bf7fbc01f32ed03d0823dffd4a61186628a4c3c7c482b18589ff65e4c449fa35c2a4", + "0xb1ca8fee56192611094ae865f5f7fcfed3f89303386e8fd93eace625217b51a2023d5b7adf7cdf070e85438cd73fd75f", + "0xa5b3da08aad945effdb645c797a0a8bfa828c9d658df2783a214597acebda3ffc07ee48d0ce1147d77540b557d9ada91", + "0xad8d94e46cc02a1c0ad27105e8f672ec15b8296051801f1918d0bd470625686e8e8a0abde8f6852b846ee8d9132b26bc", + "0x94f4720c194e7ea4232048b0af18b8a920fde7b82869e2abcc7e14a9906530be1ef61132884bb159df019e66d83a0315", + "0xac715c7b3d794860a61d9c7bd224a2b14a6023f696afa30345aad2ce0a6ea6dbc142f34af1ffe7f783542851a28e8ece", + "0xa10788831a0cb2c3d14d8bc214d92bee6e2a9e92c423d2974760d84a6872a9465d12b628f9bd8a6e777a7db6f509b3a0", + "0x8bb045e7482b7abe670d72eb2f7afe4207b5a3d488364ff7bb4266f8784ea41893553a4bf7d01e78c99ed9008e2c13bb", + "0xa42c46a7e617d78b12053d7783f0d175fd9103db06d0c6982b38893a20b72fd8ad8501eacb3d47be06fd7c3ad89a8159", + "0x92d00e64ed711951aeb852908aeb6fd379ea516872dd512384b1e773ef078e52e6d618beb202d437d2a46bcb78087f7a", + "0x880b99e77a6efb26c0a69583abb8e1e09a5307ac037962ddf752407cacaf8f46b5a67faf9126bdbcb9b75abf854f1c89", + "0xa2b27f2a3f133d4f8669ddf4fccb3bca9f1851c4ba9bb44fbda1d259c4d249801ce7bd26ba0ee2ad671e447c54651f39", + "0xab7eff4ef8696db334bce564bc273af0412bb4de547056326dff2037e1eca7abde039a51953948dd61d3d15925cd92f6", + "0xb07d7c3f1d486f5657d5935e3d67403024ffdcf25da5c460fdadc980d8d6b931de623c4f8a3da5eb6af346193eb36573", + "0xa3d8610c2522d330df02511710e52b1d9bdc9f2b156deca12b1bf754266caeac4f449ed965d9863558df43ce9ae65a44", + "0xb19ca6e55f349bbb2dc3e429520ff5b2e817972470794f35c1aac8c118b37a694cfcc875b6d72225343799825d2f5c39", + "0x8b3256d82701d887c382cd237ac4f5673518fce465936744348ed39b73ab9e070ee8a442341e84020e2ed623b113c9ae", + "0xae36ab11be96f8c8fcfd75382bb7f4727511596bc08c25814d22f2b894952489d08396b458f7884d6b3c0adb69856a6d", + "0xb0eecd04c8d09fd364f9ca724036995c16ba6830d6c13a480b30eb2118c66c019cfdc9dacce6bfd8215abe025733e43d", + "0xa802b9ffbd4f01b877791aba27da972be4bacacc64a1f45687be4af01b84bd4b83fe2ba1ea78e29d7683f6c777ab2543", + "0xa73b3c9d16f6c63659179b74b1aa5a0f4447c683ba38f9fc112efaccde4835e5b92c2f7041fa82cd90b2c4932704b9ac", + "0xa734a3c947be4c7e6704639d4400aec2ccf5f1af0901b41a29e336afb37c53bf168774939ce51f32d4496bce1a32e612", + "0xab671eb947490c43fd05e42a787344b21af89babb705393c82748eaa0cfcf80bee498d275a1eaf1d647ca3b2923d76ea", + "0x9276e8051bed8f5dbfc6b35765aac577dd9351d9d6ac1bb14496bd98091005b9a4737b213e347336413743f681f5043b", + "0xb930ecc2a26183240f8da107e80979b59da4e05f090316d982815ed6151d7750490b85273187ec4e07eb221813a4f279", + "0xa922d48a2a7da3540dd65bda3a8b5fb1f1741604e2335de285ac814c69c40b5373d92bc1babd3e4b2d32993f251c70b5", + "0xa9300a33927335f482dd0e44d0d57704ebeb278f732ae8301073cb7d5e457f02a0cb03268de71d284b8c23fb96947469", + "0x813bafdf6a64a9c40ef774e6c8cad52b19008f1207fc41bd10ad59c870fda8089299dd057fc6da34818e7a35b5a363e9", + "0x8528cf6ed82d9f729f9aee83c3ef763d85649d46019c4ca7dfb58d7824c2003f88ddb2bc5a40c4d78d86e68b675f4e56", + "0x9408bfab1e7ac8b8b888c623bc0438b3a3460aff12436d13888315f496fdb808e9dc00894f272f348ed6aa475f848c49", + "0x850f932ef35fd8693816d950e6209bc04ce26762cf6747d0aee03770e386fa0189790a8295414c0b27695b70988a3c5a", + "0xb6cacc458ca5a0f04836c5640d34c70cab34cb5c87df28579a0d5e2c72edbc092814bdbe902747ebe3ce36808d8f4dac", + "0x96b1c82b85cdb8a7026fd3431bea9cd008f0261ee7f4179f4e69a399872837ab836a14e2dd45f5448d54800a4ae7c7f2", + "0x9722c1079db7e2e1c49756288a02302b43b8fd92d5671585ac1ea7491123742a2744a526c12c9a0b4c4a80f26342a3a6", + "0x858b6f1bd3e68fc536bdf1f4bd96db032994eb76e71571e2d85af73b898478b82f9ab432732b0beebc0864ad8025ae33", + "0x824d0dc002e158adef06fc38d79b01553be5a3903566029cf0beddb2248b11da40e66feb168e8e3e2a63ea033a75f382", + "0x8a00780f008ac29b4942ded67224be5549cdce47d047c2ca6458af643332ef5e276a69cd38b8c50f8767c6e27d5f905d", + "0xb611e52def8da2a83989f5b8391fef61774b980ce82ee2fe0acdf24e4efb81f40b9c9abb0a2010e843101efc170f9832", + "0x86b3ec14a8ffb811a0ecc3771f600d8b08c098537d100fba66def19e7ee4d1c397a311977bf37e6cd2d47a8a2ee8c223", + "0x879bcbbeab235bdb1e3b1cd59b70cedba4772a616934d48195a01c38f745d61f3ab31e60538937e65450150e9314e481", + "0xb1f43b498cba1797f9793dc794a437500c3c44a8a4b59f9125a4d358afa304fc05b88ac31ed40b6eb68f0396b60cb7cd", + "0x91013e0d537fb085a49bf1aa3b727239b3e2c1d74c0f52050ff066982d23d5ee6104e70b533047b685e8b1529a0f14dc", + "0xa0e68d24f784fcb2b71acc2d5871285623c829d0e939146b145e04908b904468a67c07a2f156e6b17bf531adc5777c4b", + "0x91659e4ff45b9f2941cb41cd33553f29c4b65be9dc68d747467f2b5e39b9bec12dada05ec514255b4e9da31ac819d8d7", + "0x87c6cb9ca628d4081000bc6c71425b95570291eb32ef2cf62416bd1ce3666eb2ce54accd69f79d506cefbfe6feb5a1da", + "0xa778da56ddfe4a383816b43b027464d7a28689fc4a6b35b36883d3f36d9c41f0177bdbfc8f258afe8da90f02d3b64fea", + "0xb43fdb2ba9128fd24721209e958be7b9c84dca08387c982723f93ed4a272f933823ae084f1b1399ff6271e0da6f5aa3f", + "0x94bcfcf974e77d5683704888621ca6f29bda9c5913472f9aec2cae03cb4a3b4237f8648c2ff1c7ecd73627d7babf0062", + "0xa684a09add047c0fe648d9c5618500d1816047168e055e8ac8c952c3544a462cc095b32fab07d939947a58fcb4ec7ba7", + "0xb9b9b6113301bd2b409b71afa1ab9e31d22f84f8cb03badaa408e1d37032350094124e533de766622d7975a047fade6c", + "0xb075db32979df905cef986cfcd6db823ac21dd4013cecfe088885390ff8acd18d76dec793b80db5f7779426127daed7b", + "0x9330a8d49b52cc673adc284c5297f961c45ec7997ced2a397b2755290981104c8d50b2fea9a3036ac2b1c329feaf4c7f", + "0x92f0bf3257e775c5c469cd9a43249421c9fd223996aeda09654045b885a512e86bd834b2947aef216b4d9dd5f8f2e9aa", + "0x93947508e60df6a0bd8b3fa24a72ef783c9fde1c3d94de0101c75e0e73d8003d9beedfdf9f40375613180d77815950dd", + "0x885c3475185e7a857c789f148944fafddb5a118163d221e87d7126dd03ad8fd56f9be90c536ebd52c0a7a31b6ee40a4f", + "0x86bba46d0031989d0f1baccea4174fc3fa0d595e60d35a464e86c33c233e2d6def84fced7a00f59afe397cf4fb5b67c5", + "0xabe68d5cac6809960b97b09c8b834f6672a66211dbdfc6fba08342453eca026455f904ad215d07d438652e18d1d19cb6", + "0xb18c41c0f827f6d8656d3fb93c90b663eb2eac034923972f8842cb30e96c32842b3fbc1127930e1ba4322d5b6641f04d", + "0x870286c76b360f9dd862e7900e9af235d4ade37c0970b88a23b56e27307b8bb2a4ffa4c19176581d39faa7d87711ff6b", + "0x80e09f3bf3ea87d48e04b53d8f3b43b7e53d61f445f8c8a5a35472b84f6bb4f58f17d9832f5881bb44fc06156151e5c5", + "0x93be3d4363659fb6fbf3e4c91ac25524f486450a3937bc210c2043773131f81018dbc042f40be623192fbdd174369be2", + "0xa6565a060dc98e2bfab26b59aff2e494777654015c3292653ecdcefbeeebd2ce9091a4f3d1da10f0a4061f81d721f6ec", + "0xa70a5be6546e4f745aeca090061792584915c6a075bbca14c3eb34d0fc2a7b7169b20199be10b242fd0d7923aa70e71f", + "0xac754a42f279472760bd36dd0cf36f5ec685e7fc2970c275811a70cd05843f94fe21745dddbd54135144edf1793aa0cc", + "0xaa0b0ef6abddbb4931fea8c194e50b47ff27ea8a290b5ef11227a6b15ae5eda11c4ab8c4f816d8929b8e7b13b0b96030", + "0x942a12ba2f7b8708afb97e8ecba8f4ce66df1f862ceb86b3452f9b80eff581ee729f0f3122c6234075c6970270e2c367", + "0xa79ef16ee66514c2a4f34605a624dbb40d446f2637f943a4acdf0154c162fa12b30e151f03fb1a1cf100052186f94ce8", + "0x895acb28f67f5b579ce0ebd9a7ef27aacef364f8e3ddd3f50f7bd7524fde35baccac627d5f43e51bbebbc72e26a07e41", + "0xb0526c028e1c9a945e340d05087ff0e4b0e465a99369d3fdb8b929e79d02fa34f316741a1610076d33212ba7d357d4b1", + "0x8f2895cb8c77c498fd4fc0b572115c859168fede213379aa8fa6914f3b1ae2d369a14743e277249611995296de206751", + "0xb77cdf45f39bf85ab3e8c8afa602f159de8352188aba5378957d468315a2d2326daef83d8ac6b227f1e7a514488afbc6", + "0xa9fdc2209bbf48970a404de3d803c65b11be96ab5a165183d05ed6477b3a0c633c3d6f0cb8eefb430fddb5b5be8cf887", + "0xa26dd9b28564c3d95679aca03e3432ac26e287f80e870714c5946b05538b3cb43bba7b85c16bceb5430e81b7a04c1b1d", + "0x95370f2c7c8c14976e5380b300451eee0dbce987b68ed96f2d13f2340f4e4e4cfac52987377b20e4e6cddf58c7975606", + "0xb5222582ed6604b9856a48039bd643340f4bf1bf0fc805e8453a9eb7630d6cea1452d28536706d6fa3ec16617617991c", + "0x86ca8ed7c475d33455fae4242b05b1b3576e6ec05ac512ca7d3f9c8d44376e909c734c25cd0e33f0f6b4857d40452024", + "0x8d5776148c65e35d717da1902d74727b3bee21ceba8d337d77738932865f1b851e810b91346f705880da6cac63183717", + "0xa267ed144cdd3099c7c418ae92e8f4696704c2c9dcde5ffccc3118c21abe09e3a05e78b067430d4fcfca0f8b1ad0714e", + "0x998c9ee20d33f96a2388b1df642aa602bc8900ba335e8810baab17060c1eace4bc5203672c257b9ae750008b707b0aa1", + "0xa4f964d672fa5579479e939d2d5dad6a5dac6fca4bcbf7d5ebbe7489f3809131667b41c3472addfe766d83202ea29c1a", + "0x949cf015ce50e27cf5c2ff1b8e2e066679905ac91164e3423d3fb7e05c64429e77e432db0f549acb99f91fb134b6edad", + "0xad2aee9a61242235f0ef6adadd5d314b18e514083d6a589ca65cc89f505e44b480724d7659a87c95b03c62caba53f487", + "0xb586e67ae1826a1cdd651ac785e4b38f8a0e042f103a9b7dbb0035626d5dec3ded04a4e2cc09e63b4b01aebe304e40d7", + "0xb5eb31e5cba0193e74968099ace5808dfc457c6f404f270fdc4949b60daa7607ba1811abab1bb19fccdad61d489b6657", + "0x9793a74fa578ace75b083578277a1ae8766d41a5c508b0f1135fb97dff1d0826002393a7276b18cbc4b3c5671360ce0b", + "0x89681684a4f5a2e56a4acd37836c06cfe8613b0694d2258f8ccee67796e76f49dd9da349b1c23a36f9438097c1e6415e", + "0xa3ee8fd53158dad3b6d9757033abf2f3d1d78a4da4022643920c233711ff5378ac4a94eadcaf0416fdcca525391d0c64", + "0x980508c4d1e655cc6200f89a884b3a25c0c05708a3e4a101205c4fd901c3e20a943071a6300bb2614be41a139d4ef1df", + "0xb37a2ec9dec3d7d9cbc911fa1e5310a47d23a841d02c8b99a923991c73fc0185d130a494748c64f2b5a4c07bcd06920e", + "0xb40504588a8ee3e0da1b60a304b865ce77196dd506e32d532e22eac9acfd2d03d3106be7d65b5c935191815a301b0f27", + "0xabbe4d05e3781e11bec29f37876e0081147ae092f4061191444bbf744f327c9dc05b2ff66487942b64d6b3c099334644", + "0xa9a591fdd18aec8746435eeead0a54bb88e055f55e91ffdd9bc663ce0bc2937fb296034ebb959d6adcf9af94bbd2f49b", + "0x842ba3c847c99532bf3a9339380e84839326d39d404f9c2994821eaf265185c1ac87d3dc04a7f851df4961e540330323", + "0x987dd977d6b8d27c4065b61b3c078ec9ce3871fec02844ed00f5ad28c42f9cedecbe830ddd19e11a5c879b01eb0f8f80", + "0xb60df25a7ac1ad14aef7e8809c4bfc190b715f94f14b0534cc2e4015ff6c322883cbdc5309e05d67dca4bc641c69725a", + "0xa154892ff23b284040e623bba940a6a1ef1207b8b089fc699cb152b00bcce220464502cfa1dfb5a2f62e6f3960cdf349", + "0xa13bf1fc1826b61cceefcc941c5a4865cefdfa6c91e5223308fa6a0aa6e7b13a0499a63edf5d9fff48fdeae83e38dcbf", + "0x8295f613c162159f368340ca0fc2fd7776f7ad64eeafbd132bd3be1f1c30b5fbdc5f107f12fb0cff15b12c08621f457f", + "0x938dc1e182f19f40ba9a4eb5530407e58dac27a237b259fad4ff070c8abf98a0fb107db6017e1da25a855c8867e80bae", + "0x8d50e904d851a5d8e01d7902d8a67b978571705caa5e58db3037350906f96db7bb141354e29ed9a47ef5e59914dcbdc4", + "0x8fb74891a8642f25a55b5eda5818367aac2fdf9663ad1e3dbc0166b484c0cda581b243cc75131167f1afa9caaf6705a0", + "0x868c13bb6bec7d56afd4e518f2f02b857a58d224fbe698be0e00bc178c1858e6bf5f0f7824fa013d5c8dd6f6e4147974", + "0x902a533bdb93794d150e433084c4c8200555d96fe88f145c2cfaf16ba69cc534e86cc5a88f671851da7f6c11a02df6bc", + "0xa6e387cfc0e2f11eb72c7d94693a28d23250c45e4dfdbb2fa588519bc7afe60d454c6b545b1e97f2b1100f564fe0f220", + "0xb8038a6569c69c5aa70db534088fa304a44a76eac1cbebecf7bca07d7b6667063b0ca36d225687581dfba677122a3c5f", + "0x884c769ff3dabc132330e4a72ecf5331490ff08a59b7dd51cf2a9cf803a1a3dbff838f40451b243786661eb1630a60d0", + "0x820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7", + "0x9195c1fce36bed493e27cd8ef8af8f22bb61658f99887fa871c95c21caa2579479eae5fa9c9262d235a237da26bc63aa", + "0x86edef59ab60ce98ae8d7a02e693970ca1cc6fa4372a59becc7ccca2a95e8f20a419899c8ccbb9c3e848f24178c15123", + "0xb3e313e79d905a3cc9cc8a86bd4dba7286fb641c2f93706adb3b932443e32eff2cbed695beeb26d93101c53d5f49d7db", + "0x8cc8d279ec08d0a5a2a09ad07fabb0122eb65f48da2571d83f86efa2c1c5bc51b04ae94b145f0a8ef19a3988638b9380", + "0x80e30cabe1b6b4c3454bc8632b9ba068a0bcfd20ce5b6d44c8b1e2e39cbe84792fd96c51cf45cf9855c847dc92ce9437", + "0xace596da3d8c878c8209ab965a1f6a5dd521ad468d0574c4ed74a5a15b9c6ba25fb622daab349daec0a1c4cdc731f502", + "0xa2db08cf00d7c15736c4ea83b0747eae36789910c58519ad10374d82a502ea289a844791a26ddfab30d0b5f16c63fadb", + "0xae2dbb2750d97e94ec0fc9da1c4096259d89429120e4da43e5a74fb3494778f457426428e73ab54f9e9ea939f8fdd3c5", + "0x8f7dbe5a57f7b0a45b7c9d87338b8ff67ce9977e2ec669f5502e77d1be30889a7976819c45c787b279b4dd96423b3715", + "0x99bd3fca280b3ad67f5b2d193de013287cade76d7414f4828ca6fa2506e6e8e9dab300207af0897b9db14608ae15fb02" + ], + "aggregate_pubkey": "0xafb6562affab421bc5fb76688d21020cfc8c76b8e0b0b091ae71bfad482e455c13c532ac5414de6f408c56ff1118e89c" + }, + "current_sync_committee_branch": [ + "0xb3903a9fb6c43cbdd5b42e93e8f26795ea452c4afcae1f7129747619080aca70", + "0x637e1423ab16cddf6e5f327241c6ca0722cf79f6cb81f118c3d8df4262d46483", + "0xba0467670d61ce2ccc4b0e86ed9096c18cc242cf70e1a662844f156316294827", + "0x6d5e978c26491177b95f0705037779716f39bf4c05c607e369918d335787abb3", + "0xbf315aa2bef815607065ba3456aa1d376f225fa7051e0fe7d9594d12f6ba56f7" + ], + "validators_root": "0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078", + "block_roots_root": "0xd285c201b20f41aa2491b8b6b91c0b621fbc224284a9e7a541cc631ef067b71c", + "block_roots_branch": [ + "0x1f6725e5060fe5a9ee5c8b98558fc3370ddac4c2337bd1290ab0acff7121da10", + "0xfec3517500fba1449fc98bd4e9622aa45e8b81776895e0a8d0fcec22862a2c57", + "0xce98f6d3b7f4ad1ecabf9442d34f1a09b1b2786a50e886cb6b5525272de6e9ca", + "0x8f415cac784fe5bfccfc90a4c459a96c9f5d2777f71b4c37dc90226279831616", + "0x9d443de8f0b598e5dc294d18896bf545636ec0f7d7d9362e015ef8ab54a5b019" + ] +} \ No newline at end of file diff --git a/control/preimage/Cargo.toml b/control/preimage/Cargo.toml index 54650be4c8..952d46ab85 100644 --- a/control/preimage/Cargo.toml +++ b/control/preimage/Cargo.toml @@ -37,8 +37,12 @@ serde_json = "1.0.114" sp-crypto-hashing = "0.1.0" handlebars = "5.1.2" +westend-runtime = { path = "../runtimes/westend", optional = true } +bridge-hub-westend-runtime = { path = "../runtimes/bridge-hub-westend", optional = true } +asset-hub-westend-runtime = { path = "../runtimes/asset-hub-westend", optional = true } + [features] -default = ["polkadot"] +default = [] rococo = [ "rococo-runtime", "asset-hub-rococo-runtime", @@ -50,3 +54,8 @@ polkadot = [ "asset-hub-polkadot-runtime", "bridge-hub-polkadot-runtime", ] +westend = [ + "westend-runtime", + "asset-hub-westend-runtime", + "bridge-hub-westend-runtime", +] diff --git a/control/preimage/src/asset_hub_runtime.rs b/control/preimage/src/asset_hub_runtime.rs index 18bad3b5ed..bed56b85f0 100644 --- a/control/preimage/src/asset_hub_runtime.rs +++ b/control/preimage/src/asset_hub_runtime.rs @@ -7,3 +7,8 @@ pub use asset_hub_rococo_runtime::*; pub use asset_hub_polkadot_runtime::runtime_types::asset_hub_polkadot_runtime::RuntimeCall; #[cfg(feature = "polkadot")] pub use asset_hub_polkadot_runtime::*; + +#[cfg(feature = "westend")] +pub use asset_hub_westend_runtime::runtime_types::asset_hub_westend_runtime::RuntimeCall; +#[cfg(feature = "westend")] +pub use asset_hub_westend_runtime::*; diff --git a/control/preimage/src/bridge_hub_runtime.rs b/control/preimage/src/bridge_hub_runtime.rs index 79406971b0..0b574870a9 100644 --- a/control/preimage/src/bridge_hub_runtime.rs +++ b/control/preimage/src/bridge_hub_runtime.rs @@ -7,3 +7,8 @@ pub use bridge_hub_rococo_runtime::*; pub use bridge_hub_polkadot_runtime::runtime_types::bridge_hub_polkadot_runtime::RuntimeCall; #[cfg(feature = "polkadot")] pub use bridge_hub_polkadot_runtime::*; + +#[cfg(feature = "westend")] +pub use bridge_hub_westend_runtime::runtime_types::bridge_hub_westend_runtime::RuntimeCall; +#[cfg(feature = "westend")] +pub use bridge_hub_westend_runtime::*; diff --git a/control/preimage/src/commands.rs b/control/preimage/src/commands.rs index 1e64e7c79c..83e6032262 100644 --- a/control/preimage/src/commands.rs +++ b/control/preimage/src/commands.rs @@ -28,6 +28,48 @@ use crate::bridge_hub_runtime::runtime_types::{ }; use crate::bridge_hub_runtime::RuntimeCall as BridgeHubRuntimeCall; +#[cfg(feature = "polkadot")] +pub mod asset_hub_polkadot_types { + pub use crate::asset_hub_runtime::runtime_types::staging_xcm::v3::multilocation::MultiLocation; + pub use crate::asset_hub_runtime::runtime_types::xcm::v3::{ + junction::Junction::AccountKey20, junction::Junction::GlobalConsensus, junction::NetworkId, + junctions::Junctions::X2, + }; + pub fn get_asset_id(chain_id: u64, key: [u8; 20]) -> MultiLocation { + return MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(NetworkId::Ethereum { chain_id: chain_id }), + AccountKey20 { + network: None, + key: key, + }, + ), + }; + } +} + +#[cfg(feature = "westend")] +pub mod asset_hub_westend_types { + pub use crate::asset_hub_runtime::runtime_types::staging_xcm::v4::location::Location; + pub use crate::asset_hub_runtime::runtime_types::staging_xcm::v4::{ + junction::Junction::AccountKey20, junction::Junction::GlobalConsensus, junction::NetworkId, + junctions::Junctions::X2, + }; + pub fn get_asset_id(chain_id: u64, key: [u8; 20]) -> Location { + return Location { + parents: 2, + interior: X2([ + GlobalConsensus(NetworkId::Ethereum { chain_id: chain_id }), + AccountKey20 { + network: None, + key: key, + }, + ]), + }; + } +} + pub fn gateway_operating_mode(operating_mode: &GatewayOperatingModeEnum) -> BridgeHubRuntimeCall { let mode = match operating_mode { GatewayOperatingModeEnum::Normal => OperatingMode::Normal, @@ -218,23 +260,14 @@ pub fn set_gateway_address(params: &GatewayAddressArgs) -> BridgeHubRuntimeCall } pub fn make_asset_sufficient(params: &UpdateAssetArgs) -> AssetHubRuntimeCall { - use crate::asset_hub_runtime::runtime_types::staging_xcm::v3::multilocation::MultiLocation; - use crate::asset_hub_runtime::runtime_types::xcm::v3::{ - junction::Junction::AccountKey20, junction::Junction::GlobalConsensus, junction::NetworkId, - junctions::Junctions::X2, - }; use subxt::utils::AccountId32; let chain_id = crate::bridge_hub_runtime::CHAIN_ID; - let asset_id = MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Ethereum { chain_id: chain_id }), - AccountKey20 { - network: None, - key: params.contract_id.into_array().into(), - }, - ), - }; + #[cfg(feature = "polkadot")] + use asset_hub_polkadot_types::*; + #[cfg(feature = "westend")] + use asset_hub_westend_types::*; + + let asset_id = get_asset_id(chain_id, params.contract_id.into_array().into()); let owner = GlobalConsensusEthereumConvertsFor::<[u8; 32]>::from_chain_id(&chain_id); AssetHubRuntimeCall::ForeignAssets(pallet_assets::pallet::Call2::force_asset_status { id: asset_id, @@ -249,22 +282,12 @@ pub fn make_asset_sufficient(params: &UpdateAssetArgs) -> AssetHubRuntimeCall { } pub fn force_set_metadata(params: &UpdateAssetArgs) -> AssetHubRuntimeCall { - use crate::asset_hub_runtime::runtime_types::staging_xcm::v3::multilocation::MultiLocation; - use crate::asset_hub_runtime::runtime_types::xcm::v3::{ - junction::Junction::AccountKey20, junction::Junction::GlobalConsensus, junction::NetworkId, - junctions::Junctions::X2, - }; let chain_id = crate::bridge_hub_runtime::CHAIN_ID; - let asset_id = MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Ethereum { chain_id: chain_id }), - AccountKey20 { - network: None, - key: params.contract_id.into_array().into(), - }, - ), - }; + #[cfg(feature = "polkadot")] + use asset_hub_polkadot_types::*; + #[cfg(feature = "westend")] + use asset_hub_westend_types::*; + let asset_id = get_asset_id(chain_id, params.contract_id.into_array().into()); AssetHubRuntimeCall::ForeignAssets(pallet_assets::pallet::Call2::force_set_metadata { id: asset_id, name: params.name.as_bytes().to_vec(), diff --git a/control/preimage/src/constants.rs b/control/preimage/src/constants.rs index a45a1ebe84..2026906c73 100644 --- a/control/preimage/src/constants.rs +++ b/control/preimage/src/constants.rs @@ -24,3 +24,17 @@ mod polkadot { #[cfg(feature = "polkadot")] pub use polkadot::*; + +#[cfg(feature = "westend")] +mod westend { + pub const POLKADOT_SYMBOL: &str = "WND"; + pub const POLKADOT_DECIMALS: u8 = 12; + pub const ASSET_HUB_ID: u32 = 1000; + pub const ASSET_HUB_API: &str = "wss://westend-asset-hub-rpc.polkadot.io"; + pub const BRIDGE_HUB_ID: u32 = 1002; + pub const BRIDGE_HUB_API: &str = "wss://westend-bridge-hub-rpc.polkadot.io"; + pub const RELAY_API: &str = "wss://westend-rpc.polkadot.io"; +} + +#[cfg(feature = "westend")] +pub use westend::*; diff --git a/control/preimage/src/helpers.rs b/control/preimage/src/helpers.rs index 3f0ee1c7ef..907c451b0e 100644 --- a/control/preimage/src/helpers.rs +++ b/control/preimage/src/helpers.rs @@ -8,8 +8,11 @@ use crate::Context; use crate::bridge_hub_runtime::{self, RuntimeCall as BridgeHubRuntimeCall}; #[cfg(feature = "polkadot")] -use crate::relay_runtime::api::runtime_types::xcm::v2::OriginKind; -use crate::relay_runtime::api::runtime_types::{ +use crate::relay_runtime::runtime_types::xcm::v2::OriginKind; +#[cfg(feature = "westend")] +use crate::relay_runtime::runtime_types::xcm::v3::OriginKind; + +use crate::relay_runtime::runtime_types::{ pallet_xcm, sp_weights::weight_v2::Weight, staging_xcm::v3::multilocation::MultiLocation, @@ -24,8 +27,6 @@ use crate::relay_runtime::api::runtime_types::{ VersionedLocation, VersionedXcm, }, }; -#[cfg(feature = "rococo")] -use crate::relay_runtime::runtime_types::xcm::v3::OriginKind; use crate::relay_runtime::RuntimeCall as RelayRuntimeCall; @@ -172,7 +173,7 @@ pub async fn query_weight_asset_hub( pub fn utility_force_batch(calls: Vec) -> RelayRuntimeCall { RelayRuntimeCall::Utility( - crate::relay_runtime::api::runtime_types::pallet_utility::pallet::Call::batch_all { calls }, + crate::relay_runtime::runtime_types::pallet_utility::pallet::Call::batch_all { calls }, ) } @@ -181,9 +182,10 @@ pub fn force_xcm_version() -> AssetHubRuntimeCall { junction::Junction::GlobalConsensus, junction::NetworkId, junctions::Junctions::X1, location::Location, }; + let chain_id = crate::bridge_hub_runtime::CHAIN_ID; let location = Box::new(Location { parents: 2, - interior: X1([GlobalConsensus(NetworkId::Ethereum { chain_id: 1 })]), + interior: X1([GlobalConsensus(NetworkId::Ethereum { chain_id })]), }); AssetHubRuntimeCall::PolkadotXcm( diff --git a/control/preimage/src/main.rs b/control/preimage/src/main.rs index c3e07721d6..121622683c 100644 --- a/control/preimage/src/main.rs +++ b/control/preimage/src/main.rs @@ -265,7 +265,7 @@ pub enum Format { struct Context { bridge_hub_api: Box>, asset_hub_api: Box>, - relay_api: Box>, + _relay_api: Box>, } #[tokio::main] @@ -298,7 +298,7 @@ async fn run() -> Result<(), Box> { let context = Context { bridge_hub_api: Box::new(bridge_hub_api), asset_hub_api: Box::new(asset_hub_api), - relay_api: Box::new(relay_api), + _relay_api: Box::new(relay_api), }; let call = match &cli.command { diff --git a/control/preimage/src/relay_runtime.rs b/control/preimage/src/relay_runtime.rs index 216d6c4383..406dabb768 100644 --- a/control/preimage/src/relay_runtime.rs +++ b/control/preimage/src/relay_runtime.rs @@ -4,6 +4,11 @@ pub use rococo_runtime::runtime_types::rococo_runtime::RuntimeCall; pub use rococo_runtime::*; #[cfg(feature = "polkadot")] -pub use polkadot_runtime::runtime::api::runtime_types::polkadot_runtime::RuntimeCall; +pub use polkadot_runtime::runtime_types::polkadot_runtime::RuntimeCall; #[cfg(feature = "polkadot")] pub use polkadot_runtime::*; + +#[cfg(feature = "westend")] +pub use westend_runtime::runtime_types::westend_runtime::RuntimeCall; +#[cfg(feature = "westend")] +pub use westend_runtime::*; diff --git a/control/preimage/src/treasury_commands.rs b/control/preimage/src/treasury_commands.rs index 59fb738af5..b48b961e92 100644 --- a/control/preimage/src/treasury_commands.rs +++ b/control/preimage/src/treasury_commands.rs @@ -1,7 +1,7 @@ use crate::{constants::*, TreasuryProposal2024Args}; use crate::helpers::utility_force_batch; -use crate::relay_runtime::api::runtime_types::{ +use crate::relay_runtime::runtime_types::{ pallet_treasury, polkadot_runtime_common::impls::VersionedLocatableAsset, staging_xcm::v4::{ diff --git a/control/runtimes/asset-hub-westend/Cargo.toml b/control/runtimes/asset-hub-westend/Cargo.toml new file mode 100644 index 0000000000..f606cc7695 --- /dev/null +++ b/control/runtimes/asset-hub-westend/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "asset-hub-westend-runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { workspace = true } +scale-info = { workspace = true } +serde = { workspace = true } +subxt= { workspace = true } +sp-arithmetic = "24.0.0" diff --git a/control/runtimes/asset-hub-westend/asset-hub-metadata.bin b/control/runtimes/asset-hub-westend/asset-hub-metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e94c484f177efeb87fe5005d5b3aafb0f003021 GIT binary patch literal 323007 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

Hi!W6w;4{28HyuLxV#4zk~*b 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 literal 0 HcmV?d00001 diff --git a/control/runtimes/asset-hub-westend/build.rs b/control/runtimes/asset-hub-westend/build.rs new file mode 100644 index 0000000000..1aaec9dcb5 --- /dev/null +++ b/control/runtimes/asset-hub-westend/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=asset-hub-metadata.bin"); +} diff --git a/control/runtimes/asset-hub-westend/src/lib.rs b/control/runtimes/asset-hub-westend/src/lib.rs new file mode 100644 index 0000000000..db14278410 --- /dev/null +++ b/control/runtimes/asset-hub-westend/src/lib.rs @@ -0,0 +1,7 @@ +#[subxt::subxt( + runtime_metadata_path = "asset-hub-metadata.bin", + derive_for_all_types = "Clone" +)] +mod runtime {} + +pub use runtime::*; diff --git a/control/runtimes/bridge-hub-westend/Cargo.toml b/control/runtimes/bridge-hub-westend/Cargo.toml new file mode 100644 index 0000000000..9556706913 --- /dev/null +++ b/control/runtimes/bridge-hub-westend/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "bridge-hub-westend-runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { workspace = true } +scale-info = { workspace = true } +serde = { workspace = true } +subxt= { workspace = true } +snowbridge-beacon-primitives = "0.2.0" +sp-arithmetic = "24.0.0" diff --git a/control/runtimes/bridge-hub-westend/bridge-hub-metadata.bin b/control/runtimes/bridge-hub-westend/bridge-hub-metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..cf58cacd72e5791672839945f387e50414fd58c5 GIT binary patch literal 385682 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%0A1^xkr;{CoDNNmk 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�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 a#S$pQ4pTTxLfi7yMeOb)vuj_Uul*lcCJlQ4 literal 0 HcmV?d00001 diff --git a/control/runtimes/bridge-hub-westend/build.rs b/control/runtimes/bridge-hub-westend/build.rs new file mode 100644 index 0000000000..31865465d0 --- /dev/null +++ b/control/runtimes/bridge-hub-westend/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=bridge-hub-metadata.bin"); +} diff --git a/control/runtimes/bridge-hub-westend/src/lib.rs b/control/runtimes/bridge-hub-westend/src/lib.rs new file mode 100644 index 0000000000..b315939ab5 --- /dev/null +++ b/control/runtimes/bridge-hub-westend/src/lib.rs @@ -0,0 +1,17 @@ +#[subxt::subxt( + runtime_metadata_path = "bridge-hub-metadata.bin", + derive_for_all_types = "Clone", + substitute_type( + path = "snowbridge_beacon_primitives::updates::CheckpointUpdate", + with = "::subxt::utils::Static<::snowbridge_beacon_primitives::updates::CheckpointUpdate<512>>", + ), + substitute_type( + path = "sp_arithmetic::fixed_point::FixedU128", + with = "::subxt::utils::Static<::sp_arithmetic::fixed_point::FixedU128>", + ) +)] +mod runtime {} + +pub use runtime::*; + +pub const CHAIN_ID: u64 = 11155111; diff --git a/control/runtimes/polkadot/src/lib.rs b/control/runtimes/polkadot/src/lib.rs index 027fdec613..122d66008a 100644 --- a/control/runtimes/polkadot/src/lib.rs +++ b/control/runtimes/polkadot/src/lib.rs @@ -1,3 +1,7 @@ -pub mod runtime; +#[subxt::subxt( + runtime_metadata_path = "polkadot-metadata.bin", + derive_for_all_types = "Clone" +)] +mod runtime {} pub use runtime::*; diff --git a/control/runtimes/westend/Cargo.toml b/control/runtimes/westend/Cargo.toml new file mode 100644 index 0000000000..4415312c2d --- /dev/null +++ b/control/runtimes/westend/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "westend-runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { workspace = true } +scale-info = { workspace = true } +serde = { workspace = true } +subxt= { workspace = true } diff --git a/control/runtimes/westend/build.rs b/control/runtimes/westend/build.rs new file mode 100644 index 0000000000..d86c71c05c --- /dev/null +++ b/control/runtimes/westend/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=polkadot-metadata.bin"); +} diff --git a/control/runtimes/westend/polkadot-metadata.bin b/control/runtimes/westend/polkadot-metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..8badb6fce7e7783bbb123d1e93b3890ae41a48a6 GIT binary patch literal 427287 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

CI^G!6=s{J5Mm?)Y#jGmvahA$D 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 Sye3PsjEdpjY%c$7s`2-gX-%a7 literal 0 HcmV?d00001 diff --git a/control/runtimes/westend/src/lib.rs b/control/runtimes/westend/src/lib.rs new file mode 100644 index 0000000000..122d66008a --- /dev/null +++ b/control/runtimes/westend/src/lib.rs @@ -0,0 +1,7 @@ +#[subxt::subxt( + runtime_metadata_path = "polkadot-metadata.bin", + derive_for_all_types = "Clone" +)] +mod runtime {} + +pub use runtime::*; From c7421bd09f35032ddf39513f127248cc9bb28a02 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 27 Sep 2024 11:56:54 +0200 Subject: [PATCH 5/8] Adds paseo UI (#1276) * adds paseo UI * remove muse and bump versions * remove muse and bump versions * remove veth token * paseo things * fix subscan urls * revert version * fix versions --- web/packages/api/package.json | 2 +- web/packages/api/src/environment.ts | 93 ++++++++++++++++++++++++ web/packages/contract-types/package.json | 2 +- web/packages/contracts/package.json | 2 +- web/pnpm-lock.yaml | 2 + 5 files changed, 98 insertions(+), 3 deletions(-) diff --git a/web/packages/api/package.json b/web/packages/api/package.json index 9b772d4884..12c71f87e5 100644 --- a/web/packages/api/package.json +++ b/web/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/api", - "version": "0.1.19", + "version": "0.1.20", "description": "Snowbridge API client", "license": "Apache-2.0", "repository": { diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index 3ccf1ef787..22691c60c2 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -306,6 +306,99 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { }, }, }, + paseo_sepolia: { + name: "paseo_sepolia", + ethChainId: 11155111, + locations: [ + { + id: "ethereum", + name: "Ethereum", + type: "ethereum", + destinationIds: ["assethub"], + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 15_000_000_000_000n, + } + ], + }, + { + id: "assethub", + name: "Asset Hub", + type: "substrate", + destinationIds: ["ethereum"], + paraInfo: { + paraId: 1000, + destinationFeeDOT: 0n, + skipExistentialDepositCheck: false, + addressType: "32byte", + decimals: 10, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 15_000_000_000_000n, + } + ], + } + ], + config: { + BEACON_HTTP_API: "https://lodestar-sepolia.chainsafe.io", + ETHEREUM_API: (key) => `https://eth-sepolia.g.alchemy.com/v2/${key}`, + RELAY_CHAIN_URL: "wss://paseo-rpc.dwellir.com", + ASSET_HUB_URL: "wss://asset-hub-paseo-rpc.dwellir.com", + BRIDGE_HUB_URL: "wss://bridge-hub-paseo.dotters.network", + PARACHAINS: [], + GATEWAY_CONTRACT: "0x5a84b15B618beEE6F6285F6bd2bA20a08673e473", + BEEFY_CONTRACT: "0xE7388f953f50d377D131350490156dB649E5DC10", + ASSET_HUB_PARAID: 1000, + BRIDGE_HUB_PARAID: 1002, + PRIMARY_GOVERNANCE_CHANNEL_ID: + "0x0000000000000000000000000000000000000000000000000000000000000001", + SECONDARY_GOVERNANCE_CHANNEL_ID: + "0x0000000000000000000000000000000000000000000000000000000000000002", + RELAYERS: [ + { + name: "beacon", + account: "5E4Hf7LzHE4W3jabjLWSP8p8RzEa9ednwRivFEwYAprzpgwc", + type: "substrate", + }, + { + name: "beefy", + account: "0xc189De708158e75E5C88C0ABfA5F9a26C71F54D1", + type: "ethereum", + }, + { + name: "parachain-primary-gov", + account: "0x4BBa8c0e87242897521Ba598d327bE8280032609", + type: "ethereum", + }, + { + name: "parachain-secondary-gov", + account: "0x4BBa8c0e87242897521Ba598d327bE8280032609", + type: "ethereum", + }, + { + name: "execution-assethub", + account: "5HT2ysqEg6SXghQ3NGXp1VWT22hhj48Um8UAwk6Udg8ZCEv8", + type: "substrate", + }, + { + name: "parachain-assethub", + account: "0x4BBa8c0e87242897521Ba598d327bE8280032609", + type: "ethereum", + }, + ], + SUBSCAN_API: { + RELAY_CHAIN_URL: "https://paseo.api.subscan.io/", + ASSET_HUB_URL: "https://assethub-paseo.api.subscan.io", + BRIDGE_HUB_URL: "https://bridgehub-paseo.api.subscan.io", + }, + }, + }, polkadot_mainnet: { name: "polkadot_mainnet", ethChainId: 1, diff --git a/web/packages/contract-types/package.json b/web/packages/contract-types/package.json index 174ced3685..a47dc81ab6 100644 --- a/web/packages/contract-types/package.json +++ b/web/packages/contract-types/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contract-types", - "version": "0.1.19", + "version": "0.1.20", "description": "Snowbridge contract type bindings", "license": "Apache-2.0", "repository": { diff --git a/web/packages/contracts/package.json b/web/packages/contracts/package.json index e639c095aa..4dca5f6033 100644 --- a/web/packages/contracts/package.json +++ b/web/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contracts", - "version": "0.1.19", + "version": "0.1.20", "description": "Snowbridge contract source and abi.", "license": "Apache-2.0", "repository": { diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index d43ffb9035..7603881159 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -104,6 +104,8 @@ importers: specifier: ^5.4.5 version: 5.5.4 + packages/contracts: {} + packages/operations: dependencies: '@aws-sdk/client-cloudwatch': From 02a325b86713330ec0cf26ac69a1dfc0b6169c75 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Tue, 1 Oct 2024 09:26:55 +0200 Subject: [PATCH 6/8] Fix find on-chain checkpoint (#1294) * fix wrap around * logs * doesnt have to be in the same period * testing something * fix * adds test and config * writer * fix compilation * remove temp building relayer * comment --- .github/workflows/release-relayer.yml | 1 - relayer/cmd/generate_beacon_data.go | 8 +- relayer/cmd/import_beacon_state.go | 2 +- relayer/cmd/import_execution_header.go | 2 +- relayer/cmd/list_beacon_states.go | 2 +- relayer/cmd/store_beacon_state.go | 2 +- relayer/relays/beacon/config/config.go | 26 +++- relayer/relays/beacon/header/header.go | 22 ++-- relayer/relays/beacon/header/header_test.go | 112 +++++++++++++++++- .../beacon/header/syncer/syncer_test.go | 13 +- relayer/relays/beacon/main.go | 4 +- relayer/relays/beacon/mock/mock_writer.go | 11 +- relayer/relays/beacon/protocol/protocol.go | 4 +- relayer/relays/beacon/store/datastore_test.go | 7 +- relayer/relays/execution/config.go | 2 +- relayer/relays/execution/main.go | 2 +- web/packages/test/config/beacon-relay.json | 3 +- web/packages/test/config/execution-relay.json | 3 +- 18 files changed, 178 insertions(+), 48 deletions(-) diff --git a/.github/workflows/release-relayer.yml b/.github/workflows/release-relayer.yml index 0fae3ff1ea..114c99ed10 100644 --- a/.github/workflows/release-relayer.yml +++ b/.github/workflows/release-relayer.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - release-v1.0.0 workflow_dispatch: env: diff --git a/relayer/cmd/generate_beacon_data.go b/relayer/cmd/generate_beacon_data.go index dfa13e860a..06202d84e5 100644 --- a/relayer/cmd/generate_beacon_data.go +++ b/relayer/cmd/generate_beacon_data.go @@ -132,7 +132,7 @@ func generateBeaconCheckpoint(cmd *cobra.Command, _ []string) error { return err } - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) store.Connect() defer store.Close() @@ -193,7 +193,7 @@ func generateBeaconTestFixture(cmd *cobra.Command, _ []string) error { return err } - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) err = store.Connect() @@ -504,7 +504,7 @@ func generateExecutionUpdate(cmd *cobra.Command, _ []string) error { } log.WithFields(log.Fields{"endpoint": conf.Source.Beacon.Endpoint}).Info("connecting to beacon API") - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) store.Connect() @@ -695,7 +695,7 @@ func generateInboundFixture(cmd *cobra.Command, _ []string) error { return err } - p := protocol.New(beaconConf.Source.Beacon.Spec) + p := protocol.New(beaconConf.Source.Beacon.Spec, beaconConf.Sink.Parachain.HeaderRedundancy) store := store.New(beaconConf.Source.Beacon.DataStore.Location, beaconConf.Source.Beacon.DataStore.MaxEntries, *p) store.Connect() diff --git a/relayer/cmd/import_beacon_state.go b/relayer/cmd/import_beacon_state.go index f683e48db0..0dac560832 100644 --- a/relayer/cmd/import_beacon_state.go +++ b/relayer/cmd/import_beacon_state.go @@ -71,7 +71,7 @@ func importBeaconState(cmd *cobra.Command, _ []string) error { return fmt.Errorf("open finalized state file: %w", err) } - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) beaconClient := api.NewBeaconClient(conf.Source.Beacon.Endpoint, conf.Source.Beacon.StateEndpoint) syncer := syncer.New(beaconClient, &store, p) diff --git a/relayer/cmd/import_execution_header.go b/relayer/cmd/import_execution_header.go index c003131e96..45126a63f7 100644 --- a/relayer/cmd/import_execution_header.go +++ b/relayer/cmd/import_execution_header.go @@ -109,7 +109,7 @@ func importExecutionHeaderFn(cmd *cobra.Command, _ []string) error { log.WithField("hash", beaconHeader).Info("will be syncing execution header for beacon hash") - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) store.Connect() defer store.Close() diff --git a/relayer/cmd/list_beacon_states.go b/relayer/cmd/list_beacon_states.go index f3113968f1..cbc48fd4c5 100644 --- a/relayer/cmd/list_beacon_states.go +++ b/relayer/cmd/list_beacon_states.go @@ -49,7 +49,7 @@ func listBeaconState(cmd *cobra.Command, _ []string) error { return err } - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) err = store.Connect() diff --git a/relayer/cmd/store_beacon_state.go b/relayer/cmd/store_beacon_state.go index 490a39a4d5..2158bf54bd 100644 --- a/relayer/cmd/store_beacon_state.go +++ b/relayer/cmd/store_beacon_state.go @@ -49,7 +49,7 @@ func storeBeaconState(cmd *cobra.Command, _ []string) error { return err } - p := protocol.New(conf.Source.Beacon.Spec) + p := protocol.New(conf.Source.Beacon.Spec, conf.Sink.Parachain.HeaderRedundancy) store := store.New(conf.Source.Beacon.DataStore.Location, conf.Source.Beacon.DataStore.MaxEntries, *p) beaconClient := api.NewBeaconClient(conf.Source.Beacon.Endpoint, conf.Source.Beacon.StateEndpoint) syncer := syncer.New(beaconClient, &store, p) diff --git a/relayer/relays/beacon/config/config.go b/relayer/relays/beacon/config/config.go index 1e3b465597..f0c9c86374 100644 --- a/relayer/relays/beacon/config/config.go +++ b/relayer/relays/beacon/config/config.go @@ -3,7 +3,6 @@ package config import ( "errors" "fmt" - "github.com/snowfork/snowbridge/relayer/config" ) type Config struct { @@ -35,8 +34,16 @@ type BeaconConfig struct { } type SinkConfig struct { - Parachain config.ParachainConfig `mapstructure:"parachain"` - UpdateSlotInterval uint64 `mapstructure:"updateSlotInterval"` + Parachain ParachainConfig `mapstructure:"parachain"` + UpdateSlotInterval uint64 `mapstructure:"updateSlotInterval"` +} + +type ParachainConfig struct { + Endpoint string `mapstructure:"endpoint"` + MaxWatchedExtrinsics int64 `mapstructure:"maxWatchedExtrinsics"` + // The max number of header in the FinalizedBeaconStateBuffer on-chain. + // https://github.com/paritytech/polkadot-sdk/blob/master/bridges/snowbridge/pallets/ethereum-client/src/types.rs#L23 + HeaderRedundancy uint64 `mapstructure:"headerRedundancy"` } func (c Config) Validate() error { @@ -81,3 +88,16 @@ func (b BeaconConfig) Validate() error { } return nil } + +func (p ParachainConfig) Validate() error { + if p.Endpoint == "" { + return errors.New("[endpoint] is not set") + } + if p.MaxWatchedExtrinsics == 0 { + return errors.New("[maxWatchedExtrinsics] is not set") + } + if p.HeaderRedundancy == 0 { + return errors.New("[HeaderRedundancy] is not set") + } + return nil +} diff --git a/relayer/relays/beacon/header/header.go b/relayer/relays/beacon/header/header.go index d65f75ebca..e7dca2c828 100644 --- a/relayer/relays/beacon/header/header.go +++ b/relayer/relays/beacon/header/header.go @@ -523,32 +523,32 @@ func (h *Header) findLatestCheckPoint(slot uint64) (state.FinalizedHeader, error return beaconState, fmt.Errorf("GetLastFinalizedStateIndex error: %w", err) } startIndex := uint64(lastIndex) - endIndex := uint64(0) + endIndex := startIndex + 1 syncCommitteePeriod := h.protocol.Settings.SlotsInEpoch * h.protocol.Settings.EpochsPerSyncCommitteePeriod - slotPeriodIndex := slot / syncCommitteePeriod - - for index := startIndex; index >= endIndex; index-- { + totalStates := syncCommitteePeriod * h.protocol.HeaderRedundancy // Total size of the circular buffer, + // https://github.com/paritytech/polkadot-sdk/blob/master/bridges/snowbridge/pallets/ethereum-client/src/lib.rs#L75 + for index := startIndex; index != endIndex; index = (index - 1 + totalStates) % totalStates { beaconRoot, err := h.writer.GetFinalizedBeaconRootByIndex(uint32(index)) if err != nil { return beaconState, fmt.Errorf("GetFinalizedBeaconRootByIndex %d, error: %w", index, err) } beaconState, err = h.writer.GetFinalizedHeaderStateByBlockRoot(beaconRoot) if err != nil { - return beaconState, fmt.Errorf("GetFinalizedHeaderStateByBlockRoot %s, error: %w", beaconRoot.Hex(), err) + // As soon as it can't find a block root, it means the circular wrap around array is empty. + log.WithFields(log.Fields{"index": index, "blockRoot": beaconRoot.Hex()}).WithError(err).Info("searching for checkpoint on-chain failed") + break } - statePeriodIndex := beaconState.BeaconSlot / syncCommitteePeriod + if beaconState.BeaconSlot < slot { + log.WithFields(log.Fields{"index": index, "blockRoot": beaconRoot.Hex()}).WithError(err).Debug("unable to find a relevant on-chain header") break } // Found the beaconState - if beaconState.BeaconSlot > slot && beaconState.BeaconSlot < slot+syncCommitteePeriod && slotPeriodIndex == statePeriodIndex { - break + if beaconState.BeaconSlot > slot && beaconState.BeaconSlot < slot+syncCommitteePeriod { + return beaconState, nil } } - if beaconState.BeaconSlot > slot && beaconState.BeaconSlot < slot+syncCommitteePeriod { - return beaconState, nil - } return beaconState, fmt.Errorf("no checkpoint on chain for slot %d", slot) } diff --git a/relayer/relays/beacon/header/header_test.go b/relayer/relays/beacon/header/header_test.go index 5ff7cee5ef..358cbe9d09 100644 --- a/relayer/relays/beacon/header/header_test.go +++ b/relayer/relays/beacon/header/header_test.go @@ -3,6 +3,7 @@ package header import ( "context" "github.com/ethereum/go-ethereum/common" + "github.com/snowfork/go-substrate-rpc-client/v4/types" "github.com/snowfork/snowbridge/relayer/relays/beacon/config" "github.com/snowfork/snowbridge/relayer/relays/beacon/header/syncer/api" "github.com/snowfork/snowbridge/relayer/relays/beacon/mock" @@ -15,6 +16,8 @@ import ( "testing" ) +const MaxRedundancy = 20 + // Verifies that the closest checkpoint is populated successfully if it is not populated in the first place. func TestSyncInterimFinalizedUpdate_WithDataFromAPI(t *testing.T) { settings := config.SpecSettings{ @@ -22,7 +25,7 @@ func TestSyncInterimFinalizedUpdate_WithDataFromAPI(t *testing.T) { EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, } - p := protocol.New(settings) + p := protocol.New(settings, MaxRedundancy) client := mock.API{} beaconStore := mock.Store{} @@ -80,7 +83,7 @@ func TestSyncInterimFinalizedUpdate_WithDataFromStore(t *testing.T) { EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, } - p := protocol.New(settings) + p := protocol.New(settings, MaxRedundancy) client := mock.API{} beaconStore := mock.Store{} @@ -146,7 +149,7 @@ func TestSyncInterimFinalizedUpdate_WithDataFromStoreWithDifferentBlocks(t *test EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, } - p := protocol.New(settings) + p := protocol.New(settings, MaxRedundancy) client := mock.API{} beaconStore := mock.Store{} @@ -212,7 +215,7 @@ func TestSyncInterimFinalizedUpdate_BeaconStateNotAvailableInAPIAndStore(t *test EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, } - p := protocol.New(settings) + p := protocol.New(settings, MaxRedundancy) client := mock.API{} beaconStore := mock.Store{} @@ -256,7 +259,7 @@ func TestSyncInterimFinalizedUpdate_NoValidBlocksFound(t *testing.T) { EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, } - p := protocol.New(settings) + p := protocol.New(settings, MaxRedundancy) client := mock.API{} beaconStore := mock.Store{} @@ -324,3 +327,102 @@ func TestShouldUpdate(t *testing.T) { assert.Equal(t, tt.result, result, "expected %t but found %t", tt.result, result) } } + +func TestFindLatestCheckPoint(t *testing.T) { + settings := config.SpecSettings{ + SlotsInEpoch: 4, + EpochsPerSyncCommitteePeriod: 2, + DenebForkEpoch: 0, + } + maxRedundancy := uint64(2) + p := protocol.New(settings, maxRedundancy) + // Total circular array would be 4 * 2 * 2 = 16 + client := mock.API{} + beaconStore := mock.Store{} + + headerIndex5 := common.HexToHash("0xd118e1464716db841f14ac1c3245f2b7900ee6f896ac85362deae3ff90c14c78") + headerIndex4 := common.HexToHash("0xe9d993e257b0d7ac775b8a03827209db2c7314a780c24a7fad64fd9fcee529f7") + headerIndex3 := common.HexToHash("0x7f2c1240dd714f3d74050638c642f14bf49f541d42f0808b7ae0c188c7edbb08") + headerIndex2 := common.HexToHash("0x01eaa6cbb00311f19c84965f3a9e8ddf56dd5443dfa8ea35c3e6d0b6306554b3") + headerIndex1 := common.HexToHash("0xa106b85508139ad0417cc521f41943a74908bfedbc6f548b3d1acddf60548493") + headerIndex0 := common.HexToHash("0xefef79bf51c3e02c19f9cbe718c6e226ad516153622a500bf783fce2aa8ec7c6") + headerIndex15 := common.HexToHash("0x416f890494e218d3cb32ce1ef3bd08e3acccf6e112b66db544cfcc6295bbdc2a") + headerIndex14 := common.HexToHash("0x74c4e67ca468722a7c3af52c5f96f4bbdd60b4d237ae7693863dca308e3c354c") + + h := New( + &mock.Writer{ + LastFinalizedState: state.FinalizedHeader{ + BeaconBlockRoot: common.Hash{}, + BeaconSlot: 50, + InitialCheckpointRoot: common.Hash{}, + InitialCheckpointSlot: 0, + }, + LastFinalizedStateIndex: 5, + FinalizedBeaconRootByIndex: map[uint32]types.H256{ + 5: types.H256(headerIndex5), + 4: types.H256(headerIndex4), + 3: types.H256(headerIndex3), + 2: types.H256(headerIndex2), + 1: types.H256(headerIndex1), + 0: types.H256(headerIndex0), + 15: types.H256(headerIndex15), + 14: types.H256(headerIndex14), + }, + FinalizedHeaderStateByBlockRoot: map[types.H256]state.FinalizedHeader{ + types.H256(headerIndex5): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex5, + BeaconSlot: 50, + }, + types.H256(headerIndex4): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex4, + BeaconSlot: 46, + }, + types.H256(headerIndex3): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex3, + BeaconSlot: 42, + }, + types.H256(headerIndex2): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex2, + BeaconSlot: 38, + }, + types.H256(headerIndex1): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex1, + BeaconSlot: 30, + }, + types.H256(headerIndex0): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex0, + BeaconSlot: 32, + }, + types.H256(headerIndex15): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex15, + BeaconSlot: 20, + }, + types.H256(headerIndex14): state.FinalizedHeader{ + BeaconBlockRoot: headerIndex14, + BeaconSlot: 18, + }, + }, + }, + &client, + settings, + &beaconStore, + p, + 316, + ) + + // Slot 20 would be usable to prove slot 19 + header, err := h.findLatestCheckPoint(19) + assert.NoError(t, err) + assert.Equal(t, headerIndex15, header.BeaconBlockRoot) + assert.Equal(t, uint64(20), header.BeaconSlot) + + // No header would be within range to prove slot 4 + _, err = h.findLatestCheckPoint(4) + assert.Error(t, err) + + // Slot 46 would be usable to prove slot 19 + header, err = h.findLatestCheckPoint(40) + assert.NoError(t, err) + assert.Equal(t, headerIndex4, header.BeaconBlockRoot) + assert.Equal(t, uint64(46), header.BeaconSlot) +} diff --git a/relayer/relays/beacon/header/syncer/syncer_test.go b/relayer/relays/beacon/header/syncer/syncer_test.go index 3e94469058..b74dfb15c2 100644 --- a/relayer/relays/beacon/header/syncer/syncer_test.go +++ b/relayer/relays/beacon/header/syncer/syncer_test.go @@ -19,13 +19,14 @@ import ( ) const TestUrl = "https://lodestar-sepolia.chainsafe.io" +const MaxRedundancy = 20 func newTestRunner() *Syncer { return New(api.NewBeaconClient(TestUrl, TestUrl), &mock.Store{}, protocol.New(config.SpecSettings{ SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) } // Verifies that the Lodestar provided finalized endpoint matches the manually constructed finalized endpoint @@ -110,7 +111,7 @@ func TestGetFinalizedUpdateWithSyncCommitteeUpdateAtSlot(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) // Manually construct a finalized update manualUpdate, err := syncer.GetFinalizedUpdateAtAttestedSlot(129, 0, true) @@ -165,7 +166,7 @@ func TestFindAttestedAndFinalizedHeadersAtBoundary(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) attested, err := syncer.FindValidAttestedHeader(8000, 8160) assert.NoError(t, err) @@ -195,7 +196,7 @@ func TestFindAttestedAndFinalizedHeadersAtBoundary(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) attested, err = syncer.FindValidAttestedHeader(32576, 32704) assert.NoError(t, err) @@ -225,7 +226,7 @@ func TestFindAttestedAndFinalizedHeadersAtBoundary(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) attested, err = syncer.FindValidAttestedHeader(25076, 32736) assert.NoError(t, err) @@ -249,7 +250,7 @@ func TestFindAttestedAndFinalizedHeadersAtBoundary(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) attested, err = syncer.FindValidAttestedHeader(32540, 32768) assert.Error(t, err) diff --git a/relayer/relays/beacon/main.go b/relayer/relays/beacon/main.go index 58b46d8688..1e6c1937c8 100644 --- a/relayer/relays/beacon/main.go +++ b/relayer/relays/beacon/main.go @@ -37,7 +37,7 @@ func (r *Relay) Start(ctx context.Context, eg *errgroup.Group) error { paraconn := parachain.NewConnection(r.config.Sink.Parachain.Endpoint, r.keypair.AsKeyringPair()) - err := paraconn.ConnectWithHeartBeat(ctx, 60 * time.Second) + err := paraconn.ConnectWithHeartBeat(ctx, 60*time.Second) if err != nil { return err } @@ -47,7 +47,7 @@ func (r *Relay) Start(ctx context.Context, eg *errgroup.Group) error { r.config.Sink.Parachain.MaxWatchedExtrinsics, ) - p := protocol.New(specSettings) + p := protocol.New(specSettings, r.config.Sink.Parachain.HeaderRedundancy) err = writer.Start(ctx, eg) if err != nil { diff --git a/relayer/relays/beacon/mock/mock_writer.go b/relayer/relays/beacon/mock/mock_writer.go index b0700e7cc5..054a99c7f2 100644 --- a/relayer/relays/beacon/mock/mock_writer.go +++ b/relayer/relays/beacon/mock/mock_writer.go @@ -12,7 +12,10 @@ import ( ) type Writer struct { - LastFinalizedState state.FinalizedHeader + LastFinalizedState state.FinalizedHeader + LastFinalizedStateIndex types.U32 + FinalizedBeaconRootByIndex map[uint32]types.H256 + FinalizedHeaderStateByBlockRoot map[types.H256]state.FinalizedHeader } func (m *Writer) GetLastExecutionHeaderState() (state.ExecutionHeader, error) { @@ -20,11 +23,11 @@ func (m *Writer) GetLastExecutionHeaderState() (state.ExecutionHeader, error) { } func (m *Writer) GetLastFinalizedStateIndex() (types.U32, error) { - return 0, nil + return m.LastFinalizedStateIndex, nil } func (m *Writer) GetFinalizedBeaconRootByIndex(index uint32) (types.H256, error) { - return types.H256{}, nil + return m.FinalizedBeaconRootByIndex[index], nil } func (m *Writer) BatchCall(ctx context.Context, extrinsic []string, calls []interface{}) error { @@ -66,7 +69,7 @@ func (m *Writer) GetLastBasicChannelNonceByAddress(address common.Address) (uint } func (m *Writer) GetFinalizedHeaderStateByBlockRoot(blockRoot types.H256) (state.FinalizedHeader, error) { - return state.FinalizedHeader{}, nil + return m.FinalizedHeaderStateByBlockRoot[blockRoot], nil } func (m *Writer) FindCheckPointBackward(slot uint64) (state.FinalizedHeader, error) { diff --git a/relayer/relays/beacon/protocol/protocol.go b/relayer/relays/beacon/protocol/protocol.go index a0935730ab..a81a6b30e2 100644 --- a/relayer/relays/beacon/protocol/protocol.go +++ b/relayer/relays/beacon/protocol/protocol.go @@ -10,12 +10,14 @@ import ( type Protocol struct { Settings config.SpecSettings SlotsPerHistoricalRoot uint64 + HeaderRedundancy uint64 } -func New(setting config.SpecSettings) *Protocol { +func New(setting config.SpecSettings, headerRedundancy uint64) *Protocol { return &Protocol{ Settings: setting, SlotsPerHistoricalRoot: setting.SlotsInEpoch * setting.EpochsPerSyncCommitteePeriod, + HeaderRedundancy: headerRedundancy, } } diff --git a/relayer/relays/beacon/store/datastore_test.go b/relayer/relays/beacon/store/datastore_test.go index efb10f75d7..75069c5883 100644 --- a/relayer/relays/beacon/store/datastore_test.go +++ b/relayer/relays/beacon/store/datastore_test.go @@ -13,6 +13,7 @@ import ( ) const TestDataStoreFile = "./" +const MaxRedundancy = 20 func TestGetBeaconState(t *testing.T) { _ = os.RemoveAll(TestDataStoreFile + BeaconStateDir) @@ -22,7 +23,7 @@ func TestGetBeaconState(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) err := store.Connect() require.NoError(t, err) defer func() { @@ -66,7 +67,7 @@ func TestPruneOldStates(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - })) + }, MaxRedundancy)) err := store.Connect() require.NoError(t, err) defer func() { @@ -137,7 +138,7 @@ func TestFindBeaconStateWithinRange(t *testing.T) { SlotsInEpoch: 32, EpochsPerSyncCommitteePeriod: 256, DenebForkEpoch: 0, - }) + }, MaxRedundancy) store := New(TestDataStoreFile, 2, *p) err := store.Connect() require.NoError(t, err) diff --git a/relayer/relays/execution/config.go b/relayer/relays/execution/config.go index 1390812e11..70dd1d5cae 100644 --- a/relayer/relays/execution/config.go +++ b/relayer/relays/execution/config.go @@ -46,7 +46,7 @@ type ContractsConfig struct { } type SinkConfig struct { - Parachain config.ParachainConfig `mapstructure:"parachain"` + Parachain beaconconf.ParachainConfig `mapstructure:"parachain"` } type ChannelID [32]byte diff --git a/relayer/relays/execution/main.go b/relayer/relays/execution/main.go index 2514a4e285..39618e6410 100644 --- a/relayer/relays/execution/main.go +++ b/relayer/relays/execution/main.go @@ -87,7 +87,7 @@ func (r *Relay) Start(ctx context.Context, eg *errgroup.Group) error { } r.gatewayContract = contract - p := protocol.New(r.config.Source.Beacon.Spec) + p := protocol.New(r.config.Source.Beacon.Spec, r.config.Sink.Parachain.HeaderRedundancy) store := store.New(r.config.Source.Beacon.DataStore.Location, r.config.Source.Beacon.DataStore.MaxEntries, *p) store.Connect() diff --git a/web/packages/test/config/beacon-relay.json b/web/packages/test/config/beacon-relay.json index b7ac5fc9d6..73534b66f6 100644 --- a/web/packages/test/config/beacon-relay.json +++ b/web/packages/test/config/beacon-relay.json @@ -18,7 +18,8 @@ "sink": { "parachain": { "endpoint": "ws://127.0.0.1:11144", - "maxWatchedExtrinsics": 8 + "maxWatchedExtrinsics": 8, + "headerRedundancy": 20 }, "updateSlotInterval": 30 } diff --git a/web/packages/test/config/execution-relay.json b/web/packages/test/config/execution-relay.json index 9bd122aeb7..f94caa75c3 100644 --- a/web/packages/test/config/execution-relay.json +++ b/web/packages/test/config/execution-relay.json @@ -25,7 +25,8 @@ "sink": { "parachain": { "endpoint": "ws://127.0.0.1:11144", - "maxWatchedExtrinsics": 8 + "maxWatchedExtrinsics": 8, + "headerRedundancy": 20 } }, "instantVerification": false, From 230cbbe5684198539a4b28424ede0eeebb89f5df Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Wed, 2 Oct 2024 19:31:19 +0200 Subject: [PATCH 7/8] Add Para threads to MMR Root (#1288) * add back in para threads * fix out of bounds error * forward compatible * fix comment * move function back up * move again * Smoke test on westend (#1291) * Initialize for westend * Update beacon checkpoint * add back in para threads * fix out of bounds error * Smoke tests on westend * Load config from env * Cleanup env * Remove penpal code * Cleanup * Update smoke tests * Add westend env * crontab smoke tests * Split as two tests * Fix typo * Remove assets/parachain non-exist * Revert change * Wait config from env * Load interval from env * Add alarm check no transfer * Adds paseo UI (#1276) * adds paseo UI * remove muse and bump versions * remove muse and bump versions * remove veth token * paseo things * fix subscan urls * revert version * fix versions * Update api package * Fix the merge * Remove unused * Fix find on-chain checkpoint (#1294) * fix wrap around * logs * doesnt have to be in the same period * testing something * fix * adds test and config * writer * fix compilation * remove temp building relayer * comment * bump version --------- Co-authored-by: Alistair Singh Co-authored-by: Clara van Staden --------- Co-authored-by: Ron Co-authored-by: Clara van Staden --- relayer/chain/relaychain/connection.go | 76 +-- relayer/cmd/parachain_head_proof.go | 2 +- relayer/relays/parachain/beefy-listener.go | 65 +- relayer/relays/parachain/scanner.go | 3 +- relayer/relays/parachain/types.go | 2 + smoketest/.envrc-westend | 26 + smoketest/.gitignore | 1 + smoketest/Cargo.lock | 570 +++++++++++++++++- smoketest/Cargo.toml | 4 +- smoketest/make-bindings.sh | 27 +- smoketest/src/constants.rs | 111 +++- smoketest/src/helper.rs | 102 +--- smoketest/src/lib.rs | 2 + smoketest/src/penpal_helper.rs | 83 +++ smoketest/tests/create_agent.rs | 6 +- smoketest/tests/create_channel.rs | 6 +- smoketest/tests/register_token.rs | 8 +- smoketest/tests/send_polkadot_token.rs | 2 +- smoketest/tests/send_token.rs | 14 +- smoketest/tests/send_token_to_penpal.rs | 17 +- smoketest/tests/set_pricing_params.rs | 2 +- smoketest/tests/set_token_transfer_fees.rs | 2 +- smoketest/tests/transfer_native_from_agent.rs | 7 +- smoketest/tests/transfer_polkadot_token.rs | 4 +- smoketest/tests/transfer_token.rs | 37 +- smoketest/tests/upgrade_gateway.rs | 8 +- web/packages/api/package.json | 2 +- web/packages/api/src/environment.ts | 93 +++ web/packages/api/src/status.ts | 18 +- web/packages/contract-types/package.json | 2 +- web/packages/contracts/package.json | 2 +- web/packages/operations/.env.example | 7 + web/packages/operations/ecosystem.config.js | 15 +- web/packages/operations/package.json | 3 + web/packages/operations/src/alarm.ts | 10 + .../operations/src/global_transfer_history.ts | 6 +- .../operations/src/transfer_to_ethereum.ts | 89 +++ .../operations/src/transfer_to_polkadot.ts | 103 ++++ web/pnpm-lock.yaml | 2 +- 39 files changed, 1312 insertions(+), 227 deletions(-) create mode 100644 smoketest/.envrc-westend create mode 100644 smoketest/src/penpal_helper.rs create mode 100644 web/packages/operations/src/transfer_to_ethereum.ts create mode 100644 web/packages/operations/src/transfer_to_polkadot.ts diff --git a/relayer/chain/relaychain/connection.go b/relayer/chain/relaychain/connection.go index c2d1e38124..bdc92b76a0 100644 --- a/relayer/chain/relaychain/connection.go +++ b/relayer/chain/relaychain/connection.go @@ -6,6 +6,7 @@ package relaychain import ( "context" "fmt" + "sort" gsrpc "github.com/snowfork/go-substrate-rpc-client/v4" "github.com/snowfork/go-substrate-rpc-client/v4/types" @@ -130,37 +131,6 @@ type ParaHead struct { Data types.Bytes } -// Fetches heads for each parachain Id filtering out para threads. -func (conn *Connection) FetchParachainHeads(relayChainBlockHash types.Hash) ([]ParaHead, error) { - // Fetch para heads - paraHeads, err := conn.fetchParaHeads(relayChainBlockHash) - if err != nil { - log.WithError(err).Error("Cannot fetch para heads.") - return nil, err - } - - // fetch ids of parachains (not including parathreads) - var parachainIDs []uint32 - parachainsKey, err := types.CreateStorageKey(conn.Metadata(), "Paras", "Parachains", nil, nil) - if err != nil { - return nil, err - } - - _, err = conn.API().RPC.State.GetStorage(parachainsKey, ¶chainIDs, relayChainBlockHash) - if err != nil { - return nil, err - } - - // filter out parathreads - var parachainHeads []ParaHead - for _, v := range parachainIDs { - if head, ok := paraHeads[v]; ok { - parachainHeads = append(parachainHeads, head) - } - } - return parachainHeads, nil -} - func (co *Connection) FetchParachainHead(relayBlockhash types.Hash, paraID uint32, header *types.Header) (bool, error) { encodedParaID, err := types.EncodeToBytes(paraID) if err != nil { @@ -272,7 +242,8 @@ func (co *Connection) fetchKeys(keyPrefix []byte, blockHash types.Hash) ([]types // Key: hash_twox_128("Paras") + hash_twox_128("Heads") + hash_twox_64(ParaId) + Encode(ParaId) const ParaIDOffset = 16 + 16 + 8 -func (co *Connection) fetchParaHeads(blockHash types.Hash) (map[uint32]ParaHead, error) { +// Fetch heads for all Paras. Included are parachains and parathreads. +func (co *Connection) FetchParasHeads(blockHash types.Hash) ([]ParaHead, error) { keyPrefix := types.CreateStorageKeyPrefix("Paras", "Heads") keys, err := co.fetchKeys(keyPrefix, blockHash) if err != nil { @@ -292,7 +263,7 @@ func (co *Connection) fetchParaHeads(blockHash types.Hash) (map[uint32]ParaHead, return nil, err } - heads := make(map[uint32]ParaHead) + heads := make([]ParaHead, 0, 32) for _, changeSet := range changeSets { for _, change := range changeSet.Changes { if change.StorageData.IsNone() { @@ -313,12 +284,47 @@ func (co *Connection) fetchParaHeads(blockHash types.Hash) (map[uint32]ParaHead, return nil, err } - heads[paraID] = ParaHead{ + heads = append(heads, ParaHead{ ParaID: paraID, Data: headData, - } + }) } } + sort.SliceStable(heads, func(i int, j int) bool { + return heads[i].ParaID < heads[j].ParaID + }) + + return heads, nil +} + +// Filters para heads to parachains only. +func (conn *Connection) FilterParachainHeads(paraHeads []ParaHead, relayChainBlockHash types.Hash) ([]ParaHead, error) { + + // fetch ids of parachains (not including parathreads) + var parachainIDs []uint32 + parachainsKey, err := types.CreateStorageKey(conn.Metadata(), "Paras", "Parachains", nil, nil) + if err != nil { + return nil, err + } + + _, err = conn.API().RPC.State.GetStorage(parachainsKey, ¶chainIDs, relayChainBlockHash) + if err != nil { + return nil, err + } + + // create a set of parachains + parachains := make(map[uint32]struct{}, len(paraHeads)) + for _, parachain := range parachainIDs { + parachains[parachain] = struct{}{} + } + + // filter to return parachains + heads := make([]ParaHead, 0, len(paraHeads)) + for _, head := range paraHeads { + if _, ok := parachains[head.ParaID]; ok { + heads = append(heads, head) + } + } return heads, nil } diff --git a/relayer/cmd/parachain_head_proof.go b/relayer/cmd/parachain_head_proof.go index dcb2259c73..1052d30837 100644 --- a/relayer/cmd/parachain_head_proof.go +++ b/relayer/cmd/parachain_head_proof.go @@ -92,7 +92,7 @@ func ParachainHeadProofFn(cmd *cobra.Command, _ []string) error { return err } - paraHeadsAsSlice, err := conn.FetchParachainHeads(relayChainBlockHash) + paraHeadsAsSlice, err := conn.FetchParasHeads(relayChainBlockHash) if err != nil { log.WithError(err).Error("Cannot fetch parachain headers") return err diff --git a/relayer/relays/parachain/beefy-listener.go b/relayer/relays/parachain/beefy-listener.go index d6689a5582..d0f567351c 100644 --- a/relayer/relays/parachain/beefy-listener.go +++ b/relayer/relays/parachain/beefy-listener.go @@ -217,6 +217,10 @@ func (li *BeefyListener) fetchLatestBeefyBlock(ctx context.Context) (uint64, typ return number, hash, nil } +// The maximum paras that will be included in the proof. +// https://github.com/paritytech/polkadot-sdk/blob/d66dee3c3da836bcf41a12ca4e1191faee0b6a5b/polkadot/runtime/parachains/src/paras/mod.rs#L1225-L1232 +const MaxParaHeads = 1024 + // Generates a proof for an MMR leaf, and then generates a merkle proof for our parachain header, which should be verifiable against the // parachains root in the mmr leaf. func (li *BeefyListener) generateProof(ctx context.Context, input *ProofInput, header *types.Header) (*ProofOutput, error) { @@ -255,21 +259,10 @@ func (li *BeefyListener) generateProof(ctx context.Context, input *ProofInput, h return nil, fmt.Errorf("retrieve MMR root hash at block %v: %w", latestBeefyBlockHash.Hex(), err) } - // Generate a merkle proof for the parachain head with input ParaId - // and verify with merkle root hash of all parachain heads - // Polkadot uses the following code to generate merkle root from parachain headers: - // https://github.com/paritytech/polkadot/blob/2eb7672905d99971fc11ad7ff4d57e68967401d2/runtime/rococo/src/lib.rs#L706-L709 - merkleProofData, err := CreateParachainMerkleProof(input.ParaHeads, input.ParaID) + var merkleProofData *MerkleProofData + merkleProofData, input.ParaHeads, err = li.generateAndValidateParasHeadsMerkleProof(input, &mmrProof) if err != nil { - return nil, fmt.Errorf("create parachain header proof: %w", err) - } - - // Verify merkle root generated is same as value generated in relaychain - if merkleProofData.Root.Hex() != mmrProof.Leaf.ParachainHeads.Hex() { - return nil, fmt.Errorf("MMR parachain merkle root does not match calculated parachain merkle root (mmr: %s, computed: %s)", - mmrProof.Leaf.ParachainHeads.Hex(), - merkleProofData.Root.String(), - ) + return nil, err } log.Debug("Created all parachain merkle proof data") @@ -278,12 +271,54 @@ func (li *BeefyListener) generateProof(ctx context.Context, input *ProofInput, h MMRProof: simplifiedProof, MMRRootHash: mmrRootHash, Header: *header, - MerkleProofData: merkleProofData, + MerkleProofData: *merkleProofData, } return &output, nil } +// Generate a merkle proof for the parachain head with input ParaId and verify with merkle root hash of all parachain heads +func (li *BeefyListener) generateAndValidateParasHeadsMerkleProof(input *ProofInput, mmrProof *types.GenerateMMRProofResponse) (*MerkleProofData, []relaychain.ParaHead, error) { + // Polkadot uses the following code to generate merkle root from parachain headers: + // https://github.com/paritytech/polkadot-sdk/blob/d66dee3c3da836bcf41a12ca4e1191faee0b6a5b/polkadot/runtime/westend/src/lib.rs#L453-L460 + // Truncate the ParaHeads to the 1024 + // https://github.com/paritytech/polkadot-sdk/blob/d66dee3c3da836bcf41a12ca4e1191faee0b6a5b/polkadot/runtime/parachains/src/paras/mod.rs#L1305-L1311 + paraHeads := input.ParaHeads + numParas := min(MaxParaHeads, len(paraHeads)) + merkleProofData, err := CreateParachainMerkleProof(paraHeads[:numParas], input.ParaID) + if err != nil { + return nil, paraHeads, fmt.Errorf("create parachain header proof: %w", err) + } + + // Verify merkle root generated is same as value generated in relaychain and if so exit early + if merkleProofData.Root.Hex() == mmrProof.Leaf.ParachainHeads.Hex() { + return &merkleProofData, paraHeads, nil + } + + // Try a filtering out parathreads + log.WithFields(log.Fields{ + "beefyBlock": merkleProofData.Root.Hex(), + "leafIndex": mmrProof.Leaf.ParachainHeads.Hex(), + }).Warn("MMR parachain merkle root does not match calculated merkle root. Trying to filtering out parathreads.") + + paraHeads, err = li.relaychainConn.FilterParachainHeads(paraHeads, input.RelayBlockHash) + if err != nil { + return nil, paraHeads, fmt.Errorf("could not filter out parathreads: %w", err) + } + + merkleProofData, err = CreateParachainMerkleProof(paraHeads[:numParas], input.ParaID) + if err != nil { + return nil, paraHeads, fmt.Errorf("create parachain header proof: %w", err) + } + if merkleProofData.Root.Hex() != mmrProof.Leaf.ParachainHeads.Hex() { + return nil, paraHeads, fmt.Errorf("MMR parachain merkle root does not match calculated parachain merkle root (mmr: %s, computed: %s)", + mmrProof.Leaf.ParachainHeads.Hex(), + merkleProofData.Root.String(), + ) + } + return &merkleProofData, paraHeads, nil +} + func (li *BeefyListener) waitAndSend(ctx context.Context, task *Task, waitingPeriod uint64) error { paraNonce := (*task.MessageProofs)[0].Message.Nonce log.Info(fmt.Sprintf("waiting for nonce %d to be picked up by another relayer", paraNonce)) diff --git a/relayer/relays/parachain/scanner.go b/relayer/relays/parachain/scanner.go index b884ed7d03..287ca93118 100644 --- a/relayer/relays/parachain/scanner.go +++ b/relayer/relays/parachain/scanner.go @@ -253,7 +253,7 @@ func (s *Scanner) gatherProofInputs( return fmt.Errorf("fetch relaychain block hash: %w", err) } - parachainHeads, err := s.relayConn.FetchParachainHeads(relayBlockHash) + parachainHeads, err := s.relayConn.FetchParasHeads(relayBlockHash) if err != nil { return fmt.Errorf("fetch parachain heads: %w", err) } @@ -261,6 +261,7 @@ func (s *Scanner) gatherProofInputs( task.ProofInput = &ProofInput{ ParaID: s.paraID, RelayBlockNumber: relayBlockNumber, + RelayBlockHash: relayBlockHash, ParaHeads: parachainHeads, } } diff --git a/relayer/relays/parachain/types.go b/relayer/relays/parachain/types.go index 632b7544da..0e5da77d39 100644 --- a/relayer/relays/parachain/types.go +++ b/relayer/relays/parachain/types.go @@ -28,6 +28,8 @@ type ProofInput struct { ParaID uint32 // Relay chain block number in which our parachain head was included RelayBlockNumber uint64 + // Relay chain block hash in which our parachain head was included + RelayBlockHash types.Hash // All included paraheads in RelayBlockNumber ParaHeads []relaychain.ParaHead } diff --git a/smoketest/.envrc-westend b/smoketest/.envrc-westend new file mode 100644 index 0000000000..3edf6c5ca9 --- /dev/null +++ b/smoketest/.envrc-westend @@ -0,0 +1,26 @@ +source_up_if_exists + +export ETH_NETWORK=sepolia +export POLKADOT_NETWORK=westend + +# Endpoints +export BRIDGE_HUB_WS_URL=wss://westend-bridge-hub-rpc.polkadot.io +export ASSET_HUB_WS_URL=wss://westend-asset-hub-rpc.polkadot.io +export RELAY_CHAIN_WS_URL=wss://westend-rpc.polkadot.io +export ETHEREUM_HTTP_API=https://sepolia.infura.io/v3/*** +export ETHEREUM_API=wss://sepolia.infura.io/ws/v3/*** + +# Contract address +export GATEWAY_PROXY_CONTRACT=9ed8b47bc3417e3bd0507adc06e56e2fa360a4e9 +export WETH_CONTRACT=fff9976782d46cc05630d1f6ebab18b2324d6b14 + +# Receiver Accounts +export SUBSTRATE_RECEIVER=5827013ddc4082f8252f8729bd2f06e77e7863dea9202a6f0e7a2c34e356e85a +export ETHEREUM_RECEIVER=302F0B71B8aD3CF6dD90aDb668E49b2168d652fd + +# Sender Keys +export ETHEREUM_KEY=* +export SUBSTRATE_KEY=* + +# Wait period in blocks +WAIT_PERIOD=1000 \ No newline at end of file diff --git a/smoketest/.gitignore b/smoketest/.gitignore index e40652197b..16f7a97f76 100644 --- a/smoketest/.gitignore +++ b/smoketest/.gitignore @@ -16,3 +16,4 @@ src/parachains/bridgehub.rs src/parachains/penpal.rs src/parachains/relaychain.rs src/contracts +.envrc diff --git a/smoketest/Cargo.lock b/smoketest/Cargo.lock index b205e9171c..6223b9ff8a 100644 --- a/smoketest/Cargo.lock +++ b/smoketest/Cargo.lock @@ -36,6 +36,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aead" version = "0.5.2" @@ -282,6 +288,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + [[package]] name = "async-channel" version = "2.1.1" @@ -475,7 +490,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.2", "object 0.32.2", "rustc-demangle", ] @@ -551,6 +566,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitcoin-internals" version = "0.2.0" @@ -710,6 +740,27 @@ dependencies = [ "serde", ] +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "camino" version = "1.1.6" @@ -748,6 +799,7 @@ version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -974,6 +1026,25 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.11" @@ -1240,6 +1311,48 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "docify" version = "0.2.8" @@ -1400,6 +1513,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -1527,9 +1649,11 @@ dependencies = [ "ethers-addressbook", "ethers-contract", "ethers-core", + "ethers-etherscan", "ethers-middleware", "ethers-providers", "ethers-signers", + "ethers-solc", ] [[package]] @@ -1570,11 +1694,13 @@ dependencies = [ "const-hex", "dunce", "ethers-core", + "ethers-etherscan", "eyre", "prettyplease", "proc-macro2", "quote", "regex", + "reqwest", "serde", "serde_json", "syn 2.0.58", @@ -1626,6 +1752,21 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ethers-etherscan" +version = "2.0.13" +source = "git+https://github.com/gakonst/ethers-rs#79cdcf54e46ceebbcb661fad24ee6b4d98914f5c" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror", + "tracing", +] + [[package]] name = "ethers-middleware" version = "2.0.13" @@ -1706,6 +1847,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "ethers-solc" +version = "2.0.13" +source = "git+https://github.com/gakonst/ethers-rs#79cdcf54e46ceebbcb661fad24ee6b4d98914f5c" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -1818,6 +1990,22 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1865,6 +2053,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "funty" version = "2.0.0" @@ -2052,6 +2250,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "gloo-timers" version = "0.2.6" @@ -2213,6 +2417,15 @@ dependencies = [ "hmac 0.8.1", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "0.2.11" @@ -2461,6 +2674,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -2496,6 +2718,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.67" @@ -2714,6 +2945,36 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.8.2", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata 0.4.5", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2732,6 +2993,16 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "libsecp256k1" version = "0.7.1" @@ -2835,6 +3106,16 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.7.1" @@ -2901,6 +3182,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "1.0.1" @@ -2913,6 +3203,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "no-std-net" version = "0.6.0" @@ -3095,6 +3391,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "parity-bip39" version = "2.0.1" @@ -3164,6 +3466,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "password-hash" version = "0.5.0" @@ -3181,6 +3494,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -3188,6 +3507,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", + "hmac 0.12.1", + "password-hash 0.4.2", + "sha2 0.10.8", ] [[package]] @@ -3198,7 +3520,7 @@ checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", "hmac 0.12.1", - "password-hash", + "password-hash 0.5.0", ] [[package]] @@ -3216,6 +3538,16 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.2.2", +] + [[package]] name = "pharos" version = "0.5.3" @@ -3226,6 +3558,57 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher 0.3.11", +] + [[package]] name = "pin-project" version = "1.1.4" @@ -3279,6 +3662,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "platforms" version = "3.3.0" @@ -3396,6 +3785,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettier-please" version = "0.2.0" @@ -3567,6 +3962,26 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "reconnecting-jsonrpsee-ws-client" version = "0.4.3" @@ -3592,6 +4007,17 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "ref-cast" version = "1.0.22" @@ -3671,6 +4097,7 @@ dependencies = [ "http 0.2.11", "http-body", "hyper", + "hyper-rustls", "ipnet", "js-sys", "log", @@ -3678,17 +4105,21 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls 0.21.10", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "system-configuration", "tokio", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots 0.25.4", "winreg", ] @@ -3924,7 +4355,7 @@ dependencies = [ "rustls-webpki 0.102.2", "security-framework", "security-framework-sys", - "webpki-roots", + "webpki-roots 0.26.3", "winapi", ] @@ -4462,6 +4893,12 @@ dependencies = [ "time", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "siphasher" version = "1.0.0" @@ -4545,7 +4982,7 @@ dependencies = [ "serde_json", "sha2 0.10.8", "sha3", - "siphasher", + "siphasher 1.0.0", "slab", "smallvec", "soketto 0.7.1", @@ -4584,7 +5021,7 @@ dependencies = [ "rand_chacha", "serde", "serde_json", - "siphasher", + "siphasher 1.0.0", "slab", "smol", "smoldot", @@ -4650,6 +5087,20 @@ dependencies = [ "sha1", ] +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + [[package]] name = "sp-application-crypto" version = "33.0.0" @@ -5031,6 +5482,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.10.0" @@ -5231,6 +5695,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "url", + "zip", +] + [[package]] name = "syn" version = "1.0.109" @@ -5304,6 +5788,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5476,8 +5971,11 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", + "rustls 0.21.10", "tokio", + "tokio-rustls 0.24.1", "tungstenite", + "webpki-roots 0.25.4", ] [[package]] @@ -5704,6 +6202,7 @@ dependencies = [ "httparse", "log", "rand", + "rustls 0.21.10", "sha1", "thiserror", "url", @@ -6141,6 +6640,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + [[package]] name = "webpki-roots" version = "0.26.3" @@ -6447,6 +6952,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "yap" version = "0.11.0" @@ -6492,3 +7003,52 @@ dependencies = [ "quote", "syn 2.0.58", ] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq 0.1.5", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac 0.12.1", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/smoketest/Cargo.toml b/smoketest/Cargo.toml index 259e8faee4..965d732068 100644 --- a/smoketest/Cargo.toml +++ b/smoketest/Cargo.toml @@ -12,11 +12,11 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = hex = "0.4.3" hex-literal = "0.4.1" serde = { version = "1.0.197", features = ["derive"] } -subxt = { version = "0.37.0", features = ["substrate-compat", "unstable-light-client"]} +subxt = { version = "0.37.0", features = ["substrate-compat", "unstable-light-client"] } subxt-macro = { version = "0.37.0" } subxt-metadata = { version = "0.37.0" } subxt-codegen = { version = "0.37.0" } subxt-signer = { version = "0.37.0" } -ethers = { git = "https://github.com/gakonst/ethers-rs", default-features = false, features = ["abigen", "ws"] } +ethers = { git = "https://github.com/gakonst/ethers-rs", default-features = false, features = ["abigen", "ws", "rustls"] } lazy_static = "1.4.0" diff --git a/smoketest/make-bindings.sh b/smoketest/make-bindings.sh index 02b96f77da..26157f7983 100755 --- a/smoketest/make-bindings.sh +++ b/smoketest/make-bindings.sh @@ -15,13 +15,24 @@ command -v subxt || cargo install subxt-cli \ --git https://github.com/paritytech/subxt.git \ --tag v0.37.0 -if ! lsof -Pi :11144 -sTCP:LISTEN -t >/dev/null; then - echo "substrate nodes not running, please start with the e2e setup and rerun this script" - exit 1 +eth_network="${ETH_NETWORK:-localhost}" +polkadot_network="${POLKADOT_NETWORK:-localhost}" + +if [ "$polkadot_network" == "westend" ]; then + # Todo: There is no penpal nodes on westend yet + subxt codegen --url wss://westend-bridge-hub-rpc.polkadot.io >src/parachains/bridgehub.rs + subxt codegen --url wss://westend-asset-hub-rpc.polkadot.io >src/parachains/assethub.rs + subxt codegen --url wss://westend-rpc.polkadot.io >src/parachains/relaychain.rs +else + if ! lsof -Pi :11144 -sTCP:LISTEN -t >/dev/null; then + echo "substrate nodes not running, please start with the e2e setup and rerun this script" + exit 1 + fi + # Fetch metadata from BridgeHub and generate client + subxt codegen --url ws://localhost:11144 >src/parachains/bridgehub.rs + subxt codegen --url ws://localhost:12144 >src/parachains/assethub.rs + subxt codegen --url ws://localhost:13144 >src/parachains/penpal.rs + subxt codegen --url ws://localhost:9944 >src/parachains/relaychain.rs fi -# Fetch metadata from BridgeHub and generate client -subxt codegen --url ws://localhost:11144 >src/parachains/bridgehub.rs -subxt codegen --url ws://localhost:12144 >src/parachains/assethub.rs -subxt codegen --url ws://localhost:13144 >src/parachains/penpal.rs -subxt codegen --url ws://localhost:9944 >src/parachains/relaychain.rs + diff --git a/smoketest/src/constants.rs b/smoketest/src/constants.rs index 5394d848e8..c65b7228f5 100644 --- a/smoketest/src/constants.rs +++ b/smoketest/src/constants.rs @@ -1,3 +1,4 @@ +use hex::FromHex; use hex_literal::hex; use lazy_static::lazy_static; use std::{env, string::ToString}; @@ -8,23 +9,25 @@ pub const ASSET_HUB_PARA_ID: u32 = 1000; pub const BRIDGE_HUB_PARA_ID: u32 = 1002; pub const PENPAL_PARA_ID: u32 = 2000; -pub const ETHEREUM_API: &str = "ws://localhost:8546"; -pub const ETHEREUM_HTTP_API: &str = "http://localhost:8545"; +pub const DEFAULT_ETHEREUM_API: &str = "ws://localhost:8546"; +pub const DEFAULT_ETHEREUM_HTTP_API: &str = "http://localhost:8545"; -pub const ASSET_HUB_WS_URL: &str = "ws://127.0.0.1:12144"; -pub const BRIDGE_HUB_WS_URL: &str = "ws://127.0.0.1:11144"; +pub const DEFAULT_BRIDGE_HUB_WS_URL: &str = "ws://127.0.0.1:11144"; +pub const DEFAULT_ASSET_HUB_WS_URL: &str = "ws://127.0.0.1:12144"; pub const PENPAL_WS_URL: &str = "ws://127.0.0.1:13144"; -pub const RELAY_CHAIN_WS_URL: &str = "ws://127.0.0.1:9944"; +pub const DEFAULT_RELAY_CHAIN_WS_URL: &str = "ws://127.0.0.1:9944"; pub const TEMPLATE_NODE_WS_URL: &str = "ws://127.0.0.1:13144"; pub const ETHEREUM_CHAIN_ID: u64 = 11155111; -pub const ETHEREUM_KEY: &str = "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342"; +pub const DEFAULT_ETHEREUM_KEY: &str = + "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342"; pub const ETHEREUM_ADDRESS: [u8; 20] = hex!("90A987B944Cb1dCcE5564e5FDeCD7a54D3de27Fe"); // The deployment addresses of the following contracts are stable in our E2E env, unless we modify // the order in contracts are deployed in DeployScript.sol. -pub const GATEWAY_PROXY_CONTRACT: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); -pub const WETH_CONTRACT: [u8; 20] = hex!("774667629726ec1FaBEbCEc0D9139bD1C8f72a23"); +pub const DEFAULT_GATEWAY_PROXY_CONTRACT: [u8; 20] = + hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); +pub const DEFAULT_WETH_CONTRACT: [u8; 20] = hex!("774667629726ec1FaBEbCEc0D9139bD1C8f72a23"); pub const AGENT_EXECUTOR_CONTRACT: [u8; 20] = hex!("Fc97A6197dc90bef6bbEFD672742Ed75E9768553"); pub const ERC20_DOT_CONTRACT: [u8; 20] = hex!("B8C39CbCe8106c8415472e3AAe88Eb694Cc70B57"); @@ -86,4 +89,96 @@ lazy_static! { .unwrap_or("1000000000000000".to_string()) .parse() .unwrap(); + pub static ref BRIDGE_HUB_WS_URL: String = { + if let Ok(val) = env::var("BRIDGE_HUB_WS_URL") { + val + } + else { + DEFAULT_BRIDGE_HUB_WS_URL.to_string() + } + }; + pub static ref ASSET_HUB_WS_URL: String = { + if let Ok(val) = env::var("ASSET_HUB_WS_URL") { + val + } + else { + DEFAULT_ASSET_HUB_WS_URL.to_string() + } + }; + pub static ref RELAY_CHAIN_WS_URL: String = { + if let Ok(val) = env::var("RELAY_CHAIN_WS_URL") { + val + } + else { + DEFAULT_RELAY_CHAIN_WS_URL.to_string() + } + }; + pub static ref ETHEREUM_API: String = { + if let Ok(val) = env::var("ETHEREUM_API") { + val + } + else { + DEFAULT_ETHEREUM_API.to_string() + } + }; + pub static ref ETHEREUM_HTTP_API: String = { + if let Ok(val) = env::var("ETHEREUM_HTTP_API") { + val + } + else { + DEFAULT_ETHEREUM_HTTP_API.to_string() + } + }; + pub static ref ETHEREUM_KEY: String = { + if let Ok(val) = env::var("ETHEREUM_KEY") { + val + } + else { + DEFAULT_ETHEREUM_KEY.to_string() + } + }; + pub static ref GATEWAY_PROXY_CONTRACT: [u8; 20] = { + if let Ok(val) = env::var("GATEWAY_PROXY_CONTRACT") { + <[u8; 20]>::from_hex(val).unwrap() + } + else { + DEFAULT_GATEWAY_PROXY_CONTRACT + } + }; + pub static ref WETH_CONTRACT: [u8; 20] = { + if let Ok(val) = env::var("WETH_CONTRACT") { + <[u8; 20]>::from_hex(val).unwrap() + } + else { + DEFAULT_WETH_CONTRACT + } + }; + + pub static ref SUBSTRATE_RECEIVER: [u8; 32] = { + if let Ok(val) = env::var("SUBSTRATE_RECEIVER") { + <[u8; 32]>::from_hex(val).unwrap() + } + else { + BOB_PUBLIC.clone() + } + }; + + pub static ref ETHEREUM_RECEIVER: [u8; 20] = { + if let Ok(val) = env::var("ETHEREUM_RECEIVER") { + <[u8; 20]>::from_hex(val).unwrap() + } + else { + <[u8; 20]>::from_hex("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e").unwrap() + } + }; + pub static ref SUBSTRATE_KEY: String = { + if let Ok(val) = env::var("SUBSTRATE_KEY") { + "0x".to_owned() + &val + } + else { + "//Bob".to_string() + } + }; + pub static ref WAIT_PERIOD: u64 = + env::var("WAIT_PERIOD").unwrap_or("100".to_string()).parse().unwrap(); } diff --git a/smoketest/src/helper.rs b/smoketest/src/helper.rs index e0b668e11d..136067d959 100644 --- a/smoketest/src/helper.rs +++ b/smoketest/src/helper.rs @@ -3,7 +3,6 @@ use crate::{ contracts::i_gateway, parachains::{ bridgehub::{self, api::runtime_types::snowbridge_core::outbound::v1::OperatingMode}, - penpal::{self, api::runtime_types as penpalTypes}, relaychain, relaychain::api::runtime_types::{ pallet_xcm::pallet::Call as RelaychainPalletXcmCall, @@ -33,14 +32,6 @@ use ethers::{ types::Log, }; use futures::StreamExt; -use penpalTypes::{ - penpal_runtime::RuntimeCall as PenpalRuntimeCall, - staging_xcm::v4::{ - junction::Junction as PenpalJunction, junctions::Junctions as PenpalJunctions, - location::Location as PenpalLocation, - }, - xcm::{VersionedLocation as PenpalVersionedLocation, VersionedXcm as PenpalVersionedXcm}, -}; use std::{ops::Deref, sync::Arc, time::Duration}; use subxt::{ config::DefaultExtrinsicParams, @@ -51,20 +42,6 @@ use subxt::{ Config, OnlineClient, PolkadotConfig, }; -/// Custom config that works with Penpal -pub enum PenpalConfig {} - -impl Config for PenpalConfig { - type Hash = ::Hash; - type AccountId = ::AccountId; - type Address = ::Address; - type AssetId = ::AssetId; - type Signature = ::Signature; - type Hasher = ::Hasher; - type Header = ::Header; - type ExtrinsicParams = DefaultExtrinsicParams; -} - /// Custom config that works with Statemint pub enum AssetHubConfig {} @@ -82,31 +59,28 @@ impl Config for AssetHubConfig { pub struct TestClients { pub asset_hub_client: Box>, pub bridge_hub_client: Box>, - pub penpal_client: Box>, pub relaychain_client: Box>, pub ethereum_client: Box>>, pub ethereum_signed_client: Box, LocalWallet>>>, } pub async fn initial_clients() -> Result> { - let bridge_hub_client: OnlineClient = OnlineClient::from_url(BRIDGE_HUB_WS_URL) - .await - .expect("can not connect to bridgehub"); - - let asset_hub_client: OnlineClient = OnlineClient::from_url(ASSET_HUB_WS_URL) - .await - .expect("can not connect to bridgehub"); + let bridge_hub_client: OnlineClient = + OnlineClient::from_url((*BRIDGE_HUB_WS_URL).to_string()) + .await + .expect("can not connect to bridgehub"); - let penpal_client: OnlineClient = OnlineClient::from_url(PENPAL_WS_URL) - .await - .expect("can not connect to penpal parachain"); + let asset_hub_client: OnlineClient = + OnlineClient::from_url((*ASSET_HUB_WS_URL).to_string()) + .await + .expect("can not connect to assethub"); let relaychain_client: OnlineClient = - OnlineClient::from_url(RELAY_CHAIN_WS_URL) + OnlineClient::from_url((*RELAY_CHAIN_WS_URL).to_string()) .await .expect("can not connect to relaychain"); - let ethereum_provider = Provider::::connect(ETHEREUM_API) + let ethereum_provider = Provider::::connect((*ETHEREUM_API).to_string()) .await .unwrap() .interval(Duration::from_millis(10u64)); @@ -118,7 +92,6 @@ pub async fn initial_clients() -> Result Ok(TestClients { asset_hub_client: Box::new(asset_hub_client), bridge_hub_client: Box::new(bridge_hub_client), - penpal_client: Box::new(penpal_client), relaychain_client: Box::new(relaychain_client), ethereum_client: Box::new(ethereum_client), ethereum_signed_client: Box::new(Arc::new(ethereum_signed_client)), @@ -153,7 +126,7 @@ pub async fn wait_for_bridgehub_event( } pub async fn wait_for_ethereum_event(ethereum_client: &Box>>) { - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_gateway::IGateway::new(gateway_addr, (*ethereum_client).deref().clone()); let wait_for_blocks = 500; @@ -181,56 +154,17 @@ pub struct SudoResult { pub extrinsic_hash: H256, } -pub async fn send_sudo_xcm_transact( - penpal_client: &Box>, - message: Box, -) -> Result> { - let dest = Box::new(PenpalVersionedLocation::V4(PenpalLocation { - parents: 1, - interior: PenpalJunctions::X1([PenpalJunction::Parachain(BRIDGE_HUB_PARA_ID)]), - })); - - let sudo_call = penpal::api::sudo::calls::TransactionApi::sudo( - &penpal::api::sudo::calls::TransactionApi, - PenpalRuntimeCall::PolkadotXcm(penpalTypes::pallet_xcm::pallet::Call::send { - dest, - message, - }), - ); - - let owner = Pair::from_string("//Alice", None).expect("cannot create keypair"); - - let signer: PairSigner = PairSigner::new(owner); - - let result = penpal_client - .tx() - .sign_and_submit_then_watch_default(&sudo_call, &signer) - .await - .expect("send through xcm call.") - .wait_for_finalized() - .await - .expect("xcm call failed"); - - let block_hash = result.block_hash(); - let extrinsic_hash = result.extrinsic_hash(); - - let sudo_result = SudoResult { block_hash, extrinsic_hash }; - - if let Err(err) = result.wait_for_success().await { - Err(Box::new(err)) - } else { - Ok(sudo_result) - } -} - pub async fn initialize_wallet( ) -> Result, LocalWallet>, Box> { - let provider = Provider::::try_from(ETHEREUM_HTTP_API) + let provider = Provider::::try_from((*ETHEREUM_HTTP_API).to_string()) .unwrap() .interval(Duration::from_millis(10u64)); - let wallet: LocalWallet = - ETHEREUM_KEY.parse::().unwrap().with_chain_id(ETHEREUM_CHAIN_ID); + let wallet: LocalWallet = (*ETHEREUM_KEY) + .to_string() + .parse::() + .unwrap() + .with_chain_id(ETHEREUM_CHAIN_ID); Ok(SignerMiddleware::new(provider.clone(), wallet.clone())) } @@ -342,7 +276,7 @@ pub async fn governance_bridgehub_call_from_relay_chain( pub async fn fund_agent(agent_id: [u8; 32]) -> Result<(), Box> { let test_clients = initial_clients().await.expect("initialize clients"); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let ethereum_client = *(test_clients.ethereum_client.clone()); let gateway = i_gateway::IGateway::new(gateway_addr, ethereum_client.clone()); let agent_address = gateway.agent_of(agent_id).await.expect("find agent"); diff --git a/smoketest/src/lib.rs b/smoketest/src/lib.rs index 68fd128d80..5ce34eed3f 100644 --- a/smoketest/src/lib.rs +++ b/smoketest/src/lib.rs @@ -3,3 +3,5 @@ pub mod contracts; pub mod helper; pub mod parachains; pub mod xcm; + +pub mod penpal_helper; diff --git a/smoketest/src/penpal_helper.rs b/smoketest/src/penpal_helper.rs new file mode 100644 index 0000000000..46503d97a5 --- /dev/null +++ b/smoketest/src/penpal_helper.rs @@ -0,0 +1,83 @@ +use crate::{ + constants::*, + parachains::penpal::{self, api::runtime_types as penpalTypes}, +}; +use penpalTypes::{ + penpal_runtime::RuntimeCall as PenpalRuntimeCall, + staging_xcm::v4::{ + junction::Junction as PenpalJunction, junctions::Junctions as PenpalJunctions, + location::Location as PenpalLocation, + }, + xcm::{VersionedLocation as PenpalVersionedLocation, VersionedXcm as PenpalVersionedXcm}, +}; +use subxt::{ + config::DefaultExtrinsicParams, + ext::sp_core::{sr25519::Pair, Pair as PairT}, + tx::PairSigner, + utils::H256, + Config, OnlineClient, PolkadotConfig, +}; + +/// Custom config that works with Penpal +pub enum PenpalConfig {} + +impl Config for PenpalConfig { + type Hash = ::Hash; + type AccountId = ::AccountId; + type Address = ::Address; + type AssetId = ::AssetId; + type Signature = ::Signature; + type Hasher = ::Hasher; + type Header = ::Header; + type ExtrinsicParams = DefaultExtrinsicParams; +} + +pub struct SudoResult { + pub block_hash: H256, + pub extrinsic_hash: H256, +} + +pub async fn send_sudo_xcm_transact( + message: Box, +) -> Result> { + let penpal_client: OnlineClient = OnlineClient::from_url(PENPAL_WS_URL) + .await + .expect("can not connect to penpal parachain"); + + let dest = Box::new(PenpalVersionedLocation::V4(PenpalLocation { + parents: 1, + interior: PenpalJunctions::X1([PenpalJunction::Parachain(BRIDGE_HUB_PARA_ID)]), + })); + + let sudo_call = penpal::api::sudo::calls::TransactionApi::sudo( + &penpal::api::sudo::calls::TransactionApi, + PenpalRuntimeCall::PolkadotXcm(penpalTypes::pallet_xcm::pallet::Call::send { + dest, + message, + }), + ); + + let owner = Pair::from_string("//Alice", None).expect("cannot create keypair"); + + let signer: PairSigner = PairSigner::new(owner); + + let result = penpal_client + .tx() + .sign_and_submit_then_watch_default(&sudo_call, &signer) + .await + .expect("send through xcm call.") + .wait_for_finalized() + .await + .expect("xcm call failed"); + + let block_hash = result.block_hash(); + let extrinsic_hash = result.extrinsic_hash(); + + let sudo_result = SudoResult { block_hash, extrinsic_hash }; + + if let Err(err) = result.wait_for_success().await { + Err(Box::new(err)) + } else { + Ok(sudo_result) + } +} diff --git a/smoketest/tests/create_agent.rs b/smoketest/tests/create_agent.rs index 19159e2cc1..3074af3aa3 100644 --- a/smoketest/tests/create_agent.rs +++ b/smoketest/tests/create_agent.rs @@ -1,7 +1,7 @@ use snowbridge_smoketest::{ contracts::i_gateway::AgentCreatedFilter, helper::*, parachains::bridgehub::api::ethereum_system::events::CreateAgent, - xcm::construct_xcm_message_with_fee, + penpal_helper::send_sudo_xcm_transact, xcm::construct_xcm_message_with_fee, }; #[tokio::test] @@ -14,9 +14,7 @@ async fn create_agent() { let message = construct_xcm_message_with_fee(encoded_call); - let result = send_sudo_xcm_transact(&test_clients.penpal_client, message) - .await - .expect("failed to send xcm transact."); + let result = send_sudo_xcm_transact(message).await.expect("failed to send xcm transact."); println!( "xcm call issued at block hash {:?}, transaction hash {:?}", diff --git a/smoketest/tests/create_channel.rs b/smoketest/tests/create_channel.rs index 795847be43..43640ee181 100644 --- a/smoketest/tests/create_channel.rs +++ b/smoketest/tests/create_channel.rs @@ -1,7 +1,7 @@ use snowbridge_smoketest::{ contracts::i_gateway::ChannelCreatedFilter, helper::*, parachains::bridgehub::api::ethereum_system::events::CreateChannel, - xcm::construct_xcm_message_with_fee, + penpal_helper::send_sudo_xcm_transact, xcm::construct_xcm_message_with_fee, }; #[tokio::test] @@ -14,9 +14,7 @@ async fn create_channel() { let message = construct_xcm_message_with_fee(encoded_call); - let result = send_sudo_xcm_transact(&test_clients.penpal_client, message) - .await - .expect("failed to send xcm transact."); + let result = send_sudo_xcm_transact(message).await.expect("failed to send xcm transact."); println!( "xcm call issued at block hash {:?}, transaction hash {:?}", diff --git a/smoketest/tests/register_token.rs b/smoketest/tests/register_token.rs index a804452f9b..ede7f6991e 100644 --- a/smoketest/tests/register_token.rs +++ b/smoketest/tests/register_token.rs @@ -27,10 +27,10 @@ async fn register_token() { let ethereum_client = *(test_clients.ethereum_signed_client.clone()); let assethub = *(test_clients.asset_hub_client.clone()); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_gateway::IGateway::new(gateway_addr, ethereum_client.clone()); - let weth_addr: Address = WETH_CONTRACT.into(); + let weth_addr: Address = (*WETH_CONTRACT).into(); let weth = weth9::WETH9::new(weth_addr, ethereum_client.clone()); let fee = gateway.quote_register_token_fee().call().await.unwrap(); @@ -59,7 +59,7 @@ async fn register_token() { assert_eq!(receipt.status.unwrap().as_u64(), 1u64); - let wait_for_blocks = 100; + let wait_for_blocks = (*WAIT_PERIOD) as usize; let mut blocks = assethub .blocks() .subscribe_finalized() @@ -71,7 +71,7 @@ async fn register_token() { parents: 2, interior: X2( GlobalConsensus(NetworkId::Ethereum { chain_id: ETHEREUM_CHAIN_ID }), - AccountKey20 { network: None, key: WETH_CONTRACT.into() }, + AccountKey20 { network: None, key: (*WETH_CONTRACT).into() }, ), }; let expected_creator: AccountId32 = SNOWBRIDGE_SOVEREIGN.into(); diff --git a/smoketest/tests/send_polkadot_token.rs b/smoketest/tests/send_polkadot_token.rs index a81e662e05..ccb60853a6 100644 --- a/smoketest/tests/send_polkadot_token.rs +++ b/smoketest/tests/send_polkadot_token.rs @@ -14,7 +14,7 @@ async fn send_polkadot_token() { let ethereum_client = *(test_clients.ethereum_signed_client.clone()); let assethub = *(test_clients.asset_hub_client.clone()); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_gateway::IGateway::new(gateway_addr, ethereum_client.clone()); let token: Address = ERC20_DOT_CONTRACT.into(); diff --git a/smoketest/tests/send_token.rs b/smoketest/tests/send_token.rs index e0063d9391..0acf38e207 100644 --- a/smoketest/tests/send_token.rs +++ b/smoketest/tests/send_token.rs @@ -29,14 +29,14 @@ async fn send_token() { let ethereum_client = *(test_clients.ethereum_signed_client.clone()); let assethub = *(test_clients.asset_hub_client.clone()); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_gateway::IGateway::new(gateway_addr, ethereum_client.clone()); - let weth_addr: Address = WETH_CONTRACT.into(); + let weth_addr: Address = (*WETH_CONTRACT).into(); let weth = weth9::WETH9::new(weth_addr, ethereum_client.clone()); // Mint WETH tokens - let value = parse_units("1", "ether").unwrap(); + let value = parse_units("0.01", "ether").unwrap(); let receipt = weth.deposit().value(value).send().await.unwrap().await.unwrap().unwrap(); assert_eq!(receipt.status.unwrap().as_u64(), 1u64); @@ -63,7 +63,7 @@ async fn send_token() { .send_token( weth.address(), ASSET_HUB_PARA_ID, - i_gateway::MultiAddress { kind: 1, data: (*BOB_PUBLIC).into() }, + i_gateway::MultiAddress { kind: 1, data: (*SUBSTRATE_RECEIVER).into() }, destination_fee, amount, ) @@ -89,7 +89,7 @@ async fn send_token() { assert_eq!(receipt.status.unwrap().as_u64(), 1u64); - let wait_for_blocks = 100; + let wait_for_blocks = (*WAIT_PERIOD) as usize; let mut blocks = assethub .blocks() .subscribe_finalized() @@ -101,10 +101,10 @@ async fn send_token() { parents: 2, interior: X2( GlobalConsensus(NetworkId::Ethereum { chain_id: ETHEREUM_CHAIN_ID }), - AccountKey20 { network: None, key: WETH_CONTRACT.into() }, + AccountKey20 { network: None, key: (*WETH_CONTRACT).into() }, ), }; - let expected_owner: AccountId32 = (*BOB_PUBLIC).into(); + let expected_owner: AccountId32 = (*SUBSTRATE_RECEIVER).into(); let mut issued_event_found = false; while let Some(Ok(block)) = blocks.next().await { diff --git a/smoketest/tests/send_token_to_penpal.rs b/smoketest/tests/send_token_to_penpal.rs index 3a24d5c9fc..d278cb56df 100644 --- a/smoketest/tests/send_token_to_penpal.rs +++ b/smoketest/tests/send_token_to_penpal.rs @@ -6,7 +6,7 @@ use futures::StreamExt; use snowbridge_smoketest::{ constants::*, contracts::{i_gateway, weth9}, - helper::{initial_clients, PenpalConfig}, + helper::initial_clients, parachains::{ assethub::api::{ foreign_assets::events::Issued as AssetHubIssued, @@ -21,6 +21,7 @@ use snowbridge_smoketest::{ }, penpal::{self, api::foreign_assets::events::Issued as PenpalIssued}, }, + penpal_helper::PenpalConfig, }; use subxt::{ ext::codec::Encode, @@ -34,12 +35,14 @@ async fn send_token_to_penpal() { let test_clients = initial_clients().await.expect("initialize clients"); let ethereum_client = *(test_clients.ethereum_signed_client.clone()); let assethub_client = *(test_clients.asset_hub_client.clone()); - let penpal_client = *(test_clients.penpal_client.clone()); + let penpal_client: OnlineClient = OnlineClient::from_url(PENPAL_WS_URL) + .await + .expect("can not connect to penpal parachain"); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_gateway::IGateway::new(gateway_addr, ethereum_client.clone()); - let weth_addr: Address = WETH_CONTRACT.into(); + let weth_addr: Address = (*WETH_CONTRACT).into(); let weth = weth9::WETH9::new(weth_addr, ethereum_client.clone()); // Mint WETH tokens @@ -47,7 +50,7 @@ async fn send_token_to_penpal() { let receipt = weth.deposit().value(value).send().await.unwrap().await.unwrap().unwrap(); assert_eq!(receipt.status.unwrap().as_u64(), 1u64); - ensure_penpal_asset_exists(&mut test_clients.penpal_client.clone()).await; + ensure_penpal_asset_exists(&mut penpal_client.clone()).await; // Approve token spend weth.approve(gateway_addr, value.into()) @@ -100,7 +103,7 @@ async fn send_token_to_penpal() { parents: 2, interior: X2([ GlobalConsensus(NetworkId::Ethereum { chain_id: ETHEREUM_CHAIN_ID }), - AccountKey20 { network: None, key: WETH_CONTRACT.into() }, + AccountKey20 { network: None, key: (*WETH_CONTRACT).into() }, ]), }; let assethub_expected_owner: AccountId32 = PENPAL_SOVEREIGN.into(); @@ -166,7 +169,7 @@ async fn ensure_penpal_asset_exists(penpal_client: &mut OnlineClient::connect(ETHEREUM_API) + let ethereum_provider = Provider::::connect((*ETHEREUM_API).to_string()) .await .unwrap() .interval(Duration::from_millis(10u64)); @@ -38,7 +38,7 @@ async fn transfer_polkadot_token() { let ethereum_client = Arc::new(ethereum_provider); let assethub: OnlineClient = - OnlineClient::from_url(ASSET_HUB_WS_URL).await.unwrap(); + OnlineClient::from_url((*ASSET_HUB_WS_URL).to_string()).await.unwrap(); let amount: u128 = 1_000_000_000; let assets = VersionedAssets::V3(MultiAssets(vec![MultiAsset { diff --git a/smoketest/tests/transfer_token.rs b/smoketest/tests/transfer_token.rs index a356d2855e..7953011e53 100644 --- a/smoketest/tests/transfer_token.rs +++ b/smoketest/tests/transfer_token.rs @@ -5,7 +5,6 @@ use ethers::{ types::Address, }; use futures::StreamExt; -use hex_literal::hex; use snowbridge_smoketest::{ constants::*, contracts::{ @@ -28,30 +27,30 @@ use snowbridge_smoketest::{ {self}, }, }; -use std::{sync::Arc, time::Duration}; +use std::{str::FromStr, sync::Arc, time::Duration}; use subxt::OnlineClient; -use subxt_signer::sr25519::dev; - -const DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e"); +use subxt_signer::{sr25519, SecretUri}; #[tokio::test] async fn transfer_token() { - let ethereum_provider = Provider::::connect(ETHEREUM_API) + let ethereum_provider = Provider::::connect((*ETHEREUM_API).to_string()) .await .unwrap() .interval(Duration::from_millis(10u64)); let ethereum_client = Arc::new(ethereum_provider); - let weth_addr: Address = WETH_CONTRACT.into(); + let weth_addr: Address = (*WETH_CONTRACT).into(); let weth = WETH9::new(weth_addr, ethereum_client.clone()); - let gateway = IGateway::new(GATEWAY_PROXY_CONTRACT, ethereum_client.clone()); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); + let gateway = IGateway::new(gateway_addr, ethereum_client.clone()); + let agent_src = gateway.agent_of(ASSET_HUB_AGENT_ID).await.expect("could not get agent address"); let assethub: OnlineClient = - OnlineClient::from_url(ASSET_HUB_WS_URL).await.unwrap(); + OnlineClient::from_url((*ASSET_HUB_WS_URL).to_string()).await.unwrap(); let amount: u128 = 1_000_000_000; let assets = VersionedAssets::V3(MultiAssets(vec![MultiAsset { @@ -59,7 +58,7 @@ async fn transfer_token() { parents: 2, interior: Junctions::X2( Junction::GlobalConsensus(NetworkId::Ethereum { chain_id: ETHEREUM_CHAIN_ID }), - Junction::AccountKey20 { network: None, key: WETH_CONTRACT.into() }, + Junction::AccountKey20 { network: None, key: (*WETH_CONTRACT).into() }, ), }), fun: Fungibility::Fungible(amount), @@ -76,11 +75,13 @@ async fn transfer_token() { parents: 0, interior: Junctions::X1(Junction::AccountKey20 { network: None, - key: DESTINATION_ADDRESS.into(), + key: (*ETHEREUM_RECEIVER).into(), }), }); - let signer = dev::bob(); + let suri = SecretUri::from_str(&SUBSTRATE_KEY).expect("Parse SURI"); + + let signer = sr25519::Keypair::from_uri(&suri).expect("valid keypair"); let token_transfer_call = TransactionApi.reserve_transfer_assets(destination, beneficiary, assets, 0); @@ -101,11 +102,13 @@ async fn transfer_token() { weth.event::().at_block_hash(block.hash.unwrap()).query().await { for transfer in transfers { - println!("Transfer event found at ethereum block {:?}", block.number.unwrap()); - assert_eq!(transfer.src, agent_src.into()); - assert_eq!(transfer.dst, DESTINATION_ADDRESS.into()); - assert_eq!(transfer.wad, amount.into()); - transfer_event_found = true; + if transfer.src.eq(&agent_src) { + println!("Transfer event found at ethereum block {:?}", block.number.unwrap()); + assert_eq!(transfer.src, agent_src.into()); + assert_eq!(transfer.dst, (*ETHEREUM_RECEIVER).into()); + assert_eq!(transfer.wad, amount.into()); + transfer_event_found = true; + } } } if transfer_event_found { diff --git a/smoketest/tests/upgrade_gateway.rs b/smoketest/tests/upgrade_gateway.rs index 2ddd5ff91d..e896b2c29c 100644 --- a/smoketest/tests/upgrade_gateway.rs +++ b/smoketest/tests/upgrade_gateway.rs @@ -46,13 +46,13 @@ const GATEWAY_V2_ADDRESS: [u8; 20] = hex!("f8f7758fbcefd546eaeff7de24aff666b6228 #[tokio::test] async fn upgrade_gateway() { - let ethereum_provider = Provider::::connect(ETHEREUM_API) + let ethereum_provider = Provider::::connect((*ETHEREUM_API).to_string()) .await .unwrap() .interval(Duration::from_millis(10u64)); let ethereum_client = Arc::new(ethereum_provider); - let gateway_addr: Address = GATEWAY_PROXY_CONTRACT.into(); + let gateway_addr: Address = (*GATEWAY_PROXY_CONTRACT).into(); let gateway = i_upgradable::IUpgradable::new(gateway_addr, ethereum_client.clone()); let new_impl = mock_gateway_v2::MockGatewayV2::new( @@ -64,9 +64,9 @@ async fn upgrade_gateway() { let new_impl_initializer_params = ethers::abi::encode(&[Token::Uint(42.into())]); let relaychain: OnlineClient = - OnlineClient::from_url(RELAY_CHAIN_WS_URL).await.unwrap(); + OnlineClient::from_url((*RELAY_CHAIN_WS_URL).to_string()).await.unwrap(); let bridgehub: OnlineClient = - OnlineClient::from_url(BRIDGE_HUB_WS_URL).await.unwrap(); + OnlineClient::from_url((*BRIDGE_HUB_WS_URL).to_string()).await.unwrap(); let sudo: Pair = Pair::from_string("//Alice", None).expect("cannot create sudo keypair"); diff --git a/web/packages/api/package.json b/web/packages/api/package.json index 12c71f87e5..84f83107cd 100644 --- a/web/packages/api/package.json +++ b/web/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/api", - "version": "0.1.20", + "version": "0.1.21", "description": "Snowbridge API client", "license": "Apache-2.0", "repository": { diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index 22691c60c2..bbfb610607 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -625,4 +625,97 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { GRAPHQL_API_URL: "https://data.snowbridge.network/graphql", }, }, + westend_sepolia: { + name: "westend_sepolia", + ethChainId: 11155111, + locations: [ + { + id: "ethereum", + name: "Ethereum", + type: "ethereum", + destinationIds: ["assethub", "muse"], + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 1_000_000_000_000n, + } + ], + }, + { + id: "assethub", + name: "Asset Hub", + type: "substrate", + destinationIds: ["ethereum"], + paraInfo: { + paraId: 1000, + destinationFeeDOT: 0n, + skipExistentialDepositCheck: false, + addressType: "32byte", + decimals: 12, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 15_000_000_000_000n, + } + ], + } + ], + config: { + BEACON_HTTP_API: "https://lodestar-sepolia.chainsafe.io", + ETHEREUM_API: (key) => `https://eth-sepolia.g.alchemy.com/v2/${key}`, + RELAY_CHAIN_URL: "https://westend-rpc.polkadot.io", + ASSET_HUB_URL: "wss://westend-asset-hub-rpc.polkadot.io", + BRIDGE_HUB_URL: "https://westend-bridge-hub-rpc.polkadot.io", + PARACHAINS: [], + GATEWAY_CONTRACT: "0x9ed8b47bc3417e3bd0507adc06e56e2fa360a4e9", + BEEFY_CONTRACT: "0x6DFaD3D73A28c48E4F4c616ECda80885b415283a", + ASSET_HUB_PARAID: 1000, + BRIDGE_HUB_PARAID: 1002, + PRIMARY_GOVERNANCE_CHANNEL_ID: + "0x0000000000000000000000000000000000000000000000000000000000000001", + SECONDARY_GOVERNANCE_CHANNEL_ID: + "0x0000000000000000000000000000000000000000000000000000000000000002", + RELAYERS: [ + { + name: "beacon", + account: "5E4Hf7LzHE4W3jabjLWSP8p8RzEa9ednwRivFEwYAprzpgwc", + type: "substrate", + }, + { + name: "beefy", + account: "0x302f0b71b8ad3cf6dd90adb668e49b2168d652fd", + type: "ethereum", + }, + { + name: "parachain-primary-gov", + account: "0x302f0b71b8ad3cf6dd90adb668e49b2168d652fd", + type: "ethereum", + }, + { + name: "parachain-secondary-gov", + account: "0x302f0b71b8ad3cf6dd90adb668e49b2168d652fd", + type: "ethereum", + }, + { + name: "execution-assethub", + account: "5E4Hf7LzHE4W3jabjLWSP8p8RzEa9ednwRivFEwYAprzpgwc", + type: "substrate", + }, + { + name: "parachain-assethub", + account: "0x302f0b71b8ad3cf6dd90adb668e49b2168d652fd", + type: "ethereum", + }, + ], + SUBSCAN_API: { + RELAY_CHAIN_URL: "https://westend.api.subscan.io", + ASSET_HUB_URL: "https://assethub-westend.api.subscan.io", + BRIDGE_HUB_URL: "https://bridgehub-westend.api.subscan.io", + }, + }, + }, } diff --git a/web/packages/api/src/status.ts b/web/packages/api/src/status.ts index 6bc4572c1b..fecda19f4c 100644 --- a/web/packages/api/src/status.ts +++ b/web/packages/api/src/status.ts @@ -63,6 +63,8 @@ export enum AlarmReason { ToEthereumChannelStale = "ToEthereumChannelStale", ToPolkadotChannelStale = "ToPolkadotChannelStale", AccountBalanceInsufficient = "AccountBalanceInsufficient", + ToEthereumNoTransfer = "ToEthereumNoTransfer", + ToPolkadotNoTransfer = "ToPolkadotNoTransfer", } export type Sovereign = { name: string; account: string; balance: bigint; type: SourceType } @@ -94,8 +96,12 @@ export const bridgeStatusInfo = async ( options = { polkadotBlockTimeInSeconds: 6, ethereumBlockTimeInSeconds: 12, - toPolkadotCheckIntervalInBlock: BlockLatencyThreshold.ToPolkadot, - toEthereumCheckIntervalInBlock: BlockLatencyThreshold.ToEthereum, + toPolkadotCheckIntervalInBlock: process.env["CheckIntervalToPolkadot"] + ? parseInt(process.env["CheckIntervalToPolkadot"]) + : BlockLatencyThreshold.ToPolkadot, + toEthereumCheckIntervalInBlock: process.env["CheckIntervalToEthereum"] + ? parseInt(process.env["CheckIntervalToEthereum"]) + : BlockLatencyThreshold.ToEthereum, } ): Promise => { // Beefy status @@ -194,8 +200,12 @@ export const channelStatusInfo = async ( context: Context, channelId: string, options = { - toPolkadotCheckIntervalInBlock: BlockLatencyThreshold.ToEthereum, - toEthereumCheckIntervalInBlock: BlockLatencyThreshold.ToPolkadot, + toPolkadotCheckIntervalInBlock: process.env["CheckIntervalToPolkadot"] + ? parseInt(process.env["CheckIntervalToPolkadot"]) + : BlockLatencyThreshold.ToPolkadot, + toEthereumCheckIntervalInBlock: process.env["CheckIntervalToEthereum"] + ? parseInt(process.env["CheckIntervalToEthereum"]) + : BlockLatencyThreshold.ToEthereum, } ): Promise => { const [inbound_nonce_eth, outbound_nonce_eth] = diff --git a/web/packages/contract-types/package.json b/web/packages/contract-types/package.json index a47dc81ab6..b9f8fcc83f 100644 --- a/web/packages/contract-types/package.json +++ b/web/packages/contract-types/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contract-types", - "version": "0.1.20", + "version": "0.1.21", "description": "Snowbridge contract type bindings", "license": "Apache-2.0", "repository": { diff --git a/web/packages/contracts/package.json b/web/packages/contracts/package.json index 4dca5f6033..b1219a9db8 100644 --- a/web/packages/contracts/package.json +++ b/web/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contracts", - "version": "0.1.20", + "version": "0.1.21", "description": "Snowbridge contract source and abi.", "license": "Apache-2.0", "repository": { diff --git a/web/packages/operations/.env.example b/web/packages/operations/.env.example index 378a348e98..a679a1de38 100644 --- a/web/packages/operations/.env.example +++ b/web/packages/operations/.env.example @@ -16,3 +16,10 @@ GRAPHQL_API_URL=https://data.snowbridge.network/graphql # Scan interval(in minutes) SCAN_INTERVAL=30 + +# Keys +ETHEREUM_KEY= +SUBSTRATE_KEY= + +PENPAL_TRANSFER=false +CRON_EXPRESSION=0 0 * * * diff --git a/web/packages/operations/ecosystem.config.js b/web/packages/operations/ecosystem.config.js index 64a1825368..a7807f8673 100644 --- a/web/packages/operations/ecosystem.config.js +++ b/web/packages/operations/ecosystem.config.js @@ -3,7 +3,20 @@ module.exports = { { name: "monitor", node_args: "--require=dotenv/config", - script: "./dist/src/cron.js", + script: "./dist/src/main.js", + args: "cron" + }, + { + name: "transferToPolkadot", + node_args: "--require=dotenv/config", + script: "./dist/src/transfer_to_polkadot.js", + args: "cron" + }, + { + name: "transferToEthereum", + node_args: "--require=dotenv/config", + script: "./dist/src/transfer_to_ethereum.js", + args: "cron" }, ], }; diff --git a/web/packages/operations/package.json b/web/packages/operations/package.json index 2727ad395e..124b588eb6 100644 --- a/web/packages/operations/package.json +++ b/web/packages/operations/package.json @@ -16,6 +16,9 @@ "start": "npx ts-node src/main.ts start", "cron": "npx ts-node src/main.ts cron", "server": "npx ts-node src/server.ts", + "smokeTest": "npx ts-node src/transfer_token.ts start", + "transferToPolkadot": "npx ts-node src/transfer_to_polkadot.ts start", + "transferToEthereum": "npx ts-node src/transfer_to_ethereum.ts start", "format": "prettier src --write" }, "devDependencies": { diff --git a/web/packages/operations/src/alarm.ts b/web/packages/operations/src/alarm.ts index dd77a3e1d6..6f3d68b564 100644 --- a/web/packages/operations/src/alarm.ts +++ b/web/packages/operations/src/alarm.ts @@ -64,6 +64,10 @@ export const sendMetrics = async (metrics: status.AllMetrics) => { }) // Channel metrics for (let channel of metrics.channels) { + // Only monitor AH channel + if (channel.name != status.ChannelKind.AssetHub) { + continue + } // To Ethereum metricData.push({ MetricName: "ToEthereumOutboundNonce", @@ -113,6 +117,12 @@ export const sendMetrics = async (metrics: status.AllMetrics) => { channel.toEthereum.inbound <= channel.toEthereum.previousInbound) ), }) + metricData.push({ + MetricName: AlarmReason.ToEthereumNoTransfer.toString(), + Value: Number( + channel.toEthereum.inbound == channel.toEthereum.previousInbound + ), + }) // To Polkadot metricData.push({ MetricName: "ToPolkadotOutboundNonce", diff --git a/web/packages/operations/src/global_transfer_history.ts b/web/packages/operations/src/global_transfer_history.ts index 54c687fe0e..e936b1f21f 100644 --- a/web/packages/operations/src/global_transfer_history.ts +++ b/web/packages/operations/src/global_transfer_history.ts @@ -9,12 +9,12 @@ const monitor = async () => { if (process.env.NODE_ENV !== undefined) { env = process.env.NODE_ENV } - const snwobridgeEnv = environment.SNOWBRIDGE_ENV[env] - if (snwobridgeEnv === undefined) { + const snowbridgeEnv = environment.SNOWBRIDGE_ENV[env] + if (snowbridgeEnv === undefined) { throw Error(`Unknown environment '${env}'`) } - const { config, ethChainId } = snwobridgeEnv + const { config, ethChainId } = snowbridgeEnv if (!config.SUBSCAN_API) throw Error(`Environment ${env} does not support subscan.`) const ethereumProvider = new AlchemyProvider(ethChainId, process.env.REACT_APP_ALCHEMY_KEY) diff --git a/web/packages/operations/src/transfer_to_ethereum.ts b/web/packages/operations/src/transfer_to_ethereum.ts new file mode 100644 index 0000000000..d6d692fbe2 --- /dev/null +++ b/web/packages/operations/src/transfer_to_ethereum.ts @@ -0,0 +1,89 @@ +import "dotenv/config" +import { Keyring } from "@polkadot/keyring" +import { + contextFactory, + destroyContext, + environment, + toEthereum, +} from "@snowbridge/api" +import { Wallet } from "ethers" +import cron from "node-cron" + +const transfer = async () => { + let env = "local_e2e" + if (process.env.NODE_ENV !== undefined) { + env = process.env.NODE_ENV + } + const snowbridgeEnv = environment.SNOWBRIDGE_ENV[env] + if (snowbridgeEnv === undefined) { + throw Error(`Unknown environment '${env}'`) + } + + const { config } = snowbridgeEnv + + const context = await contextFactory({ + ethereum: { + execution_url: process.env["EXECUTION_NODE_URL"] || config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), + beacon_url: config.BEACON_HTTP_API, + }, + polkadot: { + url: { + bridgeHub: config.BRIDGE_HUB_URL, + assetHub: config.ASSET_HUB_URL, + relaychain: config.RELAY_CHAIN_URL, + parachains: config.PARACHAINS, + }, + }, + appContracts: { + gateway: config.GATEWAY_CONTRACT, + beefy: config.BEEFY_CONTRACT, + }, + }) + const polkadot_keyring = new Keyring({ type: "sr25519" }) + + const ETHEREUM_ACCOUNT = new Wallet( + process.env["ETHEREUM_KEY"] || "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", + context.ethereum.api + ) + const ETHEREUM_ACCOUNT_PUBLIC = await ETHEREUM_ACCOUNT.getAddress() + const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"]?polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]):polkadot_keyring.addFromUri("//Ferdie") + + const amount = 2_000_000_000_000n + + const WETH_CONTRACT = snowbridgeEnv.locations[0].erc20tokensReceivable.find( + (t) => t.id === "WETH" + )!.address + + console.log("# Asset Hub to Ethereum") + { + const plan = await toEthereum.validateSend( + context, + POLKADOT_ACCOUNT, + 1000, + ETHEREUM_ACCOUNT_PUBLIC, + WETH_CONTRACT, + amount + ) + console.log("Plan:", plan, plan.failure?.errors) + const result = await toEthereum.send(context, POLKADOT_ACCOUNT, plan) + console.log("Execute:", result) + } + await destroyContext(context) +} + +if (process.argv.length != 3) { + console.error("Expected one argument with Enum from `start|cron`") + process.exit(1) +} + +if (process.argv[2] == "start") { + transfer() + .then(() => process.exit(0)) + .catch((error) => { + console.error("Error:", error) + process.exit(1) + }) +} else if (process.argv[2] == "cron") { + console.log("running cronjob") + cron.schedule(process.env["CRON_EXPRESSION"] || "0 0 * * *", transfer) +} diff --git a/web/packages/operations/src/transfer_to_polkadot.ts b/web/packages/operations/src/transfer_to_polkadot.ts new file mode 100644 index 0000000000..a2ff782e5e --- /dev/null +++ b/web/packages/operations/src/transfer_to_polkadot.ts @@ -0,0 +1,103 @@ +import "dotenv/config" +import { Keyring } from "@polkadot/keyring" +import { + contextFactory, + destroyContext, + environment, + toPolkadot, +} from "@snowbridge/api" +import { WETH9__factory } from "@snowbridge/contract-types" +import { Wallet } from "ethers" +import cron from "node-cron" + +const transfer = async () => { + let env = "local_e2e" + if (process.env.NODE_ENV !== undefined) { + env = process.env.NODE_ENV + } + const snowbridgeEnv = environment.SNOWBRIDGE_ENV[env] + if (snowbridgeEnv === undefined) { + throw Error(`Unknown environment '${env}'`) + } + + const { config } = snowbridgeEnv + + const context = await contextFactory({ + ethereum: { + execution_url: process.env["EXECUTION_NODE_URL"] || config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), + beacon_url: config.BEACON_HTTP_API, + }, + polkadot: { + url: { + bridgeHub: config.BRIDGE_HUB_URL, + assetHub: config.ASSET_HUB_URL, + relaychain: config.RELAY_CHAIN_URL, + parachains: config.PARACHAINS, + }, + }, + appContracts: { + gateway: config.GATEWAY_CONTRACT, + beefy: config.BEEFY_CONTRACT, + }, + }) + const polkadot_keyring = new Keyring({ type: "sr25519" }) + + const ETHEREUM_ACCOUNT = new Wallet( + process.env["ETHEREUM_KEY"] || "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", + context.ethereum.api + ) + const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"]?polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]):polkadot_keyring.addFromUri("//Ferdie") + const POLKADOT_ACCOUNT_PUBLIC = POLKADOT_ACCOUNT.address + + const amount = 2_000_000_000_000n + + const WETH_CONTRACT = snowbridgeEnv.locations[0].erc20tokensReceivable.find( + (t) => t.id === "WETH" + )!.address + + console.log("# Deposit and Approve WETH") + { + const weth9 = WETH9__factory.connect(WETH_CONTRACT, ETHEREUM_ACCOUNT) + const depositResult = await weth9.deposit({ value: amount }) + const depositReceipt = await depositResult.wait() + + const approveResult = await weth9.approve(config.GATEWAY_CONTRACT, amount) + const approveReceipt = await approveResult.wait() + + console.log('deposit tx', depositReceipt?.hash, 'approve tx', approveReceipt?.hash) + } + + console.log("# Ethereum to Asset Hub") + { + const plan = await toPolkadot.validateSend( + context, + ETHEREUM_ACCOUNT, + POLKADOT_ACCOUNT_PUBLIC, + WETH_CONTRACT, + 1000, + amount, + BigInt(0) + ) + console.log("Plan:", plan, plan.failure?.errors) + let result = await toPolkadot.send(context, ETHEREUM_ACCOUNT, plan) + console.log("Execute:", result) + } + await destroyContext(context) +} + +if (process.argv.length != 3) { + console.error("Expected one argument with Enum from `start|cron`") + process.exit(1) +} + +if (process.argv[2] == "start") { + transfer() + .then(() => process.exit(0)) + .catch((error) => { + console.error("Error:", error) + process.exit(1) + }) +} else if (process.argv[2] == "cron") { + console.log("running cronjob") + cron.schedule(process.env["CRON_EXPRESSION"] || "0 0 * * *", transfer) +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7603881159..f0999d0454 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -2530,7 +2530,7 @@ packages: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + deprecated: Upgrade to fsevents v2 to mitigate potential security issues fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} From 7d558a1f114ac39277b46e9eb9125f494e6d793f Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Wed, 2 Oct 2024 20:07:26 +0200 Subject: [PATCH 8/8] Fix Westend environment config (#1297) * remove muse * remove muse --- web/packages/api/package.json | 2 +- web/packages/api/src/environment.ts | 2 +- web/packages/contract-types/package.json | 2 +- web/packages/contracts/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/packages/api/package.json b/web/packages/api/package.json index 84f83107cd..bb122b1ea9 100644 --- a/web/packages/api/package.json +++ b/web/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/api", - "version": "0.1.21", + "version": "0.1.22", "description": "Snowbridge API client", "license": "Apache-2.0", "repository": { diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index bbfb610607..dae3bf90ca 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -633,7 +633,7 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { id: "ethereum", name: "Ethereum", type: "ethereum", - destinationIds: ["assethub", "muse"], + destinationIds: ["assethub"], erc20tokensReceivable: [ { id: "WETH", diff --git a/web/packages/contract-types/package.json b/web/packages/contract-types/package.json index b9f8fcc83f..d85d50afce 100644 --- a/web/packages/contract-types/package.json +++ b/web/packages/contract-types/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contract-types", - "version": "0.1.21", + "version": "0.1.22", "description": "Snowbridge contract type bindings", "license": "Apache-2.0", "repository": { diff --git a/web/packages/contracts/package.json b/web/packages/contracts/package.json index b1219a9db8..64bd99566c 100644 --- a/web/packages/contracts/package.json +++ b/web/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contracts", - "version": "0.1.21", + "version": "0.1.22", "description": "Snowbridge contract source and abi.", "license": "Apache-2.0", "repository": {