@hyperlane-xyz/registry 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +3 -16
  2. package/dist/chainAddresses.d.ts +36 -0
  3. package/dist/chainAddresses.js +38 -2
  4. package/dist/chainMetadata.js +64 -0
  5. package/dist/chains/blast/addresses.d.ts +18 -0
  6. package/dist/chains/blast/addresses.js +18 -0
  7. package/dist/chains/blast/addresses.json +18 -0
  8. package/dist/chains/blast/addresses.yaml +16 -0
  9. package/dist/chains/blast/index.d.ts +2 -0
  10. package/dist/chains/blast/index.js +2 -0
  11. package/dist/chains/blast/logo.svg +1 -0
  12. package/dist/chains/blast/metadata.d.ts +2 -0
  13. package/dist/chains/blast/metadata.js +32 -0
  14. package/dist/chains/blast/metadata.json +32 -0
  15. package/dist/chains/blast/metadata.yaml +23 -0
  16. package/dist/chains/ethereum/addresses.js +1 -1
  17. package/dist/chains/ethereum/addresses.json +1 -1
  18. package/dist/chains/ethereum/addresses.yaml +1 -1
  19. package/dist/chains/mantapacific/addresses.js +1 -1
  20. package/dist/chains/mantapacific/addresses.json +1 -1
  21. package/dist/chains/mantapacific/addresses.yaml +1 -1
  22. package/dist/chains/mode/addresses.d.ts +18 -0
  23. package/dist/chains/mode/addresses.js +18 -0
  24. package/dist/chains/mode/addresses.json +18 -0
  25. package/dist/chains/mode/addresses.yaml +16 -0
  26. package/dist/chains/mode/index.d.ts +2 -0
  27. package/dist/chains/mode/index.js +2 -0
  28. package/dist/chains/mode/logo.svg +1 -0
  29. package/dist/chains/mode/metadata.d.ts +2 -0
  30. package/dist/chains/mode/metadata.js +32 -0
  31. package/dist/chains/mode/metadata.json +32 -0
  32. package/dist/chains/mode/metadata.yaml +22 -0
  33. package/dist/chains/schema.json +16 -1
  34. package/dist/consts.d.ts +3 -1
  35. package/dist/consts.js +3 -1
  36. package/dist/coreChainAddresses.js +2 -2
  37. package/dist/index.d.ts +6 -1
  38. package/dist/index.js +6 -1
  39. package/dist/registry/BaseRegistry.d.ts +12 -6
  40. package/dist/registry/BaseRegistry.js +16 -3
  41. package/dist/registry/GithubRegistry.d.ts +4 -2
  42. package/dist/registry/GithubRegistry.js +25 -23
  43. package/dist/registry/IRegistry.d.ts +6 -4
  44. package/dist/registry/LocalRegistry.d.ts +2 -2
  45. package/dist/registry/LocalRegistry.js +14 -5
  46. package/dist/registry/warp-utils.d.ts +3 -0
  47. package/dist/registry/warp-utils.js +22 -0
  48. package/dist/utils.d.ts +1 -0
  49. package/dist/utils.js +10 -0
  50. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Hyperlane Registry
2
2
 
3
- A collection of configs, artifacts, and schemas for Hyperlane.
3
+ A collection of configs, artifacts, and schemas for Hyperlane. See the [documentation](https://docs.hyperlane.xyz/docs/reference/registries) for more information.
4
4
 
5
5
  ## Contents
6
6
 
@@ -11,8 +11,6 @@ Structured as a folder for each chain. Each folder should contain a `metadata.ya
11
11
 
12
12
  ### Deployments
13
13
 
14
- **WORK IN PROGRESS: Note, the shape and contents of the deployments folders are subject to change**
15
-
16
14
  #### Core
17
15
 
18
16
  Configs and artifacts for [Hyperlane Core Contract](https://docs.hyperlane.xyz/docs/deploy/deploy-hyperlane) deployments.
@@ -21,17 +19,6 @@ Configs and artifacts for [Hyperlane Core Contract](https://docs.hyperlane.xyz/d
21
19
 
22
20
  Address artifacts for [Warp Route](https://docs.hyperlane.xyz/docs/deploy/deploy-warp-route) token deployments.
23
21
 
24
- ## Usage
25
-
26
- ### Via the NPM package
27
-
28
- ```sh
29
- # With npm
30
- npm install @hyperlane-xyz/registry
31
- # Or with yarn
32
- yarn add @hyperlane-xyz/registry
33
- ```
34
-
35
- ### Via SDK utilities
22
+ ## Contributing
36
23
 
37
- _Coming soon!_
24
+ This registry is maintained by the core Hyperlane team but community members are encouraged to add chain and deployment information here! See the [Contribution Guide](./CONTRIBUTING.md) for more information.
@@ -105,6 +105,24 @@ export declare const chainAddresses: {
105
105
  timelockController: string;
106
106
  validatorAnnounce: string;
107
107
  };
108
+ blast: {
109
+ domainRoutingIsmFactory: string;
110
+ fallbackRoutingHook: string;
111
+ interchainGasPaymaster: string;
112
+ interchainSecurityModule: string;
113
+ mailbox: string;
114
+ merkleTreeHook: string;
115
+ pausableHook: string;
116
+ protocolFee: string;
117
+ proxyAdmin: string;
118
+ staticAggregationHookFactory: string;
119
+ staticAggregationIsmFactory: string;
120
+ staticMerkleRootMultisigIsmFactory: string;
121
+ staticMessageIdMultisigIsmFactory: string;
122
+ storageGasOracle: string;
123
+ testRecipient: string;
124
+ validatorAnnounce: string;
125
+ };
108
126
  bsc: {
109
127
  aggregationHook: string;
110
128
  domainRoutingIsmFactory: string;
@@ -290,6 +308,24 @@ export declare const chainAddresses: {
290
308
  timelockController: string;
291
309
  validatorAnnounce: string;
292
310
  };
311
+ mode: {
312
+ domainRoutingIsmFactory: string;
313
+ fallbackRoutingHook: string;
314
+ interchainGasPaymaster: string;
315
+ interchainSecurityModule: string;
316
+ mailbox: string;
317
+ merkleTreeHook: string;
318
+ pausableHook: string;
319
+ protocolFee: string;
320
+ proxyAdmin: string;
321
+ staticAggregationHookFactory: string;
322
+ staticAggregationIsmFactory: string;
323
+ staticMerkleRootMultisigIsmFactory: string;
324
+ staticMessageIdMultisigIsmFactory: string;
325
+ storageGasOracle: string;
326
+ testRecipient: string;
327
+ validatorAnnounce: string;
328
+ };
293
329
  moonbeam: {
294
330
  aggregationHook: string;
295
331
  domainRoutingIsmFactory: string;
@@ -105,6 +105,24 @@ export const chainAddresses = {
105
105
  "timelockController": "0x0000000000000000000000000000000000000000",
106
106
  "validatorAnnounce": "0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B"
107
107
  },
108
+ "blast": {
109
+ "domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
110
+ "fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa",
111
+ "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9",
112
+ "interchainSecurityModule": "0x0986f6D82A47045788b0ce8EF68f6C0D77726854",
113
+ "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7",
114
+ "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
115
+ "pausableHook": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0",
116
+ "protocolFee": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
117
+ "proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
118
+ "staticAggregationHookFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
119
+ "staticAggregationIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
120
+ "staticMerkleRootMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
121
+ "staticMessageIdMultisigIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
122
+ "storageGasOracle": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0",
123
+ "testRecipient": "0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84",
124
+ "validatorAnnounce": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72"
125
+ },
108
126
  "bsc": {
109
127
  "aggregationHook": "0x402Fc106576462a892355d69ACF03D46A888ae88",
110
128
  "domainRoutingIsmFactory": "0xe6Af5720d34213C805C08e2470aea979e3F72F75",
@@ -181,7 +199,7 @@ export const chainAddresses = {
181
199
  "interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29",
182
200
  "interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9",
183
201
  "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611",
184
- "interchainSecurityModule": "0x43Ce4Eb4aE3585dDe9Ac6967Db5b06f7f6764C8a",
202
+ "interchainSecurityModule": "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a",
185
203
  "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239",
186
204
  "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA",
187
205
  "pausableHook": "0x3A66Dc852e56d3748838b3C27CF381105b83705b",
@@ -274,7 +292,7 @@ export const chainAddresses = {
274
292
  "interchainAccountIsm": "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD",
275
293
  "interchainAccountRouter": "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa",
276
294
  "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4",
277
- "interchainSecurityModule": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff",
295
+ "interchainSecurityModule": "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d",
278
296
  "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E",
279
297
  "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112",
280
298
  "pausableHook": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E",
@@ -290,6 +308,24 @@ export const chainAddresses = {
290
308
  "timelockController": "0x0000000000000000000000000000000000000000",
291
309
  "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9"
292
310
  },
311
+ "mode": {
312
+ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
313
+ "fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
314
+ "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d",
315
+ "interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89",
316
+ "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
317
+ "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6",
318
+ "pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882",
319
+ "protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4",
320
+ "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
321
+ "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
322
+ "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
323
+ "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
324
+ "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
325
+ "storageGasOracle": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
326
+ "testRecipient": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
327
+ "validatorAnnounce": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2"
328
+ },
293
329
  "moonbeam": {
294
330
  "aggregationHook": "0x23cca255aE83F57F39EAf9D14fB9FdaDF22D5863",
295
331
  "domainRoutingIsmFactory": "0x8061Af3A459093540d17823D651BC5E2A92669a7",
@@ -179,6 +179,38 @@ export const chainMetadata = {
179
179
  }
180
180
  ]
181
181
  },
182
+ "blast": {
183
+ "blockExplorers": [
184
+ {
185
+ "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/81457/etherscan/api",
186
+ "family": "routescan",
187
+ "name": "Blast Explorer",
188
+ "url": "https://blastexplorer.io"
189
+ }
190
+ ],
191
+ "blocks": {
192
+ "confirmations": 1,
193
+ "estimateBlockTime": 2,
194
+ "reorgPeriod": 1
195
+ },
196
+ "chainId": 81457,
197
+ "displayName": "Blast",
198
+ "domainId": 81457,
199
+ "gasCurrencyCoinGeckoId": "ethereum",
200
+ "name": "blast",
201
+ "nativeToken": {
202
+ "decimals": 18,
203
+ "name": "Ether",
204
+ "symbol": "ETH"
205
+ },
206
+ "protocol": "ethereum",
207
+ "rpcUrls": [
208
+ {
209
+ "http": "https://rpc.blast.io"
210
+ }
211
+ ],
212
+ "technicalStack": "other"
213
+ },
182
214
  "bsc": {
183
215
  "blockExplorers": [
184
216
  {
@@ -555,6 +587,38 @@ export const chainMetadata = {
555
587
  }
556
588
  ]
557
589
  },
590
+ "mode": {
591
+ "blockExplorers": [
592
+ {
593
+ "apiUrl": "https://explorer.mode.network/api",
594
+ "family": "blockscout",
595
+ "name": "Mode Explorer",
596
+ "url": "https://explorer.mode.network"
597
+ }
598
+ ],
599
+ "blocks": {
600
+ "confirmations": 1,
601
+ "estimateBlockTime": 2,
602
+ "reorgPeriod": 1
603
+ },
604
+ "chainId": 34443,
605
+ "displayName": "Mode",
606
+ "domainId": 34443,
607
+ "gasCurrencyCoinGeckoId": "ethereum",
608
+ "name": "mode",
609
+ "nativeToken": {
610
+ "decimals": 18,
611
+ "name": "Ether",
612
+ "symbol": "ETH"
613
+ },
614
+ "protocol": "ethereum",
615
+ "rpcUrls": [
616
+ {
617
+ "http": "https://mainnet.mode.network"
618
+ }
619
+ ],
620
+ "technicalStack": "other"
621
+ },
558
622
  "moonbeam": {
559
623
  "blockExplorers": [
560
624
  {
@@ -0,0 +1,18 @@
1
+ export declare const addresses: {
2
+ domainRoutingIsmFactory: string;
3
+ fallbackRoutingHook: string;
4
+ interchainGasPaymaster: string;
5
+ interchainSecurityModule: string;
6
+ mailbox: string;
7
+ merkleTreeHook: string;
8
+ pausableHook: string;
9
+ protocolFee: string;
10
+ proxyAdmin: string;
11
+ staticAggregationHookFactory: string;
12
+ staticAggregationIsmFactory: string;
13
+ staticMerkleRootMultisigIsmFactory: string;
14
+ staticMessageIdMultisigIsmFactory: string;
15
+ storageGasOracle: string;
16
+ testRecipient: string;
17
+ validatorAnnounce: string;
18
+ };
@@ -0,0 +1,18 @@
1
+ export const addresses = {
2
+ "domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
3
+ "fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa",
4
+ "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9",
5
+ "interchainSecurityModule": "0x0986f6D82A47045788b0ce8EF68f6C0D77726854",
6
+ "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7",
7
+ "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
8
+ "pausableHook": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0",
9
+ "protocolFee": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
10
+ "proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
11
+ "staticAggregationHookFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
12
+ "staticAggregationIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
13
+ "staticMerkleRootMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
14
+ "staticMessageIdMultisigIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
15
+ "storageGasOracle": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0",
16
+ "testRecipient": "0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84",
17
+ "validatorAnnounce": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72"
18
+ };
@@ -0,0 +1,18 @@
1
+ {
2
+ "domainRoutingIsmFactory": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
3
+ "fallbackRoutingHook": "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa",
4
+ "interchainGasPaymaster": "0xB3fCcD379ad66CED0c91028520C64226611A48c9",
5
+ "interchainSecurityModule": "0x0986f6D82A47045788b0ce8EF68f6C0D77726854",
6
+ "mailbox": "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7",
7
+ "merkleTreeHook": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
8
+ "pausableHook": "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0",
9
+ "protocolFee": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
10
+ "proxyAdmin": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D",
11
+ "staticAggregationHookFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1",
12
+ "staticAggregationIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
13
+ "staticMerkleRootMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
14
+ "staticMessageIdMultisigIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
15
+ "storageGasOracle": "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0",
16
+ "testRecipient": "0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84",
17
+ "validatorAnnounce": "0xFC62DeF1f08793aBf0E67f69257c6be258194F72"
18
+ }
@@ -0,0 +1,16 @@
1
+ domainRoutingIsmFactory: "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7"
2
+ fallbackRoutingHook: "0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa"
3
+ interchainGasPaymaster: "0xB3fCcD379ad66CED0c91028520C64226611A48c9"
4
+ interchainSecurityModule: "0x0986f6D82A47045788b0ce8EF68f6C0D77726854"
5
+ mailbox: "0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7"
6
+ merkleTreeHook: "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465"
7
+ pausableHook: "0xE0C452DDA7506f0F4dE5C8C1d383F7aD866eA4F0"
8
+ protocolFee: "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0"
9
+ proxyAdmin: "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D"
10
+ staticAggregationHookFactory: "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1"
11
+ staticAggregationIsmFactory: "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004"
12
+ staticMerkleRootMultisigIsmFactory: "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6"
13
+ staticMessageIdMultisigIsmFactory: "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908"
14
+ storageGasOracle: "0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0"
15
+ testRecipient: "0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84"
16
+ validatorAnnounce: "0xFC62DeF1f08793aBf0E67f69257c6be258194F72"
@@ -0,0 +1,2 @@
1
+ export { metadata } from './metadata.js';
2
+ export { addresses } from './addresses.js';
@@ -0,0 +1,2 @@
1
+ export { metadata } from './metadata.js';
2
+ export { addresses } from './addresses.js';
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="14.6 46.1 185.8 122.8"><path fill="#FCFC03" d="m161 106.4 29.3-14.6 10.1-31-20.2-14.7H45.7L14.6 69.2h158.1l-8.4 26h-63.4l-6.1 19h63.4l-17.8 54.7 29.7-14.7 10.6-32.8-19.9-14.6.2-.4Z"/><path fill="#FCFC03" d="m59.3 145.4 18.3-57-20.3-15.2-30.5 95.7h113.6l7.6-23.5H59.3Z"/></svg>
@@ -0,0 +1,2 @@
1
+ import type { ChainMetadata } from '@hyperlane-xyz/sdk';
2
+ export declare const metadata: ChainMetadata;
@@ -0,0 +1,32 @@
1
+ export const metadata = {
2
+ "blockExplorers": [
3
+ {
4
+ "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/81457/etherscan/api",
5
+ "family": "routescan",
6
+ "name": "Blast Explorer",
7
+ "url": "https://blastexplorer.io"
8
+ }
9
+ ],
10
+ "blocks": {
11
+ "confirmations": 1,
12
+ "estimateBlockTime": 2,
13
+ "reorgPeriod": 1
14
+ },
15
+ "chainId": 81457,
16
+ "displayName": "Blast",
17
+ "domainId": 81457,
18
+ "gasCurrencyCoinGeckoId": "ethereum",
19
+ "name": "blast",
20
+ "nativeToken": {
21
+ "decimals": 18,
22
+ "name": "Ether",
23
+ "symbol": "ETH"
24
+ },
25
+ "protocol": "ethereum",
26
+ "rpcUrls": [
27
+ {
28
+ "http": "https://rpc.blast.io"
29
+ }
30
+ ],
31
+ "technicalStack": "other"
32
+ };
@@ -0,0 +1,32 @@
1
+ {
2
+ "blockExplorers": [
3
+ {
4
+ "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/81457/etherscan/api",
5
+ "family": "routescan",
6
+ "name": "Blast Explorer",
7
+ "url": "https://blastexplorer.io"
8
+ }
9
+ ],
10
+ "blocks": {
11
+ "confirmations": 1,
12
+ "estimateBlockTime": 2,
13
+ "reorgPeriod": 1
14
+ },
15
+ "chainId": 81457,
16
+ "displayName": "Blast",
17
+ "domainId": 81457,
18
+ "gasCurrencyCoinGeckoId": "ethereum",
19
+ "name": "blast",
20
+ "nativeToken": {
21
+ "decimals": 18,
22
+ "name": "Ether",
23
+ "symbol": "ETH"
24
+ },
25
+ "protocol": "ethereum",
26
+ "rpcUrls": [
27
+ {
28
+ "http": "https://rpc.blast.io"
29
+ }
30
+ ],
31
+ "technicalStack": "other"
32
+ }
@@ -0,0 +1,23 @@
1
+ ---
2
+ blockExplorers:
3
+ - apiUrl: https://api.routescan.io/v2/network/mainnet/evm/81457/etherscan/api
4
+ family: routescan
5
+ name: Blast Explorer
6
+ url: https://blastexplorer.io
7
+ blocks:
8
+ confirmations: 1
9
+ estimateBlockTime: 2
10
+ reorgPeriod: 1
11
+ chainId: 81457
12
+ displayName: Blast
13
+ domainId: 81457
14
+ gasCurrencyCoinGeckoId: ethereum
15
+ name: blast
16
+ nativeToken:
17
+ decimals: 18
18
+ name: Ether
19
+ symbol: ETH
20
+ protocol: ethereum
21
+ rpcUrls:
22
+ - http: https://rpc.blast.io
23
+ technicalStack: other
@@ -5,7 +5,7 @@ export const addresses = {
5
5
  "interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29",
6
6
  "interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9",
7
7
  "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611",
8
- "interchainSecurityModule": "0x43Ce4Eb4aE3585dDe9Ac6967Db5b06f7f6764C8a",
8
+ "interchainSecurityModule": "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a",
9
9
  "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239",
10
10
  "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA",
11
11
  "pausableHook": "0x3A66Dc852e56d3748838b3C27CF381105b83705b",
@@ -5,7 +5,7 @@
5
5
  "interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29",
6
6
  "interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9",
7
7
  "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611",
8
- "interchainSecurityModule": "0x43Ce4Eb4aE3585dDe9Ac6967Db5b06f7f6764C8a",
8
+ "interchainSecurityModule": "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a",
9
9
  "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239",
10
10
  "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA",
11
11
  "pausableHook": "0x3A66Dc852e56d3748838b3C27CF381105b83705b",
@@ -4,7 +4,7 @@ fallbackRoutingHook: "0x571f1435613381208477ac5d6974310d88AC7cB7"
4
4
  interchainAccountIsm: "0x609707355a53d2aAb6366f48E2b607C599D26B29"
5
5
  interchainAccountRouter: "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9"
6
6
  interchainGasPaymaster: "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611"
7
- interchainSecurityModule: "0x43Ce4Eb4aE3585dDe9Ac6967Db5b06f7f6764C8a"
7
+ interchainSecurityModule: "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a"
8
8
  mailbox: "0xc005dc82818d67AF737725bD4bf75435d065D239"
9
9
  merkleTreeHook: "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA"
10
10
  pausableHook: "0x3A66Dc852e56d3748838b3C27CF381105b83705b"
@@ -6,7 +6,7 @@ export const addresses = {
6
6
  "interchainAccountIsm": "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD",
7
7
  "interchainAccountRouter": "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa",
8
8
  "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4",
9
- "interchainSecurityModule": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff",
9
+ "interchainSecurityModule": "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d",
10
10
  "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E",
11
11
  "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112",
12
12
  "pausableHook": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E",
@@ -6,7 +6,7 @@
6
6
  "interchainAccountIsm": "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD",
7
7
  "interchainAccountRouter": "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa",
8
8
  "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4",
9
- "interchainSecurityModule": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff",
9
+ "interchainSecurityModule": "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d",
10
10
  "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E",
11
11
  "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112",
12
12
  "pausableHook": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E",
@@ -5,7 +5,7 @@ fallbackRoutingHook: "0xD1E267d2d7876e97E217BfE61c34AB50FEF52807"
5
5
  interchainAccountIsm: "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD"
6
6
  interchainAccountRouter: "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa"
7
7
  interchainGasPaymaster: "0x0D63128D887159d63De29497dfa45AFc7C699AE4"
8
- interchainSecurityModule: "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff"
8
+ interchainSecurityModule: "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d"
9
9
  mailbox: "0x3a464f746D23Ab22155710f44dB16dcA53e0775E"
10
10
  merkleTreeHook: "0x149db7afD694722747035d5AEC7007ccb6F8f112"
11
11
  pausableHook: "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E"
@@ -0,0 +1,18 @@
1
+ export declare const addresses: {
2
+ domainRoutingIsmFactory: string;
3
+ fallbackRoutingHook: string;
4
+ interchainGasPaymaster: string;
5
+ interchainSecurityModule: string;
6
+ mailbox: string;
7
+ merkleTreeHook: string;
8
+ pausableHook: string;
9
+ protocolFee: string;
10
+ proxyAdmin: string;
11
+ staticAggregationHookFactory: string;
12
+ staticAggregationIsmFactory: string;
13
+ staticMerkleRootMultisigIsmFactory: string;
14
+ staticMessageIdMultisigIsmFactory: string;
15
+ storageGasOracle: string;
16
+ testRecipient: string;
17
+ validatorAnnounce: string;
18
+ };
@@ -0,0 +1,18 @@
1
+ export const addresses = {
2
+ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
3
+ "fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
4
+ "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d",
5
+ "interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89",
6
+ "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
7
+ "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6",
8
+ "pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882",
9
+ "protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4",
10
+ "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
11
+ "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
12
+ "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
13
+ "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
14
+ "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
15
+ "storageGasOracle": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
16
+ "testRecipient": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
17
+ "validatorAnnounce": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2"
18
+ };
@@ -0,0 +1,18 @@
1
+ {
2
+ "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908",
3
+ "fallbackRoutingHook": "0x8F1E22d309baa69D398a03cc88E9b46037e988AA",
4
+ "interchainGasPaymaster": "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d",
5
+ "interchainSecurityModule": "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89",
6
+ "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7",
7
+ "merkleTreeHook": "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6",
8
+ "pausableHook": "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882",
9
+ "protocolFee": "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4",
10
+ "proxyAdmin": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004",
11
+ "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6",
12
+ "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A",
13
+ "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC",
14
+ "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE",
15
+ "storageGasOracle": "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465",
16
+ "testRecipient": "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0",
17
+ "validatorAnnounce": "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2"
18
+ }
@@ -0,0 +1,16 @@
1
+ domainRoutingIsmFactory: "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908"
2
+ fallbackRoutingHook: "0x8F1E22d309baa69D398a03cc88E9b46037e988AA"
3
+ interchainGasPaymaster: "0x931dFCc8c1141D6F532FD023bd87DAe0080c835d"
4
+ interchainSecurityModule: "0x8dfE6790DbB2Ecc1bEdb0eECfc1Ff467Ae5d8C89"
5
+ mailbox: "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7"
6
+ merkleTreeHook: "0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6"
7
+ pausableHook: "0xA1ac41d8A663fd317cc3BD94C7de92dC4BA4a882"
8
+ protocolFee: "0xea820f9BCFD5E16a0dd42071EB61A29874Ad81A4"
9
+ proxyAdmin: "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004"
10
+ staticAggregationHookFactory: "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6"
11
+ staticAggregationIsmFactory: "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A"
12
+ staticMerkleRootMultisigIsmFactory: "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC"
13
+ staticMessageIdMultisigIsmFactory: "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE"
14
+ storageGasOracle: "0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465"
15
+ testRecipient: "0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0"
16
+ validatorAnnounce: "0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2"
@@ -0,0 +1,2 @@
1
+ export { metadata } from './metadata.js';
2
+ export { addresses } from './addresses.js';
@@ -0,0 +1,2 @@
1
+ export { metadata } from './metadata.js';
2
+ export { addresses } from './addresses.js';
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="enable-background:new 0 0 1000 1000" viewBox="216.2 247.6 568.5 503.2"><path d="M784.2 750.7H673.3V500l44.4-143-31.5-11.2-143.8 404.9H458L314.1 345.8 282.7 357l44.4 143v250.8H216.2V247.6h165.1l102.4 288v84.6h33.5v-84.6l102.4-288h165.1v503.1h-.5z" style="fill:#dffe00"/></svg>
@@ -0,0 +1,2 @@
1
+ import type { ChainMetadata } from '@hyperlane-xyz/sdk';
2
+ export declare const metadata: ChainMetadata;
@@ -0,0 +1,32 @@
1
+ export const metadata = {
2
+ "blockExplorers": [
3
+ {
4
+ "apiUrl": "https://explorer.mode.network/api",
5
+ "family": "blockscout",
6
+ "name": "Mode Explorer",
7
+ "url": "https://explorer.mode.network"
8
+ }
9
+ ],
10
+ "blocks": {
11
+ "confirmations": 1,
12
+ "estimateBlockTime": 2,
13
+ "reorgPeriod": 1
14
+ },
15
+ "chainId": 34443,
16
+ "displayName": "Mode",
17
+ "domainId": 34443,
18
+ "gasCurrencyCoinGeckoId": "ethereum",
19
+ "name": "mode",
20
+ "nativeToken": {
21
+ "decimals": 18,
22
+ "name": "Ether",
23
+ "symbol": "ETH"
24
+ },
25
+ "protocol": "ethereum",
26
+ "rpcUrls": [
27
+ {
28
+ "http": "https://mainnet.mode.network"
29
+ }
30
+ ],
31
+ "technicalStack": "other"
32
+ };
@@ -0,0 +1,32 @@
1
+ {
2
+ "blockExplorers": [
3
+ {
4
+ "apiUrl": "https://explorer.mode.network/api",
5
+ "family": "blockscout",
6
+ "name": "Mode Explorer",
7
+ "url": "https://explorer.mode.network"
8
+ }
9
+ ],
10
+ "blocks": {
11
+ "confirmations": 1,
12
+ "estimateBlockTime": 2,
13
+ "reorgPeriod": 1
14
+ },
15
+ "chainId": 34443,
16
+ "displayName": "Mode",
17
+ "domainId": 34443,
18
+ "gasCurrencyCoinGeckoId": "ethereum",
19
+ "name": "mode",
20
+ "nativeToken": {
21
+ "decimals": 18,
22
+ "name": "Ether",
23
+ "symbol": "ETH"
24
+ },
25
+ "protocol": "ethereum",
26
+ "rpcUrls": [
27
+ {
28
+ "http": "https://mainnet.mode.network"
29
+ }
30
+ ],
31
+ "technicalStack": "other"
32
+ }
@@ -0,0 +1,22 @@
1
+ blockExplorers:
2
+ - apiUrl: https://explorer.mode.network/api
3
+ family: blockscout
4
+ name: Mode Explorer
5
+ url: https://explorer.mode.network
6
+ blocks:
7
+ confirmations: 1
8
+ estimateBlockTime: 2
9
+ reorgPeriod: 1
10
+ chainId: 34443
11
+ displayName: Mode
12
+ domainId: 34443
13
+ gasCurrencyCoinGeckoId: ethereum
14
+ name: mode
15
+ nativeToken:
16
+ decimals: 18
17
+ name: Ether
18
+ symbol: ETH
19
+ protocol: ethereum
20
+ rpcUrls:
21
+ - http: https://mainnet.mode.network
22
+ technicalStack: other
@@ -14,7 +14,6 @@
14
14
  "enum": [
15
15
  "ethereum",
16
16
  "sealevel",
17
- "fuel",
18
17
  "cosmos"
19
18
  ],
20
19
  "description": "The type of protocol used by this chain. See ProtocolType for valid values."
@@ -91,6 +90,11 @@
91
90
  "format": "uri",
92
91
  "description": "The HTTP URL of the RPC endpoint (preferably HTTPS)."
93
92
  },
93
+ "concurrency": {
94
+ "type": "integer",
95
+ "exclusiveMinimum": 0,
96
+ "description": "Maximum number of concurrent RPC requests."
97
+ },
94
98
  "webSocket": {
95
99
  "type": "string",
96
100
  "description": "The WSS URL if the endpoint also supports websockets."
@@ -254,6 +258,17 @@
254
258
  "isTestnet": {
255
259
  "type": "boolean",
256
260
  "description": "Whether the chain is considered a testnet or a mainnet."
261
+ },
262
+ "index": {
263
+ "type": "object",
264
+ "properties": {
265
+ "from": {
266
+ "type": "number",
267
+ "description": "The block to start any indexing from."
268
+ }
269
+ },
270
+ "additionalProperties": false,
271
+ "description": "Indexing settings for the chain."
257
272
  }
258
273
  },
259
274
  "required": [
package/dist/consts.d.ts CHANGED
@@ -1 +1,3 @@
1
- export declare const CHAIN_SCHEMA_REF = "# yaml-language-server: $schema=../schema.json";
1
+ export declare const SCHEMA_REF = "# yaml-language-server: $schema=../schema.json";
2
+ export declare const DEFAULT_GITHUB_REGISTRY = "https://github.com/hyperlane-xyz/hyperlane-registry";
3
+ export declare const GITHUB_FETCH_CONCURRENCY_LIMIT = 5;
package/dist/consts.js CHANGED
@@ -1 +1,3 @@
1
- export const CHAIN_SCHEMA_REF = '# yaml-language-server: $schema=../schema.json';
1
+ export const SCHEMA_REF = '# yaml-language-server: $schema=../schema.json';
2
+ export const DEFAULT_GITHUB_REGISTRY = 'https://github.com/hyperlane-xyz/hyperlane-registry';
3
+ export const GITHUB_FETCH_CONCURRENCY_LIMIT = 5;
@@ -119,7 +119,7 @@ export const coreChainAddresses = {
119
119
  "interchainAccountIsm": "0x609707355a53d2aAb6366f48E2b607C599D26B29",
120
120
  "interchainAccountRouter": "0x8dBae9B1616c46A20591fE0006Bf015E28ca5cC9",
121
121
  "interchainGasPaymaster": "0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611",
122
- "interchainSecurityModule": "0x43Ce4Eb4aE3585dDe9Ac6967Db5b06f7f6764C8a",
122
+ "interchainSecurityModule": "0xB42b88243F749F47697F01Ae1cbBCA9d4763902a",
123
123
  "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239",
124
124
  "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA",
125
125
  "pausableHook": "0x3A66Dc852e56d3748838b3C27CF381105b83705b",
@@ -143,7 +143,7 @@ export const coreChainAddresses = {
143
143
  "interchainAccountIsm": "0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD",
144
144
  "interchainAccountRouter": "0x0f6fF770Eda6Ba1433C39cCf47d4059b254224Aa",
145
145
  "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4",
146
- "interchainSecurityModule": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff",
146
+ "interchainSecurityModule": "0xEda7cCD2A8CF717dc997D0002e363e4D10bF5c0d",
147
147
  "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E",
148
148
  "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112",
149
149
  "pausableHook": "0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E",
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { CoreChain, CoreChainName, CoreChains, CoreMainnets, CoreTestnets } from './core/chains.js';
2
- export { BaseRegistry } from './registry/BaseRegistry.js';
2
+ export { DEFAULT_GITHUB_REGISTRY } from './consts.js';
3
+ export { BaseRegistry, CHAIN_FILE_REGEX } from './registry/BaseRegistry.js';
3
4
  export { GithubRegistry, GithubRegistryOptions } from './registry/GithubRegistry.js';
4
5
  export { ChainFiles, IRegistry, RegistryContent, RegistryType } from './registry/IRegistry.js';
5
6
  export { ChainAddresses, ChainAddressesSchema } from './types.js';
@@ -17,6 +18,8 @@ export { metadata as avalanche } from './chains/avalanche/metadata.js';
17
18
  export { addresses as avalancheAddresses } from './chains/avalanche/addresses.js';
18
19
  export { metadata as base } from './chains/base/metadata.js';
19
20
  export { addresses as baseAddresses } from './chains/base/addresses.js';
21
+ export { metadata as blast } from './chains/blast/metadata.js';
22
+ export { addresses as blastAddresses } from './chains/blast/addresses.js';
20
23
  export { metadata as bsc } from './chains/bsc/metadata.js';
21
24
  export { addresses as bscAddresses } from './chains/bsc/addresses.js';
22
25
  export { metadata as bsctestnet } from './chains/bsctestnet/metadata.js';
@@ -36,6 +39,8 @@ export { addresses as inevmAddresses } from './chains/inevm/addresses.js';
36
39
  export { metadata as injective } from './chains/injective/metadata.js';
37
40
  export { metadata as mantapacific } from './chains/mantapacific/metadata.js';
38
41
  export { addresses as mantapacificAddresses } from './chains/mantapacific/addresses.js';
42
+ export { metadata as mode } from './chains/mode/metadata.js';
43
+ export { addresses as modeAddresses } from './chains/mode/addresses.js';
39
44
  export { metadata as moonbeam } from './chains/moonbeam/metadata.js';
40
45
  export { addresses as moonbeamAddresses } from './chains/moonbeam/addresses.js';
41
46
  export { metadata as nautilus } from './chains/nautilus/metadata.js';
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { CoreChain, CoreChains, CoreMainnets, CoreTestnets } from './core/chains.js';
2
- export { BaseRegistry } from './registry/BaseRegistry.js';
2
+ export { DEFAULT_GITHUB_REGISTRY } from './consts.js';
3
+ export { BaseRegistry, CHAIN_FILE_REGEX } from './registry/BaseRegistry.js';
3
4
  export { GithubRegistry } from './registry/GithubRegistry.js';
4
5
  export { RegistryType } from './registry/IRegistry.js';
5
6
  export { ChainAddressesSchema } from './types.js';
@@ -17,6 +18,8 @@ export { metadata as avalanche } from './chains/avalanche/metadata.js';
17
18
  export { addresses as avalancheAddresses } from './chains/avalanche/addresses.js';
18
19
  export { metadata as base } from './chains/base/metadata.js';
19
20
  export { addresses as baseAddresses } from './chains/base/addresses.js';
21
+ export { metadata as blast } from './chains/blast/metadata.js';
22
+ export { addresses as blastAddresses } from './chains/blast/addresses.js';
20
23
  export { metadata as bsc } from './chains/bsc/metadata.js';
21
24
  export { addresses as bscAddresses } from './chains/bsc/addresses.js';
22
25
  export { metadata as bsctestnet } from './chains/bsctestnet/metadata.js';
@@ -36,6 +39,8 @@ export { addresses as inevmAddresses } from './chains/inevm/addresses.js';
36
39
  export { metadata as injective } from './chains/injective/metadata.js';
37
40
  export { metadata as mantapacific } from './chains/mantapacific/metadata.js';
38
41
  export { addresses as mantapacificAddresses } from './chains/mantapacific/addresses.js';
42
+ export { metadata as mode } from './chains/mode/metadata.js';
43
+ export { addresses as modeAddresses } from './chains/mode/addresses.js';
39
44
  export { metadata as moonbeam } from './chains/moonbeam/metadata.js';
40
45
  export { addresses as moonbeamAddresses } from './chains/moonbeam/addresses.js';
41
46
  export { metadata as nautilus } from './chains/nautilus/metadata.js';
@@ -1,34 +1,40 @@
1
1
  import type { Logger } from 'pino';
2
- import type { ChainMap, ChainMetadata, ChainName } from '@hyperlane-xyz/sdk';
2
+ import type { ChainMap, ChainMetadata, ChainName, WarpCoreConfig } from '@hyperlane-xyz/sdk';
3
3
  import type { ChainAddresses, MaybePromise } from '../types.js';
4
4
  import type { IRegistry, RegistryContent, RegistryType } from './IRegistry.js';
5
5
  export declare const CHAIN_FILE_REGEX: RegExp;
6
6
  export declare abstract class BaseRegistry implements IRegistry {
7
7
  abstract type: RegistryType;
8
+ readonly uri: string;
8
9
  protected readonly logger: Logger;
9
10
  protected listContentCache?: RegistryContent;
10
11
  protected metadataCache?: ChainMap<ChainMetadata>;
11
12
  protected addressCache?: ChainMap<ChainAddresses>;
12
- constructor({ logger }: {
13
+ constructor({ uri, logger }: {
14
+ uri: string;
13
15
  logger?: Logger;
14
16
  });
15
17
  protected getChainsPath(): string;
16
- protected getWarpArtifactsPath(): string;
18
+ protected getWarpArtifactsPaths({ tokens }: WarpCoreConfig): {
19
+ configPath: string;
20
+ addressesPath: string;
21
+ };
17
22
  abstract listRegistryContent(): MaybePromise<RegistryContent>;
18
23
  abstract getChains(): MaybePromise<Array<ChainName>>;
19
24
  abstract getMetadata(): MaybePromise<ChainMap<ChainMetadata>>;
20
25
  abstract getChainMetadata(chainName: ChainName): MaybePromise<ChainMetadata | null>;
21
26
  abstract getAddresses(): MaybePromise<ChainMap<ChainAddresses>>;
22
27
  abstract getChainAddresses(chainName: ChainName): MaybePromise<ChainAddresses | null>;
23
- abstract addChain(chains: {
28
+ abstract addChain(chain: {
24
29
  chainName: ChainName;
25
30
  metadata?: ChainMetadata;
26
31
  addresses?: ChainAddresses;
27
32
  }): MaybePromise<void>;
28
- abstract updateChain(chains: {
33
+ abstract updateChain(chain: {
29
34
  chainName: ChainName;
30
35
  metadata?: ChainMetadata;
31
36
  addresses?: ChainAddresses;
32
37
  }): MaybePromise<void>;
33
- abstract removeChain(chains: ChainName): MaybePromise<void>;
38
+ abstract removeChain(chain: ChainName): MaybePromise<void>;
39
+ abstract addWarpRoute(config: WarpCoreConfig): MaybePromise<void>;
34
40
  }
@@ -1,11 +1,13 @@
1
1
  export const CHAIN_FILE_REGEX = /chains\/([a-z0-9]+)\/([a-z]+)\.yaml/;
2
2
  export class BaseRegistry {
3
+ uri;
3
4
  logger;
4
5
  // Caches
5
6
  listContentCache;
6
7
  metadataCache;
7
8
  addressCache;
8
- constructor({ logger }) {
9
+ constructor({ uri, logger }) {
10
+ this.uri = uri;
9
11
  // @ts-ignore forcing in to avoid a @hyperlane-xyz/utils
10
12
  // dependency here, which could bloat consumer bundles
11
13
  // unnecessarily (e.g. they just want metadata)
@@ -14,7 +16,18 @@ export class BaseRegistry {
14
16
  getChainsPath() {
15
17
  return 'chains';
16
18
  }
17
- getWarpArtifactsPath() {
18
- return 'deployments/warp_routes';
19
+ getWarpArtifactsPaths({ tokens }) {
20
+ if (!tokens.length)
21
+ throw new Error('No tokens provided in config');
22
+ const symbols = new Set(tokens.map((token) => token.symbol.toUpperCase()));
23
+ if (symbols.size !== 1)
24
+ throw new Error('Only one token symbol per warp config is supported for now');
25
+ const symbol = symbols.values().next().value;
26
+ const chains = tokens
27
+ .map((token) => token.chainName)
28
+ .sort()
29
+ .join('-');
30
+ const basePath = `deployments/warp_routes/${symbol}/${chains}`;
31
+ return { configPath: `${basePath}-config.yaml`, addressesPath: `${basePath}-addresses.yaml` };
19
32
  }
20
33
  }
@@ -1,8 +1,8 @@
1
1
  import type { Logger } from 'pino';
2
- import { type ChainMap, type ChainMetadata, type ChainName } from '@hyperlane-xyz/sdk';
2
+ import type { ChainMap, ChainMetadata, ChainName, WarpCoreConfig } from '@hyperlane-xyz/sdk';
3
3
  import { ChainAddresses } from '../types.js';
4
4
  import { BaseRegistry } from './BaseRegistry.js';
5
- import { RegistryType, type IRegistry, type RegistryContent } from './IRegistry.js';
5
+ import { RegistryType, type ChainFiles, type IRegistry, type RegistryContent } from './IRegistry.js';
6
6
  export interface GithubRegistryOptions {
7
7
  uri?: string;
8
8
  branch?: string;
@@ -33,6 +33,8 @@ export declare class GithubRegistry extends BaseRegistry implements IRegistry {
33
33
  addresses?: ChainAddresses;
34
34
  }): Promise<void>;
35
35
  removeChain(_chains: ChainName): Promise<void>;
36
+ addWarpRoute(_config: WarpCoreConfig): Promise<void>;
36
37
  protected getRawContentUrl(path: string): string;
38
+ protected fetchChainFiles<T>(fileName: keyof ChainFiles): Promise<ChainMap<T>>;
37
39
  protected fetch(url: string): Promise<Response>;
38
40
  }
@@ -1,8 +1,9 @@
1
1
  import { parse as yamlParse } from 'yaml';
2
+ import { DEFAULT_GITHUB_REGISTRY, GITHUB_FETCH_CONCURRENCY_LIMIT } from '../consts.js';
2
3
  import { ChainAddressesSchema } from '../types.js';
4
+ import { concurrentMap } from '../utils.js';
3
5
  import { BaseRegistry, CHAIN_FILE_REGEX } from './BaseRegistry.js';
4
6
  import { RegistryType, } from './IRegistry.js';
5
- const DEFAULT_REGISTRY = 'https://github.com/hyperlane-xyz/hyperlane-registry';
6
7
  export class GithubRegistry extends BaseRegistry {
7
8
  type = RegistryType.Github;
8
9
  url;
@@ -10,8 +11,8 @@ export class GithubRegistry extends BaseRegistry {
10
11
  repoOwner;
11
12
  repoName;
12
13
  constructor(options = {}) {
13
- super({ logger: options.logger });
14
- this.url = new URL(options.uri ?? DEFAULT_REGISTRY);
14
+ super({ uri: options.uri ?? DEFAULT_GITHUB_REGISTRY, logger: options.logger });
15
+ this.url = new URL(this.uri);
15
16
  this.branch = options.branch ?? 'main';
16
17
  const pathSegments = this.url.pathname.split('/');
17
18
  if (pathSegments.length < 2)
@@ -48,16 +49,7 @@ export class GithubRegistry extends BaseRegistry {
48
49
  async getMetadata() {
49
50
  if (this.metadataCache)
50
51
  return this.metadataCache;
51
- const chainMetadata = {};
52
- const repoContents = await this.listRegistryContent();
53
- // TODO use concurrentMap here when utils package is updated
54
- for (const [chainName, chainFiles] of Object.entries(repoContents.chains)) {
55
- if (!chainFiles.metadata)
56
- continue;
57
- const response = await this.fetch(chainFiles.metadata);
58
- const data = await response.text();
59
- chainMetadata[chainName] = yamlParse(data);
60
- }
52
+ const chainMetadata = await this.fetchChainFiles('metadata');
61
53
  return (this.metadataCache = chainMetadata);
62
54
  }
63
55
  async getChainMetadata(chainName) {
@@ -71,16 +63,7 @@ export class GithubRegistry extends BaseRegistry {
71
63
  async getAddresses() {
72
64
  if (this.addressCache)
73
65
  return this.addressCache;
74
- const chainAddresses = {};
75
- const repoContents = await this.listRegistryContent();
76
- // TODO use concurrentMap here when utils package is updated
77
- for (const [chainName, chainFiles] of Object.entries(repoContents.chains)) {
78
- if (!chainFiles.addresses)
79
- continue;
80
- const response = await this.fetch(chainFiles.addresses);
81
- const data = await response.text();
82
- chainAddresses[chainName] = ChainAddressesSchema.parse(yamlParse(data));
83
- }
66
+ const chainAddresses = await this.fetchChainFiles('addresses');
84
67
  return (this.addressCache = chainAddresses);
85
68
  }
86
69
  async getChainAddresses(chainName) {
@@ -100,9 +83,28 @@ export class GithubRegistry extends BaseRegistry {
100
83
  async removeChain(_chains) {
101
84
  throw new Error('TODO: Implement');
102
85
  }
86
+ async addWarpRoute(_config) {
87
+ throw new Error('TODO: Implement');
88
+ }
103
89
  getRawContentUrl(path) {
104
90
  return `https://raw.githubusercontent.com/${this.repoOwner}/${this.repoName}/${this.branch}/${path}`;
105
91
  }
92
+ async fetchChainFiles(fileName) {
93
+ const repoContents = await this.listRegistryContent();
94
+ const chainNames = Object.keys(repoContents.chains);
95
+ const fileUrls = chainNames.reduce((acc, chainName) => {
96
+ const fileUrl = repoContents.chains[chainName][fileName];
97
+ if (fileUrl)
98
+ acc[chainName] = fileUrl;
99
+ return acc;
100
+ }, {});
101
+ const results = await concurrentMap(GITHUB_FETCH_CONCURRENCY_LIMIT, Object.entries(fileUrls), async ([chainName, fileUrl]) => {
102
+ const response = await this.fetch(fileUrl);
103
+ const data = await response.text();
104
+ return [chainName, yamlParse(data)];
105
+ });
106
+ return Object.fromEntries(results);
107
+ }
106
108
  async fetch(url) {
107
109
  this.logger.debug(`Fetching from github: ${url}`);
108
110
  const response = await fetch(url);
@@ -1,4 +1,4 @@
1
- import type { ChainMap, ChainMetadata, ChainName } from '@hyperlane-xyz/sdk';
1
+ import type { ChainMap, ChainMetadata, ChainName, WarpCoreConfig } from '@hyperlane-xyz/sdk';
2
2
  import type { ChainAddresses, MaybePromise } from '../types.js';
3
3
  export interface ChainFiles {
4
4
  metadata?: string;
@@ -14,21 +14,23 @@ export declare enum RegistryType {
14
14
  }
15
15
  export interface IRegistry {
16
16
  type: RegistryType;
17
+ uri: string;
17
18
  listRegistryContent(): MaybePromise<RegistryContent>;
18
19
  getChains(): MaybePromise<Array<ChainName>>;
19
20
  getMetadata(): MaybePromise<ChainMap<ChainMetadata>>;
20
21
  getChainMetadata(chainName: ChainName): MaybePromise<ChainMetadata | null>;
21
22
  getAddresses(): MaybePromise<ChainMap<ChainAddresses>>;
22
23
  getChainAddresses(chainName: ChainName): MaybePromise<ChainAddresses | null>;
23
- addChain(chains: {
24
+ addChain(chain: {
24
25
  chainName: ChainName;
25
26
  metadata?: ChainMetadata;
26
27
  addresses?: ChainAddresses;
27
28
  }): MaybePromise<void>;
28
- updateChain(chains: {
29
+ updateChain(chain: {
29
30
  chainName: ChainName;
30
31
  metadata?: ChainMetadata;
31
32
  addresses?: ChainAddresses;
32
33
  }): MaybePromise<void>;
33
- removeChain(chains: ChainName): MaybePromise<void>;
34
+ removeChain(chain: ChainName): MaybePromise<void>;
35
+ addWarpRoute(config: WarpCoreConfig): MaybePromise<void>;
34
36
  }
@@ -1,5 +1,5 @@
1
1
  import type { Logger } from 'pino';
2
- import type { ChainMap, ChainMetadata, ChainName } from '@hyperlane-xyz/sdk';
2
+ import type { ChainMap, ChainMetadata, ChainName, WarpCoreConfig } from '@hyperlane-xyz/sdk';
3
3
  import { ChainAddresses } from '../types.js';
4
4
  import { BaseRegistry } from './BaseRegistry.js';
5
5
  import { RegistryType, type ChainFiles, type IRegistry, type RegistryContent } from './IRegistry.js';
@@ -9,7 +9,6 @@ export interface LocalRegistryOptions {
9
9
  }
10
10
  export declare class LocalRegistry extends BaseRegistry implements IRegistry {
11
11
  readonly type = RegistryType.Local;
12
- readonly uri: string;
13
12
  constructor(options: LocalRegistryOptions);
14
13
  listRegistryContent(): RegistryContent;
15
14
  getChains(): Array<ChainName>;
@@ -29,6 +28,7 @@ export declare class LocalRegistry extends BaseRegistry implements IRegistry {
29
28
  }): void;
30
29
  removeChain(chainName: ChainName): void;
31
30
  protected listFiles(dirPath: string): string[];
31
+ addWarpRoute(config: WarpCoreConfig): void;
32
32
  protected createOrUpdateChain(chain: {
33
33
  chainName: ChainName;
34
34
  metadata?: ChainMetadata;
@@ -1,17 +1,16 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { parse as yamlParse } from 'yaml';
4
- import { CHAIN_SCHEMA_REF } from '../consts.js';
4
+ import { SCHEMA_REF } from '../consts.js';
5
5
  import { ChainAddressesSchema } from '../types.js';
6
6
  import { toYamlString } from '../utils.js';
7
7
  import { BaseRegistry, CHAIN_FILE_REGEX } from './BaseRegistry.js';
8
8
  import { RegistryType, } from './IRegistry.js';
9
+ import { warpConfigToWarpAddresses } from './warp-utils.js';
9
10
  export class LocalRegistry extends BaseRegistry {
10
11
  type = RegistryType.Local;
11
- uri;
12
12
  constructor(options) {
13
- super({ logger: options.logger });
14
- this.uri = options.uri;
13
+ super(options);
15
14
  }
16
15
  listRegistryContent() {
17
16
  if (this.listContentCache)
@@ -97,6 +96,8 @@ export class LocalRegistry extends BaseRegistry {
97
96
  delete this.addressCache[chainName];
98
97
  }
99
98
  listFiles(dirPath) {
99
+ if (!fs.existsSync(dirPath))
100
+ return [];
100
101
  const entries = fs.readdirSync(dirPath, { withFileTypes: true });
101
102
  const filePaths = entries.map((entry) => {
102
103
  const fullPath = path.join(dirPath, entry.name);
@@ -104,6 +105,14 @@ export class LocalRegistry extends BaseRegistry {
104
105
  });
105
106
  return filePaths.flat();
106
107
  }
108
+ addWarpRoute(config) {
109
+ let { configPath, addressesPath } = this.getWarpArtifactsPaths(config);
110
+ configPath = path.join(this.uri, configPath);
111
+ this.createFile({ filePath: configPath, data: toYamlString(config, SCHEMA_REF) });
112
+ addressesPath = path.join(this.uri, addressesPath);
113
+ const addresses = warpConfigToWarpAddresses(config);
114
+ this.createFile({ filePath: addressesPath, data: toYamlString(addresses) });
115
+ }
107
116
  createOrUpdateChain(chain) {
108
117
  if (!chain.metadata && !chain.addresses)
109
118
  throw new Error(`Chain ${chain.chainName} must have metadata or addresses, preferably both`);
@@ -112,7 +121,7 @@ export class LocalRegistry extends BaseRegistry {
112
121
  this.logger.debug(`Chain ${chain.chainName} not found in registry, adding it now`);
113
122
  }
114
123
  if (chain.metadata) {
115
- this.createChainFile(chain.chainName, 'metadata', chain.metadata, this.getMetadata(), CHAIN_SCHEMA_REF);
124
+ this.createChainFile(chain.chainName, 'metadata', chain.metadata, this.getMetadata(), SCHEMA_REF);
116
125
  }
117
126
  if (chain.addresses) {
118
127
  this.createChainFile(chain.chainName, 'addresses', chain.addresses, this.getAddresses());
@@ -0,0 +1,3 @@
1
+ import type { ChainMap, WarpCoreConfig } from '@hyperlane-xyz/sdk';
2
+ import { ChainAddresses } from '../types.js';
3
+ export declare function warpConfigToWarpAddresses(config: WarpCoreConfig): ChainMap<ChainAddresses>;
@@ -0,0 +1,22 @@
1
+ export function warpConfigToWarpAddresses(config) {
2
+ return config.tokens.reduce((acc, token) => {
3
+ const addressKey = getWarpAddressKey(token.standard);
4
+ if (!addressKey || !token.addressOrDenom)
5
+ return acc;
6
+ acc[token.chainName] = {
7
+ [addressKey]: token.addressOrDenom,
8
+ };
9
+ return acc;
10
+ }, {});
11
+ }
12
+ function getWarpAddressKey(standard) {
13
+ const standardValue = standard.toLowerCase();
14
+ if (standardValue.includes('collateral'))
15
+ return 'collateral';
16
+ if (standardValue.includes('synthetic'))
17
+ return 'synthetic';
18
+ if (standardValue.includes('native'))
19
+ return 'native';
20
+ else
21
+ return null;
22
+ }
package/dist/utils.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare function toYamlString(data: any, prefix?: string): string;
2
+ export declare function concurrentMap<A, B>(concurrency: number, xs: A[], mapFn: (val: A, idx: number) => Promise<B>): Promise<B[]>;
package/dist/utils.js CHANGED
@@ -3,3 +3,13 @@ export function toYamlString(data, prefix) {
3
3
  const yamlString = stringify(data);
4
4
  return prefix ? `${prefix}\n${yamlString}` : yamlString;
5
5
  }
6
+ export async function concurrentMap(concurrency, xs, mapFn) {
7
+ let res = [];
8
+ for (let i = 0; i < xs.length; i += concurrency) {
9
+ const remaining = xs.length - i;
10
+ const sliceSize = Math.min(remaining, concurrency);
11
+ const slice = xs.slice(i, i + sliceSize);
12
+ res = res.concat(await Promise.all(slice.map((elem, index) => mapFn(elem, i + index))));
13
+ }
14
+ return res;
15
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hyperlane-xyz/registry",
3
3
  "description": "A collection of configs, artifacts, and schemas for Hyperlane",
4
- "version": "1.0.6",
4
+ "version": "1.1.0",
5
5
  "dependencies": {
6
6
  "yaml": "^2",
7
7
  "zod": "^3.21.2"
@@ -9,7 +9,7 @@
9
9
  "devDependencies": {
10
10
  "@changesets/cli": "^2.26.2",
11
11
  "@eslint/js": "^9.1.1",
12
- "@hyperlane-xyz/sdk": "3.10.0",
12
+ "@hyperlane-xyz/sdk": "3.11.1",
13
13
  "@types/mocha": "^10.0.1",
14
14
  "@types/node": "^16.9.1",
15
15
  "@typescript-eslint/parser": "^7.7.0",