Merge remote-tracking branch 'hl/main' into pb/zksync

pb/zksync
pbio 17 hours ago
commit 824da54e74
  1. 5
      .changeset/funny-elephants-pretend.md
  2. 5
      .changeset/mighty-panthers-play.md
  3. 5
      .changeset/nice-elephants-heal.md
  4. 5
      .changeset/odd-frogs-move.md
  5. 5
      .changeset/polite-kings-warn.md
  6. 7
      .changeset/rare-llamas-float.md
  7. 7
      .changeset/real-phones-bake.md
  8. 5
      .changeset/shaggy-countries-kick.md
  9. 6
      .changeset/strange-poems-build.md
  10. 26
      .github/workflows/test.yml
  11. 2
      .registryrc
  12. 53
      rust/main/Cargo.lock
  13. 36
      rust/main/Cargo.toml
  14. 7
      rust/main/chains/hyperlane-sealevel/src/rpc/client.rs
  15. 14
      rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs
  16. 8
      rust/main/config/mainnet_config.json
  17. 7
      rust/main/hyperlane-base/src/settings/signers.rs
  18. 3
      rust/rust-toolchain
  19. 121
      rust/sealevel/Cargo.lock
  20. 35
      rust/sealevel/Cargo.toml
  21. 2
      rust/sealevel/libraries/test-utils/src/igp.rs
  22. 2
      rust/sealevel/rust-toolchain
  23. 7
      solidity/CHANGELOG.md
  24. 2
      solidity/contracts/PackageVersioned.sol
  25. 4
      solidity/package.json
  26. 2
      typescript/ccip-server/CHANGELOG.md
  27. 2
      typescript/ccip-server/package.json
  28. 1
      typescript/cli/.mocharc-e2e.json
  29. 18
      typescript/cli/CHANGELOG.md
  30. 8
      typescript/cli/package.json
  31. 7
      typescript/cli/scripts/run-e2e-test.sh
  32. 2
      typescript/cli/src/version.ts
  33. 2
      typescript/github-proxy/CHANGELOG.md
  34. 2
      typescript/github-proxy/package.json
  35. 13
      typescript/helloworld/CHANGELOG.md
  36. 8
      typescript/helloworld/package.json
  37. 19
      typescript/infra/CHANGELOG.md
  38. 26
      typescript/infra/config/environments/mainnet3/agent.ts
  39. 38
      typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json
  40. 0
      typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json
  41. 0
      typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json
  42. 0
      typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json
  43. 14
      typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json
  44. 14
      typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json
  45. 16
      typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts
  46. 27
      typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts
  47. 20
      typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts
  48. 14
      typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts
  49. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts
  50. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts
  51. 25
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts
  52. 13
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts
  53. 13
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts
  54. 51
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts
  55. 44
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts
  56. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts
  57. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts
  58. 22
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts
  59. 9
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts
  60. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts
  61. 12
      typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts
  62. 11
      typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts
  63. 8
      typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts
  64. 2
      typescript/infra/config/environments/mainnet3/warp/warpIds.ts
  65. 38
      typescript/infra/config/warp.ts
  66. 2
      typescript/infra/helm/warp-routes/templates/_helpers.tpl
  67. 10
      typescript/infra/package.json
  68. 32
      typescript/infra/scripts/agent-utils.ts
  69. 10
      typescript/infra/scripts/agents/utils.ts
  70. 5
      typescript/infra/scripts/keys/create-keys.ts
  71. 5
      typescript/infra/scripts/keys/delete-keys.ts
  72. 7
      typescript/infra/scripts/keys/get-key-addresses.ts
  73. 38
      typescript/infra/scripts/keys/get-key.ts
  74. 9
      typescript/infra/scripts/keys/get-owner-ica.ts
  75. 2
      typescript/infra/scripts/keys/rotate-key.ts
  76. 2
      typescript/infra/scripts/keys/update-key.ts
  77. 202
      typescript/infra/scripts/safes/get-pending-txs.ts
  78. 9
      typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts
  79. 14
      typescript/infra/scripts/warp-routes/monitor/metrics.ts
  80. 15
      typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts
  81. 12
      typescript/infra/src/config/agent/relayer.ts
  82. 8
      typescript/infra/src/config/environment.ts
  83. 14
      typescript/infra/src/config/warp.ts
  84. 56
      typescript/infra/src/utils/safe.ts
  85. 2
      typescript/infra/src/warp/helm.ts
  86. 6
      typescript/infra/test/warpIds.test.ts
  87. 17
      typescript/sdk/CHANGELOG.md
  88. 9
      typescript/sdk/package.json
  89. 5
      typescript/sdk/src/index.ts
  90. 98
      typescript/sdk/src/metadata/chainMetadataConversion.ts
  91. 6
      typescript/sdk/src/token/Token.ts
  92. 19
      typescript/sdk/src/token/adapters/EvmTokenAdapter.ts
  93. 29
      typescript/sdk/src/utils/viem.ts
  94. 6
      typescript/utils/CHANGELOG.md
  95. 2
      typescript/utils/package.json
  96. 8
      typescript/widgets/.eslintrc
  97. 5
      typescript/widgets/.storybook/main.ts
  98. 25
      typescript/widgets/CHANGELOG.md
  99. 26
      typescript/widgets/package.json
  100. 3
      typescript/widgets/src/chains/ChainAddMenu.tsx
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/sdk': minor
---
Updated Fraxtal set to include Superlane validators, updated Flow set

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/sdk': minor
---
Enroll new validators for alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet, flame, prom, inevm.

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/utils': minor
---
Add an isRelativeUrl function

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/sdk': minor
---
Added helpers to Token and token adapters to get bridged supply of tokens"

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/sdk': minor
---
Add a validateZodResult util function

@ -1,7 +0,0 @@
---
'@hyperlane-xyz/widgets': minor
---
New Icons
Updated modal with new props
Updated storybook for modal and icon list

@ -1,7 +0,0 @@
---
'@hyperlane-xyz/infra': minor
'@hyperlane-xyz/cli': minor
'@hyperlane-xyz/sdk': minor
---
Implements persistent relayer for use in CLI

@ -1,5 +0,0 @@
---
'@hyperlane-xyz/widgets': minor
---
Add various utility hooks: useIsSsr, useTimeout, useDebounce, useInterval

@ -1,6 +0,0 @@
---
'@hyperlane-xyz/widgets': minor
---
Props and style update: IconButton and Tooltip
New Icons: XCircleIcon and SwapIcon

@ -109,9 +109,18 @@ jobs:
- name: Unit Tests
run: yarn test:ci
cli-e2e:
cli-e2e-matrix:
runs-on: ubuntu-latest
needs: [yarn-install]
strategy:
fail-fast: false
matrix:
test:
- core
- relay
- warp-read
- warp-apply
- warp-deploy
steps:
- uses: actions/checkout@v4
with:
@ -130,8 +139,21 @@ jobs:
- name: Checkout registry
uses: ./.github/actions/checkout-registry
- name: CLI e2e tests
- name: CLI e2e tests (${{ matrix.test }})
run: yarn --cwd typescript/cli test:e2e
env:
CLI_E2E_TEST: ${{ matrix.test }}
cli-e2e:
runs-on: ubuntu-latest
needs: cli-e2e-matrix
if: always()
steps:
- name: Check cli-e2e matrix status
if: ${{ needs.cli-e2e-matrix.result != 'success' }}
run: |
echo "CLI E2E tests failed"
exit 1
agent-configs:
runs-on: ubuntu-latest

@ -1 +1 @@
3e366eae1d49da4270695b157d7af00bb761156a
82013508db45dcd55b44d2721414d26817686c8f

53
rust/main/Cargo.lock generated

@ -2564,7 +2564,8 @@ dependencies = [
[[package]]
name = "ed25519-dalek"
version = "1.0.1"
source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
dependencies = [
"curve25519-dalek 3.2.2",
"ed25519 1.5.3",
@ -8353,7 +8354,7 @@ dependencies = [
[[package]]
name = "solana-account-decoder"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"Inflector",
"base64 0.13.1",
@ -8377,7 +8378,7 @@ dependencies = [
[[package]]
name = "solana-address-lookup-table-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"bytemuck",
@ -8397,7 +8398,7 @@ dependencies = [
[[package]]
name = "solana-clap-utils"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"chrono",
"clap 2.34.0",
@ -8414,7 +8415,7 @@ dependencies = [
[[package]]
name = "solana-cli-config"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"dirs-next",
"lazy_static",
@ -8429,7 +8430,7 @@ dependencies = [
[[package]]
name = "solana-client"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"async-mutex",
"async-trait",
@ -8482,7 +8483,7 @@ dependencies = [
[[package]]
name = "solana-config-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"chrono",
@ -8495,7 +8496,7 @@ dependencies = [
[[package]]
name = "solana-faucet"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"byteorder",
@ -8518,7 +8519,7 @@ dependencies = [
[[package]]
name = "solana-frozen-abi"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"ahash 0.7.8",
"blake3",
@ -8551,7 +8552,7 @@ dependencies = [
[[package]]
name = "solana-frozen-abi-macro"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"proc-macro2 1.0.86",
"quote 1.0.37",
@ -8562,7 +8563,7 @@ dependencies = [
[[package]]
name = "solana-logger"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"env_logger",
"lazy_static",
@ -8572,7 +8573,7 @@ dependencies = [
[[package]]
name = "solana-measure"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"log",
"solana-sdk",
@ -8581,7 +8582,7 @@ dependencies = [
[[package]]
name = "solana-metrics"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"crossbeam-channel",
"gethostname",
@ -8594,7 +8595,7 @@ dependencies = [
[[package]]
name = "solana-net-utils"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"clap 3.2.25",
@ -8615,7 +8616,7 @@ dependencies = [
[[package]]
name = "solana-perf"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"ahash 0.7.8",
"bincode",
@ -8641,7 +8642,7 @@ dependencies = [
[[package]]
name = "solana-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"base64 0.13.1",
"bincode",
@ -8689,7 +8690,7 @@ dependencies = [
[[package]]
name = "solana-program-runtime"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"base64 0.13.1",
"bincode",
@ -8715,7 +8716,7 @@ dependencies = [
[[package]]
name = "solana-rayon-threadlimit"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"lazy_static",
"num_cpus",
@ -8724,7 +8725,7 @@ dependencies = [
[[package]]
name = "solana-remote-wallet"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"console",
"dialoguer",
@ -8742,7 +8743,7 @@ dependencies = [
[[package]]
name = "solana-sdk"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"assert_matches",
"base64 0.13.1",
@ -8792,7 +8793,7 @@ dependencies = [
[[package]]
name = "solana-sdk-macro"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bs58 0.4.0",
"proc-macro2 1.0.86",
@ -8804,7 +8805,7 @@ dependencies = [
[[package]]
name = "solana-streamer"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"crossbeam-channel",
"futures-util",
@ -8832,7 +8833,7 @@ dependencies = [
[[package]]
name = "solana-transaction-status"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"Inflector",
"base64 0.13.1",
@ -8860,7 +8861,7 @@ dependencies = [
[[package]]
name = "solana-version"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"log",
"rustc_version",
@ -8875,7 +8876,7 @@ dependencies = [
[[package]]
name = "solana-vote-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"log",
@ -8895,7 +8896,7 @@ dependencies = [
[[package]]
name = "solana-zk-token-sdk"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"aes-gcm-siv",
"arrayref",

@ -126,24 +126,9 @@ sha2 = { version = "0.10.6", default-features = false }
sha256 = "1.1.4"
sha3 = "0.10"
solana-account-decoder = "=1.14.13"
solana-banks-client = "=1.14.13"
solana-banks-interface = "=1.14.13"
solana-banks-server = "=1.14.13"
solana-clap-utils = "=1.14.13"
solana-cli-config = "=1.14.13"
solana-client = "=1.14.13"
solana-program = "=1.14.13"
solana-program-test = "=1.14.13"
solana-sdk = "=1.14.13"
solana-transaction-status = "=1.14.13"
solana-zk-token-sdk = "=1.14.13"
spl-associated-token-account = { version = "=1.1.2", features = [
"no-entrypoint",
] }
spl-noop = { version = "=0.1.3", features = ["no-entrypoint"] }
spl-token = { version = "=3.5.0", features = ["no-entrypoint"] }
spl-token-2022 = { version = "=0.5.0", features = ["no-entrypoint"] }
spl-type-length-value = "=0.1.0"
static_assertions = "1.1"
strum = "0.26.2"
strum_macros = "0.26.2"
@ -239,11 +224,6 @@ branch = "v3.2.2-relax-zeroize"
git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek"
version = "3.2.2"
[patch.crates-io.ed25519-dalek]
branch = "main"
git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek"
version = "1.0.1"
[patch.crates-io.primitive-types]
branch = "hyperlane"
git = "https://github.com/hyperlane-xyz/parity-common.git"
@ -256,42 +236,42 @@ version = "=0.5.2"
[patch.crates-io.solana-account-decoder]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-clap-utils]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-cli-config]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-client]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-program]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-sdk]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-transaction-status]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-zk-token-sdk]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.spl-associated-token-account]

@ -112,14 +112,14 @@ impl SealevelRpcClient {
Ok(balance.into())
}
pub async fn get_block(&self, height: u64) -> ChainResult<UiConfirmedBlock> {
pub async fn get_block(&self, slot: u64) -> ChainResult<UiConfirmedBlock> {
let config = RpcBlockConfig {
commitment: Some(CommitmentConfig::finalized()),
max_supported_transaction_version: Some(0),
..Default::default()
};
self.0
.get_block_with_config(height, config)
.get_block_with_config(slot, config)
.await
.map_err(HyperlaneSealevelError::ClientError)
.map_err(Into::into)
@ -273,3 +273,6 @@ impl std::fmt::Debug for SealevelRpcClient {
f.write_str("RpcClient { ... }")
}
}
#[cfg(test)]
mod tests;

@ -0,0 +1,14 @@
use crate::SealevelRpcClient;
//#[tokio::test]
async fn _test_get_block() {
// given
let client = SealevelRpcClient::new("<solana-rpc>".to_string());
// when
let slot = 301337842; // block which requires latest version of solana-client
let result = client.get_block(slot).await;
// then
assert!(result.is_ok());
}

@ -1231,7 +1231,7 @@
"bech32Prefix": "inj",
"blockExplorers": [
{
"apiUrl": "https://www.mintscan.io/injective",
"apiUrl": "https://apis.mintscan.io/v1/injective",
"family": "other",
"name": "Mintscan",
"url": "https://www.mintscan.io/injective"
@ -2042,7 +2042,7 @@
"bech32Prefix": "neutron",
"blockExplorers": [
{
"apiUrl": "https://www.mintscan.io/neutron",
"apiUrl": "https://apis.mintscan.io/v1/neutron",
"family": "other",
"name": "Mintscan",
"url": "https://www.mintscan.io/neutron"
@ -2180,7 +2180,7 @@
"bech32Prefix": "osmo",
"blockExplorers": [
{
"apiUrl": "https://www.mintscan.io/osmosis",
"apiUrl": "https://apis.mintscan.io/v1/osmosis",
"family": "other",
"name": "Mintscan",
"url": "https://www.mintscan.io/osmosis"
@ -4111,7 +4111,7 @@
"bech32Prefix": "stride",
"blockExplorers": [
{
"apiUrl": "https://www.mintscan.io/stride",
"apiUrl": "https://apis.mintscan.io/v1/stride",
"family": "other",
"name": "Mintscan",
"url": "https://www.mintscan.io/stride"

@ -126,10 +126,9 @@ impl BuildableWithSignerConf for Keypair {
if let SignerConf::HexKey { key } = conf {
let secret = SecretKey::from_bytes(key.as_bytes())
.context("Invalid sealevel ed25519 secret key")?;
Ok(
Keypair::from_bytes(&ed25519_dalek::Keypair::from(secret).to_bytes())
.context("Unable to create Keypair")?,
)
let public = ed25519_dalek::PublicKey::from(&secret);
let dalek = ed25519_dalek::Keypair { secret, public };
Ok(Keypair::from_bytes(&dalek.to_bytes()).context("Unable to create Keypair")?)
} else {
bail!(format!("{conf:?} key is not supported by sealevel"));
}

@ -1,3 +0,0 @@
[toolchain]
channel = "1.72.1"
profile = "default"

@ -743,9 +743,9 @@ dependencies = [
[[package]]
name = "cargo-platform"
version = "0.1.6"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc"
dependencies = [
"serde",
]
@ -1254,6 +1254,26 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "derive_more"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
dependencies = [
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2 1.0.86",
"quote 1.0.37",
"syn 2.0.77",
]
[[package]]
name = "dialoguer"
version = "0.10.4"
@ -1405,7 +1425,8 @@ dependencies = [
[[package]]
name = "ed25519-dalek"
version = "1.0.1"
source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
dependencies = [
"curve25519-dalek",
"ed25519",
@ -2385,7 +2406,7 @@ dependencies = [
"bytes",
"convert_case 0.6.0",
"derive-new",
"derive_more",
"derive_more 0.99.17",
"eyre",
"fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"getrandom 0.2.15",
@ -4538,26 +4559,26 @@ dependencies = [
[[package]]
name = "scale-info"
version = "2.11.3"
version = "2.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024"
checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b"
dependencies = [
"cfg-if",
"derive_more",
"derive_more 1.0.0",
"parity-scale-codec",
"scale-info-derive",
]
[[package]]
name = "scale-info-derive"
version = "2.11.3"
version = "2.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62"
checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951"
dependencies = [
"proc-macro-crate 3.2.0",
"proc-macro2 1.0.86",
"quote 1.0.37",
"syn 1.0.109",
"syn 2.0.77",
]
[[package]]
@ -4903,7 +4924,7 @@ dependencies = [
[[package]]
name = "solana-account-decoder"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"Inflector",
"base64 0.13.1",
@ -4927,7 +4948,7 @@ dependencies = [
[[package]]
name = "solana-address-lookup-table-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"bytemuck",
@ -4947,7 +4968,7 @@ dependencies = [
[[package]]
name = "solana-banks-client"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"borsh",
"futures",
@ -4963,7 +4984,7 @@ dependencies = [
[[package]]
name = "solana-banks-interface"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"serde",
"solana-sdk",
@ -4973,7 +4994,7 @@ dependencies = [
[[package]]
name = "solana-banks-server"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"crossbeam-channel",
@ -4992,7 +5013,7 @@ dependencies = [
[[package]]
name = "solana-bpf-loader-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"byteorder",
@ -5010,7 +5031,7 @@ dependencies = [
[[package]]
name = "solana-bucket-map"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"log",
"memmap2",
@ -5024,7 +5045,7 @@ dependencies = [
[[package]]
name = "solana-clap-utils"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"chrono",
"clap 2.34.0",
@ -5041,7 +5062,7 @@ dependencies = [
[[package]]
name = "solana-cli-config"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"dirs-next",
"lazy_static",
@ -5056,7 +5077,7 @@ dependencies = [
[[package]]
name = "solana-client"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"async-mutex",
"async-trait",
@ -5109,7 +5130,7 @@ dependencies = [
[[package]]
name = "solana-compute-budget-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"solana-program-runtime",
"solana-sdk",
@ -5118,7 +5139,7 @@ dependencies = [
[[package]]
name = "solana-config-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"chrono",
@ -5131,7 +5152,7 @@ dependencies = [
[[package]]
name = "solana-faucet"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"byteorder",
@ -5154,7 +5175,7 @@ dependencies = [
[[package]]
name = "solana-frozen-abi"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"ahash",
"blake3",
@ -5187,7 +5208,7 @@ dependencies = [
[[package]]
name = "solana-frozen-abi-macro"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"proc-macro2 1.0.86",
"quote 1.0.37",
@ -5198,7 +5219,7 @@ dependencies = [
[[package]]
name = "solana-logger"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"env_logger 0.9.3",
"lazy_static",
@ -5208,7 +5229,7 @@ dependencies = [
[[package]]
name = "solana-measure"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"log",
"solana-sdk",
@ -5217,7 +5238,7 @@ dependencies = [
[[package]]
name = "solana-metrics"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"crossbeam-channel",
"gethostname",
@ -5230,7 +5251,7 @@ dependencies = [
[[package]]
name = "solana-net-utils"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"clap 3.2.25",
@ -5251,7 +5272,7 @@ dependencies = [
[[package]]
name = "solana-perf"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"ahash",
"bincode",
@ -5277,7 +5298,7 @@ dependencies = [
[[package]]
name = "solana-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"base64 0.13.1",
"bincode",
@ -5325,7 +5346,7 @@ dependencies = [
[[package]]
name = "solana-program-runtime"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"base64 0.13.1",
"bincode",
@ -5351,7 +5372,7 @@ dependencies = [
[[package]]
name = "solana-program-test"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"assert_matches",
"async-trait",
@ -5375,7 +5396,7 @@ dependencies = [
[[package]]
name = "solana-rayon-threadlimit"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"lazy_static",
"num_cpus",
@ -5384,7 +5405,7 @@ dependencies = [
[[package]]
name = "solana-remote-wallet"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"console",
"dialoguer",
@ -5402,7 +5423,7 @@ dependencies = [
[[package]]
name = "solana-runtime"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"arrayref",
"bincode",
@ -5462,7 +5483,7 @@ dependencies = [
[[package]]
name = "solana-sdk"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"assert_matches",
"base64 0.13.1",
@ -5512,7 +5533,7 @@ dependencies = [
[[package]]
name = "solana-sdk-macro"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bs58 0.4.0",
"proc-macro2 1.0.86",
@ -5524,7 +5545,7 @@ dependencies = [
[[package]]
name = "solana-send-transaction-service"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"crossbeam-channel",
"log",
@ -5538,7 +5559,7 @@ dependencies = [
[[package]]
name = "solana-stake-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"log",
@ -5560,7 +5581,7 @@ dependencies = [
[[package]]
name = "solana-streamer"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"crossbeam-channel",
"futures-util",
@ -5588,7 +5609,7 @@ dependencies = [
[[package]]
name = "solana-transaction-status"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"Inflector",
"base64 0.13.1",
@ -5616,7 +5637,7 @@ dependencies = [
[[package]]
name = "solana-version"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"log",
"rustc_version",
@ -5631,7 +5652,7 @@ dependencies = [
[[package]]
name = "solana-vote-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bincode",
"log",
@ -5651,7 +5672,7 @@ dependencies = [
[[package]]
name = "solana-zk-token-proof-program"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"bytemuck",
"getrandom 0.1.16",
@ -5665,7 +5686,7 @@ dependencies = [
[[package]]
name = "solana-zk-token-sdk"
version = "1.14.13"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7"
source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e"
dependencies = [
"aes-gcm-siv",
"arrayref",
@ -6304,9 +6325,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
[[package]]
name = "toml_edit"
version = "0.22.20"
version = "0.22.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
dependencies = [
"indexmap 2.5.0",
"toml_datetime",
@ -6943,9 +6964,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.6.18"
version = "0.6.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
dependencies = [
"memchr",
]

@ -256,11 +256,6 @@ branch = "v3.2.2-relax-zeroize"
git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek"
version = "3.2.2"
[patch.crates-io.ed25519-dalek]
branch = "main"
git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek"
version = "1.0.1"
[patch.crates-io.primitive-types]
branch = "hyperlane"
git = "https://github.com/hyperlane-xyz/parity-common.git"
@ -273,62 +268,52 @@ version = "=0.5.2"
[patch.crates-io.solana-account-decoder]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-banks-client]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
version = "=1.14.13"
[patch.crates-io.solana-banks-interface]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
version = "=1.14.13"
[patch.crates-io.solana-banks-server]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-clap-utils]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-cli-config]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-client]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-program]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-program-test]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-sdk]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-transaction-status]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.solana-zk-token-sdk]
git = "https://github.com/hyperlane-xyz/solana.git"
tag = "hyperlane-1.14.13-2023-07-04"
tag = "hyperlane-1.14.13-2024-11-20"
version = "=1.14.13"
[patch.crates-io.spl-associated-token-account]

@ -49,7 +49,7 @@ pub async fn initialize_igp_accounts(
GasOracle::RemoteGasData(RemoteGasData {
token_exchange_rate: TOKEN_EXCHANGE_RATE_SCALE,
gas_price: 1u128,
/// The number of decimals for the remote token.
// The number of decimals for the remote token.
token_decimals: SOL_DECIMALS,
}),
None,

@ -1,3 +1,3 @@
[toolchain]
channel = "1.72.1"
channel = "1.75.0"
profile = "default"

@ -1,5 +1,12 @@
# @hyperlane-xyz/core
## 5.8.1
### Patch Changes
- Updated dependencies [0e285a443]
- @hyperlane-xyz/utils@7.1.0
## 5.8.0
### Minor Changes

@ -7,5 +7,5 @@ pragma solidity >=0.6.11;
**/
abstract contract PackageVersioned {
// GENERATED CODE - DO NOT EDIT
string public constant PACKAGE_VERSION = "5.8.0";
string public constant PACKAGE_VERSION = "5.8.1";
}

@ -1,11 +1,11 @@
{
"name": "@hyperlane-xyz/core",
"description": "Core solidity contracts for Hyperlane",
"version": "5.8.0",
"version": "5.8.1",
"dependencies": {
"@arbitrum/nitro-contracts": "^1.2.1",
"@eth-optimism/contracts": "^0.6.0",
"@hyperlane-xyz/utils": "7.0.0",
"@hyperlane-xyz/utils": "7.1.0",
"@layerzerolabs/lz-evm-oapp-v2": "2.0.2",
"@openzeppelin/contracts": "^4.9.3",
"@openzeppelin/contracts-upgradeable": "^v4.9.3",

@ -1,5 +1,7 @@
# @hyperlane-xyz/ccip-server
## 7.1.0
## 7.0.0
## 6.0.0

@ -1,6 +1,6 @@
{
"name": "@hyperlane-xyz/ccip-server",
"version": "7.0.0",
"version": "7.1.0",
"description": "CCIP server",
"typings": "dist/index.d.ts",
"typedocMain": "src/index.ts",

@ -1,6 +1,5 @@
{
"extensions": ["ts"],
"spec": ["src/**/*.e2e-test.ts"],
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"

@ -1,5 +1,23 @@
# @hyperlane-xyz/cli
## 7.1.0
### Minor Changes
- 5db46bd31: Implements persistent relayer for use in CLI
### Patch Changes
- Updated dependencies [6f2d50fbd]
- Updated dependencies [1159e0f4b]
- Updated dependencies [0e285a443]
- Updated dependencies [ff2b4e2fb]
- Updated dependencies [0e285a443]
- Updated dependencies [5db46bd31]
- Updated dependencies [0cd65c571]
- @hyperlane-xyz/sdk@7.1.0
- @hyperlane-xyz/utils@7.1.0
## 7.0.0
### Minor Changes

@ -1,13 +1,13 @@
{
"name": "@hyperlane-xyz/cli",
"version": "7.0.0",
"version": "7.1.0",
"description": "A command-line utility for common Hyperlane operations",
"dependencies": {
"@aws-sdk/client-kms": "^3.577.0",
"@aws-sdk/client-s3": "^3.577.0",
"@hyperlane-xyz/registry": "4.7.0",
"@hyperlane-xyz/sdk": "7.0.0",
"@hyperlane-xyz/utils": "7.0.0",
"@hyperlane-xyz/registry": "6.1.0",
"@hyperlane-xyz/sdk": "7.1.0",
"@hyperlane-xyz/utils": "7.1.0",
"@inquirer/core": "9.0.10",
"@inquirer/figures": "1.0.5",
"@inquirer/prompts": "^3.0.0",

@ -18,7 +18,12 @@ anvil --chain-id 31338 -p 8555 --state /tmp/anvil2/state --gas-price 1 > /dev/nu
anvil --chain-id 31347 -p 8600 --state /tmp/anvil3/state --gas-price 1 > /dev/null &
echo "Running E2E tests"
yarn mocha --config .mocharc-e2e.json
if [ -n "${CLI_E2E_TEST}" ]; then
echo "Running only ${CLI_E2E_TEST} test"
yarn mocha --config .mocharc-e2e.json "src/**/${CLI_E2E_TEST}.e2e-test.ts"
else
yarn mocha --config .mocharc-e2e.json "src/**/*.e2e-test.ts"
fi
cleanup

@ -1 +1 @@
export const VERSION = '7.0.0';
export const VERSION = '7.1.0';

@ -1,5 +1,7 @@
# @hyperlane-xyz/github-proxy
## 7.1.0
## 7.0.0
## 6.0.0

@ -1,7 +1,7 @@
{
"name": "@hyperlane-xyz/github-proxy",
"description": "Github proxy that adds the API key to requests",
"version": "7.0.0",
"version": "7.1.0",
"private": true,
"scripts": {
"deploy": "wrangler deploy",

@ -1,5 +1,18 @@
# @hyperlane-xyz/helloworld
## 7.1.0
### Patch Changes
- Updated dependencies [6f2d50fbd]
- Updated dependencies [1159e0f4b]
- Updated dependencies [ff2b4e2fb]
- Updated dependencies [0e285a443]
- Updated dependencies [5db46bd31]
- Updated dependencies [0cd65c571]
- @hyperlane-xyz/sdk@7.1.0
- @hyperlane-xyz/core@5.8.1
## 7.0.0
### Patch Changes

@ -1,11 +1,11 @@
{
"name": "@hyperlane-xyz/helloworld",
"description": "A basic skeleton of an Hyperlane app",
"version": "7.0.0",
"version": "7.1.0",
"dependencies": {
"@hyperlane-xyz/core": "5.8.0",
"@hyperlane-xyz/registry": "4.7.0",
"@hyperlane-xyz/sdk": "7.0.0",
"@hyperlane-xyz/core": "5.8.1",
"@hyperlane-xyz/registry": "6.1.0",
"@hyperlane-xyz/sdk": "7.1.0",
"@openzeppelin/contracts-upgradeable": "^4.9.3",
"ethers": "^5.7.2"
},

@ -1,5 +1,24 @@
# @hyperlane-xyz/infra
## 7.1.0
### Minor Changes
- 5db46bd31: Implements persistent relayer for use in CLI
### Patch Changes
- Updated dependencies [6f2d50fbd]
- Updated dependencies [1159e0f4b]
- Updated dependencies [0e285a443]
- Updated dependencies [ff2b4e2fb]
- Updated dependencies [0e285a443]
- Updated dependencies [5db46bd31]
- Updated dependencies [0cd65c571]
- @hyperlane-xyz/sdk@7.1.0
- @hyperlane-xyz/utils@7.1.0
- @hyperlane-xyz/helloworld@7.1.0
## 7.0.0
### Minor Changes

@ -12,6 +12,7 @@ import {
import {
MetricAppContext,
routerMatchingList,
senderMatchingList,
warpRouteMatchingList,
} from '../../../src/config/agent/relayer.js';
import { ALL_KEY_ROLES, Role } from '../../../src/roles.js';
@ -20,14 +21,17 @@ import { getDomainId } from '../../registry.js';
import { environment } from './chains.js';
import { helloWorld } from './helloworld.js';
import aaveSenderAddresses from './misc-artifacts/aave-sender-addresses.json';
import merklyEthAddresses from './misc-artifacts/merkly-eth-addresses.json';
import merklyNftAddresses from './misc-artifacts/merkly-eth-addresses.json';
import merklyErc20Addresses from './misc-artifacts/merkly-eth-addresses.json';
import veloMessageModuleAddresses from './misc-artifacts/velo-message-module-addresses.json';
import veloTokenBridgeAddresses from './misc-artifacts/velo-token-bridge-addresses.json';
import {
mainnet3SupportedChainNames,
supportedChainNames,
} from './supportedChainNames.js';
import { validatorChainConfig } from './validators.js';
import merklyEthAddresses from './warp/artifacts/merkly-eth-addresses.json';
import merklyNftAddresses from './warp/artifacts/merkly-eth-addresses.json';
import merklyErc20Addresses from './warp/artifacts/merkly-eth-addresses.json';
import { WarpRouteIds } from './warp/warpIds.js';
// const releaseCandidateHelloworldMatchingList = routerMatchingList(
@ -375,6 +379,22 @@ const metricAppContextsGetter = (): MetricAppContext[] => {
name: 'merkly_nft',
matchingList: routerMatchingList(merklyNftAddresses),
},
{
name: 'velo_message_module',
matchingList: routerMatchingList(veloMessageModuleAddresses),
},
{
name: 'velo_token_bridge',
matchingList: routerMatchingList(veloTokenBridgeAddresses),
},
{
// https://github.com/bgd-labs/aave-delivery-infrastructure?tab=readme-ov-file#deployed-addresses
// We match on senders because the sender is always the same and
// well documented, while the recipient may be switched out and is
// more poorly documented.
name: 'aave',
matchingList: senderMatchingList(aaveSenderAddresses),
},
];
};

@ -0,0 +1,38 @@
{
"ethereum": {
"sender": "0xEd42a7D8559a463722Ca4beD50E0Cc05a386b0e1"
},
"polygon": {
"sender": "0xF6B99959F0b5e79E1CC7062E12aF632CEb18eF0d"
},
"avalanche": {
"sender": "0x27FC7D54C893dA63C0AE6d57e1B2B13A70690928"
},
"arbitrum": {
"sender": "0xCbFB78a3Eeaa611b826E37c80E4126c8787D29f0"
},
"optimism": {
"sender": "0x48A9FE90bce5EEd790f3F4Ce192d1C0B351fd4Ca"
},
"bsc": {
"sender": "0x9d33ee6543C9b2C8c183b8fb58fB089266cffA19"
},
"base": {
"sender": "0x529467C76f234F2bD359d7ecF7c660A2846b04e2"
},
"metis": {
"sender": "0x6fDaFb26915ABD6065a1E1501a37Ac438D877f70"
},
"gnosis": {
"sender": "0x8Dc5310fc9D3D7D1Bb3D1F686899c8F082316c9F"
},
"scroll": {
"sender": "0x03073D3F4769f6b6604d616238fD6c636C99AD0A"
},
"polygonzkevm": {
"sender": "0xed7e0874526B9BB9E36C7e9472ed7ed324CEeE3B"
},
"celo": {
"sender": "0x4A5f4b29C0407E5Feb323305e121f563c7bC4d79"
}
}

@ -0,0 +1,14 @@
{
"optimism": {
"router": "0xF385603a12Be8b7B885222329c581FDD1C30071D"
},
"mode": {
"router": "0xF385603a12Be8b7B885222329c581FDD1C30071D"
},
"lisk": {
"router": "0xF385603a12Be8b7B885222329c581FDD1C30071D"
},
"fraxtal": {
"router": "0xF385603a12Be8b7B885222329c581FDD1C30071D"
}
}

@ -0,0 +1,14 @@
{
"optimism": {
"router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6"
},
"mode": {
"router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6"
},
"lisk": {
"router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6"
},
"fraxtal": {
"router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6"
}
}

@ -2,17 +2,21 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
buildAggregationIsmConfigs,
defaultMultisigConfigs,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getAncient8EthereumUSDCWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ismConfig = buildAggregationIsmConfigs(
'ethereum',
@ -22,6 +26,7 @@ export const getAncient8EthereumUSDCWarpConfig = async (
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDC,
interchainSecurityModule: ismConfig,
@ -31,12 +36,9 @@ export const getAncient8EthereumUSDCWarpConfig = async (
hook: '0x19b2cF952b70b217c90FC408714Fbc1acD29A6A8',
};
// @ts-ignore - The types as they stand require a synthetic to specify
// TokenMetadata, but in practice these are actually inferred from a
// collateral config. To avoid needing to specify the TokenMetadata, just
// ts-ignore for synthetic tokens.
const ancient8: TokenRouterConfig = {
...routerConfig.ancient8,
...abacusWorksEnvOwnerConfig.ancient8,
type: TokenType.synthetic,
// Uses the default ISM
interchainSecurityModule: ethers.constants.AddressZero,

@ -2,49 +2,46 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
// MEV Capital
const arbitrumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9';
const ethereumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9';
const zircuitOwner = '0xD0673e7F3FB4037CA79F53d2d311D0e017d39963';
export const getArbitrumEthereumZircuitAmphrETHWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const arbitrum: TokenRouterConfig = {
...routerConfig.arbitrum,
...getOwnerConfigForAddress(arbitrumOwner),
type: TokenType.synthetic,
interchainSecurityModule: ethers.constants.AddressZero,
owner: arbitrumOwner,
ownerOverrides: {
proxyAdmin: arbitrumOwner,
},
};
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...getOwnerConfigForAddress(ethereumOwner),
type: TokenType.collateral,
token: tokens.ethereum.amphrETH,
owner: ethereumOwner,
interchainSecurityModule: ethers.constants.AddressZero,
ownerOverrides: {
proxyAdmin: ethereumOwner,
},
};
const zircuit: TokenRouterConfig = {
...routerConfig.zircuit,
...getOwnerConfigForAddress(zircuitOwner),
type: TokenType.synthetic,
interchainSecurityModule: ethers.constants.AddressZero,
owner: zircuitOwner,
ownerOverrides: {
proxyAdmin: zircuitOwner,
},
};
return {

@ -1,23 +1,36 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
// Eclipse Fi team
const arbitrumOwner = '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8';
const neutronOwner =
'neutron1aud8lty0wwmyc86ugkzqrusnrku0ckm0ym62v4ve0jjjyepjjg6spssrwj';
export const getArbitrumNeutronEclipWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const neutronRouter =
'6b04c49fcfd98bc4ea9c05cd5790462a39537c00028333474aebe6ddf20b73a3';
// @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig
const neutron: TokenRouterConfig = {
...routerConfig.neutron,
...getOwnerConfigForAddress(neutronOwner),
type: TokenType.collateral,
token: 'factory/neutron10sr06r3qkhn7xzpw3339wuj77hu06mzna6uht0/eclip',
foreignDeployment: neutronRouter,
};
const arbitrum: TokenRouterConfig = {
...routerConfig.arbitrum,
...getOwnerConfigForAddress(arbitrumOwner),
type: TokenType.synthetic,
name: 'Eclipse Fi',
symbol: 'ECLIP',
@ -25,7 +38,6 @@ export const getArbitrumNeutronEclipWarpConfig = async (
totalSupply: 0,
gas: 600_000,
interchainSecurityModule: '0x676151bFB8D29690a359F99AE764860595504689', // This has diverged from the default ism on neutron, we cannot change as it is owned by the Eclip team
owner: '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8', // Eclip team
};
return {

@ -1,23 +1,31 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
export const getArbitrumNeutronTiaWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const neutronRouter =
'910926c4cf95d107237a9cf0b3305fe9c81351ebcba3d218ceb0e4935d92ceac';
// @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig
const neutron: TokenRouterConfig = {
...routerConfig.neutron,
...abacusWorksEnvOwnerConfig.neutron,
type: TokenType.collateral,
token:
'ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7',
foreignDeployment: neutronRouter,
};
const arbitrum: TokenRouterConfig = {
...routerConfig.arbitrum,
...abacusWorksEnvOwnerConfig.arbitrum,
type: TokenType.synthetic,
name: 'TIA',
symbol: 'TIA.n',

@ -2,18 +2,23 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEclipseEthereumSolanaUSDTWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const eclipsemainnet: TokenRouterConfig = {
...routerConfig.eclipsemainnet,
...abacusWorksEnvOwnerConfig.eclipsemainnet,
type: TokenType.synthetic,
foreignDeployment: '5g5ujyYUNvdydwyDVCpZwPpgYRqH5RYJRi156cxyE3me',
gas: 300_000,
@ -21,6 +26,7 @@ export const getEclipseEthereumSolanaUSDTWarpConfig = async (
};
let ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDT,
interchainSecurityModule: ethers.constants.AddressZero,

@ -2,18 +2,23 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEclipseEthereumWBTCWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const eclipsemainnet: TokenRouterConfig = {
...routerConfig.eclipsemainnet,
...abacusWorksEnvOwnerConfig.eclipsemainnet,
type: TokenType.synthetic,
foreignDeployment: 'A7EGCDYFw5R7Jfm6cYtKvY8dmkrYMgwRCJFkyQwpHTYu',
gas: 300_000,
@ -22,6 +27,7 @@ export const getEclipseEthereumWBTCWarpConfig = async (
let ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.WBTC,
interchainSecurityModule: ethers.constants.AddressZero,

@ -2,19 +2,30 @@ import { ethers } from 'ethers';
import {
ChainMap,
OwnableConfig,
RouterConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import { DEPLOYER } from '../../owners.js';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
// Safe owned by Veda
const ethereumOwner = '0xCEA8039076E35a825854c5C2f85659430b06ec96';
// Vault owned by Veda
const eclipseOwner = '4Cj1s2ipALjJk9foQV4oDaZYCZwSsVkAShQL1KFVJG9b';
export const getEclipseEthereumWeEthsWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
export async function getEclipseEthereumWeEthsWarpConfig(
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> {
const eclipsemainnet: TokenRouterConfig = {
...routerConfig.eclipsemainnet,
...getOwnerConfigForAddress(eclipseOwner),
type: TokenType.synthetic,
foreignDeployment: '7Zx4wU1QAw98MfvnPFqRh1oyumek7G5VAX6TKB3U1tcn',
gas: 300_000,
@ -23,14 +34,14 @@ export const getEclipseEthereumWeEthsWarpConfig = async (
let ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...getOwnerConfigForAddress(ethereumOwner),
type: TokenType.collateral,
token: tokens.ethereum.weETHs,
interchainSecurityModule: ethers.constants.AddressZero,
owner: DEPLOYER,
};
return {
eclipsemainnet,
ethereum,
};
};
}

@ -1,15 +1,23 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
// Stride team
const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh';
export const getEclipseStrideTiaWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const eclipsemainnet: TokenRouterConfig = {
...routerConfig.eclipsemainnet,
...abacusWorksEnvOwnerConfig.eclipsemainnet,
type: TokenType.synthetic,
foreignDeployment: 'BpXHAiktwjx7fN6M9ST9wr6qKAsH27wZFhdHEhReJsR6',
gas: 300_000,
@ -17,6 +25,7 @@ export const getEclipseStrideTiaWarpConfig = async (
const stride: TokenRouterConfig = {
...routerConfig.stride,
...getOwnerConfigForAddress(strideOwner),
type: TokenType.collateral,
foreignDeployment:
'stride1pvtesu3ve7qn7ctll2x495mrqf2ysp6fws68grvcu6f7n2ajghgsh2jdj6',

@ -1,15 +1,23 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
// Stride team
const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh';
export const getEclipseStrideStTiaWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const eclipsemainnet: TokenRouterConfig = {
...routerConfig.eclipsemainnet,
...abacusWorksEnvOwnerConfig.eclipsemainnet,
type: TokenType.synthetic,
foreignDeployment: 'tKUHyJ5NxhnwU94JUmzh1ekukDcHHX8mZF6fqxbMwX6',
gas: 300_000,
@ -17,6 +25,7 @@ export const getEclipseStrideStTiaWarpConfig = async (
const stride: TokenRouterConfig = {
...routerConfig.stride,
...getOwnerConfigForAddress(strideOwner),
type: TokenType.collateral,
foreignDeployment:
'stride134axwdlam929m3mar3wv95nvkyep7mr87ravkqcpf8dfe3v0pjlqwrw6ee',

@ -1,59 +1,50 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { objMap } from '@hyperlane-xyz/utils';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
// Lumia Team
const owner = '0x8bBA07Ddc72455b55530C17e6f6223EF6E156863';
const ownerConfig = {
owner,
// The proxyAdmins are warp-route specific
ownerOverrides: {
proxyAdmin: owner,
},
};
const ownerConfig = getOwnerConfigForAddress(owner);
export const getEthereumBscLUMIAWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ethereum = {
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...ownerConfig,
type: TokenType.collateral,
token: '0xD9343a049D5DBd89CD19DC6BcA8c48fB3a0a42a7',
ownerOverrides: {
proxyAdmin: owner,
},
};
const bsc = {
const bsc: TokenRouterConfig = {
...routerConfig.bsc,
...ownerConfig,
type: TokenType.synthetic,
ownerOverrides: {
proxyAdmin: owner,
},
};
const lumia = {
const lumia: TokenRouterConfig = {
...routerConfig.lumia,
...ownerConfig,
type: TokenType.native,
// As this has been removed from the registry in https://github.com/hyperlane-xyz/hyperlane-registry/pull/348,
// we must specify this explicitly.
mailbox: '0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7',
proxyAdmin: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D',
proxyAdmin: {
owner: owner,
address: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D',
},
};
const configMap = {
return {
ethereum,
bsc,
lumia,
};
const merged = objMap(configMap, (chain, config) => ({
...routerConfig[chain],
...config,
...ownerConfig,
}));
return merged as ChainMap<TokenRouterConfig>;
};

@ -0,0 +1,44 @@
import { ethers } from 'ethers';
import {
ChainMap,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
import { DEPLOYER } from '../../owners.js';
// Keep on our deployer for now until we get an address from Flow
const owner = DEPLOYER;
const ownerConfig = getOwnerConfigForAddress(owner);
export const getEthereumFlowCbBTCWarpConfig = async (
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...ownerConfig,
type: TokenType.collateral,
token: tokens.ethereum.cbBTC,
interchainSecurityModule: ethers.constants.AddressZero,
};
const flowmainnet: TokenRouterConfig = {
...routerConfig.flowmainnet,
...ownerConfig,
type: TokenType.synthetic,
interchainSecurityModule: ethers.constants.AddressZero,
};
return {
ethereum,
flowmainnet,
};
};

@ -2,18 +2,23 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEthereumInevmUSDCWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDC,
hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future
@ -21,6 +26,7 @@ export const getEthereumInevmUSDCWarpConfig = async (
const inevm: TokenRouterConfig = {
...routerConfig.inevm,
...abacusWorksEnvOwnerConfig.inevm,
type: TokenType.synthetic,
interchainSecurityModule: ethers.constants.AddressZero,
};

@ -2,18 +2,23 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEthereumInevmUSDTWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDT,
hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future
@ -21,6 +26,7 @@ export const getEthereumInevmUSDTWarpConfig = async (
const inevm: TokenRouterConfig = {
...routerConfig.inevm,
...abacusWorksEnvOwnerConfig.inevm,
type: TokenType.synthetic,
interchainSecurityModule: ethers.constants.AddressZero,
};

@ -2,42 +2,42 @@ import { ethers } from 'ethers';
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
// Elixir
const owner = '0x00000000F51340906F767C6999Fe512b1275955C';
const ownerConfig = getOwnerConfigForAddress(owner);
export const getEthereumSeiFastUSDWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
_abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const sei: TokenRouterConfig = {
...routerConfig.viction,
...ownerConfig,
type: TokenType.XERC20,
name: 'fastUSD',
symbol: 'fastUSD',
decimals: 18,
token: tokens.sei.fastUSD,
interchainSecurityModule: ethers.constants.AddressZero,
owner,
ownerOverrides: {
proxyAdmin: owner,
},
};
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...ownerConfig,
type: TokenType.collateral,
token: tokens.ethereum.deUSD,
owner,
interchainSecurityModule: ethers.constants.AddressZero,
ownerOverrides: {
proxyAdmin: owner,
},
};
return {

@ -1,14 +1,17 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
buildAggregationIsmConfigs,
defaultMultisigConfigs,
} from '@hyperlane-xyz/sdk';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
export const getEthereumVictionETHWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ismConfig = buildAggregationIsmConfigs(
'ethereum',
@ -18,6 +21,7 @@ export const getEthereumVictionETHWarpConfig = async (
const viction: TokenRouterConfig = {
...routerConfig.viction,
...abacusWorksEnvOwnerConfig.viction,
type: TokenType.synthetic,
name: 'ETH',
symbol: 'ETH',
@ -28,6 +32,7 @@ export const getEthereumVictionETHWarpConfig = async (
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.native,
gas: 65_000,
interchainSecurityModule: ismConfig,

@ -1,16 +1,20 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
buildAggregationIsmConfigs,
defaultMultisigConfigs,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEthereumVictionUSDCWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
// commit that the config was copied from https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3067/commits/7ed5b460034ea5e140c6ff86bcd6baf6ebb824c4#diff-fab5dd1a27c76e4310699c57ccf92ab6274ef0acf17e079b17270cedf4057775R109
const ismConfig = buildAggregationIsmConfigs(
@ -21,6 +25,7 @@ export const getEthereumVictionUSDCWarpConfig = async (
const viction: TokenRouterConfig = {
...routerConfig.viction,
...abacusWorksEnvOwnerConfig.viction,
type: TokenType.synthetic,
name: 'USDC',
symbol: 'USDC',
@ -31,6 +36,7 @@ export const getEthereumVictionUSDCWarpConfig = async (
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDC,
gas: 65_000,

@ -1,16 +1,20 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
buildAggregationIsmConfigs,
defaultMultisigConfigs,
} from '@hyperlane-xyz/sdk';
import { tokens } from '../../../../../src/config/warp.js';
import {
RouterConfigWithoutOwner,
tokens,
} from '../../../../../src/config/warp.js';
export const getEthereumVictionUSDTWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const ismConfig = buildAggregationIsmConfigs(
'ethereum',
@ -20,6 +24,7 @@ export const getEthereumVictionUSDTWarpConfig = async (
const viction: TokenRouterConfig = {
...routerConfig.viction,
...abacusWorksEnvOwnerConfig.viction,
type: TokenType.synthetic,
name: 'USDT',
symbol: 'USDT',
@ -30,6 +35,7 @@ export const getEthereumVictionUSDTWarpConfig = async (
const ethereum: TokenRouterConfig = {
...routerConfig.ethereum,
...abacusWorksEnvOwnerConfig.ethereum,
type: TokenType.collateral,
token: tokens.ethereum.USDT,
gas: 65_000,

@ -1,23 +1,28 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
export const getInevmInjectiveINJWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const injectiveRouter = 'inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k';
// @ts-ignore - foreignDeployment configs don't conform to the TokenRouterConfig
const injective: TokenRouterConfig = {
...routerConfig.injective,
...abacusWorksEnvOwnerConfig.injective,
type: TokenType.native,
foreignDeployment: injectiveRouter,
};
const inevm: TokenRouterConfig = {
...routerConfig.inevm,
...abacusWorksEnvOwnerConfig.inevm,
type: TokenType.native,
};

@ -1,12 +1,15 @@
import {
ChainMap,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js';
export const getMantapacificNeutronTiaWarpConfig = async (
routerConfig: ChainMap<RouterConfig>,
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
): Promise<ChainMap<TokenRouterConfig>> => {
const neutronRouter =
'0xc5fc6899019cb4a7649981d89eb7b1a0929d0a85b2d41802f3315129ad4b581a';
@ -18,6 +21,7 @@ export const getMantapacificNeutronTiaWarpConfig = async (
const mantapacific: TokenRouterConfig = {
...routerConfig.mantapacific,
...abacusWorksEnvOwnerConfig.mantapacific,
type: TokenType.synthetic,
name: 'TIA',
symbol: 'TIA',

@ -1,6 +1,7 @@
export enum WarpRouteIds {
Ancient8EthereumUSDC = 'USDC/ancient8-ethereum',
ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH = 'EZETH/arbitrum-base-blast-bsc-ethereum-fraxtal-linea-mode-optimism-sei-taiko-zircuit',
ArbitrumBaseEnduranceUSDC = 'USDC/arbitrum-base-endurance',
ArbitrumEthereumZircuitAMPHRETH = 'AMPHRETH/arbitrum-ethereum-zircuit',
ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron',
ArbitrumNeutronTIA = 'TIA/arbitrum-neutron',
@ -14,6 +15,7 @@ export enum WarpRouteIds {
EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet',
EclipseStrideSTTIA = 'stTIA/eclipsemainnet-stride',
EclipseStrideTIA = 'TIA/eclipsemainnet-stride',
EthereumFlowCbBTC = 'CBBTC/ethereum-flowmainnet',
EthereumInevmUSDC = 'USDC/ethereum-inevm',
EthereumInevmUSDT = 'USDT/ethereum-inevm',
EthereumSeiFastUSD = 'FASTUSD/ethereum-sei',

@ -1,15 +1,16 @@
import {
ChainMap,
MultiProvider,
RouterConfig,
OwnableConfig,
TokenRouterConfig,
} from '@hyperlane-xyz/sdk';
import { objMap } from '@hyperlane-xyz/utils';
import { getHyperlaneCore } from '../scripts/core-utils.js';
import {
EnvironmentConfig,
getRouterConfigsForAllVms,
} from '../src/config/environment.js';
import { RouterConfigWithoutOwner } from '../src/config/warp.js';
import { getAncient8EthereumUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.js';
import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js';
@ -21,6 +22,7 @@ import { getEclipseEthereumWeEthsWarpConfig } from './environments/mainnet3/warp
import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.js';
import { getEclipseStrideStTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.js';
import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.js';
import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.js';
import { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js';
import { getEthereumInevmUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.js';
import { getEthereumSeiFastUSDWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.js';
@ -33,16 +35,12 @@ import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGett
import { getRenzoPZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoPZETHWarpConfig.js';
import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js';
type WarpConfigGetterWithConfig = (
routerConfig: ChainMap<RouterConfig>,
type WarpConfigGetter = (
routerConfig: ChainMap<RouterConfigWithoutOwner>,
abacusWorksEnvOwnerConfig: ChainMap<OwnableConfig>,
) => Promise<ChainMap<TokenRouterConfig>>;
type WarpConfigGetterWithoutConfig = () => Promise<ChainMap<TokenRouterConfig>>;
export const warpConfigGetterMap: Record<
string,
WarpConfigGetterWithConfig | WarpConfigGetterWithoutConfig
> = {
export const warpConfigGetterMap: Record<string, WarpConfigGetter> = {
[WarpRouteIds.Ancient8EthereumUSDC]: getAncient8EthereumUSDCWarpConfig,
[WarpRouteIds.ArbitrumEthereumZircuitAMPHRETH]:
getArbitrumEthereumZircuitAmphrETHWarpConfig,
@ -53,6 +51,7 @@ export const warpConfigGetterMap: Record<
[WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH]:
getRenzoEZETHWarpConfig,
[WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig,
[WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig,
[WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig,
[WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig,
[WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig,
@ -77,6 +76,19 @@ export async function getWarpConfig(
envConfig,
multiProvider,
);
// Strip the owners from the router config
const routerConfigWithoutOwner = objMap(routerConfig, (_chain, config) => {
const { owner, ownerOverrides, ...configWithoutOwner } = config;
return configWithoutOwner;
});
// Isolate the owners from the router config
const abacusWorksEnvOwnerConfig = objMap(routerConfig, (_chain, config) => {
const { owner, ownerOverrides } = config;
return {
owner,
ownerOverrides,
};
});
const warpConfigGetter = warpConfigGetterMap[warpRouteId];
if (!warpConfigGetter) {
@ -87,9 +99,5 @@ export async function getWarpConfig(
);
}
if (warpConfigGetter.length === 1) {
return warpConfigGetter(routerConfig);
} else {
return (warpConfigGetter as WarpConfigGetterWithoutConfig)();
}
return warpConfigGetter(routerConfigWithoutOwner, abacusWorksEnvOwnerConfig);
}

@ -69,7 +69,7 @@ The warp-routes container
imagePullPolicy: IfNotPresent
env:
- name: LOG_FORMAT
value: pretty
value: json
command:
- ./node_modules/.bin/tsx
- ./typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts

@ -1,7 +1,7 @@
{
"name": "@hyperlane-xyz/infra",
"description": "Infrastructure utilities for the Hyperlane Network",
"version": "7.0.0",
"version": "7.1.0",
"dependencies": {
"@arbitrum/sdk": "^3.0.0",
"@aws-sdk/client-iam": "^3.74.0",
@ -13,10 +13,10 @@
"@ethersproject/hardware-wallets": "^5.7.0",
"@ethersproject/providers": "^5.7.2",
"@google-cloud/secret-manager": "^5.5.0",
"@hyperlane-xyz/helloworld": "7.0.0",
"@hyperlane-xyz/registry": "4.10.0",
"@hyperlane-xyz/sdk": "7.0.0",
"@hyperlane-xyz/utils": "7.0.0",
"@hyperlane-xyz/helloworld": "7.1.0",
"@hyperlane-xyz/registry": "6.1.0",
"@hyperlane-xyz/sdk": "7.1.0",
"@hyperlane-xyz/utils": "7.1.0",
"@inquirer/prompts": "^5.3.8",
"@nomiclabs/hardhat-etherscan": "^3.0.3",
"@safe-global/api-kit": "1.3.0",

@ -1,11 +1,7 @@
import path, { join } from 'path';
import yargs, { Argv } from 'yargs';
import {
ChainAddresses,
IRegistry,
warpConfigToWarpAddresses,
} from '@hyperlane-xyz/registry';
import { ChainAddresses, IRegistry } from '@hyperlane-xyz/registry';
import {
ChainMap,
ChainMetadata,
@ -157,20 +153,26 @@ export function withChain<T>(args: Argv<T>) {
.alias('c', 'chain');
}
export function withChains<T>(args: Argv<T>) {
export function withChains<T>(args: Argv<T>, chainOptions?: ChainName[]) {
return (
args
.describe('chains', 'Set of chains to perform actions on.')
.array('chains')
.choices('chains', getChains())
.choices(
'chains',
!chainOptions || chainOptions.length === 0 ? getChains() : chainOptions,
)
// Ensure chains are unique
.coerce('chains', (chains: string[]) => Array.from(new Set(chains)))
.alias('c', 'chains')
);
}
export function withChainsRequired<T>(args: Argv<T>) {
return withChains(args).demandOption('chains');
export function withChainsRequired<T>(
args: Argv<T>,
chainOptions?: ChainName[],
) {
return withChains(args, chainOptions).demandOption('chains');
}
export function withWarpRouteId<T>(args: Argv<T>) {
@ -191,9 +193,8 @@ export function withProtocol<T>(args: Argv<T>) {
export function withAgentRole<T>(args: Argv<T>) {
return args
.describe('role', 'agent roles')
.array('role')
.coerce('role', (role: string[]): Role[] => role.map(assertRole))
.describe('role', 'agent role')
.coerce('role', (role: string): Role => assertRole(role))
.demandOption('role')
.alias('r', 'role');
}
@ -206,11 +207,16 @@ export function withAgentRoles<T>(args: Argv<T>) {
.coerce('roles', (role: string[]): Role[] => role.map(assertRole))
.choices('roles', Object.values(Role))
// Ensure roles are unique
.coerce('roles', (roles: string[]) => Array.from(new Set(roles)))
.coerce('roles', (roles: Role[]) => Array.from(new Set(roles)))
.alias('r', 'roles')
.alias('role', 'roles')
);
}
export function withAgentRolesRequired<T>(args: Argv<T>) {
return withAgentRoles(args).demandOption('roles');
}
export function withKeyRoleAndChain<T>(args: Argv<T>) {
return args
.describe('role', 'key role')

@ -11,7 +11,7 @@ import { HelmCommand } from '../../src/utils/helm.js';
import {
assertCorrectKubeContext,
getArgs,
withAgentRole,
withAgentRolesRequired,
withChains,
withContext,
} from '../agent-utils.js';
@ -70,21 +70,23 @@ export class AgentCli {
protected async init() {
if (this.initialized) return;
const argv = await withChains(withAgentRole(withContext(getArgs())))
const argv = await withChains(
withAgentRolesRequired(withContext(getArgs())),
)
.describe('dry-run', 'Run through the steps without making any changes')
.boolean('dry-run').argv;
if (
argv.chains &&
argv.chains.length > 0 &&
!argv.role.includes(Role.Validator)
!argv.roles.includes(Role.Validator)
) {
console.warn('Chain argument applies to validator role only. Ignoring.');
}
const { envConfig, agentConfig } = await getConfigsBasedOnArgs(argv);
await assertCorrectKubeContext(envConfig);
this.roles = argv.role;
this.roles = argv.roles;
this.envConfig = envConfig;
this.agentConfig = agentConfig;
this.dryRun = argv.dryRun || false;

@ -1,6 +1,5 @@
import { createAgentKeysIfNotExists } from '../src/agents/key-utils.js';
import { getAgentConfigsBasedOnArgs } from './agent-utils.js';
import { createAgentKeysIfNotExists } from '../../src/agents/key-utils.js';
import { getAgentConfigsBasedOnArgs } from '../agent-utils.js';
async function main() {
const { agentConfig } = await getAgentConfigsBasedOnArgs();

@ -1,6 +1,5 @@
import { deleteAgentKeys } from '../src/agents/key-utils.js';
import { getAgentConfigsBasedOnArgs } from './agent-utils.js';
import { deleteAgentKeys } from '../../src/agents/key-utils.js';
import { getAgentConfigsBasedOnArgs } from '../agent-utils.js';
async function main() {
const { agentConfig } = await getAgentConfigsBasedOnArgs();

@ -1,7 +1,6 @@
import { getAllCloudAgentKeys } from '../src/agents/key-utils.js';
import { getArgs, withContext, withProtocol } from './agent-utils.js';
import { getConfigsBasedOnArgs } from './core-utils.js';
import { getAllCloudAgentKeys } from '../../src/agents/key-utils.js';
import { getArgs, withContext, withProtocol } from '../agent-utils.js';
import { getConfigsBasedOnArgs } from '../core-utils.js';
async function main() {
const argv = await withProtocol(withContext(getArgs())).argv;

@ -0,0 +1,38 @@
import { getCloudAgentKey } from '../../src/agents/key-utils.js';
import {
getArgs,
withAgentRole,
withContext,
withProtocol,
} from '../agent-utils.js';
import { getConfigsBasedOnArgs } from '../core-utils.js';
async function main() {
const argv = await withAgentRole(withContext(getArgs())).argv;
const { agentConfig } = await getConfigsBasedOnArgs(argv);
// As a (very rudimentary) security precaution, we don't print the private key directly to
// the console if this script is ran directly.
// We only write the private key to the console if it is not a tty, e.g. if
// this is being called in a subshell or piped to another command.
//
// E.g. this will print the private key:
// $ echo `yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer`
// or this too:
// $ echo $(yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer)
// and even this:
// $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer | cat
//
// But this will not print the private key directly to the shell:
// $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer
if (process.stdout.isTTY) {
console.log('<omitted in tty, use in subshell>');
} else {
const key = getCloudAgentKey(agentConfig, argv.role);
await key.fetch();
console.log(key.privateKey);
}
}
main().catch(console.error);

@ -1,11 +1,10 @@
import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk';
import { Address, eqAddress, isZeroishAddress } from '@hyperlane-xyz/utils';
import { chainsToSkip } from '../src/config/chain.js';
import { isEthereumProtocolChain } from '../src/utils/utils.js';
import { getArgs as getEnvArgs, withChains } from './agent-utils.js';
import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js';
import { chainsToSkip } from '../../src/config/chain.js';
import { isEthereumProtocolChain } from '../../src/utils/utils.js';
import { getArgs as getEnvArgs, withChains } from '../agent-utils.js';
import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js';
function getArgs() {
return withChains(getEnvArgs())

@ -3,7 +3,7 @@ import {
getArgs,
withContext,
withKeyRoleAndChain,
} from './agent-utils.js';
} from '../agent-utils.js';
async function rotateKey() {
const argv = await withContext(withKeyRoleAndChain(getArgs())).argv;

@ -3,7 +3,7 @@ import {
getArgs,
withContext,
withKeyRoleAndChain,
} from './agent-utils.js';
} from '../agent-utils.js';
async function rotateKey() {
const argv = await withKeyRoleAndChain(withContext(getArgs())).argv;

@ -0,0 +1,202 @@
import { confirm } from '@inquirer/prompts';
import chalk from 'chalk';
import yargs from 'yargs';
import { MultiProvider } from '@hyperlane-xyz/sdk';
import { Contexts } from '../../config/contexts.js';
import { safes } from '../../config/environments/mainnet3/owners.js';
import { Role } from '../../src/roles.js';
import { executeTx, getSafeAndService } from '../../src/utils/safe.js';
import { withChains } from '../agent-utils.js';
import { getEnvironmentConfig } from '../core-utils.js';
export enum SafeTxStatus {
NO_CONFIRMATIONS = '🔴',
PENDING = '🟡',
ONE_AWAY = '🔵',
READY_TO_EXECUTE = '🟢',
}
type SafeStatus = {
chain: string;
nonce: number;
submissionDate: string;
shortTxHash: string;
fullTxHash: string;
confs: number;
threshold: number;
status: string;
};
export async function getPendingTxsForChains(
chains: string[],
multiProvider: MultiProvider,
): Promise<SafeStatus[]> {
const txs: SafeStatus[] = [];
await Promise.all(
chains.map(async (chain) => {
if (!safes[chain]) {
console.error(chalk.red.bold(`No safe found for ${chain}`));
return;
}
if (chain === 'endurance') {
console.info(
chalk.gray.italic(
`Skipping chain ${chain} as it does not have a functional safe API`,
),
);
return;
}
let safeSdk, safeService;
try {
({ safeSdk, safeService } = await getSafeAndService(
chain,
multiProvider,
safes[chain],
));
} catch (error) {
console.warn(
chalk.yellow(
`Skipping chain ${chain} as there was an error getting the safe service: ${error}`,
),
);
return;
}
const threshold = await safeSdk.getThreshold();
const pendingTxs = await safeService.getPendingTransactions(safes[chain]);
if (pendingTxs.results.length === 0) {
return;
}
pendingTxs.results.forEach(
({ nonce, submissionDate, safeTxHash, confirmations }) => {
const confs = confirmations?.length ?? 0;
const status =
confs >= threshold
? SafeTxStatus.READY_TO_EXECUTE
: confs === 0
? SafeTxStatus.NO_CONFIRMATIONS
: threshold - confs
? SafeTxStatus.ONE_AWAY
: SafeTxStatus.PENDING;
txs.push({
chain,
nonce,
submissionDate: new Date(submissionDate).toDateString(),
shortTxHash: `${safeTxHash.slice(0, 6)}...${safeTxHash.slice(-4)}`,
fullTxHash: safeTxHash,
confs,
threshold,
status,
});
},
);
}),
);
return txs.sort(
(a, b) => a.chain.localeCompare(b.chain) || a.nonce - b.nonce,
);
}
async function main() {
const safeChains = Object.keys(safes);
const { chains, fullTxHash, execute } = await withChains(
yargs(process.argv.slice(2)),
safeChains,
)
.describe(
'fullTxHash',
'If enabled, include the full tx hash in the output',
)
.boolean('fullTxHash')
.default('fullTxHash', false)
.describe(
'execute',
'If enabled, execute transactions that have enough confirmations',
)
.boolean('execute')
.default('execute', false).argv;
const chainsToCheck = chains || safeChains;
if (chainsToCheck.length === 0) {
console.error('No chains provided');
process.exit(1);
}
const envConfig = getEnvironmentConfig('mainnet3');
const multiProvider = await envConfig.getMultiProvider(
Contexts.Hyperlane,
Role.Deployer,
true,
chainsToCheck,
);
const pendingTxs = await getPendingTxsForChains(chainsToCheck, multiProvider);
if (pendingTxs.length === 0) {
console.info(chalk.green('No pending transactions found!'));
process.exit(0);
}
console.table(pendingTxs, [
'chain',
'nonce',
'submissionDate',
fullTxHash ? 'fullTxHash' : 'shortTxHash',
'confs',
'threshold',
'status',
]);
const executableTxs = pendingTxs.filter(
(tx) => tx.status === SafeTxStatus.READY_TO_EXECUTE,
);
if (
executableTxs.length === 0 ||
!execute ||
!(await confirm({
message: 'Execute transactions?',
default: execute,
}))
) {
console.info(chalk.green('No transactions to execute!'));
process.exit(0);
} else {
console.info(chalk.blueBright('Executing transactions...'));
}
for (const tx of executableTxs) {
const confirmExecuteTx = await confirm({
message: `Execute transaction ${tx.shortTxHash} on chain ${tx.chain}?`,
default: execute,
});
if (confirmExecuteTx) {
console.log(
`Executing transaction ${tx.shortTxHash} on chain ${tx.chain}`,
);
try {
await executeTx(
tx.chain,
multiProvider,
safes[tx.chain],
tx.fullTxHash,
);
} catch (error) {
console.error(chalk.red(`Error executing transaction: ${error}`));
return;
}
}
}
process.exit(0);
}
main()
.then()
.catch((e) => {
console.error(e);
process.exit(1);
});

@ -46,11 +46,18 @@ async function getWarpRouteIdsInteractive() {
value: id,
}));
const selection = await checkbox({
let selection: WarpRouteIds[] = [];
while (!selection.length) {
selection = await checkbox({
message: 'Select Warp Route IDs to deploy',
choices,
pageSize: 30,
});
if (!selection.length) {
console.log('Please select at least one Warp Route ID');
}
}
return selection;
}

@ -74,17 +74,23 @@ export function updateTokenBalanceMetrics(
};
warpRouteTokenBalance.labels(metrics).set(balanceInfo.balance);
logger.info('Wallet balance updated for token', {
logger.info(
{
labels: metrics,
balance: balanceInfo.balance,
});
},
'Wallet balance updated for token',
);
if (balanceInfo.valueUSD) {
warpRouteCollateralValue.labels(metrics).set(balanceInfo.valueUSD);
logger.info('Wallet balance updated for token', {
logger.info(
{
labels: metrics,
valueUSD: balanceInfo.valueUSD,
});
},
'Wallet value updated for token',
);
}
}

@ -13,7 +13,7 @@ import {
TokenStandard,
WarpCore,
} from '@hyperlane-xyz/sdk';
import { ProtocolType, objMap, objMerge } from '@hyperlane-xyz/utils';
import { ProtocolType, objMap, objMerge, sleep } from '@hyperlane-xyz/utils';
import { getWarpCoreConfig } from '../../../config/registry.js';
import {
@ -78,7 +78,7 @@ async function pollAndUpdateWarpRouteMetrics(
apiKey: await getCoinGeckoApiKey(),
});
setInterval(async () => {
while (true) {
await tryFn(async () => {
await Promise.all(
warpCore.tokens.map((token) =>
@ -86,7 +86,8 @@ async function pollAndUpdateWarpRouteMetrics(
),
);
}, 'Updating warp route metrics');
}, checkFrequency);
await sleep(checkFrequency);
}
}
// Updates the metrics for a single token in a warp route.
@ -246,9 +247,7 @@ async function getCoinGeckoApiKey(): Promise<string | undefined> {
return apiKey;
}
main()
.then(logger.info)
.catch((err) => {
logger.error('Error in main', err);
main().catch((err) => {
logger.error('Error in main:', err);
process.exit(1);
});
});

@ -242,6 +242,18 @@ export function routerMatchingList(
return matchingList(routers);
}
// Create a matching list for the given senders to any destination or recipient
export function senderMatchingList(
senders: ChainMap<{ sender: Address }>,
): MatchingList {
return Object.entries(senders).map(([chain, { sender }]) => ({
originDomain: getDomainId(chain),
senderAddress: addressToBytes32(sender),
destinationDomain: '*',
recipientAddress: '*',
}));
}
// Create a matching list for the given contract addresses
export function matchingList<F extends HyperlaneFactories>(
addressesMap: HyperlaneAddressesMap<F>,

@ -104,3 +104,11 @@ export async function getRouterConfigsForAllVms(
// Merge, giving evmRouterConfig precedence
return objMerge(allRouterConfigs, evmRouterConfig);
}
export function getOwnerConfigForAddress(owner: string): OwnableConfig {
return {
owner,
// To ensure that any other overrides aren't applied
ownerOverrides: {},
};
}

@ -1,13 +1,19 @@
import { ChainMap } from '@hyperlane-xyz/sdk';
import {
ChainMap,
OwnableConfig,
RouterConfig,
TokenRouterConfig,
} from '@hyperlane-xyz/sdk';
import { Address } from '@hyperlane-xyz/utils';
// Common collateral tokens to be used by warp route deployments.
export const tokens: ChainMap<Record<string, Address>> = {
ethereum: {
amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd',
cbBTC: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',
deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138',
USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7',
deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138',
amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd',
WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88',
},
@ -15,3 +21,5 @@ export const tokens: ChainMap<Record<string, Address>> = {
fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269',
},
};
export type RouterConfigWithoutOwner = Omit<RouterConfig, keyof OwnableConfig>;

@ -14,7 +14,7 @@ import {
getSafe,
getSafeService,
} from '@hyperlane-xyz/sdk';
import { Address, CallData, eqAddress } from '@hyperlane-xyz/utils';
import { Address, CallData, eqAddress, retryAsync } from '@hyperlane-xyz/utils';
import safeSigners from '../../config/environments/mainnet3/safe/safeSigners.json' assert { type: 'json' };
import { AnnotatedCallData } from '../govern/HyperlaneAppGovernor.js';
@ -24,10 +24,10 @@ export async function getSafeAndService(
multiProvider: MultiProvider,
safeAddress: Address,
) {
const safeSdk: Safe.default = await getSafe(
chain,
multiProvider,
safeAddress,
const safeSdk: Safe.default = await retryAsync(
() => getSafe(chain, multiProvider, safeAddress),
5,
1000,
);
const safeService: SafeApiKit.default = getSafeService(chain, multiProvider);
return { safeSdk, safeService };
@ -41,6 +41,52 @@ export function createSafeTransactionData(call: CallData): MetaTransactionData {
};
}
export async function executeTx(
chain: ChainNameOrId,
multiProvider: MultiProvider,
safeAddress: Address,
safeTxHash: string,
): Promise<void> {
const { safeSdk, safeService } = await getSafeAndService(
chain,
multiProvider,
safeAddress,
);
const safeTransaction = await safeService.getTransaction(safeTxHash);
if (!safeTransaction) {
throw new Error(`Failed to fetch transaction details for ${safeTxHash}`);
}
// Throw if the safe doesn't have enough balance to cover the gas
let estimate;
try {
estimate = await safeService.estimateSafeTransaction(
safeAddress,
safeTransaction,
);
} catch (error) {
throw new Error(
`Failed to estimate gas for Safe transaction ${safeTxHash} on chain ${chain}: ${error}`,
);
}
const balance = await multiProvider
.getProvider(chain)
.getBalance(safeAddress);
if (balance.lt(estimate.safeTxGas)) {
throw new Error(
`Safe ${safeAddress} on ${chain} has insufficient balance (${balance.toString()}) for estimated gas (${
estimate.safeTxGas
})`,
);
}
await safeSdk.executeTransaction(safeTransaction);
console.log(
chalk.green.bold(`Executed transaction ${safeTxHash} on ${chain}`),
);
}
export async function createSafeTransaction(
safeSdk: Safe.default,
safeService: SafeApiKit.default,

@ -22,7 +22,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager {
return {
image: {
repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: '6cd61f1-20241112-111341',
tag: '4d0de30-20241119-171012',
},
warpRouteId: this.warpRouteId,
fullnameOverride: this.helmReleaseName,

@ -8,8 +8,10 @@ describe('Warp IDs', () => {
const registry = getRegistry();
for (const warpId of Object.values(WarpRouteIds)) {
// That's a long sentence!
expect(registry.getWarpRoute(warpId), `Warp ID ${warpId} not in registry`)
.to.not.be.null.and.not.be.undefined;
expect(
registry.getWarpRoute(warpId),
`Warp ID ${warpId} not in registry, the .registryrc or your local registry may be out of date`,
).to.not.be.null.and.not.be.undefined;
}
});
});

@ -1,5 +1,22 @@
# @hyperlane-xyz/sdk
## 7.1.0
### Minor Changes
- 6f2d50fbd: Updated Fraxtal set to include Superlane validators, updated Flow set
- 1159e0f4b: Enroll new validators for alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet, flame, prom, inevm.
- ff2b4e2fb: Added helpers to Token and token adapters to get bridged supply of tokens"
- 0e285a443: Add a validateZodResult util function
- 5db46bd31: Implements persistent relayer for use in CLI
- 0cd65c571: Add chainMetadataToCosmosChain function
### Patch Changes
- Updated dependencies [0e285a443]
- @hyperlane-xyz/utils@7.1.0
- @hyperlane-xyz/core@5.8.1
## 7.0.0
### Major Changes

@ -1,14 +1,15 @@
{
"name": "@hyperlane-xyz/sdk",
"description": "The official SDK for the Hyperlane Network",
"version": "7.0.0",
"version": "7.1.0",
"dependencies": {
"@arbitrum/sdk": "^4.0.0",
"@aws-sdk/client-s3": "^3.74.0",
"@chain-registry/types": "^0.50.14",
"@cosmjs/cosmwasm-stargate": "^0.32.4",
"@cosmjs/stargate": "^0.32.4",
"@hyperlane-xyz/core": "5.8.0",
"@hyperlane-xyz/utils": "7.0.0",
"@hyperlane-xyz/core": "5.8.1",
"@hyperlane-xyz/utils": "7.1.0",
"@safe-global/api-kit": "1.3.0",
"@safe-global/protocol-kit": "1.3.0",
"@safe-global/safe-deployments": "1.37.8",
@ -19,7 +20,7 @@
"cross-fetch": "^3.1.5",
"ethers": "^5.7.2",
"pino": "^8.19.0",
"viem": "^2.21.40",
"viem": "^2.21.45",
"zod": "^3.21.2"
},
"devDependencies": {

@ -371,6 +371,10 @@ export { EV5TxTransformerInterface } from './providers/transactions/transformer/
export { EV5InterchainAccountTxTransformerPropsSchema } from './providers/transactions/transformer/ethersV5/schemas.js';
export { EV5InterchainAccountTxTransformerProps } from './providers/transactions/transformer/ethersV5/types.js';
export {
chainMetadataToCosmosChain,
chainMetadataToViemChain,
} from './metadata/chainMetadataConversion.js';
export {
EvmGasRouterAdapter,
EvmRouterAdapter,
@ -504,7 +508,6 @@ export {
getSealevelAccountDataSchema,
} from './utils/sealevelSerialization.js';
export { getChainIdFromTxs } from './utils/transactions.js';
export { chainMetadataToViemChain } from './utils/viem.js';
export {
FeeConstantConfig,
RouteBlacklist,

@ -0,0 +1,98 @@
import type { AssetList, Chain as CosmosChain } from '@chain-registry/types';
import { Chain, defineChain } from 'viem';
import { test1 } from '../consts/testChains.js';
import {
ChainMetadata,
getChainIdNumber,
} from '../metadata/chainMetadataTypes.js';
export function chainMetadataToViemChain(metadata: ChainMetadata): Chain {
return defineChain({
id: getChainIdNumber(metadata),
name: metadata.displayName || metadata.name,
network: metadata.name,
nativeCurrency: metadata.nativeToken || test1.nativeToken!,
rpcUrls: {
public: { http: [metadata.rpcUrls[0].http] },
default: { http: [metadata.rpcUrls[0].http] },
},
blockExplorers: metadata.blockExplorers?.length
? {
default: {
name: metadata.blockExplorers[0].name,
url: metadata.blockExplorers[0].url,
},
}
: undefined,
testnet: !!metadata.isTestnet,
});
}
export function chainMetadataToCosmosChain(metadata: ChainMetadata): {
chain: CosmosChain;
assets: AssetList;
} {
const {
name,
displayName,
chainId,
rpcUrls,
restUrls,
isTestnet,
nativeToken,
bech32Prefix,
slip44,
} = metadata;
if (!nativeToken) throw new Error(`Missing native token for ${name}`);
const chain: CosmosChain = {
chain_name: name,
chain_type: 'cosmos',
status: 'live',
network_type: isTestnet ? 'testnet' : 'mainnet',
pretty_name: displayName || name,
chain_id: chainId as string,
bech32_prefix: bech32Prefix!,
slip44: slip44!,
apis: {
rpc: [{ address: rpcUrls[0].http, provider: displayName || name }],
rest: restUrls
? [{ address: restUrls[0].http, provider: displayName || name }]
: [],
},
fees: {
fee_tokens: [{ denom: 'token' }],
},
staking: {
staking_tokens: [{ denom: 'stake' }],
},
};
const assets: AssetList = {
chain_name: name,
assets: [
{
description: `The native token of ${displayName || name} chain.`,
denom_units: [{ denom: 'token', exponent: nativeToken.decimals }],
base: 'token',
name: 'token',
display: 'token',
symbol: 'token',
type_asset: 'sdk.coin',
},
{
description: `The native token of ${displayName || name} chain.`,
denom_units: [{ denom: 'token', exponent: nativeToken.decimals }],
base: 'stake',
name: 'stake',
display: 'stake',
symbol: 'stake',
type_asset: 'sdk.coin',
},
],
};
return { chain, assets };
}

@ -40,6 +40,7 @@ import {
} from './adapters/CosmosTokenAdapter.js';
import {
EvmHypCollateralAdapter,
EvmHypCollateralFiatAdapter,
EvmHypNativeAdapter,
EvmHypSyntheticAdapter,
EvmHypXERC20Adapter,
@ -192,13 +193,16 @@ export class Token implements IToken {
});
} else if (
standard === TokenStandard.EvmHypCollateral ||
standard === TokenStandard.EvmHypCollateralFiat ||
standard === TokenStandard.EvmHypOwnerCollateral ||
standard === TokenStandard.EvmHypRebaseCollateral
) {
return new EvmHypCollateralAdapter(chainName, multiProvider, {
token: addressOrDenom,
});
} else if (standard === TokenStandard.EvmHypCollateralFiat) {
return new EvmHypCollateralFiatAdapter(chainName, multiProvider, {
token: addressOrDenom,
});
} else if (
standard === TokenStandard.EvmHypSynthetic ||
standard === TokenStandard.EvmHypSyntheticRebase

@ -261,9 +261,7 @@ export class EvmHypCollateralAdapter
return this.wrappedTokenAddress!;
}
protected async getWrappedTokenAdapter(): Promise<
ITokenAdapter<PopulatedTransaction>
> {
protected async getWrappedTokenAdapter(): Promise<EvmTokenAdapter> {
return new EvmTokenAdapter(this.chainName, this.multiProvider, {
token: await this.getWrappedTokenAddress(),
});
@ -304,6 +302,21 @@ export class EvmHypCollateralAdapter
}
}
export class EvmHypCollateralFiatAdapter
extends EvmHypCollateralAdapter
implements IHypTokenAdapter<PopulatedTransaction>
{
/**
* Note this may be inaccurate, as this returns the total supply
* of the fiat token, which may be used by other bridges.
* However this is the best we can do with a simple view call.
*/
override async getBridgedSupply(): Promise<bigint> {
const wrapped = await this.getWrappedTokenAdapter();
return wrapped.getTotalSupply();
}
}
// Interacts with HypXERC20Lockbox contracts
export class EvmHypXERC20LockboxAdapter
extends EvmHypCollateralAdapter

@ -1,29 +0,0 @@
import { Chain, defineChain } from 'viem';
import { test1 } from '../consts/testChains.js';
import {
ChainMetadata,
getChainIdNumber,
} from '../metadata/chainMetadataTypes.js';
export function chainMetadataToViemChain(metadata: ChainMetadata): Chain {
return defineChain({
id: getChainIdNumber(metadata),
name: metadata.displayName || metadata.name,
network: metadata.name,
nativeCurrency: metadata.nativeToken || test1.nativeToken!,
rpcUrls: {
public: { http: [metadata.rpcUrls[0].http] },
default: { http: [metadata.rpcUrls[0].http] },
},
blockExplorers: metadata.blockExplorers?.length
? {
default: {
name: metadata.blockExplorers[0].name,
url: metadata.blockExplorers[0].url,
},
}
: undefined,
testnet: !!metadata.isTestnet,
});
}

@ -1,5 +1,11 @@
# @hyperlane-xyz/utils
## 7.1.0
### Minor Changes
- 0e285a443: Add an isRelativeUrl function
## 7.0.0
### Major Changes

@ -1,7 +1,7 @@
{
"name": "@hyperlane-xyz/utils",
"description": "General utilities and types for the Hyperlane network",
"version": "7.0.0",
"version": "7.1.0",
"dependencies": {
"@cosmjs/encoding": "^0.32.4",
"@solana/web3.js": "^1.95.4",

@ -6,11 +6,15 @@
],
"plugins": ["react", "react-hooks"],
"rules": {
// TODO use utils rootLogger in widgets lib
"no-console": ["off"],
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn"
},
"settings": {
"react": {
"version": "18",
"defaultVersion": "18"
}
}
}

@ -10,6 +10,11 @@ const config: StorybookConfig = {
'@storybook/addon-onboarding',
'@storybook/addon-interactions',
],
refs: {
'@chakra-ui/react': {
disable: true,
},
},
framework: {
name: '@storybook/react-vite',
options: {},

@ -1,5 +1,30 @@
# @hyperlane-xyz/widgets
## 7.1.0
### Minor Changes
- 0cd65c571: Add multi-protocol wallet integration hooks and types
- 186663505: New Icons
Updated modal with new props
Updated storybook for modal and icon list
- 0e285a443: Add various utility hooks: useIsSsr, useTimeout, useDebounce, useInterval
- 92b5fe777: Props and style update: IconButton and Tooltip
New Icons: XCircleIcon and SwapIcon
### Patch Changes
- 794501ba6: Prevent propagation of form submissions from ChainSearchMenu
- Updated dependencies [6f2d50fbd]
- Updated dependencies [1159e0f4b]
- Updated dependencies [0e285a443]
- Updated dependencies [ff2b4e2fb]
- Updated dependencies [0e285a443]
- Updated dependencies [5db46bd31]
- Updated dependencies [0cd65c571]
- @hyperlane-xyz/sdk@7.1.0
- @hyperlane-xyz/utils@7.1.0
## 7.0.0
### Patch Changes

@ -1,20 +1,32 @@
{
"name": "@hyperlane-xyz/widgets",
"description": "Common react components for Hyperlane projects",
"version": "7.0.0",
"version": "7.1.0",
"peerDependencies": {
"react": "^18",
"react-dom": "^18"
},
"dependencies": {
"@cosmos-kit/react": "^2.18.0",
"@headlessui/react": "^2.1.8",
"@hyperlane-xyz/sdk": "7.0.0",
"@hyperlane-xyz/utils": "7.0.0",
"@hyperlane-xyz/sdk": "7.1.0",
"@hyperlane-xyz/utils": "7.1.0",
"@interchain-ui/react": "^1.23.28",
"@rainbow-me/rainbowkit": "^2.2.0",
"@solana/wallet-adapter-react": "^0.15.32",
"@solana/wallet-adapter-react-ui": "^0.9.31",
"@solana/web3.js": "^1.95.4",
"clsx": "^2.1.1",
"react-tooltip": "^5.28.0"
"react-tooltip": "^5.28.0",
"viem": "^2.21.41",
"wagmi": "^2.12.26"
},
"devDependencies": {
"@hyperlane-xyz/registry": "4.7.0",
"@chakra-ui/react": "^2.8.2",
"@cosmjs/cosmwasm-stargate": "^0.32.4",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@hyperlane-xyz/registry": "6.1.0",
"@storybook/addon-essentials": "^7.6.14",
"@storybook/addon-interactions": "^7.6.14",
"@storybook/addon-links": "^7.6.14",
@ -23,6 +35,7 @@
"@storybook/react": "^7.6.14",
"@storybook/react-vite": "^7.6.14",
"@storybook/test": "^7.6.14",
"@tanstack/react-query": "^5.59.20",
"@types/node": "^18.11.18",
"@types/react": "^18.0.27",
"@types/react-dom": "^18.0.10",
@ -35,6 +48,7 @@
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-storybook": "^0.6.15",
"framer-motion": "^10.16.4",
"postcss": "^8.4.21",
"prettier": "^2.8.8",
"react": "^18.2.0",
@ -72,7 +86,7 @@
"build:ts": "tsc",
"build:css": "tailwindcss -c ./tailwind.config.cjs -i ./src/styles.css -o ./dist/styles.css --minify",
"clean": "rm -rf ./dist ./cache ./storybook-static",
"lint": "eslint ./src --ext .ts",
"lint": "eslint ./src --ext '.ts,.tsx'",
"prettier": "prettier --write ./src",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"

@ -21,6 +21,7 @@ import { CopyButton } from '../components/CopyButton.js';
import { LinkButton } from '../components/LinkButton.js';
import { ChevronIcon } from '../icons/Chevron.js';
import { PlusIcon } from '../icons/Plus.js';
import { widgetLogger } from '../logger.js';
export interface ChainAddMenuProps {
chainMetadata: ChainMap<ChainMetadata>;
@ -143,7 +144,7 @@ function tryParseMetadataInput(
const result = ChainMetadataSchema.safeParse(parsed.data);
if (!result.success) {
console.error('Error validating chain config', result.error);
widgetLogger.error('Error validating chain config', result.error);
const firstIssue = result.error.issues[0];
return failure(`${firstIssue.path} => ${firstIssue.message}`);
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save