@hyperlane-xyz/sealevel-sdk 27.0.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 (222) hide show
  1. package/LICENSE.md +193 -0
  2. package/dist/accounts/mint.d.ts +43 -0
  3. package/dist/accounts/mint.d.ts.map +1 -0
  4. package/dist/accounts/mint.js +159 -0
  5. package/dist/accounts/mint.js.map +1 -0
  6. package/dist/accounts/multisig-ism-message-id.d.ts +14 -0
  7. package/dist/accounts/multisig-ism-message-id.d.ts.map +1 -0
  8. package/dist/accounts/multisig-ism-message-id.js +32 -0
  9. package/dist/accounts/multisig-ism-message-id.js.map +1 -0
  10. package/dist/accounts/test-ism.d.ts +5 -0
  11. package/dist/accounts/test-ism.d.ts.map +1 -0
  12. package/dist/accounts/test-ism.js +8 -0
  13. package/dist/accounts/test-ism.js.map +1 -0
  14. package/dist/accounts/token.d.ts +60 -0
  15. package/dist/accounts/token.d.ts.map +1 -0
  16. package/dist/accounts/token.js +127 -0
  17. package/dist/accounts/token.js.map +1 -0
  18. package/dist/clients/protocol.d.ts +21 -0
  19. package/dist/clients/protocol.d.ts.map +1 -0
  20. package/dist/clients/protocol.js +51 -0
  21. package/dist/clients/protocol.js.map +1 -0
  22. package/dist/clients/provider.d.ts +66 -0
  23. package/dist/clients/provider.d.ts.map +1 -0
  24. package/dist/clients/provider.js +237 -0
  25. package/dist/clients/provider.js.map +1 -0
  26. package/dist/clients/signer.d.ts +61 -0
  27. package/dist/clients/signer.d.ts.map +1 -0
  28. package/dist/clients/signer.js +314 -0
  29. package/dist/clients/signer.js.map +1 -0
  30. package/dist/codecs/account-data.d.ts +8 -0
  31. package/dist/codecs/account-data.d.ts.map +1 -0
  32. package/dist/codecs/account-data.js +20 -0
  33. package/dist/codecs/account-data.js.map +1 -0
  34. package/dist/codecs/binary.d.ts +34 -0
  35. package/dist/codecs/binary.d.ts.map +1 -0
  36. package/dist/codecs/binary.js +165 -0
  37. package/dist/codecs/binary.js.map +1 -0
  38. package/dist/codecs/shared.d.ts +81 -0
  39. package/dist/codecs/shared.d.ts.map +1 -0
  40. package/dist/codecs/shared.js +241 -0
  41. package/dist/codecs/shared.js.map +1 -0
  42. package/dist/constants.d.ts +13 -0
  43. package/dist/constants.d.ts.map +1 -0
  44. package/dist/constants.js +21 -0
  45. package/dist/constants.js.map +1 -0
  46. package/dist/deploy/program-deployer.d.ts +51 -0
  47. package/dist/deploy/program-deployer.d.ts.map +1 -0
  48. package/dist/deploy/program-deployer.js +176 -0
  49. package/dist/deploy/program-deployer.js.map +1 -0
  50. package/dist/deploy/resolve-program.d.ts +9 -0
  51. package/dist/deploy/resolve-program.d.ts.map +1 -0
  52. package/dist/deploy/resolve-program.js +24 -0
  53. package/dist/deploy/resolve-program.js.map +1 -0
  54. package/dist/generated/core-addresses.d.ts +14 -0
  55. package/dist/generated/core-addresses.d.ts.map +1 -0
  56. package/dist/generated/core-addresses.js +55 -0
  57. package/dist/generated/core-addresses.js.map +1 -0
  58. package/dist/hook/hook-artifact-manager.d.ts +17 -0
  59. package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
  60. package/dist/hook/hook-artifact-manager.js +58 -0
  61. package/dist/hook/hook-artifact-manager.js.map +1 -0
  62. package/dist/hook/hook-query.d.ts +25 -0
  63. package/dist/hook/hook-query.d.ts.map +1 -0
  64. package/dist/hook/hook-query.js +46 -0
  65. package/dist/hook/hook-query.js.map +1 -0
  66. package/dist/hook/igp-hook.d.ts +28 -0
  67. package/dist/hook/igp-hook.d.ts.map +1 -0
  68. package/dist/hook/igp-hook.js +242 -0
  69. package/dist/hook/igp-hook.js.map +1 -0
  70. package/dist/hook/merkle-tree-hook.d.ts +23 -0
  71. package/dist/hook/merkle-tree-hook.d.ts.map +1 -0
  72. package/dist/hook/merkle-tree-hook.js +46 -0
  73. package/dist/hook/merkle-tree-hook.js.map +1 -0
  74. package/dist/hyperlane/program-bytes.d.ts +20 -0
  75. package/dist/hyperlane/program-bytes.d.ts.map +1 -0
  76. package/dist/hyperlane/program-bytes.js +80534 -0
  77. package/dist/hyperlane/program-bytes.js.map +1 -0
  78. package/dist/index.d.ts +21 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +27 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/instructions/igp.d.ts +66 -0
  83. package/dist/instructions/igp.d.ts.map +1 -0
  84. package/dist/instructions/igp.js +168 -0
  85. package/dist/instructions/igp.js.map +1 -0
  86. package/dist/instructions/interfaces.d.ts +52 -0
  87. package/dist/instructions/interfaces.d.ts.map +1 -0
  88. package/dist/instructions/interfaces.js +126 -0
  89. package/dist/instructions/interfaces.js.map +1 -0
  90. package/dist/instructions/loader.d.ts +11 -0
  91. package/dist/instructions/loader.d.ts.map +1 -0
  92. package/dist/instructions/loader.js +24 -0
  93. package/dist/instructions/loader.js.map +1 -0
  94. package/dist/instructions/multisig-ism-message-id.d.ts +32 -0
  95. package/dist/instructions/multisig-ism-message-id.d.ts.map +1 -0
  96. package/dist/instructions/multisig-ism-message-id.js +105 -0
  97. package/dist/instructions/multisig-ism-message-id.js.map +1 -0
  98. package/dist/instructions/test-ism.d.ts +16 -0
  99. package/dist/instructions/test-ism.d.ts.map +1 -0
  100. package/dist/instructions/test-ism.js +47 -0
  101. package/dist/instructions/test-ism.js.map +1 -0
  102. package/dist/instructions/token.d.ts +62 -0
  103. package/dist/instructions/token.d.ts.map +1 -0
  104. package/dist/instructions/token.js +257 -0
  105. package/dist/instructions/token.js.map +1 -0
  106. package/dist/instructions/utils.d.ts +19 -0
  107. package/dist/instructions/utils.d.ts.map +1 -0
  108. package/dist/instructions/utils.js +36 -0
  109. package/dist/instructions/utils.js.map +1 -0
  110. package/dist/ism/ism-artifact-manager.d.ts +14 -0
  111. package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
  112. package/dist/ism/ism-artifact-manager.js +49 -0
  113. package/dist/ism/ism-artifact-manager.js.map +1 -0
  114. package/dist/ism/ism-query.d.ts +22 -0
  115. package/dist/ism/ism-query.d.ts.map +1 -0
  116. package/dist/ism/ism-query.js +53 -0
  117. package/dist/ism/ism-query.js.map +1 -0
  118. package/dist/ism/multisig-ism.d.ts +33 -0
  119. package/dist/ism/multisig-ism.d.ts.map +1 -0
  120. package/dist/ism/multisig-ism.js +113 -0
  121. package/dist/ism/multisig-ism.js.map +1 -0
  122. package/dist/ism/test-ism.d.ts +20 -0
  123. package/dist/ism/test-ism.d.ts.map +1 -0
  124. package/dist/ism/test-ism.js +57 -0
  125. package/dist/ism/test-ism.js.map +1 -0
  126. package/dist/pda.d.ts +17 -0
  127. package/dist/pda.d.ts.map +1 -0
  128. package/dist/pda.js +118 -0
  129. package/dist/pda.js.map +1 -0
  130. package/dist/rpc.d.ts +9 -0
  131. package/dist/rpc.d.ts.map +1 -0
  132. package/dist/rpc.js +21 -0
  133. package/dist/rpc.js.map +1 -0
  134. package/dist/testing/index.d.ts +3 -0
  135. package/dist/testing/index.d.ts.map +1 -0
  136. package/dist/testing/index.js +3 -0
  137. package/dist/testing/index.js.map +1 -0
  138. package/dist/testing/setup.d.ts +33 -0
  139. package/dist/testing/setup.d.ts.map +1 -0
  140. package/dist/testing/setup.js +120 -0
  141. package/dist/testing/setup.js.map +1 -0
  142. package/dist/testing/solana-container.d.ts +32 -0
  143. package/dist/testing/solana-container.d.ts.map +1 -0
  144. package/dist/testing/solana-container.js +289 -0
  145. package/dist/testing/solana-container.js.map +1 -0
  146. package/dist/tests/collateral-token.e2e-test.d.ts +2 -0
  147. package/dist/tests/collateral-token.e2e-test.d.ts.map +1 -0
  148. package/dist/tests/collateral-token.e2e-test.js +112 -0
  149. package/dist/tests/collateral-token.e2e-test.js.map +1 -0
  150. package/dist/tests/deploy.e2e-test.d.ts +2 -0
  151. package/dist/tests/deploy.e2e-test.d.ts.map +1 -0
  152. package/dist/tests/deploy.e2e-test.js +76 -0
  153. package/dist/tests/deploy.e2e-test.js.map +1 -0
  154. package/dist/tests/hook.e2e-test.d.ts +2 -0
  155. package/dist/tests/hook.e2e-test.d.ts.map +1 -0
  156. package/dist/tests/hook.e2e-test.js +176 -0
  157. package/dist/tests/hook.e2e-test.js.map +1 -0
  158. package/dist/tests/ism.e2e-test.d.ts +2 -0
  159. package/dist/tests/ism.e2e-test.d.ts.map +1 -0
  160. package/dist/tests/ism.e2e-test.js +167 -0
  161. package/dist/tests/ism.e2e-test.js.map +1 -0
  162. package/dist/tests/native-token.e2e-test.d.ts +2 -0
  163. package/dist/tests/native-token.e2e-test.d.ts.map +1 -0
  164. package/dist/tests/native-token.e2e-test.js +93 -0
  165. package/dist/tests/native-token.e2e-test.js.map +1 -0
  166. package/dist/tests/provider.e2e-test.d.ts +2 -0
  167. package/dist/tests/provider.e2e-test.d.ts.map +1 -0
  168. package/dist/tests/provider.e2e-test.js +87 -0
  169. package/dist/tests/provider.e2e-test.js.map +1 -0
  170. package/dist/tests/read-token.e2e-test.d.ts +2 -0
  171. package/dist/tests/read-token.e2e-test.d.ts.map +1 -0
  172. package/dist/tests/read-token.e2e-test.js +79 -0
  173. package/dist/tests/read-token.e2e-test.js.map +1 -0
  174. package/dist/tests/scale.unit-test.d.ts +2 -0
  175. package/dist/tests/scale.unit-test.d.ts.map +1 -0
  176. package/dist/tests/scale.unit-test.js +65 -0
  177. package/dist/tests/scale.unit-test.js.map +1 -0
  178. package/dist/tests/synthetic-token.e2e-test.d.ts +2 -0
  179. package/dist/tests/synthetic-token.e2e-test.d.ts.map +1 -0
  180. package/dist/tests/synthetic-token.e2e-test.js +115 -0
  181. package/dist/tests/synthetic-token.e2e-test.js.map +1 -0
  182. package/dist/tests/warp-token-suite.d.ts +26 -0
  183. package/dist/tests/warp-token-suite.d.ts.map +1 -0
  184. package/dist/tests/warp-token-suite.js +208 -0
  185. package/dist/tests/warp-token-suite.js.map +1 -0
  186. package/dist/tx.d.ts +23 -0
  187. package/dist/tx.d.ts.map +1 -0
  188. package/dist/tx.js +43 -0
  189. package/dist/tx.js.map +1 -0
  190. package/dist/types.d.ts +50 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/warp/collateral-token.d.ts +21 -0
  195. package/dist/warp/collateral-token.d.ts.map +1 -0
  196. package/dist/warp/collateral-token.js +129 -0
  197. package/dist/warp/collateral-token.js.map +1 -0
  198. package/dist/warp/native-token.d.ts +21 -0
  199. package/dist/warp/native-token.d.ts.map +1 -0
  200. package/dist/warp/native-token.js +99 -0
  201. package/dist/warp/native-token.js.map +1 -0
  202. package/dist/warp/synthetic-token.d.ts +21 -0
  203. package/dist/warp/synthetic-token.d.ts.map +1 -0
  204. package/dist/warp/synthetic-token.js +180 -0
  205. package/dist/warp/synthetic-token.js.map +1 -0
  206. package/dist/warp/types.d.ts +16 -0
  207. package/dist/warp/types.d.ts.map +1 -0
  208. package/dist/warp/types.js +2 -0
  209. package/dist/warp/types.js.map +1 -0
  210. package/dist/warp/warp-artifact-manager.d.ts +14 -0
  211. package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
  212. package/dist/warp/warp-artifact-manager.js +52 -0
  213. package/dist/warp/warp-artifact-manager.js.map +1 -0
  214. package/dist/warp/warp-query.d.ts +30 -0
  215. package/dist/warp/warp-query.d.ts.map +1 -0
  216. package/dist/warp/warp-query.js +66 -0
  217. package/dist/warp/warp-query.js.map +1 -0
  218. package/dist/warp/warp-tx.d.ts +64 -0
  219. package/dist/warp/warp-tx.d.ts.map +1 -0
  220. package/dist/warp/warp-tx.js +291 -0
  221. package/dist/warp/warp-tx.js.map +1 -0
  222. package/package.json +76 -0
@@ -0,0 +1,33 @@
1
+ import type { Address, Rpc, SolanaRpcApi } from '@solana/kit';
2
+ import type { SvmSigner } from '../clients/signer.js';
3
+ import type { SvmRpc } from '../types.js';
4
+ import type { PreloadedProgram } from './solana-container.js';
5
+ export declare const DEFAULT_PROGRAMS_PATH: string;
6
+ export declare const TEST_PROGRAM_IDS: {
7
+ readonly mailbox: Address;
8
+ readonly igp: Address;
9
+ readonly multisigIsm: Address;
10
+ readonly testIsm: Address;
11
+ readonly validatorAnnounce: Address;
12
+ };
13
+ export declare const TEST_ATA_PAYER_FUNDING_AMOUNT = 100000000n;
14
+ export declare const PROGRAM_BINARIES: {
15
+ readonly mailbox: "hyperlane_sealevel_mailbox.so";
16
+ readonly igp: "hyperlane_sealevel_igp.so";
17
+ readonly multisigIsm: "hyperlane_sealevel_multisig_ism_message_id.so";
18
+ readonly testIsm: "hyperlane_sealevel_test_ism.so";
19
+ readonly validatorAnnounce: "hyperlane_sealevel_validator_announce.so";
20
+ readonly tokenSynthetic: "hyperlane_sealevel_token.so";
21
+ readonly tokenNative: "hyperlane_sealevel_token_native.so";
22
+ readonly tokenCollateral: "hyperlane_sealevel_token_collateral.so";
23
+ };
24
+ export type PreloadableProgram = keyof typeof PROGRAM_BINARIES & keyof typeof TEST_PROGRAM_IDS;
25
+ export declare function getPreloadedPrograms(programs: Array<PreloadableProgram>, programsPath?: string): PreloadedProgram[];
26
+ export declare function airdropSol(rpc: Rpc<SolanaRpcApi>, address: Address, amount?: bigint): Promise<void>;
27
+ export declare function getBalance(rpc: Rpc<SolanaRpcApi>, address: Address): Promise<number>;
28
+ /**
29
+ * Creates a new SPL Token (v1) mint account using only @solana/kit primitives.
30
+ * The signer becomes the mint authority. No freeze authority is set.
31
+ */
32
+ export declare function createSplMint(rpc: SvmRpc, signer: SvmSigner, decimals: number): Promise<Address>;
33
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/testing/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AAEF,eAAO,MAAM,gBAAgB;sBACgC,OAAO;kBACX,OAAO;0BACC,OAAO;sBACX,OAAO;gCACG,OAAO;CACpE,CAAC;AAEX,eAAO,MAAM,6BAA6B,aAAe,CAAC;AAE1D,eAAO,MAAM,gBAAgB;;;;;;;;;CASnB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,gBAAgB,GAC5D,MAAM,OAAO,gBAAgB,CAAC;AAahC,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC,kBAAkB,CAAC,EACnC,YAAY,GAAE,MAA8B,GAC3C,gBAAgB,EAAE,CAmBpB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,MAAwB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAoClB"}
@@ -0,0 +1,120 @@
1
+ import { getCreateAccountInstruction } from '@solana-program/system';
2
+ import { lamports as brandLamports, generateKeyPairSigner, getAddressEncoder, } from '@solana/kit';
3
+ // eslint-disable-next-line import/no-nodejs-modules
4
+ import * as fs from 'fs';
5
+ // eslint-disable-next-line import/no-nodejs-modules
6
+ import * as path from 'path';
7
+ import { assert, retryAsync } from '@hyperlane-xyz/utils';
8
+ import { SPL_TOKEN_PROGRAM_ADDRESS, TOKEN_2022_PROGRAM_ADDRESS, } from '../constants.js';
9
+ import { buildInstruction, writableAccount } from '../instructions/utils.js';
10
+ function findMonorepoRoot() {
11
+ let dir = process.cwd();
12
+ while (dir !== '/') {
13
+ if (fs.existsSync(path.join(dir, 'pnpm-workspace.yaml'))) {
14
+ return dir;
15
+ }
16
+ dir = path.dirname(dir);
17
+ }
18
+ return process.cwd();
19
+ }
20
+ export const DEFAULT_PROGRAMS_PATH = path.join(findMonorepoRoot(), 'rust/sealevel/target/deploy');
21
+ export const TEST_PROGRAM_IDS = {
22
+ mailbox: '2Zvzyv2sstAhs9wu1xaLpH5X17dVouEb8zjkBRPKsSy5',
23
+ igp: 'GZGLpeuMaUXUmBHh1EtgWQDufyUoHapAKFfgKb6u8o3h',
24
+ multisigIsm: 'EALSQwzJFwRbjDjBkwNziHXnowfgwt9ixKapKiudGa45',
25
+ testIsm: '2nss3sLwiUCP98rXQ6FciJ35cDeSLu3VEU5mFRa7p43J',
26
+ validatorAnnounce: '4ZiKsHnTUbgH97sMggds4NfV31yBB3hsJJEKk1Fj8NyL',
27
+ };
28
+ export const TEST_ATA_PAYER_FUNDING_AMOUNT = 100000000n;
29
+ export const PROGRAM_BINARIES = {
30
+ mailbox: 'hyperlane_sealevel_mailbox.so',
31
+ igp: 'hyperlane_sealevel_igp.so',
32
+ multisigIsm: 'hyperlane_sealevel_multisig_ism_message_id.so',
33
+ testIsm: 'hyperlane_sealevel_test_ism.so',
34
+ validatorAnnounce: 'hyperlane_sealevel_validator_announce.so',
35
+ tokenSynthetic: 'hyperlane_sealevel_token.so',
36
+ tokenNative: 'hyperlane_sealevel_token_native.so',
37
+ tokenCollateral: 'hyperlane_sealevel_token_collateral.so',
38
+ };
39
+ // Token-2022 v10.0.0 binary — fixes InvalidRealloc on Agave v3.0+ where the
40
+ // stricter_abi_and_runtime_constraints feature gate rejects the older program's
41
+ // non-zero-init realloc calls during InitializeTokenMetadata.
42
+ // See https://github.com/anza-xyz/agave/issues/9799
43
+ // Binary source: https://github.com/solana-program/token-2022/releases/tag/program%40v10.0.0
44
+ const TOKEN_2022_V10_SO_PATH = path.join(path.dirname(new URL(import.meta.url).pathname), 'fixtures', 'spl_token_2022_v10.so');
45
+ export function getPreloadedPrograms(programs, programsPath = DEFAULT_PROGRAMS_PATH) {
46
+ const preloaded = programs.map((program) => {
47
+ const programId = TEST_PROGRAM_IDS[program];
48
+ assert(programId, `Program '${program}' not found in TEST_PROGRAM_IDS`);
49
+ return {
50
+ programId,
51
+ soPath: path.join(programsPath, PROGRAM_BINARIES[program]),
52
+ };
53
+ });
54
+ // Override the built-in Token-2022 with v10.0.0 to fix realloc on v3.0+.
55
+ if (fs.existsSync(TOKEN_2022_V10_SO_PATH)) {
56
+ preloaded.push({
57
+ programId: TOKEN_2022_PROGRAM_ADDRESS,
58
+ soPath: TOKEN_2022_V10_SO_PATH,
59
+ });
60
+ }
61
+ return preloaded;
62
+ }
63
+ export async function airdropSol(rpc, address, amount = 10000000000n) {
64
+ const signature = await retryAsync(() => rpc.requestAirdrop(address, brandLamports(amount)).send());
65
+ let confirmed = false;
66
+ for (let i = 0; i < 30 && !confirmed; i++) {
67
+ await new Promise((resolve) => setTimeout(resolve, 1000));
68
+ const status = await rpc.getSignatureStatuses([signature]).send();
69
+ const result = status.value[0];
70
+ if (result && result.confirmationStatus) {
71
+ if (result.err) {
72
+ throw new Error(`Airdrop failed: ${signature}, err: ${JSON.stringify(result.err)}`);
73
+ }
74
+ if (result.confirmationStatus === 'confirmed' ||
75
+ result.confirmationStatus === 'finalized') {
76
+ confirmed = true;
77
+ }
78
+ }
79
+ }
80
+ if (!confirmed) {
81
+ throw new Error(`Airdrop not confirmed: ${signature}`);
82
+ }
83
+ }
84
+ export async function getBalance(rpc, address) {
85
+ const result = await rpc.getBalance(address).send();
86
+ return Number(result.value) / 1_000_000_000;
87
+ }
88
+ /**
89
+ * Creates a new SPL Token (v1) mint account using only @solana/kit primitives.
90
+ * The signer becomes the mint authority. No freeze authority is set.
91
+ */
92
+ export async function createSplMint(rpc, signer, decimals) {
93
+ /** SPL Token mint account size in bytes. */
94
+ const MINT_SIZE = 82n;
95
+ const mintSigner = await generateKeyPairSigner();
96
+ const rent = await rpc.getMinimumBalanceForRentExemption(MINT_SIZE).send();
97
+ const createAccountIx = getCreateAccountInstruction({
98
+ payer: signer.signer,
99
+ newAccount: mintSigner,
100
+ lamports: rent,
101
+ space: MINT_SIZE,
102
+ programAddress: SPL_TOKEN_PROGRAM_ADDRESS,
103
+ });
104
+ // SPL Token InitializeMint2 (discriminator 20):
105
+ // decimals(1) + mintAuthority(32) + freezeAuthorityOption(1 = None)
106
+ const addrEncoder = getAddressEncoder();
107
+ const initMintData = new Uint8Array(35);
108
+ initMintData[0] = 20; // InitializeMint2 discriminator
109
+ initMintData[1] = decimals;
110
+ initMintData.set(addrEncoder.encode(signer.signer.address), 2);
111
+ initMintData[34] = 0; // freeze authority: None
112
+ const initMintIx = buildInstruction(SPL_TOKEN_PROGRAM_ADDRESS, [writableAccount(mintSigner.address)], initMintData);
113
+ await signer.send({
114
+ instructions: [createAccountIx, initMintIx],
115
+ additionalSigners: [mintSigner],
116
+ skipPreflight: true,
117
+ });
118
+ return mintSigner.address;
119
+ }
120
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/testing/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type ChildProcess } from 'child_process';
2
+ import { type StartedTestContainer } from 'testcontainers';
3
+ export declare const SOLANA_VALIDATOR_IMAGE = "anzaxyz/agave:v3.0.14";
4
+ export declare const SOLANA_RPC_PORT = 8899;
5
+ export declare function isAppleSilicon(): boolean;
6
+ export declare function findSolanaTestValidator(): string | null;
7
+ export interface PreloadedProgram {
8
+ programId: string;
9
+ soPath: string;
10
+ }
11
+ export interface SolanaValidatorConfig {
12
+ image?: string;
13
+ keepRunning?: boolean;
14
+ validatorArgs?: string[];
15
+ forceDocker?: boolean;
16
+ binaryPath?: string;
17
+ rpcPort?: number;
18
+ preloadedPrograms?: PreloadedProgram[];
19
+ platform?: string;
20
+ }
21
+ export interface SolanaTestValidator {
22
+ rpcUrl: string;
23
+ mode: 'local' | 'docker';
24
+ stop(): Promise<void>;
25
+ container?: StartedTestContainer;
26
+ process?: ChildProcess;
27
+ }
28
+ export type SolanaTestContainer = SolanaTestValidator;
29
+ export declare function startSolanaTestValidator(config?: SolanaValidatorConfig): Promise<SolanaTestValidator>;
30
+ export declare function waitForRpcReady(rpcUrl: string, maxAttempts?: number, delayMs?: number): Promise<void>;
31
+ export declare const APPLE_SILICON_SKIP_MESSAGE: string;
32
+ //# sourceMappingURL=solana-container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solana-container.d.ts","sourceRoot":"","sources":["../../src/testing/solana-container.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,eAAe,CAAC;AASvB,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,gBAAgB,CAAC;AAOxB,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAC9D,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,wBAAgB,cAAc,IAAI,OAAO,CAUxC;AA2CD,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CA2CvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAwLtD,wBAAsB,wBAAwB,CAC5C,MAAM,GAAE,qBAA0B,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA0B9B;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,SAAK,EAChB,OAAO,SAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,eAAO,MAAM,0BAA0B,QAEW,CAAC"}
@@ -0,0 +1,289 @@
1
+ // eslint-disable-next-line import/no-nodejs-modules
2
+ import { execFileSync, execSync, spawn, } from 'child_process';
3
+ // eslint-disable-next-line import/no-nodejs-modules
4
+ import * as fs from 'fs';
5
+ // eslint-disable-next-line import/no-nodejs-modules
6
+ import * as os from 'os';
7
+ // eslint-disable-next-line import/no-nodejs-modules
8
+ import * as path from 'path';
9
+ import { isNullish } from '@hyperlane-xyz/utils';
10
+ import { GenericContainer, Wait, } from 'testcontainers';
11
+ // Agave v3.0.x activates stricter_abi_and_runtime_constraints which rejects
12
+ // the old Token-2022 program's non-zero-init realloc calls. The test setup
13
+ // overrides the built-in Token-2022 with v10.0.0 (via --bpf-program) which
14
+ // uses zero-init realloc and is compatible with the stricter runtime.
15
+ // See https://github.com/anza-xyz/agave/issues/9799
16
+ export const SOLANA_VALIDATOR_IMAGE = 'anzaxyz/agave:v3.0.14';
17
+ export const SOLANA_RPC_PORT = 8899;
18
+ export function isAppleSilicon() {
19
+ try {
20
+ const arch = execSync('uname -m', { encoding: 'utf-8' }).trim();
21
+ const osName = execSync('uname -s', { encoding: 'utf-8' }).trim();
22
+ return osName === 'Darwin' && arch === 'arm64';
23
+ }
24
+ catch (error) {
25
+ // eslint-disable-next-line no-console
26
+ console.warn('Failed to detect platform architecture:', error);
27
+ return false;
28
+ }
29
+ }
30
+ const MIN_SOLANA_VERSION = { major: 3, minor: 0 };
31
+ function parseVersion(version) {
32
+ const match = version.match(/(\d+)\.(\d+)/);
33
+ if (!match)
34
+ return null;
35
+ return { major: parseInt(match[1], 10), minor: parseInt(match[2], 10) };
36
+ }
37
+ function meetsMinVersion(version, min) {
38
+ if (version.major > min.major)
39
+ return true;
40
+ if (version.major === min.major && version.minor >= min.minor)
41
+ return true;
42
+ return false;
43
+ }
44
+ function getValidatorVersion(binaryPath) {
45
+ try {
46
+ const output = execFileSync(binaryPath, ['--version'], {
47
+ encoding: 'utf-8',
48
+ });
49
+ const match = output.match(/solana-test-validator\s+(\d+\.\d+\.\d+)/);
50
+ return match ? match[1] : null;
51
+ }
52
+ catch (error) {
53
+ // eslint-disable-next-line no-console
54
+ console.warn(`Failed to get validator version from ${binaryPath}:`, error);
55
+ return null;
56
+ }
57
+ }
58
+ const SOLANA_BINARY_PATHS = [
59
+ path.join(os.homedir(), '.local/share/solana/install/active_release/bin'),
60
+ path.join(os.homedir(), '.local/share/solana/install/releases/3.0.14/bin'),
61
+ '/tmp/solana-release/bin',
62
+ '/opt/homebrew/bin',
63
+ '/usr/local/bin',
64
+ ];
65
+ export function findSolanaTestValidator() {
66
+ const candidates = [];
67
+ for (const basePath of SOLANA_BINARY_PATHS) {
68
+ const binaryPath = path.join(basePath, 'solana-test-validator');
69
+ if (fs.existsSync(binaryPath)) {
70
+ const version = getValidatorVersion(binaryPath);
71
+ if (version) {
72
+ candidates.push({ path: binaryPath, version });
73
+ }
74
+ }
75
+ }
76
+ try {
77
+ const result = execSync('which solana-test-validator', {
78
+ encoding: 'utf-8',
79
+ }).trim();
80
+ if (result && fs.existsSync(result)) {
81
+ const version = getValidatorVersion(result);
82
+ if (version && !candidates.some((c) => c.path === result)) {
83
+ candidates.push({ path: result, version });
84
+ }
85
+ }
86
+ }
87
+ catch (error) {
88
+ // eslint-disable-next-line no-console
89
+ console.warn('solana-test-validator not found in PATH:', error);
90
+ }
91
+ if (candidates.length === 0)
92
+ return null;
93
+ for (const candidate of candidates) {
94
+ const parsed = parseVersion(candidate.version);
95
+ if (parsed && meetsMinVersion(parsed, MIN_SOLANA_VERSION)) {
96
+ return candidate.path;
97
+ }
98
+ }
99
+ // eslint-disable-next-line no-console
100
+ console.warn(`Warning: No Solana v${MIN_SOLANA_VERSION.major}.x found. ` +
101
+ `Using ${candidates[0].version} which may have compatibility issues.`);
102
+ return candidates[0].path;
103
+ }
104
+ async function startLocalValidator(config) {
105
+ const { binaryPath, keepRunning = false, validatorArgs = [], rpcPort = SOLANA_RPC_PORT, preloadedPrograms = [], } = config;
106
+ const solanaPath = binaryPath ?? findSolanaTestValidator();
107
+ if (!solanaPath) {
108
+ throw new Error('solana-test-validator binary not found. Install from https://docs.anza.xyz/cli/install');
109
+ }
110
+ const ledgerDir = fs.mkdtempSync(path.join(os.tmpdir(), 'solana-ledger-'));
111
+ const bpfProgramArgs = [];
112
+ for (const program of preloadedPrograms) {
113
+ bpfProgramArgs.push('--bpf-program', program.programId, program.soPath);
114
+ }
115
+ const args = [
116
+ '--rpc-port',
117
+ String(rpcPort),
118
+ '--ledger',
119
+ ledgerDir,
120
+ '--reset',
121
+ ...bpfProgramArgs,
122
+ ...validatorArgs,
123
+ ];
124
+ const proc = spawn(solanaPath, args, {
125
+ stdio: ['ignore', 'pipe', 'pipe'],
126
+ detached: false,
127
+ });
128
+ const rpcUrl = `http://127.0.0.1:${rpcPort}`;
129
+ await new Promise((resolve, reject) => {
130
+ let output = '';
131
+ const timeout = setTimeout(() => {
132
+ proc.kill();
133
+ proc.stdout?.removeAllListeners();
134
+ proc.stderr?.removeAllListeners();
135
+ reject(new Error('Timeout waiting for validator to start'));
136
+ }, 120_000);
137
+ const checkReady = (data) => {
138
+ output += data.toString();
139
+ if (output.includes('JSON RPC URL:') || output.includes('RPC URL:')) {
140
+ clearTimeout(timeout);
141
+ resolve();
142
+ }
143
+ };
144
+ proc.stdout?.on('data', checkReady);
145
+ proc.stderr?.on('data', checkReady);
146
+ proc.on('error', (err) => {
147
+ clearTimeout(timeout);
148
+ reject(err);
149
+ });
150
+ proc.on('exit', (code) => {
151
+ if (code !== 0 && code !== null) {
152
+ clearTimeout(timeout);
153
+ reject(new Error(`Validator exited with code ${code}: ${output}`));
154
+ }
155
+ });
156
+ });
157
+ return {
158
+ rpcUrl,
159
+ mode: 'local',
160
+ process: proc,
161
+ async stop() {
162
+ if (!keepRunning && proc && isNullish(proc.exitCode)) {
163
+ proc.kill('SIGTERM');
164
+ await new Promise((resolve) => setTimeout(resolve, 1000));
165
+ if (isNullish(proc.exitCode)) {
166
+ proc.kill('SIGKILL');
167
+ }
168
+ }
169
+ try {
170
+ fs.rmSync(ledgerDir, { recursive: true, force: true });
171
+ }
172
+ catch {
173
+ // Best-effort cleanup — ledger dir may already be removed
174
+ }
175
+ },
176
+ };
177
+ }
178
+ async function startDockerValidator(config) {
179
+ const { image = SOLANA_VALIDATOR_IMAGE, keepRunning = false, validatorArgs = [], rpcPort = SOLANA_RPC_PORT, preloadedPrograms = [], platform, } = config;
180
+ const bpfProgramArgs = [];
181
+ const hostDirToContainerDir = new Map();
182
+ let mountIndex = 0;
183
+ for (const program of preloadedPrograms) {
184
+ const hostDir = path.dirname(program.soPath);
185
+ const fileName = path.basename(program.soPath);
186
+ if (!hostDirToContainerDir.has(hostDir)) {
187
+ hostDirToContainerDir.set(hostDir, `/programs/${mountIndex++}`);
188
+ }
189
+ const containerDir = hostDirToContainerDir.get(hostDir);
190
+ bpfProgramArgs.push('--bpf-program', program.programId, `${containerDir}/${fileName}`);
191
+ }
192
+ const entrypoint = ['solana-test-validator'];
193
+ const command = [
194
+ '--rpc-port',
195
+ String(rpcPort),
196
+ '--bind-address',
197
+ '0.0.0.0',
198
+ '--ledger',
199
+ '/tmp/solana-ledger',
200
+ '--reset',
201
+ '--log',
202
+ ...bpfProgramArgs,
203
+ ...validatorArgs,
204
+ ];
205
+ let builder = new GenericContainer(image)
206
+ .withEntrypoint(entrypoint)
207
+ .withExposedPorts(rpcPort)
208
+ .withCommand(command)
209
+ .withWaitStrategy(Wait.forLogMessage(/Processed Slot:/, 1))
210
+ .withStartupTimeout(120_000);
211
+ const effectivePlatform = platform ?? (isAppleSilicon() ? 'linux/amd64' : undefined);
212
+ if (effectivePlatform) {
213
+ builder = builder.withPlatform(effectivePlatform);
214
+ }
215
+ const bindMounts = [...hostDirToContainerDir.entries()].map(([hostDir, containerDir]) => ({
216
+ source: hostDir,
217
+ target: containerDir,
218
+ mode: 'ro',
219
+ }));
220
+ if (bindMounts.length > 0) {
221
+ builder = builder.withBindMounts(bindMounts);
222
+ }
223
+ const container = await builder.start();
224
+ const mappedPort = container.getMappedPort(rpcPort);
225
+ const host = container.getHost();
226
+ const rpcUrl = `http://${host}:${mappedPort}`;
227
+ return {
228
+ rpcUrl,
229
+ mode: 'docker',
230
+ container,
231
+ async stop() {
232
+ if (!keepRunning) {
233
+ await container.stop();
234
+ }
235
+ },
236
+ };
237
+ }
238
+ export async function startSolanaTestValidator(config = {}) {
239
+ const { forceDocker = false } = config;
240
+ if (!forceDocker) {
241
+ const localBinary = config.binaryPath ?? findSolanaTestValidator();
242
+ if (localBinary) {
243
+ // eslint-disable-next-line no-console
244
+ console.log(`Using local solana-test-validator: ${localBinary}`);
245
+ return startLocalValidator({ ...config, binaryPath: localBinary });
246
+ }
247
+ }
248
+ if (isAppleSilicon()) {
249
+ throw new Error('No local solana-test-validator found on Apple Silicon.\n' +
250
+ 'Docker is not supported: Solana requires AVX instructions that Rosetta 2 cannot emulate.\n' +
251
+ 'Install natively from: https://docs.anza.xyz/cli/install\n' +
252
+ 'Or download directly:\n' +
253
+ ' curl -L -o /tmp/solana.tar.bz2 https://github.com/anza-xyz/agave/releases/download/v3.0.14/solana-release-aarch64-apple-darwin.tar.bz2\n' +
254
+ ' tar jxf /tmp/solana.tar.bz2 -C /tmp');
255
+ }
256
+ // eslint-disable-next-line no-console
257
+ console.log('Using Docker for solana-test-validator');
258
+ return startDockerValidator(config);
259
+ }
260
+ export async function waitForRpcReady(rpcUrl, maxAttempts = 30, delayMs = 1000) {
261
+ let lastError;
262
+ for (let i = 0; i < maxAttempts; i++) {
263
+ try {
264
+ const response = await fetch(rpcUrl, {
265
+ method: 'POST',
266
+ headers: { 'Content-Type': 'application/json' },
267
+ body: JSON.stringify({
268
+ jsonrpc: '2.0',
269
+ id: 1,
270
+ method: 'getHealth',
271
+ }),
272
+ });
273
+ if (response.ok) {
274
+ const data = await response.json();
275
+ if (data.result === 'ok') {
276
+ return;
277
+ }
278
+ }
279
+ }
280
+ catch (error) {
281
+ lastError = error;
282
+ }
283
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
284
+ }
285
+ throw new Error(`RPC endpoint not ready after ${maxAttempts} attempts. Last error: ${lastError}`);
286
+ }
287
+ export const APPLE_SILICON_SKIP_MESSAGE = 'Skipping: No local solana-test-validator found and Docker unavailable. ' +
288
+ 'Install from https://docs.anza.xyz/cli/install';
289
+ //# sourceMappingURL=solana-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solana-container.js","sourceRoot":"","sources":["../../src/testing/solana-container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=collateral-token.e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateral-token.e2e-test.d.ts","sourceRoot":"","sources":["../../src/tests/collateral-token.e2e-test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { address } from '@solana/kit';
2
+ import { expect } from 'chai';
3
+ import { after, before, describe, it } from 'mocha';
4
+ import { HYPERLANE_SVM_PROGRAM_BYTES } from '../hyperlane/program-bytes.js';
5
+ import { ArtifactState } from '@hyperlane-xyz/provider-sdk/artifact';
6
+ import { TokenType } from '@hyperlane-xyz/provider-sdk/warp';
7
+ import { SvmSigner } from '../clients/signer.js';
8
+ import { DEFAULT_IGP_SALT, SvmIgpHookWriter, } from '../hook/igp-hook.js';
9
+ import { SvmTestIsmWriter } from '../ism/test-ism.js';
10
+ import { deriveAtaPayerPda } from '../pda.js';
11
+ import { createRpc } from '../rpc.js';
12
+ import { TEST_ATA_PAYER_FUNDING_AMOUNT, TEST_PROGRAM_IDS, airdropSol, createSplMint, getPreloadedPrograms, } from '../testing/setup.js';
13
+ import { startSolanaTestValidator, waitForRpcReady, } from '../testing/solana-container.js';
14
+ import { SvmCollateralTokenWriter } from '../warp/collateral-token.js';
15
+ import { defineWarpTokenTests } from './warp-token-suite.js';
16
+ const TEST_PRIVATE_KEY = '0x0000000000000000000000000000000000000000000000000000000000000001';
17
+ const PRELOADED_PROGRAMS = [
18
+ 'mailbox',
19
+ 'igp',
20
+ 'testIsm',
21
+ ];
22
+ describe('SVM Collateral Warp Token E2E Tests', function () {
23
+ this.timeout(300_000);
24
+ let solana;
25
+ let rpc;
26
+ let signer;
27
+ let mailboxAddress;
28
+ let collateralMint;
29
+ let igpProgramId;
30
+ let testIsmAddress;
31
+ let writer;
32
+ before(async () => {
33
+ const preloadedPrograms = getPreloadedPrograms(PRELOADED_PROGRAMS);
34
+ solana = await startSolanaTestValidator({ preloadedPrograms });
35
+ await waitForRpcReady(solana.rpcUrl);
36
+ rpc = createRpc(solana.rpcUrl);
37
+ signer = await SvmSigner.connectWithSigner([solana.rpcUrl], TEST_PRIVATE_KEY);
38
+ await airdropSol(rpc, address(signer.getSignerAddress()), 50000000000n);
39
+ mailboxAddress = TEST_PROGRAM_IDS.mailbox;
40
+ igpProgramId = TEST_PROGRAM_IDS.igp;
41
+ const igpConfig = {
42
+ type: 'interchainGasPaymaster',
43
+ owner: signer.getSignerAddress(),
44
+ beneficiary: signer.getSignerAddress(),
45
+ oracleKey: signer.getSignerAddress(),
46
+ overhead: { 1: 50000 },
47
+ oracleConfig: {
48
+ 1: { gasPrice: '1', tokenExchangeRate: '1000000000000000000' },
49
+ },
50
+ program: { programId: igpProgramId },
51
+ };
52
+ const igpWriter = new SvmIgpHookWriter(rpc, DEFAULT_IGP_SALT, signer);
53
+ await igpWriter.create({
54
+ artifactState: ArtifactState.NEW,
55
+ config: igpConfig,
56
+ });
57
+ testIsmAddress = TEST_PROGRAM_IDS.testIsm;
58
+ const ismConfig = {
59
+ type: 'testIsm',
60
+ program: { programId: testIsmAddress },
61
+ };
62
+ const ismWriter = new SvmTestIsmWriter(rpc, signer);
63
+ await ismWriter.create({
64
+ artifactState: ArtifactState.NEW,
65
+ config: ismConfig,
66
+ });
67
+ // Create a collateral SPL mint for the test.
68
+ collateralMint = await createSplMint(rpc, signer, 9);
69
+ writer = new SvmCollateralTokenWriter({
70
+ program: { programBytes: HYPERLANE_SVM_PROGRAM_BYTES.tokenCollateral },
71
+ ataPayerFundingAmount: TEST_ATA_PAYER_FUNDING_AMOUNT,
72
+ }, rpc, signer);
73
+ });
74
+ after(async () => {
75
+ if (solana) {
76
+ await solana.stop();
77
+ }
78
+ });
79
+ describe('Collateral Token', () => {
80
+ let deployedProgramId;
81
+ defineWarpTokenTests(() => ({
82
+ writer,
83
+ makeConfig: (overrides = {}) => ({
84
+ type: TokenType.collateral,
85
+ owner: signer.getSignerAddress(),
86
+ mailbox: mailboxAddress,
87
+ token: collateralMint,
88
+ remoteRouters: {},
89
+ destinationGas: {},
90
+ ...overrides,
91
+ }),
92
+ igpProgramId,
93
+ testIsmAddress,
94
+ signer,
95
+ rpc,
96
+ rpcUrl: solana.rpcUrl,
97
+ }), (id) => {
98
+ deployedProgramId = id;
99
+ });
100
+ it('should fund ATA payer PDA after deploy', async () => {
101
+ const { address: ataPayerPda } = await deriveAtaPayerPda(address(deployedProgramId));
102
+ const balance = await rpc.getBalance(ataPayerPda).send();
103
+ expect(BigInt(balance.value) >= TEST_ATA_PAYER_FUNDING_AMOUNT).to.be.true;
104
+ });
105
+ it('should have correct collateral token address after deploy', async () => {
106
+ const token = await writer.read(deployedProgramId);
107
+ expect(token.config.token).to.equal(collateralMint);
108
+ expect(token.config.mailbox).to.equal(mailboxAddress);
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=collateral-token.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateral-token.e2e-test.js","sourceRoot":"","sources":["../../src/tests/collateral-token.e2e-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deploy.e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.e2e-test.d.ts","sourceRoot":"","sources":["../../src/tests/deploy.e2e-test.ts"],"names":[],"mappings":""}