@layerzerolabs/lz-v2-stellar-sdk 0.2.13 → 0.2.18

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 (107) hide show
  1. package/.turbo/turbo-build.log +1 -0
  2. package/.turbo/turbo-test.log +1009 -0
  3. package/dist/generated/bml.d.ts +104 -37
  4. package/dist/generated/bml.js +83 -42
  5. package/dist/generated/counter.d.ts +334 -175
  6. package/dist/generated/counter.js +109 -63
  7. package/dist/generated/dvn.d.ts +1985 -0
  8. package/dist/generated/dvn.js +326 -0
  9. package/dist/generated/dvn_fee_lib.d.ts +690 -0
  10. package/dist/generated/dvn_fee_lib.js +163 -0
  11. package/dist/generated/endpoint.d.ts +155 -46
  12. package/dist/generated/endpoint.js +93 -50
  13. package/dist/generated/executor.d.ts +1841 -0
  14. package/dist/generated/executor.js +312 -0
  15. package/dist/generated/executor_fee_lib.d.ts +1083 -0
  16. package/dist/generated/executor_fee_lib.js +255 -0
  17. package/dist/generated/executor_helper.d.ts +981 -0
  18. package/dist/generated/executor_helper.js +236 -0
  19. package/dist/generated/oft_std.d.ts +1722 -0
  20. package/dist/generated/oft_std.js +316 -0
  21. package/dist/generated/price_feed.d.ts +1077 -0
  22. package/dist/generated/price_feed.js +210 -0
  23. package/dist/generated/sml.d.ts +171 -56
  24. package/dist/generated/sml.js +111 -62
  25. package/dist/generated/treasury.d.ts +896 -0
  26. package/dist/generated/treasury.js +219 -0
  27. package/dist/generated/uln302.d.ts +175 -75
  28. package/dist/generated/uln302.js +126 -82
  29. package/dist/generated/upgrader.d.ts +70 -0
  30. package/dist/generated/upgrader.js +19 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.js +14 -0
  33. package/dist/wasm/blocked-message-lib.d.ts +1 -0
  34. package/dist/wasm/blocked-message-lib.js +2 -0
  35. package/dist/wasm/counter.d.ts +1 -0
  36. package/dist/wasm/counter.js +2 -0
  37. package/dist/wasm/dvn-fee-lib.d.ts +1 -0
  38. package/dist/wasm/dvn-fee-lib.js +2 -0
  39. package/dist/wasm/dvn.d.ts +1 -0
  40. package/dist/wasm/dvn.js +2 -0
  41. package/dist/wasm/endpoint-v2.d.ts +1 -0
  42. package/dist/wasm/endpoint-v2.js +2 -0
  43. package/dist/wasm/executor-fee-lib.d.ts +1 -0
  44. package/dist/wasm/executor-fee-lib.js +2 -0
  45. package/dist/wasm/executor-helper.d.ts +1 -0
  46. package/dist/wasm/executor-helper.js +2 -0
  47. package/dist/wasm/executor.d.ts +1 -0
  48. package/dist/wasm/executor.js +2 -0
  49. package/dist/wasm/layerzero-views.d.ts +1 -0
  50. package/dist/wasm/layerzero-views.js +2 -0
  51. package/dist/wasm/oft-std.d.ts +1 -0
  52. package/dist/wasm/oft-std.js +2 -0
  53. package/dist/wasm/price-feed.d.ts +1 -0
  54. package/dist/wasm/price-feed.js +2 -0
  55. package/dist/wasm/simple-message-lib.d.ts +1 -0
  56. package/dist/wasm/simple-message-lib.js +2 -0
  57. package/dist/wasm/treasury.d.ts +1 -0
  58. package/dist/wasm/treasury.js +2 -0
  59. package/dist/wasm/uln302.d.ts +1 -0
  60. package/dist/wasm/uln302.js +2 -0
  61. package/dist/wasm/upgrader.d.ts +1 -0
  62. package/dist/wasm/upgrader.js +2 -0
  63. package/dist/wasm.d.ts +15 -0
  64. package/dist/wasm.js +15 -0
  65. package/package.json +12 -9
  66. package/src/generated/bml.ts +117 -66
  67. package/src/generated/counter.ts +338 -191
  68. package/src/generated/dvn.ts +2036 -0
  69. package/src/generated/dvn_fee_lib.ts +693 -0
  70. package/src/generated/endpoint.ts +177 -80
  71. package/src/generated/executor.ts +228 -127
  72. package/src/generated/executor_fee_lib.ts +1072 -0
  73. package/src/generated/executor_helper.ts +163 -57
  74. package/src/generated/oft_std.ts +800 -246
  75. package/src/generated/price_feed.ts +1108 -0
  76. package/src/generated/sml.ts +194 -91
  77. package/src/generated/treasury.ts +943 -0
  78. package/src/generated/uln302.ts +211 -113
  79. package/src/generated/upgrader.ts +102 -0
  80. package/src/index.ts +17 -0
  81. package/src/wasm/blocked-message-lib.ts +2 -0
  82. package/src/wasm/counter.ts +2 -0
  83. package/src/wasm/dvn-fee-lib.ts +2 -0
  84. package/src/wasm/dvn.ts +2 -0
  85. package/src/wasm/endpoint-v2.ts +2 -0
  86. package/src/wasm/executor-fee-lib.ts +2 -0
  87. package/src/wasm/executor-helper.ts +2 -0
  88. package/src/wasm/executor.ts +2 -0
  89. package/src/wasm/layerzero-views.ts +2 -0
  90. package/src/wasm/oft-std.ts +2 -0
  91. package/src/wasm/price-feed.ts +2 -0
  92. package/src/wasm/simple-message-lib.ts +2 -0
  93. package/src/wasm/treasury.ts +2 -0
  94. package/src/wasm/uln302.ts +2 -0
  95. package/src/wasm/upgrader.ts +2 -0
  96. package/src/wasm.ts +15 -0
  97. package/test/counter-sml.test.ts +376 -0
  98. package/test/counter-uln.test.ts +493 -0
  99. package/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  100. package/test/suites/constants.ts +22 -2
  101. package/test/suites/dummyContractClient.ts +169 -0
  102. package/test/suites/globalSetup.ts +450 -0
  103. package/test/suites/localnet.ts +23 -6
  104. package/test/upgrader.test.ts +300 -0
  105. package/test/utils.ts +558 -85
  106. package/vitest.config.ts +21 -0
  107. package/test/index.test.ts +0 -376
@@ -2,102 +2,56 @@ import {
2
2
  Address,
3
3
  Asset,
4
4
  BASE_FEE,
5
- Contract,
6
5
  Keypair,
7
- nativeToScVal,
8
6
  Operation,
9
7
  rpc,
10
- scValToNative,
11
8
  StrKey,
12
9
  TransactionBuilder,
13
10
  } from '@stellar/stellar-sdk';
14
11
  import path from 'path';
15
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
16
- import { $ } from 'zx';
12
+ import { beforeAll, describe, expect, inject, it } from 'vitest';
17
13
 
18
14
  import { getFullyQualifiedRepoRootPath } from '@layerzerolabs/common-node-utils';
19
15
  import { PacketSerializer, PacketV1Codec } from '@layerzerolabs/lz-v2-utilities';
20
16
 
21
17
  import { Client as EndpointClient } from '../src/generated/endpoint';
22
- import { Client as ExecutorClient } from '../src/generated/executor';
23
18
  import { Client as ExecutorHelperClient } from '../src/generated/executor_helper';
24
- import { Client as OFTStdClient, SendParam } from '../src/generated/oft_std';
19
+ import { Client as OFTStdClient, OFTMode, SendParam } from '../src/generated/oft_std';
25
20
  import { Client as SMLClient } from '../src/generated/sml';
26
21
  import {
27
22
  DEFAULT_DEPLOYER,
28
23
  EID,
29
- NATIVE_TOKEN_ADDRESS,
24
+ EXECUTOR_ADMIN,
30
25
  NETWORK_PASSPHRASE,
31
26
  RPC_URL,
32
- ZRO_TOKEN_ADDRESS,
33
27
  } from './suites/constants';
34
28
  import { deployAssetSac, deployContract } from './suites/deploy';
35
- import { fundAccount, startStellarLocalnet, stopStellarLocalnet } from './suites/localnet';
29
+ import { fundAccount } from './suites/localnet';
36
30
  import { PacketSentEvent, scanPacketSentEvents } from './suites/scan';
37
- import { assertTransactionsSucceeded, signExecutorAuthEntries } from './utils';
38
-
39
- /**
40
- * Helper to get SAC token balance for an address
41
- */
42
- async function getSacBalance(tokenAddress: string, accountAddress: string): Promise<bigint> {
43
- const server = new rpc.Server(RPC_URL, { allowHttp: true });
44
- const tokenContract = new Contract(tokenAddress);
45
-
46
- // Build the balance call
47
- const balanceOp = tokenContract.call(
48
- 'balance',
49
- nativeToScVal(Address.fromString(accountAddress), { type: 'address' }),
50
- );
31
+ import {
32
+ assertTransactionSucceeded,
33
+ createClient,
34
+ getTokenBalance,
35
+ signAndSendWithExecutorAuth,
36
+ } from './utils';
37
+
38
+ // Protocol addresses (will be injected from globalSetup in beforeAll)
39
+ let protocolAddresses: ReturnType<typeof inject<'protocolAddresses'>>;
51
40
 
52
- const account = await server.getAccount(DEFAULT_DEPLOYER.publicKey());
53
- const tx = new TransactionBuilder(account, {
54
- fee: BASE_FEE,
55
- networkPassphrase: NETWORK_PASSPHRASE,
56
- })
57
- .addOperation(balanceOp)
58
- .setTimeout(30)
59
- .build();
60
-
61
- const simulated = await server.simulateTransaction(tx);
62
- if (rpc.Api.isSimulationError(simulated)) {
63
- throw new Error(`Balance query failed: ${JSON.stringify(simulated)}`);
64
- }
65
-
66
- // Extract result from simulation
67
- const result = (simulated as rpc.Api.SimulateTransactionSuccessResponse).result;
68
- if (result?.retval) {
69
- return scValToNative(result.retval) as bigint;
70
- }
71
- return 0n;
72
- }
73
-
74
- $.verbose = true;
75
- $.stdio = ['inherit', 'pipe', process.stderr];
76
-
77
- // Contract addresses
78
- const CONTRACT_ADDRESSES = {
79
- endpointV2: '',
80
- sml: '',
81
- executor: '',
82
- executorHelper: '',
83
- oftToken: '', // The SAC for OFT token
84
- lockUnlockOft: '',
85
- mintBurnOft: '',
86
- };
41
+ // OFT-specific addresses
42
+ let oftTokenAddress = '';
43
+ let lockUnlockOftAddress = '';
44
+ let mintBurnOftAddress = '';
87
45
 
88
46
  // Clients
89
47
  let endpointClient: EndpointClient;
90
48
  let smlClient: SMLClient;
91
- let executorClient: ExecutorClient;
92
49
  let executorHelperClient: ExecutorHelperClient;
93
50
  let lockUnlockOftClient: OFTStdClient;
94
51
  let mintBurnOftClient: OFTStdClient;
95
52
 
96
53
  // Test accounts
97
- const EXECUTOR_ADMIN = Keypair.random();
98
54
  const TOKEN_ISSUER = Keypair.random();
99
- // Use DEFAULT_DEPLOYER as SENDER (same pattern as Counter test)
100
- // The deployer has proper signing setup with the contract clients
101
55
 
102
56
  // Recipients for each direction
103
57
  const RECIPIENT_A = Keypair.random(); // Receives tokens in Lock/Unlock -> Mint/Burn direction
@@ -114,7 +68,7 @@ const SEND_AMOUNT = 100_0000000n; // 100 tokens in local decimals (7 decimals)
114
68
 
115
69
  // NOTE: run `stellar contract build` before running the test
116
70
 
117
- describe('OFT E2E Testing with SAC', async () => {
71
+ describe('OFT E2E Testing with SAC (SML)', async () => {
118
72
  const repoRoot = await getFullyQualifiedRepoRootPath();
119
73
  const wasmDir = path.join(
120
74
  repoRoot,
@@ -126,99 +80,33 @@ describe('OFT E2E Testing with SAC', async () => {
126
80
  'release',
127
81
  );
128
82
 
129
- const ENDPOINT_WASM_PATH = path.join(wasmDir, 'endpoint_v2.wasm');
130
- const SML_WASM_PATH = path.join(wasmDir, 'simple_message_lib.wasm');
131
- const EXECUTOR_WASM_PATH = path.join(wasmDir, 'executor.wasm');
132
- const EXECUTOR_HELPER_WASM_PATH = path.join(wasmDir, 'executor_helper.wasm');
133
83
  const OFT_STD_WASM_PATH = path.join(wasmDir, 'oft_std.wasm');
134
84
 
135
85
  beforeAll(async () => {
136
- await startStellarLocalnet();
86
+ // Inject protocol addresses from globalSetup
87
+ protocolAddresses = inject('protocolAddresses');
88
+
89
+ console.log('\nšŸ“‹ Protocol addresses injected from globalSetup');
90
+ console.log(' Endpoint:', protocolAddresses.endpointV2);
91
+ console.log(' SML:', protocolAddresses.sml);
92
+ console.log(' Executor:', protocolAddresses.executor);
93
+ console.log(' Executor Helper:', protocolAddresses.executorHelper);
94
+
95
+ // Create clients for protocol contracts
96
+ endpointClient = createClient(EndpointClient, protocolAddresses.endpointV2);
97
+ smlClient = createClient(SMLClient, protocolAddresses.sml);
98
+ executorHelperClient = createClient(ExecutorHelperClient, protocolAddresses.executorHelper);
99
+
137
100
  // Fund test accounts
138
- await fundAccount(EXECUTOR_ADMIN.publicKey());
139
101
  await fundAccount(TOKEN_ISSUER.publicKey());
140
102
  await fundAccount(RECIPIENT_A.publicKey());
141
103
  await fundAccount(RECIPIENT_B.publicKey());
142
104
 
143
105
  // Create the OFT asset (TOKEN_ISSUER is the issuer)
144
106
  OFT_ASSET = new Asset(OFT_TOKEN_CODE, TOKEN_ISSUER.publicKey());
145
- }, 120000); // 2 minute timeout for setup
146
-
147
- afterAll(async () => {
148
- await stopStellarLocalnet();
149
107
  });
150
108
 
151
- describe('Contract Deployments', () => {
152
- it('Deploy Endpoint', async () => {
153
- endpointClient = await deployContract<EndpointClient>(
154
- EndpointClient,
155
- ENDPOINT_WASM_PATH,
156
- {
157
- eid: EID,
158
- owner: DEFAULT_DEPLOYER.publicKey(),
159
- native_token: NATIVE_TOKEN_ADDRESS,
160
- },
161
- DEFAULT_DEPLOYER,
162
- );
163
-
164
- CONTRACT_ADDRESSES.endpointV2 = endpointClient.options.contractId;
165
- console.log('āœ… Endpoint deployed:', CONTRACT_ADDRESSES.endpointV2);
166
- });
167
-
168
- it('Deploy SimpleMessageLib', async () => {
169
- smlClient = await deployContract<SMLClient>(
170
- SMLClient,
171
- SML_WASM_PATH,
172
- {
173
- owner: DEFAULT_DEPLOYER.publicKey(),
174
- endpoint: CONTRACT_ADDRESSES.endpointV2,
175
- fee_recipient: DEFAULT_DEPLOYER.publicKey(),
176
- },
177
- DEFAULT_DEPLOYER,
178
- );
179
-
180
- CONTRACT_ADDRESSES.sml = smlClient.options.contractId;
181
- console.log('āœ… SimpleMessageLib deployed:', CONTRACT_ADDRESSES.sml);
182
- });
183
-
184
- it('Deploy Executor Helper', async () => {
185
- executorHelperClient = await deployContract<ExecutorHelperClient>(
186
- ExecutorHelperClient,
187
- EXECUTOR_HELPER_WASM_PATH,
188
- undefined,
189
- DEFAULT_DEPLOYER,
190
- );
191
- CONTRACT_ADDRESSES.executorHelper = executorHelperClient.options.contractId;
192
- console.log('āœ… Executor Helper deployed:', CONTRACT_ADDRESSES.executorHelper);
193
- });
194
-
195
- it('Deploy Executor', async () => {
196
- const whitelist = [
197
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'native_drop_and_execute' },
198
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'execute' },
199
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'compose' },
200
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'native_drop' },
201
- ];
202
-
203
- executorClient = await deployContract<ExecutorClient>(
204
- ExecutorClient,
205
- EXECUTOR_WASM_PATH,
206
- {
207
- owner: DEFAULT_DEPLOYER.publicKey(),
208
- endpoint: CONTRACT_ADDRESSES.endpointV2,
209
- whitelist,
210
- admins: [EXECUTOR_ADMIN.publicKey()],
211
- message_libs: [CONTRACT_ADDRESSES.sml],
212
- // FIXME: Add price feed
213
- price_feed: CONTRACT_ADDRESSES.endpointV2,
214
- default_multiplier_bps: 10000,
215
- },
216
- DEFAULT_DEPLOYER,
217
- );
218
- CONTRACT_ADDRESSES.executor = executorClient.options.contractId;
219
- console.log('āœ… Executor deployed:', CONTRACT_ADDRESSES.executor);
220
- });
221
-
109
+ describe('Deploy OFT Contracts', () => {
222
110
  it('Deploy OFT Token SAC', async () => {
223
111
  const server = new rpc.Server(RPC_URL, { allowHttp: true });
224
112
 
@@ -272,8 +160,8 @@ describe('OFT E2E Testing with SAC', async () => {
272
160
  console.log('āœ… OFT token issued to DEFAULT_DEPLOYER');
273
161
 
274
162
  // Step 2: Deploy the SAC for the OFT token
275
- CONTRACT_ADDRESSES.oftToken = await deployAssetSac(OFT_ASSET);
276
- console.log('āœ… OFT Token SAC deployed:', CONTRACT_ADDRESSES.oftToken);
163
+ oftTokenAddress = await deployAssetSac(OFT_ASSET);
164
+ console.log('āœ… OFT Token SAC deployed:', oftTokenAddress);
277
165
  });
278
166
 
279
167
  it('Deploy Lock/Unlock OFT', async () => {
@@ -281,22 +169,22 @@ describe('OFT E2E Testing with SAC', async () => {
281
169
  OFTStdClient,
282
170
  OFT_STD_WASM_PATH,
283
171
  {
284
- token: CONTRACT_ADDRESSES.oftToken,
172
+ token: oftTokenAddress,
285
173
  owner: DEFAULT_DEPLOYER.publicKey(),
286
- endpoint: CONTRACT_ADDRESSES.endpointV2,
174
+ endpoint: protocolAddresses.endpointV2,
287
175
  delegate: DEFAULT_DEPLOYER.publicKey(),
288
176
  shared_decimals: SHARED_DECIMALS,
289
- is_lock_unlock: true, // Lock/Unlock mode
177
+ mode: OFTMode.LockUnlock, // Lock/Unlock mode
290
178
  },
291
179
  DEFAULT_DEPLOYER,
292
180
  );
293
181
 
294
- CONTRACT_ADDRESSES.lockUnlockOft = lockUnlockOftClient.options.contractId;
295
- console.log('āœ… Lock/Unlock OFT deployed:', CONTRACT_ADDRESSES.lockUnlockOft);
182
+ lockUnlockOftAddress = lockUnlockOftClient.options.contractId;
183
+ console.log('āœ… Lock/Unlock OFT deployed:', lockUnlockOftAddress);
296
184
 
297
185
  // Verify it's in lock/unlock mode
298
- const { result: isLockUnlock } = await lockUnlockOftClient.is_lock_unlock();
299
- expect(isLockUnlock).toBe(true);
186
+ const { result: mode } = await lockUnlockOftClient.mode();
187
+ expect(mode).toEqual(OFTMode.LockUnlock);
300
188
  });
301
189
 
302
190
  it('Deploy Mint/Burn OFT', async () => {
@@ -304,91 +192,102 @@ describe('OFT E2E Testing with SAC', async () => {
304
192
  OFTStdClient,
305
193
  OFT_STD_WASM_PATH,
306
194
  {
307
- token: CONTRACT_ADDRESSES.oftToken,
195
+ token: oftTokenAddress,
308
196
  owner: DEFAULT_DEPLOYER.publicKey(),
309
- endpoint: CONTRACT_ADDRESSES.endpointV2,
197
+ endpoint: protocolAddresses.endpointV2,
310
198
  delegate: DEFAULT_DEPLOYER.publicKey(),
311
199
  shared_decimals: SHARED_DECIMALS,
312
- is_lock_unlock: false, // Mint/Burn mode
200
+ mode: OFTMode.MintBurn, // Mint/Burn mode
313
201
  },
314
202
  DEFAULT_DEPLOYER,
315
203
  );
316
204
 
317
- CONTRACT_ADDRESSES.mintBurnOft = mintBurnOftClient.options.contractId;
318
- console.log('āœ… Mint/Burn OFT deployed:', CONTRACT_ADDRESSES.mintBurnOft);
205
+ mintBurnOftAddress = mintBurnOftClient.options.contractId;
206
+ console.log('āœ… Mint/Burn OFT deployed:', mintBurnOftAddress);
319
207
 
320
208
  // Verify it's in mint/burn mode
321
- const { result: isLockUnlock } = await mintBurnOftClient.is_lock_unlock();
322
- expect(isLockUnlock).toBe(false);
209
+ const { result: mode } = await mintBurnOftClient.mode();
210
+ expect(mode).toEqual(OFTMode.MintBurn);
323
211
  });
212
+ });
324
213
 
325
- it('Verify all contracts deployed', () => {
326
- console.log('\nšŸ“‹ All deployed contracts:');
327
- console.log(' Endpoint:', CONTRACT_ADDRESSES.endpointV2);
328
- console.log(' SimpleMessageLib:', CONTRACT_ADDRESSES.sml);
329
- console.log(' Executor:', CONTRACT_ADDRESSES.executor);
330
- console.log(' Executor Helper:', CONTRACT_ADDRESSES.executorHelper);
331
- console.log(' OFT Token SAC:', CONTRACT_ADDRESSES.oftToken);
332
- console.log(' Lock/Unlock OFT:', CONTRACT_ADDRESSES.lockUnlockOft);
333
- console.log(' Mint/Burn OFT:', CONTRACT_ADDRESSES.mintBurnOft);
214
+ describe('Wire OFT Contracts to use SML', () => {
215
+ it('Set Lock/Unlock OFT Send Library to SML', async () => {
216
+ const assembledTx = await endpointClient.set_send_library({
217
+ caller: DEFAULT_DEPLOYER.publicKey(),
218
+ sender: lockUnlockOftAddress,
219
+ dst_eid: EID,
220
+ new_lib: protocolAddresses.sml,
221
+ });
222
+ await assembledTx.signAndSend();
223
+
224
+ const { result: sendLib } = await endpointClient.get_send_library({
225
+ sender: lockUnlockOftAddress,
226
+ dst_eid: EID,
227
+ });
228
+ expect(sendLib.lib).toBe(protocolAddresses.sml);
229
+ expect(sendLib.is_default).toBe(false);
230
+ console.log('āœ… Lock/Unlock OFT send library set to SML');
334
231
  });
335
- });
336
232
 
337
- describe('Wire Contracts', () => {
338
- it('Register Library', async () => {
339
- const assembledTx = await endpointClient.register_library({
340
- new_lib: CONTRACT_ADDRESSES.sml,
233
+ it('Set Lock/Unlock OFT Receive Library to SML', async () => {
234
+ const assembledTx = await endpointClient.set_receive_library({
235
+ caller: DEFAULT_DEPLOYER.publicKey(),
236
+ receiver: lockUnlockOftAddress,
237
+ src_eid: EID,
238
+ new_lib: protocolAddresses.sml,
239
+ grace_period: 0n,
341
240
  });
342
241
  await assembledTx.signAndSend();
343
- const { result: libs } = await endpointClient.get_registered_libraries({
344
- start: 0,
345
- max_count: 100,
242
+
243
+ const { result: receiveLib } = await endpointClient.get_receive_library({
244
+ receiver: lockUnlockOftAddress,
245
+ src_eid: EID,
346
246
  });
347
- expect(libs.length).toBe(1);
348
- expect(libs[0]).toBe(CONTRACT_ADDRESSES.sml);
349
- console.log('āœ… Library registered');
247
+ expect(receiveLib.lib).toBe(protocolAddresses.sml);
248
+ expect(receiveLib.is_default).toBe(false);
249
+ console.log('āœ… Lock/Unlock OFT receive library set to SML');
350
250
  });
351
251
 
352
- it('Set Default Send Library', async () => {
353
- const assembledTx = await endpointClient.set_default_send_library({
252
+ it('Set Mint/Burn OFT Send Library to SML', async () => {
253
+ const assembledTx = await endpointClient.set_send_library({
254
+ caller: DEFAULT_DEPLOYER.publicKey(),
255
+ sender: mintBurnOftAddress,
354
256
  dst_eid: EID,
355
- new_lib: CONTRACT_ADDRESSES.sml,
257
+ new_lib: protocolAddresses.sml,
356
258
  });
357
259
  await assembledTx.signAndSend();
358
- const { result: defaultSendLib } = await endpointClient.default_send_library({
260
+
261
+ const { result: sendLib } = await endpointClient.get_send_library({
262
+ sender: mintBurnOftAddress,
359
263
  dst_eid: EID,
360
264
  });
361
- expect(defaultSendLib).toBe(CONTRACT_ADDRESSES.sml);
362
- console.log('āœ… Default send library set');
265
+ expect(sendLib.lib).toBe(protocolAddresses.sml);
266
+ expect(sendLib.is_default).toBe(false);
267
+ console.log('āœ… Mint/Burn OFT send library set to SML');
363
268
  });
364
269
 
365
- it('Set Default Receive Library', async () => {
366
- const assembledTx = await endpointClient.set_default_receive_library({
270
+ it('Set Mint/Burn OFT Receive Library to SML', async () => {
271
+ const assembledTx = await endpointClient.set_receive_library({
272
+ caller: DEFAULT_DEPLOYER.publicKey(),
273
+ receiver: mintBurnOftAddress,
367
274
  src_eid: EID,
368
- new_lib: CONTRACT_ADDRESSES.sml,
275
+ new_lib: protocolAddresses.sml,
369
276
  grace_period: 0n,
370
277
  });
371
278
  await assembledTx.signAndSend();
372
- const { result: defaultReceiveLib } = await endpointClient.default_receive_library({
373
- src_eid: EID,
374
- });
375
- expect(defaultReceiveLib).toBe(CONTRACT_ADDRESSES.sml);
376
- console.log('āœ… Default receive library set');
377
- });
378
279
 
379
- it('Set ZRO Token', async () => {
380
- const setZroTx = await endpointClient.set_zro({
381
- zro: ZRO_TOKEN_ADDRESS,
280
+ const { result: receiveLib } = await endpointClient.get_receive_library({
281
+ receiver: mintBurnOftAddress,
282
+ src_eid: EID,
382
283
  });
383
- await setZroTx.signAndSend();
384
-
385
- const { result: newZroToken } = await endpointClient.zro();
386
- expect(newZroToken).toBe(ZRO_TOKEN_ADDRESS);
387
- console.log('āœ… ZRO token set:', ZRO_TOKEN_ADDRESS);
284
+ expect(receiveLib.lib).toBe(protocolAddresses.sml);
285
+ expect(receiveLib.is_default).toBe(false);
286
+ console.log('āœ… Mint/Burn OFT receive library set to SML');
388
287
  });
389
288
 
390
289
  it('Set Lock/Unlock OFT Peer (to Mint/Burn OFT)', async () => {
391
- const mintBurnPeerBytes = StrKey.decodeContract(CONTRACT_ADDRESSES.mintBurnOft);
290
+ const mintBurnPeerBytes = StrKey.decodeContract(mintBurnOftAddress);
392
291
 
393
292
  const assembledTx = await lockUnlockOftClient.set_peer({
394
293
  eid: EID,
@@ -404,7 +303,7 @@ describe('OFT E2E Testing with SAC', async () => {
404
303
  });
405
304
 
406
305
  it('Set Mint/Burn OFT Peer (to Lock/Unlock OFT)', async () => {
407
- const lockUnlockPeerBytes = StrKey.decodeContract(CONTRACT_ADDRESSES.lockUnlockOft);
306
+ const lockUnlockPeerBytes = StrKey.decodeContract(lockUnlockOftAddress);
408
307
 
409
308
  const assembledTx = await mintBurnOftClient.set_peer({
410
309
  eid: EID,
@@ -421,26 +320,19 @@ describe('OFT E2E Testing with SAC', async () => {
421
320
 
422
321
  it('Set SAC Admin to Mint/Burn OFT (for minting)', async () => {
423
322
  // The Mint/Burn OFT needs to be the admin of the SAC to mint tokens
424
- // Use the SAC's set_admin function
425
323
  const server = new rpc.Server(RPC_URL, { allowHttp: true });
426
324
 
427
- // Build set_admin transaction
428
- // SAC's set_admin function requires the current admin (TOKEN_ISSUER) to sign
429
325
  const account = await server.getAccount(TOKEN_ISSUER.publicKey());
430
326
 
431
- // Build the invokeContract operation for SAC's set_admin
432
327
  const setAdminTx = new TransactionBuilder(account, {
433
328
  fee: BASE_FEE,
434
329
  networkPassphrase: NETWORK_PASSPHRASE,
435
330
  })
436
331
  .addOperation(
437
332
  Operation.invokeContractFunction({
438
- contract: CONTRACT_ADDRESSES.oftToken,
333
+ contract: oftTokenAddress,
439
334
  function: 'set_admin',
440
- args: [
441
- // new_admin: Address
442
- Address.fromString(CONTRACT_ADDRESSES.mintBurnOft).toScVal(),
443
- ],
335
+ args: [Address.fromString(mintBurnOftAddress).toScVal()],
444
336
  }),
445
337
  )
446
338
  .setTimeout(30)
@@ -473,39 +365,35 @@ describe('OFT E2E Testing with SAC', async () => {
473
365
  let message: Buffer;
474
366
 
475
367
  it('Verify initial balances', async () => {
476
- // Check sender balance (DEFAULT_DEPLOYER has 1000 OFT tokens)
477
- const senderBalance = await getSacBalance(
478
- CONTRACT_ADDRESSES.oftToken,
368
+ const senderBalance = await getTokenBalance(
479
369
  DEFAULT_DEPLOYER.publicKey(),
370
+ oftTokenAddress,
480
371
  );
481
372
  console.log('šŸ“Š Initial Balances:');
482
373
  console.log(` - Sender (DEFAULT_DEPLOYER): ${senderBalance} (expected: 10000000000)`);
483
374
 
484
- // RECIPIENT_A should have 0 tokens
485
- const recipientABalance = await getSacBalance(
486
- CONTRACT_ADDRESSES.oftToken,
375
+ const recipientABalance = await getTokenBalance(
487
376
  RECIPIENT_A.publicKey(),
377
+ oftTokenAddress,
488
378
  );
489
379
  console.log(` - RECIPIENT_A: ${recipientABalance} (expected: 0)`);
490
380
 
491
- expect(senderBalance).toBe(10000000000n); // 1000 tokens with 7 decimals
381
+ expect(senderBalance).toBe(10000000000n);
492
382
  expect(recipientABalance).toBe(0n);
493
383
  });
494
384
 
495
385
  it('Quote OFT send', async () => {
496
- // Build SendParam - send to RECIPIENT_A
497
386
  const receiverBytes = StrKey.decodeEd25519PublicKey(RECIPIENT_A.publicKey());
498
387
  const sendParam: SendParam = {
499
388
  dst_eid: EID,
500
389
  to: Buffer.from(receiverBytes),
501
390
  amount_ld: SEND_AMOUNT,
502
- min_amount_ld: SEND_AMOUNT, // No slippage for test
391
+ min_amount_ld: SEND_AMOUNT,
503
392
  extra_options: Buffer.from([]),
504
393
  compose_msg: Buffer.from([]),
505
394
  oft_cmd: Buffer.from([]),
506
395
  };
507
396
 
508
- // Quote OFT
509
397
  const { result: quoteResult } = await lockUnlockOftClient.quote_oft({
510
398
  send_param: sendParam,
511
399
  });
@@ -519,7 +407,6 @@ describe('OFT E2E Testing with SAC', async () => {
519
407
  });
520
408
 
521
409
  it('Send tokens (Lock/Unlock -> Mint/Burn)', async () => {
522
- // Build SendParam - send to RECIPIENT_A
523
410
  const receiverBytes = StrKey.decodeEd25519PublicKey(RECIPIENT_A.publicKey());
524
411
  const sendParam: SendParam = {
525
412
  dst_eid: EID,
@@ -531,7 +418,6 @@ describe('OFT E2E Testing with SAC', async () => {
531
418
  oft_cmd: Buffer.from([]),
532
419
  };
533
420
 
534
- // Quote send fee (pay in ZRO like Counter test does)
535
421
  const { result: fee } = await lockUnlockOftClient.quote_send({
536
422
  sender: DEFAULT_DEPLOYER.publicKey(),
537
423
  send_param: sendParam,
@@ -539,7 +425,6 @@ describe('OFT E2E Testing with SAC', async () => {
539
425
  });
540
426
  console.log('šŸ“Š Messaging Fee:', fee);
541
427
 
542
- // Send tokens
543
428
  const assembledTx = await lockUnlockOftClient.send({
544
429
  sender: DEFAULT_DEPLOYER.publicKey(),
545
430
  send_param: sendParam,
@@ -547,22 +432,22 @@ describe('OFT E2E Testing with SAC', async () => {
547
432
  refund_address: DEFAULT_DEPLOYER.publicKey(),
548
433
  });
549
434
 
550
- // Sign and send
551
435
  const sentTx = await assembledTx.signAndSend();
552
436
 
553
- // Extract ledger number
554
437
  const txResponse = sentTx.getTransactionResponse;
555
438
  if (txResponse && 'ledger' in txResponse) {
556
439
  sendLedger = txResponse.ledger;
557
440
  }
558
441
 
559
- assertTransactionsSucceeded(sentTx, 'OFT Send');
442
+ if (txResponse) {
443
+ assertTransactionSucceeded(txResponse, 'OFT Send');
444
+ }
560
445
  console.log('āœ… Tokens sent, ledger:', sendLedger);
561
446
  });
562
447
 
563
448
  it('Scan PacketSent events', async () => {
564
449
  const packetSentEvents = await scanPacketSentEvents(
565
- CONTRACT_ADDRESSES.endpointV2,
450
+ protocolAddresses.endpointV2,
566
451
  sendLedger,
567
452
  );
568
453
  expect(packetSentEvents.length).toBeGreaterThan(0);
@@ -587,64 +472,56 @@ describe('OFT E2E Testing with SAC', async () => {
587
472
  });
588
473
 
589
474
  it('Receive tokens (mint on Mint/Burn OFT)', async () => {
590
- const lockUnlockPeerBytes = StrKey.decodeContract(CONTRACT_ADDRESSES.lockUnlockOft);
475
+ const lockUnlockPeerBytes = StrKey.decodeContract(lockUnlockOftAddress);
591
476
  const origin = {
592
477
  nonce: 1n,
593
478
  sender: Buffer.from(lockUnlockPeerBytes),
594
479
  src_eid: EID,
595
480
  };
596
481
 
597
- // Use native_drop_and_execute with empty native_drop_params
598
- const assembledTx = await executorHelperClient.native_drop_and_execute({
599
- executor: CONTRACT_ADDRESSES.executor,
600
- admin: EXECUTOR_ADMIN.publicKey(),
601
- origin,
602
- dst_eid: EID,
603
- oapp: CONTRACT_ADDRESSES.mintBurnOft,
604
- native_drop_params: [],
605
- execute_params: {
606
- extra_data: Buffer.from([]),
607
- gas_limit: 0n,
608
- guid,
609
- message,
610
- origin,
611
- receiver: CONTRACT_ADDRESSES.mintBurnOft,
612
- value: 0n,
482
+ const assembledTx = await executorHelperClient.execute(
483
+ {
484
+ executor: protocolAddresses.executor,
485
+ params: {
486
+ extra_data: Buffer.from([]),
487
+ gas_limit: 0n,
488
+ guid,
489
+ message,
490
+ origin,
491
+ receiver: mintBurnOftAddress,
492
+ value: 0n,
493
+ },
494
+ value_payer: EXECUTOR_ADMIN.publicKey(),
613
495
  },
614
- });
496
+ {
497
+ simulate: false,
498
+ },
499
+ );
615
500
 
616
- // Sign the Executor's auth entries
617
- await signExecutorAuthEntries(
618
- CONTRACT_ADDRESSES.executor,
501
+ const txResult = await signAndSendWithExecutorAuth(
502
+ protocolAddresses.executor,
619
503
  EXECUTOR_ADMIN,
620
504
  assembledTx,
621
505
  NETWORK_PASSPHRASE,
622
506
  );
623
507
 
624
- // Sign and send
625
- const sentTx = await assembledTx.signAndSend();
626
- assertTransactionsSucceeded(sentTx, 'LzReceive (Mint)');
508
+ assertTransactionSucceeded(txResult, 'LzReceive (Mint)');
627
509
 
628
510
  console.log('āœ… Tokens received and minted on Mint/Burn OFT');
629
511
  });
630
512
 
631
513
  it('Verify balances after forward send', async () => {
632
- // Balance changes after forward send:
633
- // - Sender (DEFAULT_DEPLOYER): 1000 - 100 = 900 tokens
634
- // - Lock/Unlock OFT contract: holds 100 locked tokens
635
- // - RECIPIENT_A: received 100 minted tokens
636
-
637
- const senderBalance = await getSacBalance(
638
- CONTRACT_ADDRESSES.oftToken,
514
+ const senderBalance = await getTokenBalance(
639
515
  DEFAULT_DEPLOYER.publicKey(),
516
+ oftTokenAddress,
640
517
  );
641
- const lockUnlockOftBalance = await getSacBalance(
642
- CONTRACT_ADDRESSES.oftToken,
643
- CONTRACT_ADDRESSES.lockUnlockOft,
518
+ const lockUnlockOftBalance = await getTokenBalance(
519
+ lockUnlockOftAddress,
520
+ oftTokenAddress,
644
521
  );
645
- const recipientABalance = await getSacBalance(
646
- CONTRACT_ADDRESSES.oftToken,
522
+ const recipientABalance = await getTokenBalance(
647
523
  RECIPIENT_A.publicKey(),
524
+ oftTokenAddress,
648
525
  );
649
526
 
650
527
  console.log('šŸ“Š Balances after forward send:');
@@ -654,9 +531,9 @@ describe('OFT E2E Testing with SAC', async () => {
654
531
  );
655
532
  console.log(` - RECIPIENT_A (minted): ${recipientABalance} (expected: 1000000000)`);
656
533
 
657
- expect(senderBalance).toBe(9000000000n); // 900 tokens
658
- expect(lockUnlockOftBalance).toBe(1000000000n); // 100 tokens locked
659
- expect(recipientABalance).toBe(1000000000n); // 100 tokens minted
534
+ expect(senderBalance).toBe(9000000000n);
535
+ expect(lockUnlockOftBalance).toBe(1000000000n);
536
+ expect(recipientABalance).toBe(1000000000n);
660
537
  });
661
538
  });
662
539
 
@@ -665,10 +542,9 @@ describe('OFT E2E Testing with SAC', async () => {
665
542
  let packetSentEvent: PacketSentEvent;
666
543
  let guid: Buffer;
667
544
  let message: Buffer;
668
- const REVERSE_SEND_AMOUNT = 50_0000000n; // 50 tokens
545
+ const REVERSE_SEND_AMOUNT = 50_0000000n;
669
546
 
670
547
  it('Quote OFT send (reverse)', async () => {
671
- // Send to RECIPIENT_B
672
548
  const receiverBytes = StrKey.decodeEd25519PublicKey(RECIPIENT_B.publicKey());
673
549
  const sendParam: SendParam = {
674
550
  dst_eid: EID,
@@ -693,7 +569,6 @@ describe('OFT E2E Testing with SAC', async () => {
693
569
  });
694
570
 
695
571
  it('Send tokens (Mint/Burn -> Lock/Unlock)', async () => {
696
- // DEFAULT_DEPLOYER sends via Mint/Burn OFT to RECIPIENT_B
697
572
  const receiverBytes = StrKey.decodeEd25519PublicKey(RECIPIENT_B.publicKey());
698
573
  const sendParam: SendParam = {
699
574
  dst_eid: EID,
@@ -705,7 +580,6 @@ describe('OFT E2E Testing with SAC', async () => {
705
580
  oft_cmd: Buffer.from([]),
706
581
  };
707
582
 
708
- // Quote send fee (pay in ZRO like Counter test does)
709
583
  const { result: fee } = await mintBurnOftClient.quote_send({
710
584
  sender: DEFAULT_DEPLOYER.publicKey(),
711
585
  send_param: sendParam,
@@ -713,7 +587,6 @@ describe('OFT E2E Testing with SAC', async () => {
713
587
  });
714
588
  console.log('šŸ“Š Reverse Messaging Fee:', fee);
715
589
 
716
- // Send tokens
717
590
  const assembledTx = await mintBurnOftClient.send({
718
591
  sender: DEFAULT_DEPLOYER.publicKey(),
719
592
  send_param: sendParam,
@@ -721,22 +594,22 @@ describe('OFT E2E Testing with SAC', async () => {
721
594
  refund_address: DEFAULT_DEPLOYER.publicKey(),
722
595
  });
723
596
 
724
- // Sign and send
725
597
  const sentTx = await assembledTx.signAndSend();
726
598
 
727
- // Extract ledger number
728
599
  const txResponse = sentTx.getTransactionResponse;
729
600
  if (txResponse && 'ledger' in txResponse) {
730
601
  sendLedger = txResponse.ledger;
731
602
  }
732
603
 
733
- assertTransactionsSucceeded(sentTx, 'OFT Reverse Send');
604
+ if (txResponse) {
605
+ assertTransactionSucceeded(txResponse, 'OFT Reverse Send');
606
+ }
734
607
  console.log('āœ… Tokens sent (reverse), ledger:', sendLedger);
735
608
  });
736
609
 
737
610
  it('Scan PacketSent events (reverse)', async () => {
738
611
  const packetSentEvents = await scanPacketSentEvents(
739
- CONTRACT_ADDRESSES.endpointV2,
612
+ protocolAddresses.endpointV2,
740
613
  sendLedger,
741
614
  );
742
615
  expect(packetSentEvents.length).toBeGreaterThan(0);
@@ -763,69 +636,60 @@ describe('OFT E2E Testing with SAC', async () => {
763
636
  });
764
637
 
765
638
  it('Receive tokens (unlock on Lock/Unlock OFT)', async () => {
766
- const mintBurnPeerBytes = StrKey.decodeContract(CONTRACT_ADDRESSES.mintBurnOft);
639
+ const mintBurnPeerBytes = StrKey.decodeContract(mintBurnOftAddress);
767
640
  const origin = {
768
641
  nonce: 1n,
769
642
  sender: Buffer.from(mintBurnPeerBytes),
770
643
  src_eid: EID,
771
644
  };
772
645
 
773
- // Use native_drop_and_execute with empty native_drop_params
774
- const assembledTx = await executorHelperClient.native_drop_and_execute({
775
- executor: CONTRACT_ADDRESSES.executor,
776
- admin: EXECUTOR_ADMIN.publicKey(),
777
- origin,
778
- dst_eid: EID,
779
- oapp: CONTRACT_ADDRESSES.lockUnlockOft,
780
- native_drop_params: [],
781
- execute_params: {
782
- extra_data: Buffer.from([]),
783
- gas_limit: 0n,
784
- guid,
785
- message,
786
- origin,
787
- receiver: CONTRACT_ADDRESSES.lockUnlockOft,
788
- value: 0n,
646
+ const assembledTx = await executorHelperClient.execute(
647
+ {
648
+ executor: protocolAddresses.executor,
649
+ params: {
650
+ extra_data: Buffer.from([]),
651
+ gas_limit: 0n,
652
+ guid,
653
+ message,
654
+ origin,
655
+ receiver: lockUnlockOftAddress,
656
+ value: 0n,
657
+ },
658
+ value_payer: EXECUTOR_ADMIN.publicKey(),
789
659
  },
790
- });
660
+ {
661
+ simulate: false,
662
+ },
663
+ );
791
664
 
792
- // Sign the Executor's auth entries
793
- await signExecutorAuthEntries(
794
- CONTRACT_ADDRESSES.executor,
665
+ const txResult = await signAndSendWithExecutorAuth(
666
+ protocolAddresses.executor,
795
667
  EXECUTOR_ADMIN,
796
668
  assembledTx,
797
669
  NETWORK_PASSPHRASE,
798
670
  );
799
671
 
800
- // Sign and send
801
- const sentTx = await assembledTx.signAndSend();
802
- assertTransactionsSucceeded(sentTx, 'LzReceive (Unlock)');
672
+ assertTransactionSucceeded(txResult, 'LzReceive (Unlock)');
803
673
 
804
674
  console.log('āœ… Tokens received and unlocked on Lock/Unlock OFT');
805
675
  });
806
676
 
807
677
  it('Verify final balances', async () => {
808
- // Final balance summary:
809
- // - DEFAULT_DEPLOYER: started with 1000, sent 100 (locked), sent 50 (burned) = 850
810
- // - Lock/Unlock OFT: locked 100, unlocked 50 = 50 held
811
- // - RECIPIENT_A: received 100 (minted)
812
- // - RECIPIENT_B: received 50 (unlocked)
813
-
814
- const senderBalance = await getSacBalance(
815
- CONTRACT_ADDRESSES.oftToken,
678
+ const senderBalance = await getTokenBalance(
816
679
  DEFAULT_DEPLOYER.publicKey(),
680
+ oftTokenAddress,
817
681
  );
818
- const lockUnlockOftBalance = await getSacBalance(
819
- CONTRACT_ADDRESSES.oftToken,
820
- CONTRACT_ADDRESSES.lockUnlockOft,
682
+ const lockUnlockOftBalance = await getTokenBalance(
683
+ lockUnlockOftAddress,
684
+ oftTokenAddress,
821
685
  );
822
- const recipientABalance = await getSacBalance(
823
- CONTRACT_ADDRESSES.oftToken,
686
+ const recipientABalance = await getTokenBalance(
824
687
  RECIPIENT_A.publicKey(),
688
+ oftTokenAddress,
825
689
  );
826
- const recipientBBalance = await getSacBalance(
827
- CONTRACT_ADDRESSES.oftToken,
690
+ const recipientBBalance = await getTokenBalance(
828
691
  RECIPIENT_B.publicKey(),
692
+ oftTokenAddress,
829
693
  );
830
694
 
831
695
  console.log('\nšŸ“Š Final Balance Summary:');
@@ -836,10 +700,10 @@ describe('OFT E2E Testing with SAC', async () => {
836
700
  console.log(` - RECIPIENT_A (minted): ${recipientABalance} (expected: 1000000000)`);
837
701
  console.log(` - RECIPIENT_B (unlocked): ${recipientBBalance} (expected: 500000000)`);
838
702
 
839
- expect(senderBalance).toBe(8500000000n); // 850 tokens (1000 - 100 - 50)
840
- expect(lockUnlockOftBalance).toBe(500000000n); // 50 tokens (100 - 50)
841
- expect(recipientABalance).toBe(1000000000n); // 100 tokens minted
842
- expect(recipientBBalance).toBe(500000000n); // 50 tokens unlocked
703
+ expect(senderBalance).toBe(8500000000n);
704
+ expect(lockUnlockOftBalance).toBe(500000000n);
705
+ expect(recipientABalance).toBe(1000000000n);
706
+ expect(recipientBBalance).toBe(500000000n);
843
707
 
844
708
  console.log('āœ… OFT E2E test completed successfully!');
845
709
  });