@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
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ // Global setup runs ONCE before all test files
6
+ globalSetup: './test/suites/globalSetup.ts',
7
+ // Run tests sequentially to avoid conflicts with shared blockchain state
8
+ sequence: {
9
+ concurrent: false,
10
+ },
11
+ // Longer timeouts for blockchain operations
12
+ testTimeout: 120000,
13
+ hookTimeout: 240000,
14
+ // Don't isolate test files - they share the same localnet
15
+ isolate: false,
16
+ // Run test files sequentially
17
+ fileParallelism: false,
18
+ // Stop on first failure
19
+ bail: 1,
20
+ },
21
+ });
@@ -1,376 +0,0 @@
1
- import { Keypair, StrKey, TransactionBuilder } from '@stellar/stellar-sdk';
2
- import path from 'path';
3
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
- import { $ } from 'zx';
5
-
6
- import { getFullyQualifiedRepoRootPath } from '@layerzerolabs/common-node-utils';
7
- import { PacketSerializer, PacketV1Codec } from '@layerzerolabs/lz-v2-utilities';
8
-
9
- import { Client as CounterClient } from '../src/generated/counter';
10
- import { Client as EndpointClient } from '../src/generated/endpoint';
11
- import { Client as ExecutorClient } from '../src/generated/executor';
12
- import { Client as ExecutorHelperClient } from '../src/generated/executor_helper';
13
- import { Client as SMLClient } from '../src/generated/sml';
14
- import {
15
- DEFAULT_DEPLOYER,
16
- EID,
17
- MSG_TYPE_VANILLA,
18
- NATIVE_TOKEN_ADDRESS,
19
- NETWORK_PASSPHRASE,
20
- ZRO_TOKEN_ADDRESS,
21
- } from './suites/constants';
22
- import { deployContract } from './suites/deploy';
23
- import { fundAccount, startStellarLocalnet, stopStellarLocalnet } from './suites/localnet';
24
- import { PacketSentEvent, scanPacketSentEvents } from './suites/scan';
25
- import { assertTransactionsSucceeded, signExecutorAuthEntries } from './utils';
26
-
27
- $.verbose = true;
28
- $.stdio = ['inherit', 'pipe', process.stderr];
29
-
30
- const CONTRACT_ADDRESSES = {
31
- endpointV2: '',
32
- sml: '',
33
- counter: '',
34
- executor: '',
35
- executorHelper: '',
36
- };
37
-
38
- let endpointClient: EndpointClient;
39
- let smlClient: SMLClient;
40
- let counterClient: CounterClient;
41
- let executorClient: ExecutorClient;
42
- let executorHelperClient: ExecutorHelperClient;
43
-
44
- const EXECUTOR_ADMIN = Keypair.random();
45
-
46
- // NOTE: run `stellar contract build --features sandbox` before running the test
47
-
48
- describe('Protocol testing', async () => {
49
- const repoRoot = await getFullyQualifiedRepoRootPath();
50
- const wasmDir = path.join(
51
- repoRoot,
52
- 'contracts',
53
- 'protocol',
54
- 'stellar',
55
- 'target',
56
- 'wasm32v1-none',
57
- 'release',
58
- );
59
-
60
- const ENDPOINT_WASM_PATH = path.join(wasmDir, 'endpoint_v2.wasm');
61
- const SML_WASM_PATH = path.join(wasmDir, 'simple_message_lib.wasm');
62
- const COUNTER_WASM_PATH = path.join(wasmDir, 'counter.wasm');
63
- const EXECUTOR_WASM_PATH = path.join(wasmDir, 'executor.wasm');
64
- const EXECUTOR_HELPER_WASM_PATH = path.join(wasmDir, 'executor_helper.wasm');
65
-
66
- beforeAll(async () => {
67
- await startStellarLocalnet();
68
- await fundAccount(EXECUTOR_ADMIN.publicKey());
69
- }, 120000); // 2 minute timeout for setup
70
-
71
- afterAll(async () => {
72
- await stopStellarLocalnet();
73
- });
74
-
75
- describe('Contract Deployments', () => {
76
- it('Deploy Endpoint', async () => {
77
- endpointClient = await deployContract<EndpointClient>(
78
- EndpointClient,
79
- ENDPOINT_WASM_PATH,
80
- {
81
- eid: EID,
82
- owner: DEFAULT_DEPLOYER.publicKey(),
83
- native_token: NATIVE_TOKEN_ADDRESS,
84
- },
85
- DEFAULT_DEPLOYER,
86
- );
87
-
88
- CONTRACT_ADDRESSES.endpointV2 = endpointClient.options.contractId;
89
- console.log('✅ Endpoint deployed:', CONTRACT_ADDRESSES.endpointV2);
90
- });
91
-
92
- it('Deploy SimpleMessageLib', async () => {
93
- smlClient = await deployContract<SMLClient>(
94
- SMLClient,
95
- SML_WASM_PATH,
96
- {
97
- owner: DEFAULT_DEPLOYER.publicKey(),
98
- endpoint: CONTRACT_ADDRESSES.endpointV2,
99
- fee_recipient: DEFAULT_DEPLOYER.publicKey(),
100
- },
101
- DEFAULT_DEPLOYER,
102
- );
103
-
104
- CONTRACT_ADDRESSES.sml = smlClient.options.contractId;
105
- console.log('✅ SimpleMessageLib deployed:', CONTRACT_ADDRESSES.sml);
106
- });
107
-
108
- it('Deploy Executor Helper', async () => {
109
- // Deploy ExecutorHelper first (it's stateless) so we can pass it to Executor
110
- executorHelperClient = await deployContract<ExecutorHelperClient>(
111
- ExecutorHelperClient,
112
- EXECUTOR_HELPER_WASM_PATH,
113
- undefined,
114
- DEFAULT_DEPLOYER,
115
- );
116
- CONTRACT_ADDRESSES.executorHelper = executorHelperClient.options.contractId;
117
- console.log('✅ Executor Helper deployed:', CONTRACT_ADDRESSES.executorHelper);
118
- });
119
-
120
- it('Deploy Executor', async () => {
121
- // Whitelist ExecutorHelper entry points
122
- const whitelist = [
123
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'native_drop_and_execute' },
124
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'execute' },
125
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'compose' },
126
- { contract: CONTRACT_ADDRESSES.executorHelper, fn_name: 'native_drop' },
127
- ];
128
-
129
- executorClient = await deployContract<ExecutorClient>(
130
- ExecutorClient,
131
- EXECUTOR_WASM_PATH,
132
- {
133
- owner: DEFAULT_DEPLOYER.publicKey(),
134
- endpoint: CONTRACT_ADDRESSES.endpointV2,
135
- whitelist,
136
- admins: [EXECUTOR_ADMIN.publicKey()],
137
- message_libs: [CONTRACT_ADDRESSES.sml],
138
- // FIXME: Add price feed
139
- price_feed: CONTRACT_ADDRESSES.endpointV2,
140
- default_multiplier_bps: 10000,
141
- },
142
- DEFAULT_DEPLOYER,
143
- );
144
- CONTRACT_ADDRESSES.executor = executorClient.options.contractId;
145
- console.log('✅ Executor deployed:', CONTRACT_ADDRESSES.executor);
146
- });
147
-
148
- it('Deploy Counter', async () => {
149
- counterClient = await deployContract<CounterClient>(
150
- CounterClient,
151
- COUNTER_WASM_PATH,
152
- {
153
- owner: DEFAULT_DEPLOYER.publicKey(),
154
- endpoint: CONTRACT_ADDRESSES.endpointV2,
155
- delegate: DEFAULT_DEPLOYER.publicKey(),
156
- },
157
- DEFAULT_DEPLOYER,
158
- );
159
-
160
- CONTRACT_ADDRESSES.counter = counterClient.options.contractId;
161
- console.log('✅ Counter deployed:', CONTRACT_ADDRESSES.counter);
162
- });
163
-
164
- it('Verify all contracts deployed', () => {
165
- console.log('\n📋 All deployed contracts:');
166
- console.log(' Endpoint:', CONTRACT_ADDRESSES.endpointV2);
167
- console.log(' SimpleMessageLib:', CONTRACT_ADDRESSES.sml);
168
- console.log(' Counter:', CONTRACT_ADDRESSES.counter);
169
- console.log(' Executor:', CONTRACT_ADDRESSES.executor);
170
- console.log(' Executor Helper:', CONTRACT_ADDRESSES.executorHelper);
171
- });
172
- });
173
-
174
- describe('Wire Contracts', async () => {
175
- it('Register Library', async () => {
176
- const assembledTx = await endpointClient.register_library({
177
- new_lib: CONTRACT_ADDRESSES.sml,
178
- });
179
- await assembledTx.signAndSend();
180
- const { result: libs } = await endpointClient.get_registered_libraries({
181
- start: 0,
182
- max_count: 100,
183
- });
184
- expect(libs.length).toBe(1);
185
- expect(libs[0]).toBe(CONTRACT_ADDRESSES.sml);
186
- console.log('✅ Library registered');
187
- });
188
-
189
- it('Set Default Send Library', async () => {
190
- const assembledTx = await endpointClient.set_default_send_library({
191
- dst_eid: EID,
192
- new_lib: CONTRACT_ADDRESSES.sml,
193
- });
194
- await assembledTx.signAndSend();
195
- const { result: defaultSendLib } = await endpointClient.default_send_library({
196
- dst_eid: EID,
197
- });
198
- expect(defaultSendLib).toBe(CONTRACT_ADDRESSES.sml);
199
- console.log('✅ Default send library set');
200
- });
201
-
202
- it('Set Default Receive Library', async () => {
203
- const assembledTx = await endpointClient.set_default_receive_library({
204
- src_eid: EID,
205
- new_lib: CONTRACT_ADDRESSES.sml,
206
- grace_period: 0n,
207
- });
208
- await assembledTx.signAndSend();
209
- const { result: defaultReceiveLib } = await endpointClient.default_receive_library({
210
- src_eid: EID,
211
- });
212
- expect(defaultReceiveLib).toBe(CONTRACT_ADDRESSES.sml);
213
- console.log('✅ Default receive library set');
214
- });
215
-
216
- it('Set ZRO Token (Required even for 0 fee)', async () => {
217
- const setZroTx = await endpointClient.set_zro({
218
- zro: ZRO_TOKEN_ADDRESS,
219
- });
220
- await setZroTx.signAndSend();
221
-
222
- const { result: newZroToken } = await endpointClient.zro();
223
- expect(newZroToken).toBe(ZRO_TOKEN_ADDRESS);
224
- console.log('✅ ZRO token set:', ZRO_TOKEN_ADDRESS);
225
- });
226
-
227
- it('Set Counter Peer', async () => {
228
- const peerBytes = StrKey.decodeContract(CONTRACT_ADDRESSES.counter);
229
-
230
- const assembledTx = await counterClient.set_peer({
231
- eid: EID,
232
- peer: Buffer.from(peerBytes),
233
- });
234
- await assembledTx.signAndSend();
235
-
236
- const { result: peer } = await counterClient.peer({
237
- eid: EID,
238
- });
239
- expect(peer?.toString()).toBe(Buffer.from(peerBytes).toString());
240
- console.log('✅ Counter peer set for EID', EID);
241
- });
242
- });
243
-
244
- describe('Counter', async () => {
245
- let incrementLedger = 0;
246
- let packetSentEvent: PacketSentEvent;
247
- let guid: Buffer;
248
- let message: Buffer;
249
- it('Counter Increment', async () => {
250
- const { result: fee } = await counterClient.quote({
251
- dst_eid: EID,
252
- msg_type: MSG_TYPE_VANILLA,
253
- options: Buffer.from([]),
254
- pay_in_zro: true,
255
- });
256
- console.log('✅ Fee:', fee);
257
-
258
- const assembledTx = await counterClient.increment({
259
- caller: DEFAULT_DEPLOYER.publicKey(),
260
- dst_eid: EID,
261
- msg_type: MSG_TYPE_VANILLA,
262
- options: Buffer.from([]),
263
- fee: fee,
264
- });
265
- const sentTx = await assembledTx.signAndSend();
266
-
267
- // Extract ledger number from transaction response
268
- const txResponse = sentTx.getTransactionResponse;
269
- if (txResponse && 'ledger' in txResponse) {
270
- incrementLedger = txResponse.ledger;
271
- }
272
-
273
- const { result: outboundCount } = await counterClient.outbound_count({
274
- eid: EID,
275
- });
276
- expect(outboundCount).toBe(1n);
277
- console.log('✅ Counter incremented, outbound count:', outboundCount);
278
- });
279
-
280
- it('Scan PacketSent Events', async () => {
281
- const packetSentEvents = await scanPacketSentEvents(
282
- CONTRACT_ADDRESSES.endpointV2,
283
- incrementLedger,
284
- );
285
- expect(packetSentEvents.length).toBeGreaterThan(0);
286
- packetSentEvent = packetSentEvents[0];
287
- console.log(
288
- `✅ PacketSent events scanned successfully. Found ${packetSentEvents.length} events`,
289
- );
290
- });
291
-
292
- it('Verify Counter Message', async () => {
293
- const packet = PacketSerializer.deserialize(packetSentEvent.encoded_packet);
294
- guid = Buffer.from(packet.guid.replace('0x', ''), 'hex');
295
- message = Buffer.from(packet.message.replace('0x', ''), 'hex');
296
- const codec = PacketV1Codec.from(packet);
297
- const packetHeader = codec.header();
298
- const payloadHash = codec.payloadHash();
299
- const assembledTx = await smlClient.validate_packet({
300
- // caller: DEFAULT_DEPLOYER.publicKey(),
301
- header_bytes: Buffer.from(packetHeader.replace('0x', ''), 'hex'),
302
- payload_hash: Buffer.from(payloadHash.replace('0x', ''), 'hex'),
303
- });
304
- await assembledTx.signAndSend();
305
- });
306
-
307
- it('Receive Counter Message (with native_drop)', async () => {
308
- // Use native_drop_and_execute to test both native_drop and lz_receive
309
- const origin = {
310
- nonce: 1n,
311
- sender: Buffer.from(StrKey.decodeContract(CONTRACT_ADDRESSES.counter)),
312
- src_eid: EID,
313
- };
314
-
315
- const assembledTx = await executorHelperClient.native_drop_and_execute({
316
- executor: CONTRACT_ADDRESSES.executor,
317
- admin: EXECUTOR_ADMIN.publicKey(),
318
- origin,
319
- dst_eid: EID,
320
- oapp: CONTRACT_ADDRESSES.counter,
321
- // Native drop: send 100 stroops to counter contract
322
- native_drop_params: [
323
- {
324
- receiver: CONTRACT_ADDRESSES.counter,
325
- amount: 100n,
326
- },
327
- ],
328
- execute_params: {
329
- extra_data: Buffer.from([]),
330
- gas_limit: 0n,
331
- guid,
332
- message,
333
- origin,
334
- receiver: CONTRACT_ADDRESSES.counter,
335
- value: 11n,
336
- },
337
- });
338
-
339
- // Step 1: Sign the Executor's auth entries with the admin address as signature
340
- await signExecutorAuthEntries(
341
- CONTRACT_ADDRESSES.executor,
342
- EXECUTOR_ADMIN,
343
- assembledTx,
344
- NETWORK_PASSPHRASE,
345
- );
346
-
347
- // Step 2: Sign and send the transaction by Executor Admin
348
- const sentTx = await assembledTx.signAndSend();
349
-
350
- // Assert that the transaction success
351
- assertTransactionsSucceeded(sentTx, 'LzReceive');
352
-
353
- const txResponse = sentTx.getTransactionResponse;
354
- // Extract and print the transaction fee from the result
355
- if (txResponse && 'envelopeXdr' in txResponse && txResponse.envelopeXdr) {
356
- try {
357
- const txXdr = txResponse.envelopeXdr.toXDR('base64');
358
- const parsedTx = TransactionBuilder.fromXDR(txXdr, NETWORK_PASSPHRASE);
359
- const fee = parsedTx.fee;
360
- console.log(
361
- `💰 lz_receive transaction fee: ${fee} stroops (${(Number(fee) / 10000000).toFixed(7)} XLM)`,
362
- );
363
- } catch (_e) {
364
- // Ignore if we can't extract the fee
365
- }
366
- }
367
-
368
- // Verify the message was received
369
- const { result: inboundCount } = await counterClient.inbound_count({
370
- eid: EID,
371
- });
372
- expect(inboundCount).toBe(1n);
373
- console.log('✅ Counter message received, inbox count:', inboundCount);
374
- });
375
- });
376
- });