chore: merge main to cli-2.0 (#3964)

noah/no-warp
Connor McEwen 5 months ago committed by GitHub
parent 129bd871de
commit ec5d43cc4c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 52
      rust/config/mainnet_config.json
  2. 50
      rust/config/testnet_config.json
  3. 2
      solidity/lib/forge-std
  4. 253
      typescript/helloworld/CHANGELOG.md
  5. 1
      typescript/helloworld/package.json
  6. 41
      typescript/infra/CHANGELOG.md
  7. 6
      typescript/infra/config/environments/mainnet3/agent.ts
  8. 28
      typescript/infra/config/environments/mainnet3/chains.ts
  9. 5
      typescript/infra/config/environments/mainnet3/funding.ts
  10. 4
      typescript/infra/config/environments/mainnet3/helloworld.ts
  11. 46
      typescript/infra/config/environments/mainnet3/index.ts
  12. 2
      typescript/infra/config/environments/mainnet3/liquidityLayer.ts
  13. 9
      typescript/infra/config/environments/test/index.ts
  14. 5
      typescript/infra/config/environments/testnet4/agent.ts
  15. 3
      typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json
  16. 15
      typescript/infra/config/environments/testnet4/chains.ts
  17. 290
      typescript/infra/config/environments/testnet4/core/verification.json
  18. 7
      typescript/infra/config/environments/testnet4/funding.ts
  19. 2
      typescript/infra/config/environments/testnet4/gas-oracle.ts
  20. 8
      typescript/infra/config/environments/testnet4/helloworld.ts
  21. 33
      typescript/infra/config/environments/testnet4/index.ts
  22. 1560
      typescript/infra/config/environments/testnet4/ism/verification.json
  23. 3
      typescript/infra/config/environments/testnet4/middleware.ts
  24. 1
      typescript/infra/config/environments/testnet4/supportedChainNames.ts
  25. 15
      typescript/infra/config/environments/testnet4/validators.ts
  26. 29
      typescript/infra/config/registry.ts
  27. 4
      typescript/infra/helm/helloworld-kathy/templates/_helpers.tpl
  28. 4
      typescript/infra/helm/helloworld-kathy/templates/external-secret.yaml
  29. 4
      typescript/infra/helm/key-funder/templates/cron-job.yaml
  30. 4
      typescript/infra/helm/key-funder/templates/env-var-external-secret.yaml
  31. 4
      typescript/infra/helm/liquidity-layer-relayers/templates/circle-relayer-deployment.yaml
  32. 4
      typescript/infra/helm/liquidity-layer-relayers/templates/env-var-external-secret.yaml
  33. 4
      typescript/infra/helm/liquidity-layer-relayers/templates/portal-relayer-deployment.yaml
  34. 1
      typescript/infra/package.json
  35. 88
      typescript/infra/scripts/agent-utils.ts
  36. 7
      typescript/infra/scripts/agents/update-agent-config.ts
  37. 11
      typescript/infra/scripts/check-rpc-urls.ts
  38. 10
      typescript/infra/scripts/deploy.ts
  39. 11
      typescript/infra/scripts/funding/fund-keys-from-deployer.ts
  40. 25
      typescript/infra/scripts/helloworld/kathy.ts
  41. 5
      typescript/infra/scripts/helloworld/utils.ts
  42. 12
      typescript/infra/scripts/print-chain-metadatas.ts
  43. 88
      typescript/infra/scripts/print-gas-prices.ts
  44. 12
      typescript/infra/scripts/print-token-prices.ts
  45. 8
      typescript/infra/scripts/verify.ts
  46. 51
      typescript/infra/src/agents/index.ts
  47. 104
      typescript/infra/src/config/chain.ts
  48. 10
      typescript/infra/src/config/environment.ts
  49. 3
      typescript/infra/src/config/funding.ts
  50. 3
      typescript/infra/src/config/helloworld/types.ts
  51. 3
      typescript/infra/src/config/middleware.ts
  52. 1
      typescript/infra/src/funding/key-funder.ts
  53. 1
      typescript/infra/src/helloworld/kathy.ts
  54. 1
      typescript/infra/src/middleware/liquidity-layer-relayer.ts
  55. 141
      typescript/infra/src/utils/gcloud.ts
  56. 4
      typescript/infra/src/utils/utils.ts
  57. 44
      typescript/sdk/CHANGELOG.md
  58. 5
      typescript/sdk/src/consts/multisigIsm.ts
  59. 10
      typescript/sdk/src/metadata/agentConfig.ts
  60. 14
      typescript/utils/CHANGELOG.md
  61. 397
      yarn.lock

@ -634,13 +634,18 @@
}, },
"injective": { "injective": {
"bech32Prefix": "inj", "bech32Prefix": "inj",
"blockExplorers": [],
"blocks": { "blocks": {
"confirmations": 1,
"estimateBlockTime": 1,
"reorgPeriod": 10 "reorgPeriod": 10
}, },
"canonicalAsset": "inj", "canonicalAsset": "inj",
"chainId": "injective-1", "chainId": "injective-1",
"contractAddressBytes": 20, "contractAddressBytes": 20,
"domainId": "6909546", "displayName": "Injective",
"domainId": 6909546,
"gasCurrencyCoinGeckoId": "injective-protocol",
"gasPrice": { "gasPrice": {
"amount": "700000000", "amount": "700000000",
"denom": "inj" "denom": "inj"
@ -658,12 +663,24 @@
"mailbox": "0x0f7fb53961d70687e352aa55cb329ca76edc0c19", "mailbox": "0x0f7fb53961d70687e352aa55cb329ca76edc0c19",
"merkleTreeHook": "0x568ad3638447f07def384969f4ea39fae3802962", "merkleTreeHook": "0x568ad3638447f07def384969f4ea39fae3802962",
"name": "injective", "name": "injective",
"nativeToken": {
"decimals": 18,
"denom": "inj",
"name": "Injective",
"symbol": "INJ"
},
"protocol": "cosmos", "protocol": "cosmos",
"restUrls": [
{
"http": "https://sentry.lcd.injective.network:443"
}
],
"rpcUrls": [ "rpcUrls": [
{ {
"http": "https://injective-rpc.polkachu.com" "http": "https://sentry.tm.injective.network:443"
} }
], ],
"slip44": 118,
"validatorAnnounce": "0x1fb225b2fcfbe75e614a1d627de97ff372242eed" "validatorAnnounce": "0x1fb225b2fcfbe75e614a1d627de97ff372242eed"
}, },
"mantapacific": { "mantapacific": {
@ -837,13 +854,25 @@
}, },
"neutron": { "neutron": {
"bech32Prefix": "neutron", "bech32Prefix": "neutron",
"blockExplorers": [
{
"apiUrl": "https://www.mintscan.io/neutron",
"family": "other",
"name": "Mintscan",
"url": "https://www.mintscan.io/neutron"
}
],
"blocks": { "blocks": {
"confirmations": 1,
"estimateBlockTime": 3,
"reorgPeriod": 1 "reorgPeriod": 1
}, },
"canonicalAsset": "untrn", "canonicalAsset": "untrn",
"chainId": "neutron-1", "chainId": "neutron-1",
"contractAddressBytes": 32, "contractAddressBytes": 32,
"domainId": "1853125230", "displayName": "Neutron",
"domainId": 1853125230,
"gasCurrencyCoinGeckoId": "neutron-3",
"gasPrice": { "gasPrice": {
"amount": "0.0053", "amount": "0.0053",
"denom": "untrn" "denom": "untrn"
@ -858,10 +887,22 @@
"from": 4000000 "from": 4000000
}, },
"interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67", "interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67",
"isTestnet": false,
"mailbox": "0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc", "mailbox": "0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc",
"merkleTreeHook": "0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c", "merkleTreeHook": "0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c",
"name": "neutron", "name": "neutron",
"nativeToken": {
"decimals": 6,
"denom": "untrn",
"name": "Neutron",
"symbol": "NTRN"
},
"protocol": "cosmos", "protocol": "cosmos",
"restUrls": [
{
"http": "https://rest-lb.neutron.org"
}
],
"rpcUrls": [ "rpcUrls": [
{ {
"http": "https://rpc-kralum.neutron-1.neutron.org" "http": "https://rpc-kralum.neutron-1.neutron.org"
@ -872,6 +913,7 @@
"prefix": "neutron", "prefix": "neutron",
"type": "cosmosKey" "type": "cosmosKey"
}, },
"slip44": 118,
"validatorAnnounce": "0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0" "validatorAnnounce": "0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0"
}, },
"optimism": { "optimism": {
@ -998,8 +1040,8 @@
"name": "polygon", "name": "polygon",
"nativeToken": { "nativeToken": {
"decimals": 18, "decimals": 18,
"name": "Ether", "name": "Matic",
"symbol": "ETH" "symbol": "MATIC"
}, },
"pausableHook": "0x748040afB89B8FdBb992799808215419d36A0930", "pausableHook": "0x748040afB89B8FdBb992799808215419d36A0930",
"pausableIsm": "0x6741e91fFDC31c7786E3684427c628dad06299B0", "pausableIsm": "0x6741e91fFDC31c7786E3684427c628dad06299B0",

@ -207,6 +207,56 @@
"timelockController": "0x0000000000000000000000000000000000000000", "timelockController": "0x0000000000000000000000000000000000000000",
"validatorAnnounce": "0x4f7179A691F8a684f56cF7Fed65171877d30739a" "validatorAnnounce": "0x4f7179A691F8a684f56cF7Fed65171877d30739a"
}, },
"holesky": {
"blockExplorers": [
{
"apiUrl": "https://api-holesky.etherscan.io/api",
"family": "etherscan",
"name": "Etherscan",
"url": "https://holesky.etherscan.io"
}
],
"blocks": {
"confirmations": 1,
"estimateBlockTime": 13,
"reorgPeriod": 2
},
"chainId": 17000,
"displayName": "Holesky",
"domainId": 17000,
"domainRoutingIsmFactory": "0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD",
"fallbackRoutingHook": "0x07009DA2249c388aD0f416a235AfE90D784e1aAc",
"index": {
"from": 1543015
},
"interchainGasPaymaster": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"interchainSecurityModule": "0x751f2b684EeBb916dB777767CCb8fd793C8b2956",
"isTestnet": true,
"mailbox": "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc",
"merkleTreeHook": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE",
"name": "holesky",
"nativeToken": {
"decimals": 18,
"name": "Ether",
"symbol": "ETH"
},
"pausableHook": "0xF7561c34f17A32D5620583A3397C304e7038a7F6",
"protocol": "ethereum",
"protocolFee": "0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C",
"proxyAdmin": "0x33dB966328Ea213b0f76eF96CA368AB37779F065",
"rpcUrls": [
{
"http": "https://ethereum-holesky-rpc.publicnode.com"
}
],
"staticAggregationHookFactory": "0x589C201a07c26b4725A4A829d772f24423da480B",
"staticAggregationIsmFactory": "0x54148470292C24345fb828B003461a9444414517",
"staticMerkleRootMultisigIsmFactory": "0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2",
"staticMessageIdMultisigIsmFactory": "0x6966b0E55883d49BFB24539356a2f8A673E02039",
"storageGasOracle": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"testRecipient": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",
"validatorAnnounce": "0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2"
},
"plumetestnet": { "plumetestnet": {
"aggregationHook": "0x31dF0EEE7Dc7565665468698a0da221225619a1B", "aggregationHook": "0x31dF0EEE7Dc7565665468698a0da221225619a1B",
"blockExplorers": [ "blockExplorers": [

@ -1 +1 @@
Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e Subproject commit 52715a217dc51d0de15877878ab8213f6cbbbab5

@ -1,253 +0,0 @@
# @hyperlane-xyz/helloworld
## 4.0.0-alpha.2
### Patch Changes
- Updated dependencies [6b63c5d82]
- @hyperlane-xyz/sdk@4.0.0-alpha.2
- @hyperlane-xyz/core@4.0.0-alpha.2
## 4.0.0-alpha.0
### Patch Changes
- Updated dependencies [bdcbe1d16]
- Updated dependencies [6db9fa9ad]
- @hyperlane-xyz/sdk@4.0.0-alpha.0
- @hyperlane-xyz/core@4.0.0-alpha.0
## 4.0.0-alpha
### Patch Changes
- Updated dependencies [eb23e7729]
- Updated dependencies [1ec61debd]
- Updated dependencies [4663018fc]
- Updated dependencies [5e5886f2c]
- Updated dependencies [341b8affd]
- Updated dependencies [3dabcbdca]
- Updated dependencies [1d0d1bb36]
- Updated dependencies [74c879fa1]
- Updated dependencies [4bf7301ea]
- @hyperlane-xyz/sdk@4.0.0-alpha
- @hyperlane-xyz/core@4.0.0-alpha
## 3.13.0
### Patch Changes
- b6b26e2bb: fix: minor change was breaking in registry export
- Updated dependencies [39ea7cdef]
- Updated dependencies [babe816f8]
- Updated dependencies [b440d98be]
- Updated dependencies [0cf692e73]
- @hyperlane-xyz/sdk@3.13.0
- @hyperlane-xyz/core@3.13.0
## 3.12.0
### Patch Changes
- Updated dependencies [eba393680]
- Updated dependencies [69de68a66]
- @hyperlane-xyz/sdk@3.12.0
- @hyperlane-xyz/core@3.12.0
## 3.11.1
### Patch Changes
- Updated dependencies [c900da187]
- @hyperlane-xyz/sdk@3.11.1
- @hyperlane-xyz/core@3.11.1
## 3.11.0
### Minor Changes
- b63714ede: Convert all public hyperlane npm packages from CJS to pure ESM
### Patch Changes
- Updated dependencies [811ecfbba]
- Updated dependencies [f8b6ea467]
- Updated dependencies [d37cbab72]
- Updated dependencies [b6fdf2f7f]
- Updated dependencies [a86a8296b]
- Updated dependencies [2db77f177]
- Updated dependencies [3a08e31b6]
- Updated dependencies [917266dce]
- Updated dependencies [aab63d466]
- Updated dependencies [2e439423e]
- Updated dependencies [b63714ede]
- Updated dependencies [3528b281e]
- Updated dependencies [450e8e0d5]
- Updated dependencies [af2634207]
- @hyperlane-xyz/sdk@3.11.0
- @hyperlane-xyz/core@3.11.0
## 3.10.0
### Minor Changes
- 96485144a: SDK support for ICA deployment and operation.
- 4e7a43be6: Replace Debug logger with Pino
### Patch Changes
- Updated dependencies [96485144a]
- Updated dependencies [38358ecec]
- Updated dependencies [ed0d4188c]
- Updated dependencies [4e7a43be6]
- @hyperlane-xyz/sdk@3.10.0
- @hyperlane-xyz/core@3.10.0
## 3.9.0
### Patch Changes
- Updated dependencies [11f257ebc]
- @hyperlane-xyz/sdk@3.9.0
- @hyperlane-xyz/core@3.9.0
## 3.8.2
### Patch Changes
- @hyperlane-xyz/core@3.8.2
- @hyperlane-xyz/sdk@3.8.2
## 3.8.1
### Patch Changes
- Updated dependencies [5daaae274]
- @hyperlane-xyz/sdk@3.8.1
- @hyperlane-xyz/core@3.8.1
## 3.8.0
### Minor Changes
- 9681df08d: Enabled verification of contracts as part of the deployment flow.
- Solidity build artifact is now included as part of the `@hyperlane-xyz/core` package.
- Updated the `HyperlaneDeployer` to perform contract verification immediately after deploying a contract. A default verifier is instantiated using the core build artifact.
- Updated the `HyperlaneIsmFactory` to re-use the `HyperlaneDeployer` for deployment where possible.
- Minor logging improvements throughout deployers.
### Patch Changes
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- Updated dependencies [9681df08d]
- @hyperlane-xyz/sdk@3.8.0
- @hyperlane-xyz/core@3.8.0
## 3.7.0
### Patch Changes
- Updated dependencies [6f464eaed]
- Updated dependencies [87151c62b]
- Updated dependencies [ab17af5f7]
- Updated dependencies [7b40232af]
- Updated dependencies [54aeb6420]
- @hyperlane-xyz/sdk@3.7.0
- @hyperlane-xyz/core@3.7.0
## 3.6.2
### Patch Changes
- @hyperlane-xyz/core@3.6.2
- @hyperlane-xyz/sdk@3.6.2
## 3.6.1
### Patch Changes
- Updated dependencies [ae4476ad0]
- Updated dependencies [f3b7ddb69]
- Updated dependencies [e4e4f93fc]
- @hyperlane-xyz/sdk@3.6.1
- @hyperlane-xyz/core@3.6.1
## 3.6.0
### Patch Changes
- Updated dependencies [67a6d971e]
- Updated dependencies [612d4163a]
- Updated dependencies [0488ef31d]
- Updated dependencies [8d8ba3f7a]
- @hyperlane-xyz/sdk@3.6.0
- @hyperlane-xyz/core@3.6.0
## 3.5.1
### Patch Changes
- Updated dependencies [a04454d6d]
- @hyperlane-xyz/sdk@3.5.1
- @hyperlane-xyz/core@3.5.1
## 3.5.0
### Patch Changes
- Updated dependencies [655b6a0cd]
- Updated dependencies [08ba0d32b]
- Updated dependencies [f7d285e3a]
- @hyperlane-xyz/sdk@3.5.0
- @hyperlane-xyz/core@3.5.0
## 3.4.0
### Patch Changes
- Updated dependencies [7919417ec]
- Updated dependencies [fd4fc1898]
- Updated dependencies [e06fe0b32]
- Updated dependencies [b832e57ae]
- Updated dependencies [79c96d718]
- @hyperlane-xyz/sdk@3.4.0
- @hyperlane-xyz/core@3.4.0
## 3.3.0
### Patch Changes
- Updated dependencies [7e620c9df]
- Updated dependencies [350175581]
- Updated dependencies [9f2c7ce7c]
- @hyperlane-xyz/sdk@3.3.0
- @hyperlane-xyz/core@3.3.0
## 3.2.0
### Patch Changes
- Updated dependencies [df34198d4]
- Updated dependencies [df693708b]
- @hyperlane-xyz/core@3.2.0
- @hyperlane-xyz/sdk@3.2.0
## 3.1.10
### Patch Changes
- c9e0aedae: Improve client side StandardHookMetadata library interface
- Updated dependencies [c9e0aedae]
- @hyperlane-xyz/core@3.1.10
- @hyperlane-xyz/sdk@3.1.10

@ -14,6 +14,7 @@
"@nomiclabs/hardhat-waffle": "^2.0.6", "@nomiclabs/hardhat-waffle": "^2.0.6",
"@trivago/prettier-plugin-sort-imports": "^4.2.1", "@trivago/prettier-plugin-sort-imports": "^4.2.1",
"@typechain/ethers-v5": "^11.1.2", "@typechain/ethers-v5": "^11.1.2",
"@typechain/ethers-v6": "^0.5.1",
"@typechain/hardhat": "^9.1.0", "@typechain/hardhat": "^9.1.0",
"@typescript-eslint/eslint-plugin": "^7.4.0", "@typescript-eslint/eslint-plugin": "^7.4.0",
"@typescript-eslint/parser": "^7.4.0", "@typescript-eslint/parser": "^7.4.0",

@ -1,45 +1,12 @@
# @hyperlane-xyz/infra # @hyperlane-xyz/infra
## 4.0.0-alpha.2 ## 3.14.0
### Patch Changes ### Patch Changes
- Updated dependencies [6b63c5d82] - @hyperlane-xyz/helloworld@3.14.0
- @hyperlane-xyz/sdk@4.0.0-alpha.2 - @hyperlane-xyz/sdk@3.14.0
- @hyperlane-xyz/helloworld@4.0.0-alpha.2 - @hyperlane-xyz/utils@3.14.0
- @hyperlane-xyz/utils@4.0.0-alpha.2
## 4.0.0-alpha.0
### Patch Changes
- Updated dependencies [bdcbe1d16]
- Updated dependencies [6db9fa9ad]
- @hyperlane-xyz/sdk@4.0.0-alpha.0
- @hyperlane-xyz/helloworld@4.0.0-alpha.0
- @hyperlane-xyz/utils@4.0.0-alpha.0
## 4.0.0-alpha
### Minor Changes
- 1ec61debd: Support hook config objects in warp config
- 341b8affd: Completes the EvmIsmModule for creating, reading and updating ISMs.
### Patch Changes
- Updated dependencies [eb23e7729]
- Updated dependencies [1ec61debd]
- Updated dependencies [4663018fc]
- Updated dependencies [5e5886f2c]
- Updated dependencies [341b8affd]
- Updated dependencies [3dabcbdca]
- Updated dependencies [1d0d1bb36]
- Updated dependencies [74c879fa1]
- Updated dependencies [4bf7301ea]
- @hyperlane-xyz/sdk@4.0.0-alpha
- @hyperlane-xyz/utils@4.0.0-alpha
- @hyperlane-xyz/helloworld@4.0.0-alpha
## 3.13.0 ## 3.13.0

@ -209,7 +209,7 @@ const hyperlane: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback, rpcConsensusType: RpcConsensusType.Fallback,
docker: { docker: {
repo, repo,
tag: 'd6bb976-20240520-164138', tag: '939fa81-20240607-194607',
}, },
gasPaymentEnforcement: gasPaymentEnforcement, gasPaymentEnforcement: gasPaymentEnforcement,
metricAppContexts, metricAppContexts,
@ -226,7 +226,7 @@ const hyperlane: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback, rpcConsensusType: RpcConsensusType.Fallback,
docker: { docker: {
repo, repo,
tag: 'd6bb976-20240520-164138', tag: '939fa81-20240607-194607',
}, },
}, },
}; };
@ -240,7 +240,7 @@ const releaseCandidate: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback, rpcConsensusType: RpcConsensusType.Fallback,
docker: { docker: {
repo, repo,
tag: 'c9c5d37-20240510-014327', tag: '939fa81-20240607-194607',
}, },
// We're temporarily (ab)using the RC relayer as a way to increase // We're temporarily (ab)using the RC relayer as a way to increase
// message throughput. // message throughput.

@ -1,30 +1,23 @@
import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk';
import { objKeys } from '@hyperlane-xyz/utils';
import { getChainMetadatas } from '../../../src/config/chain.js'; import { isEthereumProtocolChain } from '../../../src/utils/utils.js';
import { getChain } from '../../registry.js';
import { supportedChainNames } from './supportedChainNames.js'; import { supportedChainNames } from './supportedChainNames.js';
export const environment = 'mainnet3'; export const environment = 'mainnet3';
const { export const ethereumChainNames = supportedChainNames.filter(
ethereumMetadatas: defaultEthereumMainnetConfigs, isEthereumProtocolChain,
nonEthereumMetadatas: nonEthereumMainnetConfigs, );
} = getChainMetadatas(supportedChainNames);
export const ethereumMainnetConfigs: ChainMap<ChainMetadata> = { export const chainMetadataOverrides: ChainMap<Partial<ChainMetadata>> = {
...defaultEthereumMainnetConfigs,
bsc: { bsc: {
...getChain('bsc'),
transactionOverrides: { transactionOverrides: {
gasPrice: 3 * 10 ** 9, // 3 gwei gasPrice: 3 * 10 ** 9, // 3 gwei
}, },
}, },
polygon: { polygon: {
...getChain('polygon'),
blocks: { blocks: {
...getChain('polygon').blocks,
confirmations: 3, confirmations: 3,
}, },
transactionOverrides: { transactionOverrides: {
@ -35,9 +28,7 @@ export const ethereumMainnetConfigs: ChainMap<ChainMetadata> = {
}, },
}, },
ethereum: { ethereum: {
...getChain('ethereum'),
blocks: { blocks: {
...getChain('ethereum').blocks,
confirmations: 3, confirmations: 3,
}, },
transactionOverrides: { transactionOverrides: {
@ -46,7 +37,6 @@ export const ethereumMainnetConfigs: ChainMap<ChainMetadata> = {
}, },
}, },
scroll: { scroll: {
...getChain('scroll'),
transactionOverrides: { transactionOverrides: {
// Scroll doesn't use EIP 1559 and the gas price that's returned is sometimes // Scroll doesn't use EIP 1559 and the gas price that's returned is sometimes
// too low for the transaction to be included in a reasonable amount of time - // too low for the transaction to be included in a reasonable amount of time -
@ -55,17 +45,9 @@ export const ethereumMainnetConfigs: ChainMap<ChainMetadata> = {
}, },
}, },
moonbeam: { moonbeam: {
...getChain('moonbeam'),
transactionOverrides: { transactionOverrides: {
maxFeePerGas: 350 * 10 ** 9, // 350 gwei maxFeePerGas: 350 * 10 ** 9, // 350 gwei
maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei maxPriorityFeePerGas: 50 * 10 ** 9, // 50 gwei
}, },
}, },
}; };
export const mainnetConfigs: ChainMap<ChainMetadata> = {
...ethereumMainnetConfigs,
...nonEthereumMainnetConfigs,
};
export const ethereumChainNames = objKeys(ethereumMainnetConfigs);

@ -1,5 +1,3 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { KeyFunderConfig } from '../../../src/config/funding.js'; import { KeyFunderConfig } from '../../../src/config/funding.js';
import { Role } from '../../../src/roles.js'; import { Role } from '../../../src/roles.js';
import { Contexts } from '../../contexts.js'; import { Contexts } from '../../contexts.js';
@ -9,7 +7,7 @@ import { environment } from './chains.js';
export const keyFunderConfig: KeyFunderConfig = { export const keyFunderConfig: KeyFunderConfig = {
docker: { docker: {
repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: 'b22a0f4-20240523-140812', tag: '7720875-20240531-072251',
}, },
// We're currently using the same deployer/key funder key as mainnet2. // We're currently using the same deployer/key funder key as mainnet2.
// To minimize nonce clobbering we offset the key funder cron // To minimize nonce clobbering we offset the key funder cron
@ -23,7 +21,6 @@ export const keyFunderConfig: KeyFunderConfig = {
[Contexts.Hyperlane]: [Role.Relayer, Role.Kathy], [Contexts.Hyperlane]: [Role.Relayer, Role.Kathy],
[Contexts.ReleaseCandidate]: [Role.Relayer, Role.Kathy], [Contexts.ReleaseCandidate]: [Role.Relayer, Role.Kathy],
}, },
connectionType: RpcConsensusType.Fallback,
// desired balance config // desired balance config
desiredBalancePerChain: { desiredBalancePerChain: {
arbitrum: '0.5', arbitrum: '0.5',

@ -1,5 +1,3 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { import {
HelloWorldConfig, HelloWorldConfig,
HelloWorldKathyRunMode, HelloWorldKathyRunMode,
@ -26,7 +24,6 @@ export const hyperlane: HelloWorldConfig = {
}, },
messageSendTimeout: 1000 * 60 * 8, // 8 min messageSendTimeout: 1000 * 60 * 8, // 8 min
messageReceiptTimeout: 1000 * 60 * 20, // 20 min messageReceiptTimeout: 1000 * 60 * 20, // 20 min
connectionType: RpcConsensusType.Fallback,
cyclesBetweenEthereumMessages: 1, // Skip 1 cycle of Ethereum, i.e. send/receive Ethereum messages every 5 days (not great since we still send like 12 in that cycle) cyclesBetweenEthereumMessages: 1, // Skip 1 cycle of Ethereum, i.e. send/receive Ethereum messages every 5 days (not great since we still send like 12 in that cycle)
}, },
}; };
@ -46,7 +43,6 @@ export const releaseCandidate: HelloWorldConfig = {
}, },
messageSendTimeout: 1000 * 60 * 8, // 8 min messageSendTimeout: 1000 * 60 * 8, // 8 min
messageReceiptTimeout: 1000 * 60 * 20, // 20 min messageReceiptTimeout: 1000 * 60 * 20, // 20 min
connectionType: RpcConsensusType.Fallback,
}, },
}; };

@ -1,16 +1,20 @@
import { ChainMetadata, RpcConsensusType } from '@hyperlane-xyz/sdk'; import { IRegistry } from '@hyperlane-xyz/registry';
import { ProtocolType, objFilter } from '@hyperlane-xyz/utils';
import { import {
getKeysForRole, getKeysForRole,
getMultiProtocolProvider,
getMultiProviderForRole, getMultiProviderForRole,
} from '../../../scripts/agent-utils.js'; } from '../../../scripts/agent-utils.js';
import { getRegistryForEnvironment } from '../../../src/config/chain.js';
import { EnvironmentConfig } from '../../../src/config/environment.js'; import { EnvironmentConfig } from '../../../src/config/environment.js';
import { Role } from '../../../src/roles.js'; import { Role } from '../../../src/roles.js';
import { Contexts } from '../../contexts.js'; import { Contexts } from '../../contexts.js';
import { agents } from './agent.js'; import { agents } from './agent.js';
import { environment as environmentName, mainnetConfigs } from './chains.js'; import {
chainMetadataOverrides,
environment as environmentName,
} from './chains.js';
import { core } from './core.js'; import { core } from './core.js';
import { keyFunderConfig } from './funding.js'; import { keyFunderConfig } from './funding.js';
import { helloWorld } from './helloworld.js'; import { helloWorld } from './helloworld.js';
@ -18,34 +22,38 @@ import { igp } from './igp.js';
import { infrastructure } from './infrastructure.js'; import { infrastructure } from './infrastructure.js';
import { bridgeAdapterConfigs, relayerConfig } from './liquidityLayer.js'; import { bridgeAdapterConfigs, relayerConfig } from './liquidityLayer.js';
import { owners } from './owners.js'; import { owners } from './owners.js';
import { supportedChainNames } from './supportedChainNames.js';
const getRegistry = async (useSecrets = true): Promise<IRegistry> =>
getRegistryForEnvironment(
environmentName,
supportedChainNames,
chainMetadataOverrides,
useSecrets,
);
export const environment: EnvironmentConfig = { export const environment: EnvironmentConfig = {
environment: environmentName, environment: environmentName,
chainMetadataConfigs: mainnetConfigs, supportedChainNames,
getMultiProvider: ( getRegistry,
getMultiProtocolProvider: async () =>
getMultiProtocolProvider(await getRegistry()),
getMultiProvider: async (
context: Contexts = Contexts.Hyperlane, context: Contexts = Contexts.Hyperlane,
role: Role = Role.Deployer, role: Role = Role.Deployer,
connectionType?: RpcConsensusType, useSecrets?: boolean,
) => { ) =>
const config = objFilter( getMultiProviderForRole(
mainnetConfigs,
(_, chainMetadata): chainMetadata is ChainMetadata =>
chainMetadata.protocol === ProtocolType.Ethereum,
);
return getMultiProviderForRole(
config,
environmentName, environmentName,
await getRegistry(useSecrets),
context, context,
role, role,
undefined, undefined,
connectionType, ),
);
},
getKeys: ( getKeys: (
context: Contexts = Contexts.Hyperlane, context: Contexts = Contexts.Hyperlane,
role: Role = Role.Deployer, role: Role = Role.Deployer,
) => getKeysForRole(mainnetConfigs, environmentName, context, role), ) => getKeysForRole(environmentName, supportedChainNames, context, role),
agents, agents,
core, core,
igp, igp,

@ -2,7 +2,6 @@ import {
BridgeAdapterConfig, BridgeAdapterConfig,
BridgeAdapterType, BridgeAdapterType,
ChainMap, ChainMap,
RpcConsensusType,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { LiquidityLayerRelayerConfig } from '../../../src/config/middleware.js'; import { LiquidityLayerRelayerConfig } from '../../../src/config/middleware.js';
@ -50,5 +49,4 @@ export const relayerConfig: LiquidityLayerRelayerConfig = {
namespace: environment, namespace: environment,
prometheusPushGateway: prometheusPushGateway:
'http://prometheus-prometheus-pushgateway.monitoring.svc.cluster.local:9091', 'http://prometheus-prometheus-pushgateway.monitoring.svc.cluster.local:9091',
connectionType: RpcConsensusType.Single,
}; };

@ -5,6 +5,7 @@ import { MultiProvider, testChainMetadata } from '@hyperlane-xyz/sdk';
import { EnvironmentConfig } from '../../../src/config/environment.js'; import { EnvironmentConfig } from '../../../src/config/environment.js';
import { agents } from './agent.js'; import { agents } from './agent.js';
import { testChainNames } from './chains.js';
import { core } from './core.js'; import { core } from './core.js';
import { igp } from './igp.js'; import { igp } from './igp.js';
import { infra } from './infra.js'; import { infra } from './infra.js';
@ -12,7 +13,13 @@ import { owners } from './owners.js';
export const environment: EnvironmentConfig = { export const environment: EnvironmentConfig = {
environment: 'test', environment: 'test',
chainMetadataConfigs: testChainMetadata, supportedChainNames: testChainNames,
getRegistry: () => {
throw new Error('Not implemented');
},
getMultiProtocolProvider: () => {
throw new Error('Not implemented');
},
agents, agents,
core, core,
igp, igp,

@ -36,6 +36,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
bsctestnet: true, bsctestnet: true,
eclipsetestnet: false, eclipsetestnet: false,
fuji: true, fuji: true,
holesky: true,
plumetestnet: true, plumetestnet: true,
scrollsepolia: true, scrollsepolia: true,
sepolia: true, sepolia: true,
@ -46,6 +47,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
bsctestnet: true, bsctestnet: true,
eclipsetestnet: false, eclipsetestnet: false,
fuji: true, fuji: true,
holesky: true,
plumetestnet: true, plumetestnet: true,
scrollsepolia: true, scrollsepolia: true,
sepolia: true, sepolia: true,
@ -57,6 +59,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig = {
// Cannot scrape non-EVM chains // Cannot scrape non-EVM chains
eclipsetestnet: false, eclipsetestnet: false,
fuji: true, fuji: true,
holesky: true,
plumetestnet: true, plumetestnet: true,
scrollsepolia: true, scrollsepolia: true,
sepolia: true, sepolia: true,
@ -124,7 +127,7 @@ const hyperlane: RootAgentConfig = {
rpcConsensusType: RpcConsensusType.Fallback, rpcConsensusType: RpcConsensusType.Fallback,
docker: { docker: {
repo, repo,
tag: 'c9c5d37-20240510-014327', tag: 'e09a360-20240520-090014',
}, },
chains: validatorChainConfig(Contexts.Hyperlane), chains: validatorChainConfig(Contexts.Hyperlane),
}, },

@ -20,6 +20,9 @@
"0x43e915573d9f1383cbf482049e4a012290759e7f" "0x43e915573d9f1383cbf482049e4a012290759e7f"
] ]
}, },
"holesky": {
"validators": ["0x7ab28ad88bb45867137ea823af88e2cb02359c03"]
},
"plumetestnet": { "plumetestnet": {
"validators": [ "validators": [
"0xe765a214849f3ecdf00793b97d00422f2d408ea6", "0xe765a214849f3ecdf00793b97d00422f2d408ea6",

@ -1,24 +1,19 @@
import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk';
import { objKeys } from '@hyperlane-xyz/utils';
import { getChainMetadatas } from '../../../src/config/chain.js'; import { isEthereumProtocolChain } from '../../../src/utils/utils.js';
import { getChain } from '../../registry.js';
import { supportedChainNames } from './supportedChainNames.js'; import { supportedChainNames } from './supportedChainNames.js';
export const environment = 'testnet4'; export const environment = 'testnet4';
const { ethereumMetadatas: defaultEthereumMainnetConfigs } = export const ethereumChainNames = supportedChainNames.filter(
getChainMetadatas(supportedChainNames); isEthereumProtocolChain,
);
export const testnetConfigs: ChainMap<ChainMetadata> = { export const chainMetadataOverrides: ChainMap<Partial<ChainMetadata>> = {
...defaultEthereumMainnetConfigs,
bsctestnet: { bsctestnet: {
...getChain('bsctestnet'),
transactionOverrides: { transactionOverrides: {
gasPrice: 8 * 10 ** 9, // 8 gwei gasPrice: 8 * 10 ** 9, // 8 gwei
}, },
}, },
}; };
export const ethereumChainNames = objKeys(defaultEthereumMainnetConfigs);

@ -1841,6 +1841,296 @@
"name": "PausableHook" "name": "PausableHook"
} }
], ],
"holesky": [
{
"address": "0x33dB966328Ea213b0f76eF96CA368AB37779F065",
"constructorArguments": "",
"isProxy": false,
"name": "ProxyAdmin"
},
{
"address": "0xB08d78F439e55D02C398519eef61606A5926245F",
"constructorArguments": "0000000000000000000000000000000000000000000000000000000000004268",
"isProxy": false,
"name": "Mailbox"
},
{
"address": "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc",
"constructorArguments": "000000000000000000000000b08d78f439e55d02c398519eef61606a5926245f00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x679Dc08cC3A4acFeea2f7CAFAa37561aE0b41Ce7",
"constructorArguments": "000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c",
"isProxy": false,
"name": "PausableIsm"
},
{
"address": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE",
"constructorArguments": "00000000000000000000000046f7c5d896bbec89be1b19e4485e59b4be49e9cc",
"isProxy": false,
"name": "MerkleTreeHook"
},
{
"address": "0x07009DA2249c388aD0f416a235AfE90D784e1aAc",
"constructorArguments": "00000000000000000000000046f7c5d896bbec89be1b19e4485e59b4be49e9cc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000098aae089cad930c64a76dd2247a2ac5773a4b8ce",
"isProxy": false,
"name": "FallbackRoutingHook"
},
{
"address": "0xF7561c34f17A32D5620583A3397C304e7038a7F6",
"constructorArguments": "",
"isProxy": false,
"name": "PausableHook"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE",
"constructorArguments": "00000000000000000000000046f7c5d896bbec89be1b19e4485e59b4be49e9cc",
"isProxy": false,
"name": "MerkleTreeHook"
},
{
"address": "0x07009DA2249c388aD0f416a235AfE90D784e1aAc",
"constructorArguments": "00000000000000000000000046f7c5d896bbec89be1b19e4485e59b4be49e9cc000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000098aae089cad930c64a76dd2247a2ac5773a4b8ce",
"isProxy": false,
"name": "FallbackRoutingHook"
},
{
"address": "0xF7561c34f17A32D5620583A3397C304e7038a7F6",
"constructorArguments": "",
"isProxy": false,
"name": "PausableHook"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x2b2a158B4059C840c7aC67399B153bb567D06303",
"constructorArguments": "",
"isProxy": false,
"name": "StorageGasOracle"
},
{
"address": "0x5CE550e14B82a9F32A0aaF9eFc4Fce548D8A0B3e",
"constructorArguments": "",
"isProxy": false,
"name": "InterchainGasPaymaster"
},
{
"address": "0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9",
"constructorArguments": "0000000000000000000000005ce550e14b82a9f32a0aaf9efc4fce548d8a0b3e00000000000000000000000033db966328ea213b0f76ef96ca368ab37779f06500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c00000000000000000000000000000000000000000000000000000000",
"isProxy": true,
"name": "TransparentUpgradeableProxy"
},
{
"address": "0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C",
"constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c000000000000000000000000fad1c94469700833717fa8a3017278bc1ca8031c",
"isProxy": false,
"name": "ProtocolFee"
},
{
"address": "0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2",
"constructorArguments": "00000000000000000000000046f7c5d896bbec89be1b19e4485e59b4be49e9cc",
"isProxy": false,
"name": "ValidatorAnnounce"
}
],
"moonbasealpha": [ "moonbasealpha": [
{ {
"address": "0xb241991527F1C21adE14F55589E5940aC4852Fa0", "address": "0xb241991527F1C21adE14F55589E5940aC4852Fa0",

@ -1,5 +1,3 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { KeyFunderConfig } from '../../../src/config/funding.js'; import { KeyFunderConfig } from '../../../src/config/funding.js';
import { Role } from '../../../src/roles.js'; import { Role } from '../../../src/roles.js';
import { Contexts } from '../../contexts.js'; import { Contexts } from '../../contexts.js';
@ -9,7 +7,7 @@ import { environment } from './chains.js';
export const keyFunderConfig: KeyFunderConfig = { export const keyFunderConfig: KeyFunderConfig = {
docker: { docker: {
repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: 'b22a0f4-20240523-140812', tag: 'efa9025-20240605-091304',
}, },
// We're currently using the same deployer key as testnet2. // We're currently using the same deployer key as testnet2.
// To minimize nonce clobbering we offset the key funder cron // To minimize nonce clobbering we offset the key funder cron
@ -23,13 +21,14 @@ export const keyFunderConfig: KeyFunderConfig = {
[Contexts.Hyperlane]: [Role.Relayer, Role.Kathy], [Contexts.Hyperlane]: [Role.Relayer, Role.Kathy],
[Contexts.ReleaseCandidate]: [Role.Relayer, Role.Kathy], [Contexts.ReleaseCandidate]: [Role.Relayer, Role.Kathy],
}, },
connectionType: RpcConsensusType.Fallback,
// desired balance config // desired balance config
desiredBalancePerChain: { desiredBalancePerChain: {
alfajores: '5', alfajores: '5',
bsctestnet: '5', bsctestnet: '5',
fuji: '5', fuji: '5',
plumetestnet: '0.2', plumetestnet: '0.2',
holesky: '5',
// Funder boosts itself upto 5x balance on L2 before dispersing funds
scrollsepolia: '1', scrollsepolia: '1',
sepolia: '5', sepolia: '5',
}, },

@ -19,6 +19,7 @@ import { ethereumChainNames } from './chains.js';
const gasPrices: ChainMap<BigNumber> = { const gasPrices: ChainMap<BigNumber> = {
alfajores: ethers.utils.parseUnits('10', 'gwei'), alfajores: ethers.utils.parseUnits('10', 'gwei'),
fuji: ethers.utils.parseUnits('30', 'gwei'), fuji: ethers.utils.parseUnits('30', 'gwei'),
holesky: ethers.utils.parseUnits('10', 'gwei'),
bsctestnet: ethers.utils.parseUnits('15', 'gwei'), bsctestnet: ethers.utils.parseUnits('15', 'gwei'),
sepolia: ethers.utils.parseUnits('5', 'gwei'), sepolia: ethers.utils.parseUnits('5', 'gwei'),
scrollsepolia: ethers.utils.parseUnits('0.5', 'gwei'), scrollsepolia: ethers.utils.parseUnits('0.5', 'gwei'),
@ -48,6 +49,7 @@ const chainTokenRarity: ChainMap<Rarity> = {
alfajores: Rarity.Common, alfajores: Rarity.Common,
fuji: Rarity.Rare, fuji: Rarity.Rare,
bsctestnet: Rarity.Rare, bsctestnet: Rarity.Rare,
holesky: Rarity.Common,
sepolia: Rarity.Mythic, sepolia: Rarity.Mythic,
scrollsepolia: Rarity.Rare, scrollsepolia: Rarity.Rare,
chiado: Rarity.Common, chiado: Rarity.Common,

@ -1,5 +1,3 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { import {
HelloWorldConfig, HelloWorldConfig,
HelloWorldKathyRunMode, HelloWorldKathyRunMode,
@ -15,7 +13,7 @@ export const hyperlaneHelloworld: HelloWorldConfig = {
kathy: { kathy: {
docker: { docker: {
repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: 'b22a0f4-20240523-140812', tag: 'efa9025-20240605-091304',
}, },
chainsToSkip: [], chainsToSkip: [],
runEnv: environment, runEnv: environment,
@ -26,7 +24,6 @@ export const hyperlaneHelloworld: HelloWorldConfig = {
}, },
messageSendTimeout: 1000 * 60 * 10, // 10 min messageSendTimeout: 1000 * 60 * 10, // 10 min
messageReceiptTimeout: 1000 * 60 * 20, // 20 min messageReceiptTimeout: 1000 * 60 * 20, // 20 min
connectionType: RpcConsensusType.Fallback,
}, },
}; };
@ -35,7 +32,7 @@ export const releaseCandidateHelloworld: HelloWorldConfig = {
kathy: { kathy: {
docker: { docker: {
repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo',
tag: 'b22a0f4-20240523-140812', tag: 'efa9025-20240605-091304',
}, },
chainsToSkip: [], chainsToSkip: [],
runEnv: environment, runEnv: environment,
@ -45,7 +42,6 @@ export const releaseCandidateHelloworld: HelloWorldConfig = {
}, },
messageSendTimeout: 1000 * 60 * 8, // 8 min messageSendTimeout: 1000 * 60 * 8, // 8 min
messageReceiptTimeout: 1000 * 60 * 20, // 20 min messageReceiptTimeout: 1000 * 60 * 20, // 20 min
connectionType: RpcConsensusType.Fallback,
}, },
}; };

@ -1,15 +1,21 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk'; import { IRegistry } from '@hyperlane-xyz/registry';
import { objMerge } from '@hyperlane-xyz/utils';
import { import {
getKeysForRole, getKeysForRole,
getMultiProtocolProvider,
getMultiProviderForRole, getMultiProviderForRole,
} from '../../../scripts/agent-utils.js'; } from '../../../scripts/agent-utils.js';
import { getRegistryForEnvironment } from '../../../src/config/chain.js';
import { EnvironmentConfig } from '../../../src/config/environment.js'; import { EnvironmentConfig } from '../../../src/config/environment.js';
import { Role } from '../../../src/roles.js'; import { Role } from '../../../src/roles.js';
import { Contexts } from '../../contexts.js'; import { Contexts } from '../../contexts.js';
import { agents } from './agent.js'; import { agents } from './agent.js';
import { environment as environmentName, testnetConfigs } from './chains.js'; import {
chainMetadataOverrides,
environment as environmentName,
} from './chains.js';
import { core } from './core.js'; import { core } from './core.js';
import { keyFunderConfig } from './funding.js'; import { keyFunderConfig } from './funding.js';
import { helloWorld } from './helloworld.js'; import { helloWorld } from './helloworld.js';
@ -18,27 +24,38 @@ import { infrastructure } from './infrastructure.js';
import { bridgeAdapterConfigs } from './liquidityLayer.js'; import { bridgeAdapterConfigs } from './liquidityLayer.js';
import { liquidityLayerRelayerConfig } from './middleware.js'; import { liquidityLayerRelayerConfig } from './middleware.js';
import { owners } from './owners.js'; import { owners } from './owners.js';
import { supportedChainNames } from './supportedChainNames.js';
const getRegistry = async (useSecrets = true): Promise<IRegistry> =>
getRegistryForEnvironment(
environmentName,
supportedChainNames,
chainMetadataOverrides,
useSecrets,
);
export const environment: EnvironmentConfig = { export const environment: EnvironmentConfig = {
environment: environmentName, environment: environmentName,
chainMetadataConfigs: testnetConfigs, supportedChainNames,
getMultiProvider: ( getRegistry,
getMultiProtocolProvider: async () =>
getMultiProtocolProvider(await getRegistry()),
getMultiProvider: async (
context: Contexts = Contexts.Hyperlane, context: Contexts = Contexts.Hyperlane,
role: Role = Role.Deployer, role: Role = Role.Deployer,
connectionType?: RpcConsensusType, useSecrets?: boolean,
) => ) =>
getMultiProviderForRole( getMultiProviderForRole(
testnetConfigs,
environmentName, environmentName,
await getRegistry(useSecrets),
context, context,
role, role,
undefined, undefined,
connectionType,
), ),
getKeys: ( getKeys: (
context: Contexts = Contexts.Hyperlane, context: Contexts = Contexts.Hyperlane,
role: Role = Role.Deployer, role: Role = Role.Deployer,
) => getKeysForRole(testnetConfigs, environmentName, context, role), ) => getKeysForRole(environmentName, supportedChainNames, context, role),
agents, agents,
core, core,
igp, igp,

@ -1,5 +1,3 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { LiquidityLayerRelayerConfig } from '../../../src/config/middleware.js'; import { LiquidityLayerRelayerConfig } from '../../../src/config/middleware.js';
import { environment } from './chains.js'; import { environment } from './chains.js';
@ -12,5 +10,4 @@ export const liquidityLayerRelayerConfig: LiquidityLayerRelayerConfig = {
namespace: environment, namespace: environment,
prometheusPushGateway: prometheusPushGateway:
'http://prometheus-prometheus-pushgateway.monitoring.svc.cluster.local:9091', 'http://prometheus-prometheus-pushgateway.monitoring.svc.cluster.local:9091',
connectionType: RpcConsensusType.Single,
}; };

@ -4,6 +4,7 @@ export const supportedChainNames = [
'alfajores', 'alfajores',
'bsctestnet', 'bsctestnet',
'eclipsetestnet', 'eclipsetestnet',
'holesky',
'fuji', 'fuji',
'plumetestnet', 'plumetestnet',
'scrollsepolia', 'scrollsepolia',

@ -70,6 +70,21 @@ export const validatorChainConfig = (
'bsctestnet', 'bsctestnet',
), ),
}, },
holesky: {
interval: 13,
reorgPeriod: getReorgPeriod('holesky'),
validators: validatorsConfig(
{
[Contexts.Hyperlane]: ['0x7ab28ad88bb45867137ea823af88e2cb02359c03'],
[Contexts.ReleaseCandidate]: [
'0x7ab28ad88bb45867137ea823af88e2cb02359c03',
],
[Contexts.Neutron]: [],
},
'holesky',
),
},
scrollsepolia: { scrollsepolia: {
interval: 5, interval: 5,
reorgPeriod: getReorgPeriod('scrollsepolia'), reorgPeriod: getReorgPeriod('scrollsepolia'),

@ -1,7 +1,11 @@
import { dirname, join } from 'path'; import { dirname, join } from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import { ChainAddresses } from '@hyperlane-xyz/registry'; import {
ChainAddresses,
MergedRegistry,
PartialRegistry,
} from '@hyperlane-xyz/registry';
import { FileSystemRegistry } from '@hyperlane-xyz/registry/fs'; import { FileSystemRegistry } from '@hyperlane-xyz/registry/fs';
import { import {
ChainMap, ChainMap,
@ -111,3 +115,26 @@ export function getMainnetAddresses(): ChainMap<ChainAddresses> {
export function getTestnetAddresses(): ChainMap<ChainAddresses> { export function getTestnetAddresses(): ChainMap<ChainAddresses> {
return getEnvAddresses('testnet4'); return getEnvAddresses('testnet4');
} }
/**
* Gets a registry, applying the provided overrides. The base registry
* that the overrides are applied to is the registry returned by `getRegistry`.
* @param chainMetadataOverrides Chain metadata overrides.
* @param chainAddressesOverrides Chain address overrides.
* @returns A MergedRegistry merging the registry from `getRegistry` and the overrides.
*/
export function getRegistryWithOverrides(
chainMetadataOverrides: ChainMap<Partial<ChainMetadata>> = {},
chainAddressesOverrides: ChainMap<Partial<ChainAddresses>> = {},
): MergedRegistry {
const baseRegistry = getRegistry();
const overrideRegistry = new PartialRegistry({
chainMetadata: chainMetadataOverrides,
chainAddresses: chainAddressesOverrides,
});
return new MergedRegistry({
registries: [baseRegistry, overrideRegistry],
});
}

@ -91,10 +91,6 @@ The helloworld-kathy container
{{- if .Values.hyperlane.cycleOnce }} {{- if .Values.hyperlane.cycleOnce }}
- --cycle-once - --cycle-once
{{- end }} {{- end }}
{{- if .Values.hyperlane.connectionType }}
- --connection-type
- {{ .Values.hyperlane.connectionType }}
{{- end }}
{{- if .Values.hyperlane.cyclesBetweenEthereumMessages }} {{- if .Values.hyperlane.cyclesBetweenEthereumMessages }}
- --cycles-between-ethereum-messages - --cycles-between-ethereum-messages
- "{{ .Values.hyperlane.cyclesBetweenEthereumMessages }}" - "{{ .Values.hyperlane.cyclesBetweenEthereumMessages }}"

@ -33,7 +33,6 @@ spec:
*/}} */}}
{{- range .Values.hyperlane.chains }} {{- range .Values.hyperlane.chains }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }} GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINT_{{ . | upper }}: {{ printf "'{{ .%s_rpc | toString }}'" . }}
{{- end }} {{- end }}
{{- if .Values.hyperlane.aws }} {{- if .Values.hyperlane.aws }}
AWS_ACCESS_KEY_ID: {{ print "'{{ .aws_access_key_id | toString }}'" }} AWS_ACCESS_KEY_ID: {{ print "'{{ .aws_access_key_id | toString }}'" }}
@ -51,9 +50,6 @@ spec:
- secretKey: {{ printf "%s_rpcs" . }} - secretKey: {{ printf "%s_rpcs" . }}
remoteRef: remoteRef:
key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }} key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }}
- secretKey: {{ printf "%s_rpc" . }}
remoteRef:
key: {{ printf "%s-rpc-endpoint-%s" $.Values.hyperlane.runEnv . }}
{{- end }} {{- end }}
{{- if .Values.hyperlane.aws }} {{- if .Values.hyperlane.aws }}
- secretKey: aws_access_key_id - secretKey: aws_access_key_id

@ -29,10 +29,6 @@ spec:
- --contexts-and-roles - --contexts-and-roles
- {{ $context }}={{ join "," $roles }} - {{ $context }}={{ join "," $roles }}
{{- end }} {{- end }}
{{- if .Values.hyperlane.connectionType }}
- --connection-type
- {{ .Values.hyperlane.connectionType }}
{{- end }}
{{- range $chain, $balance := .Values.hyperlane.desiredBalancePerChain }} {{- range $chain, $balance := .Values.hyperlane.desiredBalancePerChain }}
- --desired-balance-per-chain - --desired-balance-per-chain
- {{ $chain }}={{ $balance }} - {{ $chain }}={{ $balance }}

@ -29,7 +29,6 @@ spec:
*/}} */}}
{{- range .Values.hyperlane.chains }} {{- range .Values.hyperlane.chains }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }} GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINT_{{ . | upper }}: {{ printf "'{{ .%s_rpc | toString }}'" . }}
{{- end }} {{- end }}
data: data:
- secretKey: deployer_key - secretKey: deployer_key
@ -43,7 +42,4 @@ spec:
- secretKey: {{ printf "%s_rpcs" . }} - secretKey: {{ printf "%s_rpcs" . }}
remoteRef: remoteRef:
key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }} key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }}
- secretKey: {{ printf "%s_rpc" . }}
remoteRef:
key: {{ printf "%s-rpc-endpoint-%s" $.Values.hyperlane.runEnv . }}
{{- end }} {{- end }}

@ -21,10 +21,6 @@ spec:
- ./typescript/infra/scripts/middleware/circle-relayer.ts - ./typescript/infra/scripts/middleware/circle-relayer.ts
- -e - -e
- {{ .Values.hyperlane.runEnv }} - {{ .Values.hyperlane.runEnv }}
{{- if .Values.hyperlane.connectionType }}
- --connection-type
- {{ .Values.hyperlane.connectionType }}
{{- end }}
envFrom: envFrom:
- secretRef: - secretRef:
name: liquidity-layer-env-var-secret name: liquidity-layer-env-var-secret

@ -29,7 +29,6 @@ spec:
*/}} */}}
{{- range .Values.hyperlane.chains }} {{- range .Values.hyperlane.chains }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }} GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINTS_{{ . | upper }}: {{ printf "'{{ .%s_rpcs | toString }}'" . }}
GCP_SECRET_OVERRIDE_{{ $.Values.hyperlane.runEnv | upper }}_RPC_ENDPOINT_{{ . | upper }}: {{ printf "'{{ .%s_rpc | toString }}'" . }}
{{- end }} {{- end }}
data: data:
- secretKey: deployer_key - secretKey: deployer_key
@ -43,7 +42,4 @@ spec:
- secretKey: {{ printf "%s_rpcs" . }} - secretKey: {{ printf "%s_rpcs" . }}
remoteRef: remoteRef:
key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }} key: {{ printf "%s-rpc-endpoints-%s" $.Values.hyperlane.runEnv . }}
- secretKey: {{ printf "%s_rpc" . }}
remoteRef:
key: {{ printf "%s-rpc-endpoint-%s" $.Values.hyperlane.runEnv . }}
{{- end }} {{- end }}

@ -21,10 +21,6 @@ spec:
- ./typescript/infra/scripts/middleware/portal-relayer.ts - ./typescript/infra/scripts/middleware/portal-relayer.ts
- -e - -e
- {{ .Values.hyperlane.runEnv }} - {{ .Values.hyperlane.runEnv }}
{{- if .Values.hyperlane.connectionType }}
- --connection-type
- {{ .Values.hyperlane.connectionType }}
{{- end }}
envFrom: envFrom:
- secretRef: - secretRef:
name: liquidity-layer-env-var-secret name: liquidity-layer-env-var-secret

@ -12,6 +12,7 @@
"@ethersproject/experimental": "^5.7.0", "@ethersproject/experimental": "^5.7.0",
"@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/hardware-wallets": "^5.7.0",
"@ethersproject/providers": "^5.7.2", "@ethersproject/providers": "^5.7.2",
"@google-cloud/secret-manager": "^5.5.0",
"@hyperlane-xyz/helloworld": "4.0.0-alpha.2", "@hyperlane-xyz/helloworld": "4.0.0-alpha.2",
"@hyperlane-xyz/registry": "1.3.0", "@hyperlane-xyz/registry": "1.3.0",
"@hyperlane-xyz/sdk": "4.0.0-alpha.2", "@hyperlane-xyz/sdk": "4.0.0-alpha.2",

@ -1,14 +1,14 @@
import path, { join } from 'path'; import path, { join } from 'path';
import yargs, { Argv } from 'yargs'; import yargs, { Argv } from 'yargs';
import { ChainAddresses } from '@hyperlane-xyz/registry'; import { ChainAddresses, IRegistry } from '@hyperlane-xyz/registry';
import { import {
ChainMap, ChainMap,
ChainMetadata, ChainMetadata,
ChainName, ChainName,
CoreConfig, CoreConfig,
MultiProtocolProvider,
MultiProvider, MultiProvider,
RpcConsensusType,
collectValidators, collectValidators,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { import {
@ -16,6 +16,7 @@ import {
ProtocolType, ProtocolType,
objFilter, objFilter,
objMap, objMap,
objMerge,
promiseObjAll, promiseObjAll,
rootLogger, rootLogger,
symmetricDifference, symmetricDifference,
@ -35,7 +36,10 @@ import { getCurrentKubernetesContext } from '../src/agents/index.js';
import { getCloudAgentKey } from '../src/agents/key-utils.js'; import { getCloudAgentKey } from '../src/agents/key-utils.js';
import { CloudAgentKey } from '../src/agents/keys.js'; import { CloudAgentKey } from '../src/agents/keys.js';
import { RootAgentConfig } from '../src/config/agent/agent.js'; import { RootAgentConfig } from '../src/config/agent/agent.js';
import { fetchProvider } from '../src/config/chain.js'; import {
fetchProvider,
getSecretMetadataOverrides,
} from '../src/config/chain.js';
import { import {
AgentEnvironment, AgentEnvironment,
DeployEnvironment, DeployEnvironment,
@ -47,6 +51,7 @@ import {
assertContext, assertContext,
assertRole, assertRole,
getInfraPath, getInfraPath,
inCIMode,
readJSONAtPath, readJSONAtPath,
writeMergedJSONAtPath, writeMergedJSONAtPath,
} from '../src/utils/utils.js'; } from '../src/utils/utils.js';
@ -96,13 +101,6 @@ export function withModuleAndFork<T>(args: Argv<T>) {
.alias('f', 'fork'); .alias('f', 'fork');
} }
export function withNetwork<T>(args: Argv<T>) {
return args
.describe('network', 'network to target')
.choices('network', getChains())
.alias('n', 'network');
}
export function withContext<T>(args: Argv<T>) { export function withContext<T>(args: Argv<T>) {
return args return args
.describe('context', 'deploy context') .describe('context', 'deploy context')
@ -112,6 +110,17 @@ export function withContext<T>(args: Argv<T>) {
.demandOption('context'); .demandOption('context');
} }
export function withChainRequired<T>(args: Argv<T>) {
return withChain(args).demandOption('chain');
}
export function withChain<T>(args: Argv<T>) {
return args
.describe('chain', 'chain name')
.choices('chain', getChains())
.alias('c', 'chain');
}
export function withProtocol<T>(args: Argv<T>) { export function withProtocol<T>(args: Argv<T>) {
return args return args
.describe('protocol', 'protocol type') .describe('protocol', 'protocol type')
@ -171,6 +180,17 @@ export function withConcurrentDeploy<T>(args: Argv<T>) {
.default('concurrentDeploy', false); .default('concurrentDeploy', false);
} }
export function withRpcUrls<T>(args: Argv<T>) {
return args
.describe(
'rpcUrls',
'rpc urls in a comma separated list, in order of preference',
)
.string('rpcUrls')
.demandOption('rpcUrls')
.alias('r', 'rpcUrls');
}
// not requiring to build coreConfig to get agentConfig // not requiring to build coreConfig to get agentConfig
export async function getAgentConfigsBasedOnArgs(argv?: { export async function getAgentConfigsBasedOnArgs(argv?: {
environment: DeployEnvironment; environment: DeployEnvironment;
@ -283,8 +303,8 @@ export function ensureValidatorConfigConsistency(agentConfig: RootAgentConfig) {
export function getKeyForRole( export function getKeyForRole(
environment: DeployEnvironment, environment: DeployEnvironment,
context: Contexts, context: Contexts,
chain: ChainName,
role: Role, role: Role,
chain?: ChainName,
index?: number, index?: number,
): CloudAgentKey { ): CloudAgentKey {
debugLog(`Getting key for ${role} role`); debugLog(`Getting key for ${role} role`);
@ -292,33 +312,32 @@ export function getKeyForRole(
return getCloudAgentKey(agentConfig, role, chain, index); return getCloudAgentKey(agentConfig, role, chain, index);
} }
export async function getMultiProtocolProvider(
registry: IRegistry,
): Promise<MultiProtocolProvider> {
const chainMetadata = await registry.getMetadata();
return new MultiProtocolProvider(chainMetadata);
}
export async function getMultiProviderForRole( export async function getMultiProviderForRole(
txConfigs: ChainMap<ChainMetadata>,
environment: DeployEnvironment, environment: DeployEnvironment,
registry: IRegistry,
context: Contexts, context: Contexts,
role: Role, role: Role,
index?: number, index?: number,
// TODO: rename to consensusType?
connectionType?: RpcConsensusType,
): Promise<MultiProvider> { ): Promise<MultiProvider> {
const chainMetadata = await registry.getMetadata();
debugLog(`Getting multiprovider for ${role} role`); debugLog(`Getting multiprovider for ${role} role`);
const multiProvider = new MultiProvider(txConfigs); const multiProvider = new MultiProvider(chainMetadata);
if (process.env.CI === 'true') { if (inCIMode()) {
debugLog('Returning multiprovider with default RPCs in CI'); debugLog('Running in CI, returning multiprovider without secret keys');
// Return the multiProvider with default RPCs
return multiProvider; return multiProvider;
} }
await promiseObjAll( await promiseObjAll(
objMap(txConfigs, async (chain, _) => { objMap(chainMetadata, async (chain, _) => {
if (multiProvider.getProtocol(chain) === ProtocolType.Ethereum) { if (multiProvider.getProtocol(chain) === ProtocolType.Ethereum) {
const provider = await fetchProvider( const key = getKeyForRole(environment, context, role, chain, index);
environment, const signer = await key.getSigner();
chain,
connectionType,
);
const key = getKeyForRole(environment, context, chain, role, index);
const signer = await key.getSigner(provider);
multiProvider.setProvider(chain, provider);
multiProvider.setSigner(chain, signer); multiProvider.setSigner(chain, signer);
} }
}), }),
@ -330,23 +349,22 @@ export async function getMultiProviderForRole(
// Note: this will only work for keystores that allow key's to be extracted. // Note: this will only work for keystores that allow key's to be extracted.
// I.e. GCP will work but AWS HSMs will not. // I.e. GCP will work but AWS HSMs will not.
export async function getKeysForRole( export async function getKeysForRole(
txConfigs: ChainMap<ChainMetadata>,
environment: DeployEnvironment, environment: DeployEnvironment,
supportedChainNames: ChainName[],
context: Contexts, context: Contexts,
role: Role, role: Role,
index?: number, index?: number,
): Promise<ChainMap<CloudAgentKey>> { ): Promise<ChainMap<CloudAgentKey>> {
if (process.env.CI === 'true') { if (inCIMode()) {
debugLog('No keys to return in CI'); debugLog('No keys to return in CI');
return {}; return {};
} }
const keys = await promiseObjAll( const keyEntries = supportedChainNames.map((chain) => [
objMap(txConfigs, async (chain, _) => chain,
getKeyForRole(environment, context, chain, role, index), getKeyForRole(environment, context, role, chain, index),
), ]);
); return Object.fromEntries(keyEntries);
return keys;
} }
export function getEnvironmentDirectory(environment: DeployEnvironment) { export function getEnvironmentDirectory(environment: DeployEnvironment) {

@ -6,7 +6,12 @@ async function main() {
const { environment } = await getArgs().argv; const { environment } = await getArgs().argv;
const envConfig = getEnvironmentConfig(environment); const envConfig = getEnvironmentConfig(environment);
let multiProvider = await envConfig.getMultiProvider(); let multiProvider = await envConfig.getMultiProvider(
undefined,
undefined,
// Don't use secrets
false,
);
await writeAgentConfig(multiProvider, environment); await writeAgentConfig(multiProvider, environment);
} }

@ -2,25 +2,20 @@ import { ethers } from 'ethers';
import { rootLogger } from '@hyperlane-xyz/utils'; import { rootLogger } from '@hyperlane-xyz/utils';
import { getSecretRpcEndpoint } from '../src/agents/index.js'; import { getSecretRpcEndpoints } from '../src/agents/index.js';
import { getArgs } from './agent-utils.js'; import { getArgs } from './agent-utils.js';
import { getEnvironmentConfig } from './core-utils.js'; import { getEnvironmentConfig } from './core-utils.js';
// TODO remove this script as part of migration to CLI
// It's redundant with metadata-check.ts in the SDK
async function main() { async function main() {
const { environment } = await getArgs().argv; const { environment } = await getArgs().argv;
const config = await getEnvironmentConfig(environment); const config = getEnvironmentConfig(environment);
const multiProvider = await config.getMultiProvider(); const multiProvider = await config.getMultiProvider();
const chains = multiProvider.getKnownChainNames(); const chains = multiProvider.getKnownChainNames();
const providers: [string, ethers.providers.JsonRpcProvider][] = []; const providers: [string, ethers.providers.JsonRpcProvider][] = [];
for (const chain of chains) { for (const chain of chains) {
rootLogger.debug(`Building providers for ${chain}`); rootLogger.debug(`Building providers for ${chain}`);
const rpcData = [ const rpcData = await getSecretRpcEndpoints(environment, chain);
...(await getSecretRpcEndpoint(environment, chain, false)),
...(await getSecretRpcEndpoint(environment, chain, true)),
];
for (const url of rpcData) for (const url of rpcData)
providers.push([chain, new ethers.providers.StaticJsonRpcProvider(url)]); providers.push([chain, new ethers.providers.StaticJsonRpcProvider(url)]);
} }

@ -40,10 +40,10 @@ import {
getArgs, getArgs,
getModuleDirectory, getModuleDirectory,
withBuildArtifactPath, withBuildArtifactPath,
withChain,
withConcurrentDeploy, withConcurrentDeploy,
withContext, withContext,
withModuleAndFork, withModuleAndFork,
withNetwork,
} from './agent-utils.js'; } from './agent-utils.js';
import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js'; import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js';
@ -53,12 +53,12 @@ async function main() {
module, module,
fork, fork,
environment, environment,
network, chain,
buildArtifactPath, buildArtifactPath,
concurrentDeploy, concurrentDeploy,
} = await withContext( } = await withContext(
withConcurrentDeploy( withConcurrentDeploy(
withNetwork(withModuleAndFork(withBuildArtifactPath(getArgs()))), withChain(withModuleAndFork(withBuildArtifactPath(getArgs()))),
), ),
).argv; ).argv;
const envConfig = getEnvironmentConfig(environment); const envConfig = getEnvironmentConfig(environment);
@ -227,7 +227,7 @@ async function main() {
// prompt for confirmation in production environments // prompt for confirmation in production environments
if (environment !== 'test' && !fork) { if (environment !== 'test' && !fork) {
const confirmConfig = network ? config[network] : config; const confirmConfig = chain ? config[chain] : config;
console.log(JSON.stringify(confirmConfig, null, 2)); console.log(JSON.stringify(confirmConfig, null, 2));
const { value: confirmed } = await prompts({ const { value: confirmed } = await prompts({
type: 'confirm', type: 'confirm',
@ -244,7 +244,7 @@ async function main() {
config, config,
deployer, deployer,
cache, cache,
network ?? fork, chain ?? fork,
agentConfig, agentConfig,
); );
} }

@ -9,7 +9,6 @@ import {
ChainName, ChainName,
HyperlaneIgp, HyperlaneIgp,
MultiProvider, MultiProvider,
RpcConsensusType,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { Address, objFilter, objMap, rootLogger } from '@hyperlane-xyz/utils'; import { Address, objFilter, objMap, rootLogger } from '@hyperlane-xyz/utils';
@ -177,11 +176,6 @@ async function main() {
) )
.coerce('desired-kathy-balance-per-chain', parseBalancePerChain) .coerce('desired-kathy-balance-per-chain', parseBalancePerChain)
.string('connection-type')
.describe('connection-type', 'The provider connection type to use for RPCs')
.default('connection-type', RpcConsensusType.Single)
.demandOption('connection-type')
.boolean('skip-igp-claim') .boolean('skip-igp-claim')
.describe('skip-igp-claim', 'If true, never claims funds from the IGP') .describe('skip-igp-claim', 'If true, never claims funds from the IGP')
.default('skip-igp-claim', false).argv; .default('skip-igp-claim', false).argv;
@ -191,7 +185,6 @@ async function main() {
const multiProvider = await config.getMultiProvider( const multiProvider = await config.getMultiProvider(
Contexts.Hyperlane, // Always fund from the hyperlane context Contexts.Hyperlane, // Always fund from the hyperlane context
Role.Deployer, // Always fund from the deployer Role.Deployer, // Always fund from the deployer
argv.connectionType,
); );
let contextFunders: ContextFunder[]; let contextFunders: ContextFunder[];
@ -381,7 +374,7 @@ class ContextFunder {
[Role.Kathy]: '', [Role.Kathy]: '',
}; };
const roleKeysPerChain: ChainMap<Record<FundableRole, BaseAgentKey[]>> = {}; const roleKeysPerChain: ChainMap<Record<FundableRole, BaseAgentKey[]>> = {};
const chains = getEnvironmentConfig(environment).chainMetadataConfigs; const { supportedChainNames } = getEnvironmentConfig(environment);
for (const role of rolesToFund) { for (const role of rolesToFund) {
assertFundableRole(role); // only the relayer and kathy are fundable keys assertFundableRole(role); // only the relayer and kathy are fundable keys
const roleAddress = fetchLocalKeyAddresses(role)[environment][context]; const roleAddress = fetchLocalKeyAddresses(role)[environment][context];
@ -392,7 +385,7 @@ class ContextFunder {
} }
fundableRoleKeys[role] = roleAddress; fundableRoleKeys[role] = roleAddress;
for (const chain of Object.keys(chains)) { for (const chain of supportedChainNames) {
if (!roleKeysPerChain[chain as ChainName]) { if (!roleKeysPerChain[chain as ChainName]) {
roleKeysPerChain[chain as ChainName] = { roleKeysPerChain[chain as ChainName] = {
[Role.Relayer]: [], [Role.Relayer]: [],

@ -11,7 +11,6 @@ import {
MultiProtocolCore, MultiProtocolCore,
MultiProvider, MultiProvider,
ProviderType, ProviderType,
RpcConsensusType,
TypedTransactionReceipt, TypedTransactionReceipt,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { import {
@ -19,6 +18,7 @@ import {
ProtocolType, ProtocolType,
ensure0x, ensure0x,
objMap, objMap,
pick,
retryAsync, retryAsync,
rootLogger, rootLogger,
sleep, sleep,
@ -27,7 +27,6 @@ import {
} from '@hyperlane-xyz/utils'; } from '@hyperlane-xyz/utils';
import { Contexts } from '../../config/contexts.js'; import { Contexts } from '../../config/contexts.js';
import { testnetConfigs } from '../../config/environments/testnet4/chains.js';
import { import {
hyperlaneHelloworld, hyperlaneHelloworld,
releaseCandidateHelloworld, releaseCandidateHelloworld,
@ -127,16 +126,6 @@ function getKathyArgs() {
chainStrs.map((chainStr: string) => assertChain(chainStr)), chainStrs.map((chainStr: string) => assertChain(chainStr)),
) )
.string('connection-type')
.describe('connection-type', 'The provider connection type to use for RPCs')
.default('connection-type', RpcConsensusType.Single)
.choices('connection-type', [
RpcConsensusType.Single,
RpcConsensusType.Quorum,
RpcConsensusType.Fallback,
])
.demandOption('connection-type')
.number('cycles-between-ethereum-messages') .number('cycles-between-ethereum-messages')
.describe( .describe(
'cycles-between-ethereum-messages', 'cycles-between-ethereum-messages',
@ -155,7 +144,6 @@ async function main(): Promise<boolean> {
fullCycleTime, fullCycleTime,
messageSendTimeout, messageSendTimeout,
messageReceiptTimeout, messageReceiptTimeout,
connectionType,
cyclesBetweenEthereumMessages, cyclesBetweenEthereumMessages,
} = await getKathyArgs(); } = await getKathyArgs();
@ -165,7 +153,6 @@ async function main(): Promise<boolean> {
logger.debug('Starting up', { environment }); logger.debug('Starting up', { environment });
const coreConfig = getEnvironmentConfig(environment); const coreConfig = getEnvironmentConfig(environment);
// const coreConfig = getCoreConfigStub(environment);
const { app, core, igp, multiProvider, keys } = const { app, core, igp, multiProvider, keys } =
await getHelloWorldMultiProtocolApp( await getHelloWorldMultiProtocolApp(
@ -173,7 +160,6 @@ async function main(): Promise<boolean> {
context, context,
Role.Kathy, Role.Kathy,
undefined, undefined,
connectionType,
); );
const appChains = app.chains(); const appChains = app.chains();
@ -544,7 +530,14 @@ async function updateWalletBalanceMetricFor(
} }
// Get a core config intended for testing Kathy without secret access // Get a core config intended for testing Kathy without secret access
export function getCoreConfigStub(environment: DeployEnvironment) { export async function getCoreConfigStub(environment: DeployEnvironment) {
const environmentConfig = getEnvironmentConfig(environment);
// Don't fetch any secrets.
const registry = await environmentConfig.getRegistry(false);
const testnetConfigs = pick(
await registry.getMetadata(),
environmentConfig.supportedChainNames,
);
const multiProvider = new MultiProvider({ const multiProvider = new MultiProvider({
// Desired chains here. Key must have funds on these chains // Desired chains here. Key must have funds on these chains
...testnetConfigs, ...testnetConfigs,

@ -8,7 +8,6 @@ import {
MultiProtocolCore, MultiProtocolCore,
MultiProtocolProvider, MultiProtocolProvider,
MultiProvider, MultiProvider,
RpcConsensusType,
attachContractsMap, attachContractsMap,
attachContractsMapAndGetForeignDeployments, attachContractsMapAndGetForeignDeployments,
filterChainMapToProtocol, filterChainMapToProtocol,
@ -28,12 +27,10 @@ export async function getHelloWorldApp(
context: Contexts, context: Contexts,
keyRole: Role, keyRole: Role,
keyContext: Contexts = context, keyContext: Contexts = context,
connectionType: RpcConsensusType = RpcConsensusType.Single,
) { ) {
const multiProvider: MultiProvider = await coreConfig.getMultiProvider( const multiProvider: MultiProvider = await coreConfig.getMultiProvider(
keyContext, keyContext,
keyRole, keyRole,
connectionType,
); );
const helloworldConfig = getHelloWorldConfig(coreConfig, context); const helloworldConfig = getHelloWorldConfig(coreConfig, context);
@ -61,12 +58,10 @@ export async function getHelloWorldMultiProtocolApp(
context: Contexts, context: Contexts,
keyRole: Role, keyRole: Role,
keyContext: Contexts = context, keyContext: Contexts = context,
connectionType: RpcConsensusType = RpcConsensusType.Single,
) { ) {
const multiProvider: MultiProvider = await coreConfig.getMultiProvider( const multiProvider: MultiProvider = await coreConfig.getMultiProvider(
keyContext, keyContext,
keyRole, keyRole,
connectionType,
); );
const envAddresses = getEnvAddresses(coreConfig.environment); const envAddresses = getEnvAddresses(coreConfig.environment);

@ -1,3 +1,5 @@
import { pick } from '@hyperlane-xyz/utils';
import { getArgs } from './agent-utils.js'; import { getArgs } from './agent-utils.js';
import { getEnvironmentConfig } from './core-utils.js'; import { getEnvironmentConfig } from './core-utils.js';
@ -9,7 +11,15 @@ async function main() {
const environmentConfig = getEnvironmentConfig(args.environment); const environmentConfig = getEnvironmentConfig(args.environment);
console.log(JSON.stringify(environmentConfig.chainMetadataConfigs, null, 2)); // Intentionally do not include any secrets in the output
const registry = await environmentConfig.getRegistry(false);
const allMetadata = await registry.getMetadata();
const environmentMetadata = pick(
allMetadata,
environmentConfig.supportedChainNames,
);
console.log(JSON.stringify(environmentMetadata, null, 2));
} }
main().catch((err) => { main().catch((err) => {

@ -1,47 +1,67 @@
import { ethers } from 'ethers'; import { ethers } from 'ethers';
import { MultiProtocolProvider, ProviderType } from '@hyperlane-xyz/sdk'; import {
import { objMap, promiseObjAll } from '@hyperlane-xyz/utils'; ChainMap,
MultiProtocolProvider,
ProviderType,
} from '@hyperlane-xyz/sdk';
import { mainnetConfigs } from '../config/environments/mainnet3/chains.js'; import {
import { getCosmosChainGasPrice } from '../src/config/gas-oracle.js'; GasPriceConfig,
getCosmosChainGasPrice,
} from '../src/config/gas-oracle.js';
import { getEnvironmentConfig } from './core-utils.js';
async function main() { async function main() {
const allMetadatas = mainnetConfigs; const environmentConfig = getEnvironmentConfig('mainnet3');
const mpp = new MultiProtocolProvider(allMetadatas); const mpp = await environmentConfig.getMultiProtocolProvider();
const prices = await promiseObjAll( const prices: ChainMap<GasPriceConfig> = Object.fromEntries(
objMap(allMetadatas, async (chain, metadata) => { await Promise.all(
const provider = mpp.getProvider(chain); environmentConfig.supportedChainNames.map(async (chain) => [
switch (provider.type) { chain,
case ProviderType.EthersV5: { await getGasPrice(mpp, chain),
const gasPrice = await provider.provider.getGasPrice(); ]),
return { ),
amount: ethers.utils.formatUnits(gasPrice, 'gwei'),
decimals: 9,
};
}
case ProviderType.CosmJsWasm: {
const { amount } = await getCosmosChainGasPrice(chain);
return {
amount,
decimals: 1,
};
}
case ProviderType.SolanaWeb3:
// TODO get a reasonable value
return '0.001';
default:
throw new Error(`Unsupported provider type: ${provider.type}`);
}
}),
); );
console.log(JSON.stringify(prices, null, 2)); console.log(JSON.stringify(prices, null, 2));
} }
async function getGasPrice(
mpp: MultiProtocolProvider,
chain: string,
): Promise<GasPriceConfig> {
const provider = mpp.getProvider(chain);
switch (provider.type) {
case ProviderType.EthersV5: {
const gasPrice = await provider.provider.getGasPrice();
return {
amount: ethers.utils.formatUnits(gasPrice, 'gwei'),
decimals: 9,
};
}
case ProviderType.CosmJsWasm: {
const { amount } = await getCosmosChainGasPrice(chain);
return {
amount,
decimals: 1,
};
}
case ProviderType.SolanaWeb3:
// TODO get a reasonable value
return {
amount: '0.001',
decimals: 9,
};
default:
throw new Error(`Unsupported provider type: ${provider.type}`);
}
}
main() main()
.then() .then()
.catch((err) => { .catch((err) => {

@ -1,11 +1,17 @@
import { objMap } from '@hyperlane-xyz/utils'; import { objMap, pick } from '@hyperlane-xyz/utils';
import { mainnetConfigs } from '../config/environments/mainnet3/chains.js'; import { getEnvironmentConfig } from './core-utils.js';
const CURRENCY = 'usd'; const CURRENCY = 'usd';
async function main() { async function main() {
const metadata = mainnetConfigs; const environmentConfig = getEnvironmentConfig('mainnet3');
const registry = await environmentConfig.getRegistry();
const metadata = pick(
await registry.getMetadata(),
environmentConfig.supportedChainNames,
);
const ids = objMap( const ids = objMap(
metadata, metadata,

@ -12,12 +12,12 @@ import {
} from '../src/deployment/verify.js'; } from '../src/deployment/verify.js';
import { readJSONAtPath } from '../src/utils/utils.js'; import { readJSONAtPath } from '../src/utils/utils.js';
import { getArgs, withBuildArtifactPath, withNetwork } from './agent-utils.js'; import { getArgs, withBuildArtifactPath, withChain } from './agent-utils.js';
import { getEnvironmentConfig } from './core-utils.js'; import { getEnvironmentConfig } from './core-utils.js';
async function main() { async function main() {
const { environment, buildArtifactPath, verificationArtifactPath, network } = const { environment, buildArtifactPath, verificationArtifactPath, chain } =
await withNetwork(withBuildArtifactPath(getArgs())) await withChain(withBuildArtifactPath(getArgs()))
.string('verificationArtifactPath') .string('verificationArtifactPath')
.describe( .describe(
'verificationArtifactPath', 'verificationArtifactPath',
@ -54,7 +54,7 @@ async function main() {
// verify all the things // verify all the things
const failedResults = ( const failedResults = (
await verifier.verify(network ? [network] : undefined) await verifier.verify(chain ? [chain] : undefined)
).filter((result) => result.status === 'rejected'); ).filter((result) => result.status === 'rejected');
// only log the failed verifications to console // only log the failed verifications to console

@ -17,7 +17,12 @@ import { ScraperConfigHelper } from '../config/agent/scraper.js';
import { ValidatorConfigHelper } from '../config/agent/validator.js'; import { ValidatorConfigHelper } from '../config/agent/validator.js';
import { DeployEnvironment } from '../config/environment.js'; import { DeployEnvironment } from '../config/environment.js';
import { AgentRole, Role } from '../roles.js'; import { AgentRole, Role } from '../roles.js';
import { fetchGCPSecret } from '../utils/gcloud.js'; import {
fetchGCPSecret,
gcpSecretExistsUsingClient,
getGcpSecretLatestVersionName,
setGCPSecretUsingClient,
} from '../utils/gcloud.js';
import { import {
HelmCommand, HelmCommand,
buildHelmChartDependencies, buildHelmChartDependencies,
@ -287,6 +292,13 @@ export class ValidatorHelmManager extends MultichainAgentHelmManager {
} }
} }
export function getSecretName(
environment: string,
chainName: ChainName,
): string {
return `${environment}-rpc-endpoints-${chainName}`;
}
export async function getSecretAwsCredentials(agentConfig: AgentContextConfig) { export async function getSecretAwsCredentials(agentConfig: AgentContextConfig) {
return { return {
accessKeyId: await fetchGCPSecret( accessKeyId: await fetchGCPSecret(
@ -300,20 +312,14 @@ export async function getSecretAwsCredentials(agentConfig: AgentContextConfig) {
}; };
} }
export async function getSecretRpcEndpoint( export async function getSecretRpcEndpoints(
environment: string, environment: string,
chainName: ChainName, chainName: ChainName,
quorum = false,
): Promise<string[]> { ): Promise<string[]> {
const secret = await fetchGCPSecret( const secret = await fetchGCPSecret(getSecretName(environment, chainName));
`${environment}-rpc-endpoint${quorum ? 's' : ''}-${chainName}`,
quorum,
);
if (typeof secret != 'string' && !Array.isArray(secret)) {
throw Error(`Expected secret for ${chainName} rpc endpoint`);
}
if (!Array.isArray(secret)) { if (!Array.isArray(secret)) {
return [secret.trimEnd()]; throw Error(`Expected secret for ${chainName} rpc endpoint`);
} }
return secret.map((i) => { return secret.map((i) => {
@ -323,6 +329,29 @@ export async function getSecretRpcEndpoint(
}); });
} }
export async function getSecretRpcEndpointsLatestVersionName(
environment: string,
chainName: ChainName,
) {
return getGcpSecretLatestVersionName(getSecretName(environment, chainName));
}
export async function secretRpcEndpointsExist(
environment: string,
chainName: ChainName,
): Promise<boolean> {
return gcpSecretExistsUsingClient(getSecretName(environment, chainName));
}
export async function setSecretRpcEndpoints(
environment: string,
chainName: ChainName,
endpoints: string,
) {
const secretName = getSecretName(environment, chainName);
await setGCPSecretUsingClient(secretName, endpoints);
}
export async function getSecretDeployerKey( export async function getSecretDeployerKey(
environment: DeployEnvironment, environment: DeployEnvironment,
context: Contexts, context: Contexts,

@ -1,16 +1,19 @@
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
import { providers } from 'ethers'; import { providers } from 'ethers';
import { IRegistry } from '@hyperlane-xyz/registry';
import { import {
ChainMap,
ChainMetadata, ChainMetadata,
ChainName, ChainName,
HyperlaneSmartProvider, HyperlaneSmartProvider,
ProviderRetryOptions, ProviderRetryOptions,
RpcConsensusType,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { ProtocolType, objFilter } from '@hyperlane-xyz/utils'; import { ProtocolType, objFilter, objMerge } from '@hyperlane-xyz/utils';
import { getChain } from '../../config/registry.js'; import { getChain, getRegistryWithOverrides } from '../../config/registry.js';
import { getSecretRpcEndpoint } from '../agents/index.js'; import { getSecretRpcEndpoints } from '../agents/index.js';
import { inCIMode } from '../utils/utils.js';
import { DeployEnvironment } from './environment.js'; import { DeployEnvironment } from './environment.js';
@ -20,37 +23,24 @@ export const defaultRetry: ProviderRetryOptions = {
}; };
export async function fetchProvider( export async function fetchProvider(
environment: DeployEnvironment,
chainName: ChainName, chainName: ChainName,
connectionType: RpcConsensusType = RpcConsensusType.Single,
): Promise<providers.Provider> { ): Promise<providers.Provider> {
const chainMetadata = getChain(chainName); const chainMetadata = getChain(chainName);
if (!chainMetadata) { if (!chainMetadata) {
throw Error(`Unsupported chain: ${chainName}`); throw Error(`Unsupported chain: ${chainName}`);
} }
const chainId = chainMetadata.chainId; const chainId = chainMetadata.chainId;
const single = connectionType === RpcConsensusType.Single;
let rpcData = chainMetadata.rpcUrls.map((url) => url.http); let rpcData = chainMetadata.rpcUrls.map((url) => url.http);
if (rpcData.length === 0) { if (rpcData.length === 0) {
rpcData = await getSecretRpcEndpoint(environment, chainName, !single); throw Error(`No RPC URLs found for chain: ${chainName}`);
} }
if (connectionType === RpcConsensusType.Single) { return new HyperlaneSmartProvider(
return HyperlaneSmartProvider.fromRpcUrl(chainId, rpcData[0], defaultRetry); chainId,
} else if ( rpcData.map((url) => ({ http: url })),
connectionType === RpcConsensusType.Quorum || undefined,
connectionType === RpcConsensusType.Fallback defaultRetry,
) { );
return new HyperlaneSmartProvider(
chainId,
rpcData.map((url) => ({ http: url })),
undefined,
// disable retry for quorum
connectionType === RpcConsensusType.Fallback ? defaultRetry : undefined,
);
} else {
throw Error(`Unsupported connectionType: ${connectionType}`);
}
} }
export function getChainMetadatas(chains: Array<ChainName>) { export function getChainMetadatas(chains: Array<ChainName>) {
@ -73,3 +63,69 @@ export function getChainMetadatas(chains: Array<ChainName>) {
return { ethereumMetadatas, nonEthereumMetadatas }; return { ethereumMetadatas, nonEthereumMetadatas };
} }
/**
* Gets the registry for the given environment, with optional overrides and
* the ability to get overrides from secrets.
* @param deployEnv The deploy environment.
* @param chains The chains to get metadata for.
* @param defaultChainMetadataOverrides The default chain metadata overrides. If
* secret overrides are used, the secret overrides will be merged with these and
* take precedence.
* @param useSecrets Whether to fetch metadata overrides from secrets.
* @returns A registry with overrides for the given environment.
*/
export async function getRegistryForEnvironment(
deployEnv: DeployEnvironment,
chains: ChainName[],
defaultChainMetadataOverrides: ChainMap<Partial<ChainMetadata>> = {},
useSecrets: boolean = true,
): Promise<IRegistry> {
let overrides = defaultChainMetadataOverrides;
if (useSecrets && !inCIMode()) {
overrides = objMerge(
overrides,
await getSecretMetadataOverrides(deployEnv, chains),
);
}
const registry = getRegistryWithOverrides(overrides);
return registry;
}
/**
* Gets chain metadata overrides from GCP secrets.
* @param deployEnv The deploy environment.
* @param chains The chains to get metadata overrides for.
* @returns A partial chain metadata map with the secret overrides.
*/
export async function getSecretMetadataOverrides(
deployEnv: DeployEnvironment,
chains: string[],
): Promise<ChainMap<Partial<ChainMetadata>>> {
const chainMetadataOverrides: ChainMap<Partial<ChainMetadata>> = {};
const secretRpcUrls = await Promise.all(
chains.map(async (chain) => {
const rpcUrls = await getSecretRpcEndpoints(deployEnv, chain);
return {
chain,
rpcUrls,
};
}),
);
for (const { chain, rpcUrls } of secretRpcUrls) {
if (rpcUrls.length === 0) {
throw Error(`No secret RPC URLs found for chain: ${chain}`);
}
// Need explicit casting here because Zod expects a non-empty array.
const metadataRpcUrls = rpcUrls.map((rpcUrl: string) => ({
http: rpcUrl,
})) as ChainMetadata['rpcUrls'];
chainMetadataOverrides[chain] = {
rpcUrls: metadataRpcUrls,
};
}
return chainMetadataOverrides;
}

@ -1,3 +1,4 @@
import { IRegistry } from '@hyperlane-xyz/registry';
import { import {
BridgeAdapterConfig, BridgeAdapterConfig,
ChainMap, ChainMap,
@ -5,9 +6,9 @@ import {
ChainName, ChainName,
CoreConfig, CoreConfig,
IgpConfig, IgpConfig,
MultiProtocolProvider,
MultiProvider, MultiProvider,
OwnableConfig, OwnableConfig,
RpcConsensusType,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { objKeys } from '@hyperlane-xyz/utils'; import { objKeys } from '@hyperlane-xyz/utils';
@ -39,17 +40,20 @@ export const envNameToAgentEnv: Record<DeployEnvironment, AgentEnvironment> = {
export type EnvironmentConfig = { export type EnvironmentConfig = {
environment: DeployEnvironment; environment: DeployEnvironment;
chainMetadataConfigs: ChainMap<ChainMetadata>; supportedChainNames: ChainName[];
// Get the registry with or without environment-specific secrets.
getRegistry: (useSecrets?: boolean) => Promise<IRegistry>;
// Each AgentConfig, keyed by the context // Each AgentConfig, keyed by the context
agents: Partial<Record<Contexts, RootAgentConfig>>; agents: Partial<Record<Contexts, RootAgentConfig>>;
core: ChainMap<CoreConfig>; core: ChainMap<CoreConfig>;
igp: ChainMap<IgpConfig>; igp: ChainMap<IgpConfig>;
owners: ChainMap<OwnableConfig>; owners: ChainMap<OwnableConfig>;
infra: InfrastructureConfig; infra: InfrastructureConfig;
getMultiProtocolProvider: () => Promise<MultiProtocolProvider>;
getMultiProvider: ( getMultiProvider: (
context?: Contexts, context?: Contexts,
role?: Role, role?: Role,
connectionType?: RpcConsensusType, useSecrets?: boolean,
) => Promise<MultiProvider>; ) => Promise<MultiProvider>;
getKeys: ( getKeys: (
context?: Contexts, context?: Contexts,

@ -1,4 +1,4 @@
import { ChainMap, RpcConsensusType } from '@hyperlane-xyz/sdk'; import { ChainMap } from '@hyperlane-xyz/sdk';
import { Contexts } from '../../config/contexts.js'; import { Contexts } from '../../config/contexts.js';
import { FundableRole, Role } from '../roles.js'; import { FundableRole, Role } from '../roles.js';
@ -20,7 +20,6 @@ export interface KeyFunderConfig {
contextsAndRolesToFund: ContextAndRolesMap; contextsAndRolesToFund: ContextAndRolesMap;
cyclesBetweenEthereumMessages?: number; cyclesBetweenEthereumMessages?: number;
prometheusPushGateway: string; prometheusPushGateway: string;
connectionType: RpcConsensusType;
desiredBalancePerChain: ChainMap<string>; desiredBalancePerChain: ChainMap<string>;
desiredKathyBalancePerChain: ChainMap<string>; desiredKathyBalancePerChain: ChainMap<string>;
} }

@ -1,4 +1,4 @@
import { ChainMap, ChainName, RpcConsensusType } from '@hyperlane-xyz/sdk'; import { ChainMap, ChainName } from '@hyperlane-xyz/sdk';
import { DockerConfig } from '../agent/agent.js'; import { DockerConfig } from '../agent/agent.js';
@ -29,7 +29,6 @@ export interface HelloWorldKathyConfig {
messageReceiptTimeout: number; messageReceiptTimeout: number;
// Which type of provider to use // Which type of provider to use
connectionType: RpcConsensusType;
// How many cycles to skip between a cycles that send messages to/from Ethereum. Defaults to 0. // How many cycles to skip between a cycles that send messages to/from Ethereum. Defaults to 0.
cyclesBetweenEthereumMessages?: number; cyclesBetweenEthereumMessages?: number;
} }

@ -1,10 +1,7 @@
import { RpcConsensusType } from '@hyperlane-xyz/sdk';
import { DockerConfig } from './agent/agent.js'; import { DockerConfig } from './agent/agent.js';
export interface LiquidityLayerRelayerConfig { export interface LiquidityLayerRelayerConfig {
docker: DockerConfig; docker: DockerConfig;
namespace: string; namespace: string;
connectionType: RpcConsensusType.Single | RpcConsensusType.Quorum;
prometheusPushGateway: string; prometheusPushGateway: string;
} }

@ -48,7 +48,6 @@ function getKeyFunderHelmValues(
chains: agentConfig.environmentChainNames, chains: agentConfig.environmentChainNames,
contextFundingFrom: keyFunderConfig.contextFundingFrom, contextFundingFrom: keyFunderConfig.contextFundingFrom,
contextsAndRolesToFund: keyFunderConfig.contextsAndRolesToFund, contextsAndRolesToFund: keyFunderConfig.contextsAndRolesToFund,
connectionType: keyFunderConfig.connectionType,
desiredBalancePerChain: keyFunderConfig.desiredBalancePerChain, desiredBalancePerChain: keyFunderConfig.desiredBalancePerChain,
desiredKathyBalancePerChain: keyFunderConfig.desiredKathyBalancePerChain, desiredKathyBalancePerChain: keyFunderConfig.desiredKathyBalancePerChain,
}, },

@ -85,7 +85,6 @@ function getHelloworldKathyHelmValues(
messageReceiptTimeout: kathyConfig.messageReceiptTimeout, messageReceiptTimeout: kathyConfig.messageReceiptTimeout,
cycleOnce, cycleOnce,
fullCycleTime, fullCycleTime,
connectionType: kathyConfig.connectionType,
cyclesBetweenEthereumMessages: kathyConfig.cyclesBetweenEthereumMessages, cyclesBetweenEthereumMessages: kathyConfig.cyclesBetweenEthereumMessages,
}, },
image: { image: {

@ -44,7 +44,6 @@ function getLiquidityLayerRelayerHelmValues(
runEnv: agentConfig.runEnv, runEnv: agentConfig.runEnv,
// Only used for fetching RPC urls as env vars // Only used for fetching RPC urls as env vars
chains: agentConfig.contextChainNames, chains: agentConfig.contextChainNames,
connectionType: relayerConfig.connectionType,
}, },
image: { image: {
repository: relayerConfig.docker.repo, repository: relayerConfig.docker.repo,

@ -1,3 +1,4 @@
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
import fs from 'fs'; import fs from 'fs';
import { rootLogger } from '@hyperlane-xyz/utils'; import { rootLogger } from '@hyperlane-xyz/utils';
@ -6,6 +7,8 @@ import { rm, writeFile } from 'fs/promises';
import { execCmd, execCmdAndParseJson } from './utils.js'; import { execCmd, execCmdAndParseJson } from './utils.js';
export const GCP_PROJECT_ID = 'abacus-labs-dev';
interface IamCondition { interface IamCondition {
title: string; title: string;
expression: string; expression: string;
@ -32,9 +35,7 @@ export async function fetchGCPSecret(
); );
output = envVarOverride; output = envVarOverride;
} else { } else {
[output] = await execCmd( output = await fetchLatestGCPSecret(secretName);
`gcloud secrets versions access latest --secret ${secretName}`,
);
} }
if (parseJson) { if (parseJson) {
@ -43,6 +44,27 @@ export async function fetchGCPSecret(
return output; return output;
} }
export async function fetchLatestGCPSecret(secretName: string) {
const client = await getSecretManagerServiceClient();
const [secretVersion] = await client.accessSecretVersion({
name: `projects/${GCP_PROJECT_ID}/secrets/${secretName}/versions/latest`,
});
const secretData = secretVersion.payload?.data;
if (!secretData) {
throw new Error(`Secret ${secretName} missing payload`);
}
// Handle both string and Uint8Array
let dataStr: string;
if (typeof secretData === 'string') {
dataStr = secretData;
} else {
dataStr = new TextDecoder().decode(secretData);
}
return dataStr;
}
// If the environment variable GCP_SECRET_OVERRIDES_ENABLED is `true`, // If the environment variable GCP_SECRET_OVERRIDES_ENABLED is `true`,
// this will attempt to find an environment variable of the form: // this will attempt to find an environment variable of the form:
// `GCP_SECRET_OVERRIDE_${gcpSecretName.replaceAll('-', '_').toUpperCase()}` // `GCP_SECRET_OVERRIDE_${gcpSecretName.replaceAll('-', '_').toUpperCase()}`
@ -60,6 +82,12 @@ function tryGCPSecretFromEnvVariable(gcpSecretName: string) {
return process.env[overrideEnvVarName]; return process.env[overrideEnvVarName];
} }
/**
* Checks if a secret exists in GCP using the gcloud CLI.
* @deprecated Use gcpSecretExistsUsingClient instead.
* @param secretName The name of the secret to check.
* @returns A boolean indicating whether the secret exists.
*/
export async function gcpSecretExists(secretName: string) { export async function gcpSecretExists(secretName: string) {
const fullName = `projects/${await getCurrentProjectNumber()}/secrets/${secretName}`; const fullName = `projects/${await getCurrentProjectNumber()}/secrets/${secretName}`;
debugLog(`Checking if GCP secret exists for ${fullName}`); debugLog(`Checking if GCP secret exists for ${fullName}`);
@ -71,6 +99,55 @@ export async function gcpSecretExists(secretName: string) {
return matches.length > 0; return matches.length > 0;
} }
/**
* Uses the SecretManagerServiceClient to check if a secret exists.
* @param secretName The name of the secret to check.
* @returns A boolean indicating whether the secret exists.
*/
export async function gcpSecretExistsUsingClient(
secretName: string,
client?: SecretManagerServiceClient,
): Promise<boolean> {
if (!client) {
client = await getSecretManagerServiceClient();
}
try {
const fullSecretName = `projects/${await getCurrentProjectNumber()}/secrets/${secretName}`;
const [secrets] = await client.listSecrets({
parent: `projects/${GCP_PROJECT_ID}`,
filter: `name=${fullSecretName}`,
});
return secrets.length > 0;
} catch (e) {
debugLog(`Error checking if secret exists: ${e}`);
throw e;
}
}
export async function getGcpSecretLatestVersionName(secretName: string) {
const client = await getSecretManagerServiceClient();
const [version] = await client.getSecretVersion({
name: `projects/${GCP_PROJECT_ID}/secrets/${secretName}/versions/latest`,
});
return version?.name;
}
export async function getSecretManagerServiceClient() {
return new SecretManagerServiceClient({
projectId: GCP_PROJECT_ID,
});
}
/**
* Sets a GCP secret using the gcloud CLI. Create secret if it doesn't exist and add a new version or update the existing one.
* @deprecated Use setGCPSecretUsingClient instead.
* @param secretName The name of the secret to set.
* @param secret The secret to set.
* @param labels The labels to set on the secret.
*/
export async function setGCPSecret( export async function setGCPSecret(
secretName: string, secretName: string,
secret: string, secret: string,
@ -97,6 +174,64 @@ export async function setGCPSecret(
await rm(fileName); await rm(fileName);
} }
/**
* Sets a GCP secret using the SecretManagerServiceClient. Create secret if it doesn't exist and add a new version or update the existing one.
* @param secretName The name of the secret to set.
* @param secret The secret to set.
*/
export async function setGCPSecretUsingClient(
secretName: string,
secret: string,
labels?: Record<string, string>,
) {
const client = await getSecretManagerServiceClient();
const exists = await gcpSecretExistsUsingClient(secretName, client);
if (!exists) {
// Create the secret
await client.createSecret({
parent: `projects/${GCP_PROJECT_ID}`,
secretId: secretName,
secret: {
name: secretName,
replication: {
automatic: {},
},
labels,
},
});
debugLog(`Created new GCP secret for ${secretName}`);
}
await addGCPSecretVersion(secretName, secret, client);
}
export async function addGCPSecretVersion(
secretName: string,
secret: string,
client?: SecretManagerServiceClient,
) {
if (!client) {
client = await getSecretManagerServiceClient();
}
const [version] = await client.addSecretVersion({
parent: `projects/${GCP_PROJECT_ID}/secrets/${secretName}`,
payload: {
data: Buffer.from(secret, 'utf8'),
},
});
debugLog(`Added secret version ${version?.name}`);
}
export async function disableGCPSecretVersion(secretName: string) {
const client = await getSecretManagerServiceClient();
const [version] = await client.disableSecretVersion({
name: secretName,
});
debugLog(`Disabled secret version ${version?.name}`);
}
// Returns the email of the service account // Returns the email of the service account
export async function createServiceAccountIfNotExists( export async function createServiceAccountIfNotExists(
serviceAccountName: string, serviceAccountName: string,

@ -269,3 +269,7 @@ export function isEthereumProtocolChain(chainName: ChainName) {
export function getInfraPath() { export function getInfraPath() {
return join(dirname(fileURLToPath(import.meta.url)), '../../'); return join(dirname(fileURLToPath(import.meta.url)), '../../');
} }
export function inCIMode() {
return process.env.CI === 'true';
}

@ -1,48 +1,12 @@
# @hyperlane-xyz/sdk # @hyperlane-xyz/sdk
## 4.0.0-alpha.2 ## 3.14.0
### Patch Changes ### Patch Changes
- 6b63c5d82: Adds deployment support for IsmConfig within a WarpRouteConfig - Updated dependencies [a8a68f6f6]
- @hyperlane-xyz/core@4.0.0-alpha.2 - @hyperlane-xyz/core@3.14.0
- @hyperlane-xyz/utils@4.0.0-alpha.2 - @hyperlane-xyz/utils@3.14.0
## 4.0.0-alpha.0
### Minor Changes
- bdcbe1d16: Add EvmWarpModule with create()
- 6db9fa9ad: Implement hyperlane warp deploy
### Patch Changes
- @hyperlane-xyz/core@4.0.0-alpha.0
- @hyperlane-xyz/utils@4.0.0-alpha.0
## 4.0.0-alpha
### Major Changes
- 74c879fa1: Merge branch 'cli-2.0' into main.
### Minor Changes
- eb23e7729: Add create() with EvmCoreModule
- 1ec61debd: Support hook config objects in warp config
- 4663018fc: Implement hyperlane core config to return CoreConfig
- 5e5886f2c: Add EvmIcaModule.create()
- 341b8affd: Completes the EvmIsmModule for creating, reading and updating ISMs.
- 3dabcbdca: Adds zod validation on tx submitter populated txs & re-uses ICA params for transformer.
- 1d0d1bb36: Implements `hyperlane core deploy`
- 4bf7301ea: Adds further zod schema validation support throughout the SDK, namely for /transactions.
### Patch Changes
- Updated dependencies [341b8affd]
- Updated dependencies [74c879fa1]
- @hyperlane-xyz/utils@4.0.0-alpha
- @hyperlane-xyz/core@4.0.0-alpha
## 3.13.0 ## 3.13.0

@ -135,6 +135,11 @@ export const defaultMultisigConfigs: ChainMap<MultisigConfig> = {
], ],
}, },
holesky: {
threshold: 1,
validators: ['0x7ab28ad88bb45867137ea823af88e2cb02359c03'], // TODO
},
inevm: { inevm: {
threshold: 2, threshold: 2,
validators: [ validators: [

@ -399,6 +399,16 @@ export function buildAgentConfig(
const chainConfigs: ChainMap<AgentChainMetadata> = {}; const chainConfigs: ChainMap<AgentChainMetadata> = {};
for (const chain of [...chains].sort()) { for (const chain of [...chains].sort()) {
const metadata = multiProvider.tryGetChainMetadata(chain); const metadata = multiProvider.tryGetChainMetadata(chain);
if (metadata?.protocol === ProtocolType.Cosmos) {
// Note: the gRPC URL format in the registry lacks a correct http:// or https:// prefix at the moment,
// which is expected by the agents. For now, we intentionally skip this.
delete metadata.grpcUrls;
// The agents expect gasPrice.amount and gasPrice.denom and ignore the transaction overrides.
// To reduce confusion when looking at the config, we remove the transaction overrides.
delete metadata.transactionOverrides;
}
const chainConfig: AgentChainMetadata = { const chainConfig: AgentChainMetadata = {
...metadata, ...metadata,
...addresses[chain], ...addresses[chain],

@ -1,18 +1,6 @@
# @hyperlane-xyz/utils # @hyperlane-xyz/utils
## 4.0.0-alpha.2 ## 3.14.0
## 4.0.0-alpha.0
## 4.0.0-alpha
### Major Changes
- 74c879fa1: Merge branch 'cli-2.0' into main.
### Minor Changes
- 341b8affd: Completes the EvmIsmModule for creating, reading and updating ISMs.
## 3.13.0 ## 3.13.0

@ -4503,6 +4503,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint/config-array@npm:^0.15.1":
version: 0.15.1
resolution: "@eslint/config-array@npm:0.15.1"
dependencies:
"@eslint/object-schema": "npm:^2.1.3"
debug: "npm:^4.3.1"
minimatch: "npm:^3.0.5"
checksum: cf8f68a24498531180fad6846cb52dac4e852b0296d2664930bc15d6a2944ad427827bbaebfddf3f87b9c5db0e36c13974d6dc89fff8ba0d3d2b4357b8d52b4e
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^2.1.4": "@eslint/eslintrc@npm:^2.1.4":
version: 2.1.4 version: 2.1.4
resolution: "@eslint/eslintrc@npm:2.1.4" resolution: "@eslint/eslintrc@npm:2.1.4"
@ -4520,9 +4531,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint/eslintrc@npm:^3.0.2": "@eslint/eslintrc@npm:^3.1.0":
version: 3.0.2 version: 3.1.0
resolution: "@eslint/eslintrc@npm:3.0.2" resolution: "@eslint/eslintrc@npm:3.1.0"
dependencies: dependencies:
ajv: "npm:^6.12.4" ajv: "npm:^6.12.4"
debug: "npm:^4.3.2" debug: "npm:^4.3.2"
@ -4533,7 +4544,7 @@ __metadata:
js-yaml: "npm:^4.1.0" js-yaml: "npm:^4.1.0"
minimatch: "npm:^3.1.2" minimatch: "npm:^3.1.2"
strip-json-comments: "npm:^3.1.1" strip-json-comments: "npm:^3.1.1"
checksum: 04e3d7de2b16fd59ba8985ecd6922eb488e630f94e4433858567a8a6c99b478bb7b47854b166b830b44905759547d0a03654eb1265952c812d5d1d70e3e4ccf9 checksum: 02bf892d1397e1029209dea685e9f4f87baf643315df2a632b5f121ec7e8548a3b34f428a007234fa82772218fa8a3ac2d10328637b9ce63b7f8344035b74db3
languageName: node languageName: node
linkType: hard linkType: hard
@ -4544,10 +4555,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint/js@npm:9.0.0": "@eslint/js@npm:9.4.0":
version: 9.0.0 version: 9.4.0
resolution: "@eslint/js@npm:9.0.0" resolution: "@eslint/js@npm:9.4.0"
checksum: b14b20af72410ef53e3e77e7d83cc1d6e6554b0092ceb9f969d25d765f4d775b4be32b0cd99bbfd6ce72eb2e4fb6b39b42a159b31909fbe1b3a5e88d75211687 checksum: f1fa9acda8bab02dad21e9b7f46c6ba8cb3949979846caf7667f0c682ed0b56d9e8db143b00aab587ef2d02603df202eb5f7017d8f3a98be94be6efa763865ab
languageName: node
linkType: hard
"@eslint/object-schema@npm:^2.1.3":
version: 2.1.4
resolution: "@eslint/object-schema@npm:2.1.4"
checksum: 221e8d9f281c605948cd6e030874aacce83fe097f8f9c1964787037bccf08e82b7aa9eff1850a30fffac43f1d76555727ec22a2af479d91e268e89d1e035131e
languageName: node languageName: node
linkType: hard linkType: hard
@ -5608,6 +5626,39 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@google-cloud/secret-manager@npm:^5.5.0":
version: 5.5.0
resolution: "@google-cloud/secret-manager@npm:5.5.0"
dependencies:
google-gax: "npm:^4.0.3"
checksum: 487267dab1e260a0da79012194bb61c85f8b02b642330fdec32cac1fe37900f0fd6709ff4928fe631ab227b0d758bd3e59b1e3dc1d0682de566a64ef4fb42bba
languageName: node
linkType: hard
"@grpc/grpc-js@npm:~1.10.3":
version: 1.10.8
resolution: "@grpc/grpc-js@npm:1.10.8"
dependencies:
"@grpc/proto-loader": "npm:^0.7.13"
"@js-sdsl/ordered-map": "npm:^4.4.2"
checksum: cb7903e93db38a86bd2ddffb84313de78144454ad988801ede90f0c794d6a5f666a1b24f50e950b50d633b4bacc7416c7cabf4a6791b91c4fa89c001122edba8
languageName: node
linkType: hard
"@grpc/proto-loader@npm:^0.7.0, @grpc/proto-loader@npm:^0.7.13":
version: 0.7.13
resolution: "@grpc/proto-loader@npm:0.7.13"
dependencies:
lodash.camelcase: "npm:^4.3.0"
long: "npm:^5.0.0"
protobufjs: "npm:^7.2.5"
yargs: "npm:^17.7.2"
bin:
proto-loader-gen-types: build/bin/proto-loader-gen-types.js
checksum: 7e2d842c2061cbaf6450c71da0077263be3bab165454d5c8a3e1ae4d3c6d2915f02fd27da63ff01f05e127b1221acd40705273f5d29303901e60514e852992f4
languageName: node
linkType: hard
"@headlessui/react@npm:^1.7.17": "@headlessui/react@npm:^1.7.17":
version: 1.7.18 version: 1.7.18
resolution: "@headlessui/react@npm:1.7.18" resolution: "@headlessui/react@npm:1.7.18"
@ -5632,17 +5683,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@humanwhocodes/config-array@npm:^0.12.3":
version: 0.12.3
resolution: "@humanwhocodes/config-array@npm:0.12.3"
dependencies:
"@humanwhocodes/object-schema": "npm:^2.0.3"
debug: "npm:^4.3.1"
minimatch: "npm:^3.0.5"
checksum: b05f528c110aa1657d95d213e4ad2662f4161e838806af01a4d3f3b6ee3878d9b6f87d1b10704917f5c2f116757cb5c818480c32c4c4c6f84fe775a170b5f758
languageName: node
linkType: hard
"@humanwhocodes/module-importer@npm:^1.0.1": "@humanwhocodes/module-importer@npm:^1.0.1":
version: 1.0.1 version: 1.0.1
resolution: "@humanwhocodes/module-importer@npm:1.0.1" resolution: "@humanwhocodes/module-importer@npm:1.0.1"
@ -5657,10 +5697,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@humanwhocodes/object-schema@npm:^2.0.3": "@humanwhocodes/retry@npm:^0.3.0":
version: 2.0.3 version: 0.3.0
resolution: "@humanwhocodes/object-schema@npm:2.0.3" resolution: "@humanwhocodes/retry@npm:0.3.0"
checksum: 05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 checksum: e574bab58680867414e225c9002e9a97eb396f85871c180fbb1a9bcdf9ded4b4de0b327f7d0c43b775873362b7c92956d4b322e8bc4b90be56077524341f04b2
languageName: node languageName: node
linkType: hard linkType: hard
@ -5786,6 +5826,7 @@ __metadata:
"@openzeppelin/contracts-upgradeable": "npm:^4.9.3" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3"
"@trivago/prettier-plugin-sort-imports": "npm:^4.2.1" "@trivago/prettier-plugin-sort-imports": "npm:^4.2.1"
"@typechain/ethers-v5": "npm:^11.1.2" "@typechain/ethers-v5": "npm:^11.1.2"
"@typechain/ethers-v6": "npm:^0.5.1"
"@typechain/hardhat": "npm:^9.1.0" "@typechain/hardhat": "npm:^9.1.0"
"@typescript-eslint/eslint-plugin": "npm:^7.4.0" "@typescript-eslint/eslint-plugin": "npm:^7.4.0"
"@typescript-eslint/parser": "npm:^7.4.0" "@typescript-eslint/parser": "npm:^7.4.0"
@ -5825,6 +5866,7 @@ __metadata:
"@ethersproject/experimental": "npm:^5.7.0" "@ethersproject/experimental": "npm:^5.7.0"
"@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/hardware-wallets": "npm:^5.7.0"
"@ethersproject/providers": "npm:^5.7.2" "@ethersproject/providers": "npm:^5.7.2"
"@google-cloud/secret-manager": "npm:^5.5.0"
"@hyperlane-xyz/helloworld": "npm:4.0.0-alpha.2" "@hyperlane-xyz/helloworld": "npm:4.0.0-alpha.2"
"@hyperlane-xyz/registry": "npm:1.3.0" "@hyperlane-xyz/registry": "npm:1.3.0"
"@hyperlane-xyz/sdk": "npm:4.0.0-alpha.2" "@hyperlane-xyz/sdk": "npm:4.0.0-alpha.2"
@ -6502,6 +6544,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@js-sdsl/ordered-map@npm:^4.4.2":
version: 4.4.2
resolution: "@js-sdsl/ordered-map@npm:4.4.2"
checksum: ac64e3f0615ecc015461c9f527f124d2edaa9e68de153c1e270c627e01e83d046522d7e872692fd57a8c514578b539afceff75831c0d8b2a9a7a347fbed35af4
languageName: node
linkType: hard
"@layerzerolabs/lz-evm-messagelib-v2@npm:^2.0.2": "@layerzerolabs/lz-evm-messagelib-v2@npm:^2.0.2":
version: 2.0.6 version: 2.0.6
resolution: "@layerzerolabs/lz-evm-messagelib-v2@npm:2.0.6" resolution: "@layerzerolabs/lz-evm-messagelib-v2@npm:2.0.6"
@ -9339,6 +9388,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typechain/ethers-v6@npm:^0.5.1":
version: 0.5.1
resolution: "@typechain/ethers-v6@npm:0.5.1"
dependencies:
lodash: "npm:^4.17.15"
ts-essentials: "npm:^7.0.1"
peerDependencies:
ethers: 6.x
typechain: ^8.3.2
typescript: ">=4.7.0"
checksum: 51dd8be3548fe3c061d2a5372beb9214e767e2b69f10c12424b699bba7ff409a13c4bdff2e513ef49046b51153db56489752205541be8fb1775f3b9ad884b85b
languageName: node
linkType: hard
"@typechain/hardhat@npm:^9.1.0": "@typechain/hardhat@npm:^9.1.0":
version: 9.1.0 version: 9.1.0
resolution: "@typechain/hardhat@npm:9.1.0" resolution: "@typechain/hardhat@npm:9.1.0"
@ -9440,6 +9503,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/caseless@npm:*":
version: 0.12.5
resolution: "@types/caseless@npm:0.12.5"
checksum: f6a3628add76d27005495914c9c3873a93536957edaa5b69c63b46fe10b4649a6fecf16b676c1695f46aab851da47ec6047dcf3570fa8d9b6883492ff6d074e0
languageName: node
linkType: hard
"@types/chai@npm:*, @types/chai@npm:^4.2.21": "@types/chai@npm:*, @types/chai@npm:^4.2.21":
version: 4.3.1 version: 4.3.1
resolution: "@types/chai@npm:4.3.1" resolution: "@types/chai@npm:4.3.1"
@ -9608,7 +9678,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/long@npm:^4.0.1": "@types/long@npm:^4.0.0, @types/long@npm:^4.0.1":
version: 4.0.2 version: 4.0.2
resolution: "@types/long@npm:4.0.2" resolution: "@types/long@npm:4.0.2"
checksum: 68afa05fb20949d88345876148a76f6ccff5433310e720db51ac5ca21cb8cc6714286dbe04713840ddbd25a8b56b7a23aa87d08472fabf06463a6f2ed4967707 checksum: 68afa05fb20949d88345876148a76f6ccff5433310e720db51ac5ca21cb8cc6714286dbe04713840ddbd25a8b56b7a23aa87d08472fabf06463a6f2ed4967707
@ -9815,6 +9885,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/request@npm:^2.48.8":
version: 2.48.12
resolution: "@types/request@npm:2.48.12"
dependencies:
"@types/caseless": "npm:*"
"@types/node": "npm:*"
"@types/tough-cookie": "npm:*"
form-data: "npm:^2.5.0"
checksum: a7b3f9f14cacc18fe235bb8e57eff1232a04bd3fa3dad29371f24a5d96db2cd295a0c8b6b34ed7efa3efbbcff845febb02c9635cd68c54811c947ea66ae22090
languageName: node
linkType: hard
"@types/resolve@npm:^0.0.8": "@types/resolve@npm:^0.0.8":
version: 0.0.8 version: 0.0.8
resolution: "@types/resolve@npm:0.0.8" resolution: "@types/resolve@npm:0.0.8"
@ -9905,6 +9987,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/tough-cookie@npm:*":
version: 4.0.5
resolution: "@types/tough-cookie@npm:4.0.5"
checksum: 01fd82efc8202670865928629697b62fe9bf0c0dcbc5b1c115831caeb073a2c0abb871ff393d7df1ae94ea41e256cb87d2a5a91fd03cdb1b0b4384e08d4ee482
languageName: node
linkType: hard
"@types/trusted-types@npm:^2.0.2": "@types/trusted-types@npm:^2.0.2":
version: 2.0.7 version: 2.0.7
resolution: "@types/trusted-types@npm:2.0.7" resolution: "@types/trusted-types@npm:2.0.7"
@ -10903,6 +10992,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"agent-base@npm:^7.0.2":
version: 7.1.1
resolution: "agent-base@npm:7.1.1"
dependencies:
debug: "npm:^4.3.4"
checksum: c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26
languageName: node
linkType: hard
"agentkeepalive@npm:^4.2.1": "agentkeepalive@npm:^4.2.1":
version: 4.2.1 version: 4.2.1
resolution: "agentkeepalive@npm:4.2.1" resolution: "agentkeepalive@npm:4.2.1"
@ -11957,6 +12055,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"buffer-equal-constant-time@npm:1.0.1":
version: 1.0.1
resolution: "buffer-equal-constant-time@npm:1.0.1"
checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab
languageName: node
linkType: hard
"buffer-from@npm:^1.0.0": "buffer-from@npm:^1.0.0":
version: 1.1.2 version: 1.1.2
resolution: "buffer-from@npm:1.1.2" resolution: "buffer-from@npm:1.1.2"
@ -13652,6 +13757,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"duplexify@npm:^4.0.0":
version: 4.1.3
resolution: "duplexify@npm:4.1.3"
dependencies:
end-of-stream: "npm:^1.4.1"
inherits: "npm:^2.0.3"
readable-stream: "npm:^3.1.1"
stream-shift: "npm:^1.0.2"
checksum: b44b98ba0ffac3a658b4b1bf877219e996db288c5ae6f3dc55ca9b2cbef7df60c10eabfdd947f3d73a623eb9975a74a66d6d61e6f26bff90155315adb362aa77
languageName: node
linkType: hard
"duplexify@npm:^4.1.2": "duplexify@npm:^4.1.2":
version: 4.1.2 version: 4.1.2
resolution: "duplexify@npm:4.1.2" resolution: "duplexify@npm:4.1.2"
@ -13681,6 +13798,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11":
version: 1.0.11
resolution: "ecdsa-sig-formatter@npm:1.0.11"
dependencies:
safe-buffer: "npm:^5.0.1"
checksum: 878e1aab8a42773320bc04c6de420bee21aebd71810e40b1799880a8a1c4594bcd6adc3d4213a0fb8147d4c3f529d8f9a618d7f59ad5a9a41b142058aceda23f
languageName: node
linkType: hard
"ee-first@npm:1.1.1": "ee-first@npm:1.1.1":
version: 1.1.1 version: 1.1.1
resolution: "ee-first@npm:1.1.1" resolution: "ee-first@npm:1.1.1"
@ -14280,15 +14406,16 @@ __metadata:
linkType: hard linkType: hard
"eslint@npm:^9.0.0": "eslint@npm:^9.0.0":
version: 9.0.0 version: 9.4.0
resolution: "eslint@npm:9.0.0" resolution: "eslint@npm:9.4.0"
dependencies: dependencies:
"@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/eslint-utils": "npm:^4.2.0"
"@eslint-community/regexpp": "npm:^4.6.1" "@eslint-community/regexpp": "npm:^4.6.1"
"@eslint/eslintrc": "npm:^3.0.2" "@eslint/config-array": "npm:^0.15.1"
"@eslint/js": "npm:9.0.0" "@eslint/eslintrc": "npm:^3.1.0"
"@humanwhocodes/config-array": "npm:^0.12.3" "@eslint/js": "npm:9.4.0"
"@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/module-importer": "npm:^1.0.1"
"@humanwhocodes/retry": "npm:^0.3.0"
"@nodelib/fs.walk": "npm:^1.2.8" "@nodelib/fs.walk": "npm:^1.2.8"
ajv: "npm:^6.12.4" ajv: "npm:^6.12.4"
chalk: "npm:^4.0.0" chalk: "npm:^4.0.0"
@ -14304,7 +14431,6 @@ __metadata:
file-entry-cache: "npm:^8.0.0" file-entry-cache: "npm:^8.0.0"
find-up: "npm:^5.0.0" find-up: "npm:^5.0.0"
glob-parent: "npm:^6.0.2" glob-parent: "npm:^6.0.2"
graphemer: "npm:^1.4.0"
ignore: "npm:^5.2.0" ignore: "npm:^5.2.0"
imurmurhash: "npm:^0.1.4" imurmurhash: "npm:^0.1.4"
is-glob: "npm:^4.0.0" is-glob: "npm:^4.0.0"
@ -14319,7 +14445,7 @@ __metadata:
text-table: "npm:^0.2.0" text-table: "npm:^0.2.0"
bin: bin:
eslint: bin/eslint.js eslint: bin/eslint.js
checksum: 5cf03e14eb114f95bc4e553c8ae2da65ec09d519779beb08e326d98518bce647ce9c8bf3467bcea4cab35a2657cc3a8e945717e784afa4b1bdb9d1ecd9173ba0 checksum: e2eaae18eb79d543a1ca5420495ea9bf1278f9e25bfa6309ec4e4dae981cba4d731a9b857f5e2f8b5e467adaaf871a635a7eb143a749e7cdcdff4716821628d2
languageName: node languageName: node
linkType: hard linkType: hard
@ -14913,7 +15039,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"extend@npm:~3.0.2": "extend@npm:^3.0.2, extend@npm:~3.0.2":
version: 3.0.2 version: 3.0.2
resolution: "extend@npm:3.0.2" resolution: "extend@npm:3.0.2"
checksum: 59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e checksum: 59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e
@ -15304,7 +15430,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"form-data@npm:^2.2.0": "form-data@npm:^2.2.0, form-data@npm:^2.5.0":
version: 2.5.1 version: 2.5.1
resolution: "form-data@npm:2.5.1" resolution: "form-data@npm:2.5.1"
dependencies: dependencies:
@ -15667,6 +15793,29 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"gaxios@npm:^6.0.0, gaxios@npm:^6.1.1":
version: 6.6.0
resolution: "gaxios@npm:6.6.0"
dependencies:
extend: "npm:^3.0.2"
https-proxy-agent: "npm:^7.0.1"
is-stream: "npm:^2.0.0"
node-fetch: "npm:^2.6.9"
uuid: "npm:^9.0.1"
checksum: 9f035590374fd168e7bb3ddda369fc8bd487f16a2308fde18284ccc0f685d0af4ac5e3e38d680a8c6342a9000fbf9d77ce691ee110dbed2feebb659e729c640a
languageName: node
linkType: hard
"gcp-metadata@npm:^6.1.0":
version: 6.1.0
resolution: "gcp-metadata@npm:6.1.0"
dependencies:
gaxios: "npm:^6.0.0"
json-bigint: "npm:^1.0.0"
checksum: a0d12a9cb7499fdb9de0fff5406aa220310c1326b80056be8d9b747aae26414f99d14bd795c0ec52ef7d0473eef9d61bb657b8cd3d8186c8a84c4ddbff025fe9
languageName: node
linkType: hard
"gensync@npm:^1.0.0-beta.2": "gensync@npm:^1.0.0-beta.2":
version: 1.0.0-beta.2 version: 1.0.0-beta.2
resolution: "gensync@npm:1.0.0-beta.2" resolution: "gensync@npm:1.0.0-beta.2"
@ -16035,6 +16184,40 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"google-auth-library@npm:^9.3.0":
version: 9.10.0
resolution: "google-auth-library@npm:9.10.0"
dependencies:
base64-js: "npm:^1.3.0"
ecdsa-sig-formatter: "npm:^1.0.11"
gaxios: "npm:^6.1.1"
gcp-metadata: "npm:^6.1.0"
gtoken: "npm:^7.0.0"
jws: "npm:^4.0.0"
checksum: 10d5863493f9426107b0f6c4df244b1413a2cacff9589076f906924336d894fe8bc4153d4a3756cebec8a58784ff1a3900c621924f75f004908611fa46d3caa6
languageName: node
linkType: hard
"google-gax@npm:^4.0.3":
version: 4.3.3
resolution: "google-gax@npm:4.3.3"
dependencies:
"@grpc/grpc-js": "npm:~1.10.3"
"@grpc/proto-loader": "npm:^0.7.0"
"@types/long": "npm:^4.0.0"
abort-controller: "npm:^3.0.0"
duplexify: "npm:^4.0.0"
google-auth-library: "npm:^9.3.0"
node-fetch: "npm:^2.6.1"
object-hash: "npm:^3.0.0"
proto3-json-serializer: "npm:^2.0.0"
protobufjs: "npm:7.2.6"
retry-request: "npm:^7.0.0"
uuid: "npm:^9.0.1"
checksum: 63335724e741737b90689e43f8ea5804d82b8f4eaa013ba07166bf6119ef7474d06682d580d72f6b708d6c55251204b1f05db615c3cd84abf2f8f295c50882ec
languageName: node
linkType: hard
"gopd@npm:^1.0.1": "gopd@npm:^1.0.1":
version: 1.0.1 version: 1.0.1
resolution: "gopd@npm:1.0.1" resolution: "gopd@npm:1.0.1"
@ -16167,6 +16350,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"gtoken@npm:^7.0.0":
version: 7.1.0
resolution: "gtoken@npm:7.1.0"
dependencies:
gaxios: "npm:^6.0.0"
jws: "npm:^4.0.0"
checksum: 640392261e55c9242137a81a4af8feb053b57061762cedddcbb6a0d62c2314316161808ac2529eea67d06d69fdc56d82361af50f2d840a04a87ea29e124d7382
languageName: node
linkType: hard
"h3@npm:^1.10.1, h3@npm:^1.8.2": "h3@npm:^1.10.1, h3@npm:^1.8.2":
version: 1.10.2 version: 1.10.2
resolution: "h3@npm:1.10.2" resolution: "h3@npm:1.10.2"
@ -16726,6 +16919,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"https-proxy-agent@npm:^7.0.1":
version: 7.0.4
resolution: "https-proxy-agent@npm:7.0.4"
dependencies:
agent-base: "npm:^7.0.2"
debug: "npm:4"
checksum: 405fe582bba461bfe5c7e2f8d752b384036854488b828ae6df6a587c654299cbb2c50df38c4b6ab303502c3c5e029a793fbaac965d1e86ee0be03faceb554d63
languageName: node
linkType: hard
"human-id@npm:^1.0.2": "human-id@npm:^1.0.2":
version: 1.0.2 version: 1.0.2
resolution: "human-id@npm:1.0.2" resolution: "human-id@npm:1.0.2"
@ -18337,6 +18540,27 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jwa@npm:^2.0.0":
version: 2.0.0
resolution: "jwa@npm:2.0.0"
dependencies:
buffer-equal-constant-time: "npm:1.0.1"
ecdsa-sig-formatter: "npm:1.0.11"
safe-buffer: "npm:^5.0.1"
checksum: ab983f6685d99d13ddfbffef9b1c66309a536362a8412d49ba6e687d834a1240ce39290f30ac7dbe241e0ab6c76fee7ff795776ce534e11d148158c9b7193498
languageName: node
linkType: hard
"jws@npm:^4.0.0":
version: 4.0.0
resolution: "jws@npm:4.0.0"
dependencies:
jwa: "npm:^2.0.0"
safe-buffer: "npm:^5.0.1"
checksum: 1d15f4cdea376c6bd6a81002bd2cb0bf3d51d83da8f0727947b5ba3e10cf366721b8c0d099bf8c1eb99eb036e2c55e5fd5efd378ccff75a2b4e0bd10002348b9
languageName: node
linkType: hard
"keccak@npm:3.0.1": "keccak@npm:3.0.1":
version: 3.0.1 version: 3.0.1
resolution: "keccak@npm:3.0.1" resolution: "keccak@npm:3.0.1"
@ -18919,6 +19143,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"long@npm:^5.0.0":
version: 5.2.3
resolution: "long@npm:5.2.3"
checksum: 9167ec6947a825b827c30da169a7384eec6c0c9ec2f0b9c74da2e93d81159bbe39fb09c3f13dae9721d4b807ccfa09797a7dd1012f5d478e3e33ca3c78b608e6
languageName: node
linkType: hard
"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0":
version: 1.4.0 version: 1.4.0
resolution: "loose-envify@npm:1.4.0" resolution: "loose-envify@npm:1.4.0"
@ -20114,7 +20345,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12": "node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.9":
version: 2.7.0 version: 2.7.0
resolution: "node-fetch@npm:2.7.0" resolution: "node-fetch@npm:2.7.0"
dependencies: dependencies:
@ -20423,6 +20654,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"object-hash@npm:^3.0.0":
version: 3.0.0
resolution: "object-hash@npm:3.0.0"
checksum: f498d456a20512ba7be500cef4cf7b3c183cc72c65372a549c9a0e6dd78ce26f375e9b1315c07592d3fde8f10d5019986eba35970570d477ed9a2a702514432a
languageName: node
linkType: hard
"object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": "object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0":
version: 1.12.2 version: 1.12.2
resolution: "object-inspect@npm:1.12.2" resolution: "object-inspect@npm:1.12.2"
@ -21345,6 +21583,35 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"proto3-json-serializer@npm:^2.0.0":
version: 2.0.1
resolution: "proto3-json-serializer@npm:2.0.1"
dependencies:
protobufjs: "npm:^7.2.5"
checksum: dc4319c90e2412b9647f13dd1df2a6338ee3a07e2fd693c5ce4d1728c3730d913ebdb6d656f400ae4214a70bf0791ca0bc04d53b2cbdd75394bf0b175898443b
languageName: node
linkType: hard
"protobufjs@npm:7.2.6":
version: 7.2.6
resolution: "protobufjs@npm:7.2.6"
dependencies:
"@protobufjs/aspromise": "npm:^1.1.2"
"@protobufjs/base64": "npm:^1.1.2"
"@protobufjs/codegen": "npm:^2.0.4"
"@protobufjs/eventemitter": "npm:^1.1.0"
"@protobufjs/fetch": "npm:^1.1.0"
"@protobufjs/float": "npm:^1.0.2"
"@protobufjs/inquire": "npm:^1.1.0"
"@protobufjs/path": "npm:^1.1.2"
"@protobufjs/pool": "npm:^1.1.0"
"@protobufjs/utf8": "npm:^1.1.0"
"@types/node": "npm:>=13.7.0"
long: "npm:^5.0.0"
checksum: 81ab853d28c71998d056d6b34f83c4bc5be40cb0b416585f99ed618aed833d64b2cf89359bad7474d345302f2b5e236c4519165f8483d7ece7fd5b0d9ac13f8b
languageName: node
linkType: hard
"protobufjs@npm:^6.8.8, protobufjs@npm:~6.11.2, protobufjs@npm:~6.11.3": "protobufjs@npm:^6.8.8, protobufjs@npm:~6.11.2, protobufjs@npm:~6.11.3":
version: 6.11.4 version: 6.11.4
resolution: "protobufjs@npm:6.11.4" resolution: "protobufjs@npm:6.11.4"
@ -21369,6 +21636,26 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"protobufjs@npm:^7.2.5":
version: 7.3.0
resolution: "protobufjs@npm:7.3.0"
dependencies:
"@protobufjs/aspromise": "npm:^1.1.2"
"@protobufjs/base64": "npm:^1.1.2"
"@protobufjs/codegen": "npm:^2.0.4"
"@protobufjs/eventemitter": "npm:^1.1.0"
"@protobufjs/fetch": "npm:^1.1.0"
"@protobufjs/float": "npm:^1.0.2"
"@protobufjs/inquire": "npm:^1.1.0"
"@protobufjs/path": "npm:^1.1.2"
"@protobufjs/pool": "npm:^1.1.0"
"@protobufjs/utf8": "npm:^1.1.0"
"@types/node": "npm:>=13.7.0"
long: "npm:^5.0.0"
checksum: aff4aa2a3a2f011accb51e23fcae122acbee35cb761abe51f799675a61ab39ad9a506911f307e0fdb9a1703bed1f522cfbdaafaeefd2b3aaca2ddc18f03029d9
languageName: node
linkType: hard
"proxy-addr@npm:~2.0.7": "proxy-addr@npm:~2.0.7":
version: 2.0.7 version: 2.0.7
resolution: "proxy-addr@npm:2.0.7" resolution: "proxy-addr@npm:2.0.7"
@ -22254,6 +22541,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"retry-request@npm:^7.0.0":
version: 7.0.2
resolution: "retry-request@npm:7.0.2"
dependencies:
"@types/request": "npm:^2.48.8"
extend: "npm:^3.0.2"
teeny-request: "npm:^9.0.0"
checksum: 8f4c927d41dd575fc460aad7b762fb0a33542097201c3c1a31529ad17fa8af3ac0d2a45bf4a2024d079913e9c2dd431566070fe33321c667ac87ebb400de5917
languageName: node
linkType: hard
"retry@npm:0.13.1": "retry@npm:0.13.1":
version: 0.13.1 version: 0.13.1
resolution: "retry@npm:0.13.1" resolution: "retry@npm:0.13.1"
@ -23391,7 +23689,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"stream-shift@npm:^1.0.0": "stream-events@npm:^1.0.5":
version: 1.0.5
resolution: "stream-events@npm:1.0.5"
dependencies:
stubs: "npm:^3.0.0"
checksum: 969ce82e34bfbef5734629cc06f9d7f3705a9ceb8fcd6a526332f9159f1f8bbfdb1a453f3ced0b728083454f7706adbbe8428bceb788a0287ca48ba2642dc3fc
languageName: node
linkType: hard
"stream-shift@npm:^1.0.0, stream-shift@npm:^1.0.2":
version: 1.0.3 version: 1.0.3
resolution: "stream-shift@npm:1.0.3" resolution: "stream-shift@npm:1.0.3"
checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242
@ -23691,6 +23998,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"stubs@npm:^3.0.0":
version: 3.0.0
resolution: "stubs@npm:3.0.0"
checksum: dec7b82186e3743317616235c59bfb53284acc312cb9f4c3e97e2205c67a5c158b0ca89db5927e52351582e90a2672822eeaec9db396e23e56893d2a8676e024
languageName: node
linkType: hard
"styled-jsx@npm:5.1.1": "styled-jsx@npm:5.1.1":
version: 5.1.1 version: 5.1.1
resolution: "styled-jsx@npm:5.1.1" resolution: "styled-jsx@npm:5.1.1"
@ -23944,6 +24258,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"teeny-request@npm:^9.0.0":
version: 9.0.0
resolution: "teeny-request@npm:9.0.0"
dependencies:
http-proxy-agent: "npm:^5.0.0"
https-proxy-agent: "npm:^5.0.0"
node-fetch: "npm:^2.6.9"
stream-events: "npm:^1.0.5"
uuid: "npm:^9.0.0"
checksum: 44daabb6c2e239c3daed0218ebdafb50c7141c16d7257a6cfef786dbff56d7853c2c02c97934f7ed57818ce5861ac16c5f52f3a16fa292bd4caf53483d386443
languageName: node
linkType: hard
"term-size@npm:^2.1.0": "term-size@npm:^2.1.0":
version: 2.2.1 version: 2.2.1
resolution: "term-size@npm:2.2.1" resolution: "term-size@npm:2.2.1"

Loading…
Cancel
Save