@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.
- package/.turbo/turbo-build.log +1 -0
- package/.turbo/turbo-test.log +1009 -0
- package/dist/generated/bml.d.ts +104 -37
- package/dist/generated/bml.js +83 -42
- package/dist/generated/counter.d.ts +334 -175
- package/dist/generated/counter.js +109 -63
- package/dist/generated/dvn.d.ts +1985 -0
- package/dist/generated/dvn.js +326 -0
- package/dist/generated/dvn_fee_lib.d.ts +690 -0
- package/dist/generated/dvn_fee_lib.js +163 -0
- package/dist/generated/endpoint.d.ts +155 -46
- package/dist/generated/endpoint.js +93 -50
- package/dist/generated/executor.d.ts +1841 -0
- package/dist/generated/executor.js +312 -0
- package/dist/generated/executor_fee_lib.d.ts +1083 -0
- package/dist/generated/executor_fee_lib.js +255 -0
- package/dist/generated/executor_helper.d.ts +981 -0
- package/dist/generated/executor_helper.js +236 -0
- package/dist/generated/oft_std.d.ts +1722 -0
- package/dist/generated/oft_std.js +316 -0
- package/dist/generated/price_feed.d.ts +1077 -0
- package/dist/generated/price_feed.js +210 -0
- package/dist/generated/sml.d.ts +171 -56
- package/dist/generated/sml.js +111 -62
- package/dist/generated/treasury.d.ts +896 -0
- package/dist/generated/treasury.js +219 -0
- package/dist/generated/uln302.d.ts +175 -75
- package/dist/generated/uln302.js +126 -82
- package/dist/generated/upgrader.d.ts +70 -0
- package/dist/generated/upgrader.js +19 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +14 -0
- package/dist/wasm/blocked-message-lib.d.ts +1 -0
- package/dist/wasm/blocked-message-lib.js +2 -0
- package/dist/wasm/counter.d.ts +1 -0
- package/dist/wasm/counter.js +2 -0
- package/dist/wasm/dvn-fee-lib.d.ts +1 -0
- package/dist/wasm/dvn-fee-lib.js +2 -0
- package/dist/wasm/dvn.d.ts +1 -0
- package/dist/wasm/dvn.js +2 -0
- package/dist/wasm/endpoint-v2.d.ts +1 -0
- package/dist/wasm/endpoint-v2.js +2 -0
- package/dist/wasm/executor-fee-lib.d.ts +1 -0
- package/dist/wasm/executor-fee-lib.js +2 -0
- package/dist/wasm/executor-helper.d.ts +1 -0
- package/dist/wasm/executor-helper.js +2 -0
- package/dist/wasm/executor.d.ts +1 -0
- package/dist/wasm/executor.js +2 -0
- package/dist/wasm/layerzero-views.d.ts +1 -0
- package/dist/wasm/layerzero-views.js +2 -0
- package/dist/wasm/oft-std.d.ts +1 -0
- package/dist/wasm/oft-std.js +2 -0
- package/dist/wasm/price-feed.d.ts +1 -0
- package/dist/wasm/price-feed.js +2 -0
- package/dist/wasm/simple-message-lib.d.ts +1 -0
- package/dist/wasm/simple-message-lib.js +2 -0
- package/dist/wasm/treasury.d.ts +1 -0
- package/dist/wasm/treasury.js +2 -0
- package/dist/wasm/uln302.d.ts +1 -0
- package/dist/wasm/uln302.js +2 -0
- package/dist/wasm/upgrader.d.ts +1 -0
- package/dist/wasm/upgrader.js +2 -0
- package/dist/wasm.d.ts +15 -0
- package/dist/wasm.js +15 -0
- package/package.json +12 -9
- package/src/generated/bml.ts +117 -66
- package/src/generated/counter.ts +338 -191
- package/src/generated/dvn.ts +2036 -0
- package/src/generated/dvn_fee_lib.ts +693 -0
- package/src/generated/endpoint.ts +177 -80
- package/src/generated/executor.ts +228 -127
- package/src/generated/executor_fee_lib.ts +1072 -0
- package/src/generated/executor_helper.ts +163 -57
- package/src/generated/oft_std.ts +800 -246
- package/src/generated/price_feed.ts +1108 -0
- package/src/generated/sml.ts +194 -91
- package/src/generated/treasury.ts +943 -0
- package/src/generated/uln302.ts +211 -113
- package/src/generated/upgrader.ts +102 -0
- package/src/index.ts +17 -0
- package/src/wasm/blocked-message-lib.ts +2 -0
- package/src/wasm/counter.ts +2 -0
- package/src/wasm/dvn-fee-lib.ts +2 -0
- package/src/wasm/dvn.ts +2 -0
- package/src/wasm/endpoint-v2.ts +2 -0
- package/src/wasm/executor-fee-lib.ts +2 -0
- package/src/wasm/executor-helper.ts +2 -0
- package/src/wasm/executor.ts +2 -0
- package/src/wasm/layerzero-views.ts +2 -0
- package/src/wasm/oft-std.ts +2 -0
- package/src/wasm/price-feed.ts +2 -0
- package/src/wasm/simple-message-lib.ts +2 -0
- package/src/wasm/treasury.ts +2 -0
- package/src/wasm/uln302.ts +2 -0
- package/src/wasm/upgrader.ts +2 -0
- package/src/wasm.ts +15 -0
- package/test/counter-sml.test.ts +376 -0
- package/test/counter-uln.test.ts +493 -0
- package/test/{oft.test.ts → oft-sml.test.ts} +187 -323
- package/test/suites/constants.ts +22 -2
- package/test/suites/dummyContractClient.ts +169 -0
- package/test/suites/globalSetup.ts +450 -0
- package/test/suites/localnet.ts +23 -6
- package/test/upgrader.test.ts +300 -0
- package/test/utils.ts +558 -85
- package/vitest.config.ts +21 -0
- package/test/index.test.ts +0 -376
package/vitest.config.ts
ADDED
|
@@ -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
|
+
});
|
package/test/index.test.ts
DELETED
|
@@ -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
|
-
});
|