@layerzerolabs/protocol-stellar-v2 0.2.53 → 0.2.55

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.
@@ -45,8 +45,16 @@ impl ExecutorHelper {
45
45
  executor.require_auth();
46
46
  if params.value != 0 {
47
47
  value_payer.require_auth();
48
+ transfer_value(env, value_payer, executor, params.value);
48
49
  }
49
- Self::execute_internal(env, executor, params, value_payer);
50
+ LayerZeroReceiverClient::new(env, &params.receiver).lz_receive(
51
+ executor,
52
+ &params.origin,
53
+ &params.guid,
54
+ &params.message,
55
+ &params.extra_data,
56
+ &params.value,
57
+ );
50
58
  }
51
59
 
52
60
  /// Records a failed `lz_receive` execution for off-chain processing.
@@ -113,38 +121,6 @@ impl ExecutorHelper {
113
121
  ExecutorClient::new(env, executor).native_drop(admin, origin, &dst_eid, oapp, params);
114
122
  }
115
123
 
116
- /// Executes `native_drop` followed by `lz_receive`.
117
- pub fn native_drop_and_execute(
118
- env: &Env,
119
- executor: &Address,
120
- admin: &Address,
121
- origin: &Origin,
122
- dst_eid: u32,
123
- oapp: &Address,
124
- native_drop_params: &Vec<NativeDropParams>,
125
- execute_params: &ExecutionParams,
126
- ) {
127
- executor.require_auth();
128
- admin.require_auth();
129
- Self::native_drop(env, executor, admin, origin, dst_eid, oapp, native_drop_params);
130
- Self::execute_internal(env, executor, execute_params, admin);
131
- }
132
-
133
- /// Internal execute logic without auth checks.
134
- /// Callers (`execute` / `native_drop_and_execute`) are responsible for authorization.
135
- fn execute_internal(env: &Env, executor: &Address, params: &ExecutionParams, value_payer: &Address) {
136
- if params.value != 0 {
137
- transfer_value(env, value_payer, executor, params.value);
138
- }
139
- LayerZeroReceiverClient::new(env, &params.receiver).lz_receive(
140
- executor,
141
- &params.origin,
142
- &params.guid,
143
- &params.message,
144
- &params.extra_data,
145
- &params.value,
146
- );
147
- }
148
124
  }
149
125
 
150
126
  #[inline]
@@ -339,125 +339,3 @@ fn test_lz_compose_alert_with_empty_reason() {
339
339
  assert_eq!(record.unwrap().reason.len(), 0);
340
340
  }
341
341
 
342
- // =============================================================================
343
- // native_drop_and_execute() tests
344
- // =============================================================================
345
-
346
- #[test]
347
- fn test_native_drop_and_execute_calls_both() {
348
- let setup = TestSetup::new();
349
- let origin = setup.default_origin();
350
- let dst_eid = 2u32;
351
- let oapp = Address::generate(&setup.env);
352
-
353
- let receiver1 = Address::generate(&setup.env);
354
- let native_drop_params: Vec<NativeDropParams> =
355
- vec![&setup.env, NativeDropParams { receiver: receiver1.clone(), amount: 10 }];
356
-
357
- let execute_params = setup.default_execution_params();
358
-
359
- setup.mock_all_auths();
360
- setup.executor_helper_client.native_drop_and_execute(
361
- &setup.executor,
362
- &setup.admin,
363
- &origin,
364
- &dst_eid,
365
- &oapp,
366
- &native_drop_params,
367
- &execute_params,
368
- );
369
-
370
- // Verify native_drop was called
371
- let drop_record = setup.executor_client().get_native_drop();
372
- assert!(drop_record.is_some());
373
- let drop_record = drop_record.unwrap();
374
- assert_eq!(drop_record.admin, setup.admin);
375
- assert_eq!(drop_record.origin, origin);
376
- assert_eq!(drop_record.dst_eid, dst_eid);
377
- assert_eq!(drop_record.oapp, oapp);
378
- assert_eq!(drop_record.params.len(), 1);
379
- assert_eq!(drop_record.params.get(0).unwrap().receiver, receiver1);
380
- assert_eq!(drop_record.params.get(0).unwrap().amount, 10);
381
-
382
- // Verify lz_receive was also called
383
- let receive_record = setup.receiver_client().get_lz_receive();
384
- assert!(receive_record.is_some());
385
- let receive_record = receive_record.unwrap();
386
- assert_eq!(receive_record.executor, setup.executor);
387
- assert_eq!(receive_record.origin, execute_params.origin);
388
- assert_eq!(receive_record.guid, execute_params.guid);
389
- }
390
-
391
- #[test]
392
- fn test_native_drop_and_execute_with_empty_drop_params() {
393
- let setup = TestSetup::new();
394
- let origin = setup.default_origin();
395
- let dst_eid = 1u32;
396
- let oapp = Address::generate(&setup.env);
397
- let native_drop_params: Vec<NativeDropParams> = vec![&setup.env];
398
- let execute_params = setup.default_execution_params();
399
-
400
- setup.mock_all_auths();
401
- setup.executor_helper_client.native_drop_and_execute(
402
- &setup.executor,
403
- &setup.admin,
404
- &origin,
405
- &dst_eid,
406
- &oapp,
407
- &native_drop_params,
408
- &execute_params,
409
- );
410
-
411
- // Verify native_drop was called with empty params
412
- let drop_record = setup.executor_client().get_native_drop();
413
- assert!(drop_record.is_some());
414
- assert_eq!(drop_record.unwrap().params.len(), 0);
415
-
416
- // Verify lz_receive was still called
417
- let receive_record = setup.receiver_client().get_lz_receive();
418
- assert!(receive_record.is_some());
419
- }
420
-
421
- #[test]
422
- fn test_native_drop_and_execute_with_value_transfer() {
423
- let setup = TestSetup::new();
424
- let origin = setup.default_origin();
425
- let dst_eid = 2u32;
426
- let oapp = Address::generate(&setup.env);
427
-
428
- let receiver1 = Address::generate(&setup.env);
429
- let native_drop_params: Vec<NativeDropParams> =
430
- vec![&setup.env, NativeDropParams { receiver: receiver1.clone(), amount: 10 }];
431
-
432
- let mut execute_params = setup.default_execution_params();
433
- execute_params.value = 25; // Add value to trigger token transfer
434
-
435
- // Mint tokens to admin (value payer)
436
- setup.mint_native(&setup.admin, 100);
437
- let admin_before = setup.balance_native(&setup.admin);
438
- let executor_before = setup.balance_native(&setup.executor);
439
-
440
- setup.mock_all_auths();
441
- setup.executor_helper_client.native_drop_and_execute(
442
- &setup.executor,
443
- &setup.admin,
444
- &origin,
445
- &dst_eid,
446
- &oapp,
447
- &native_drop_params,
448
- &execute_params,
449
- );
450
-
451
- // Verify token transfer occurred
452
- assert_eq!(setup.balance_native(&setup.admin), admin_before - 25);
453
- assert_eq!(setup.balance_native(&setup.executor), executor_before + 25);
454
-
455
- // Verify both operations occurred
456
- let drop_record = setup.executor_client().get_native_drop();
457
- assert!(drop_record.is_some());
458
- assert_eq!(drop_record.unwrap().params.len(), 1);
459
-
460
- let receive_record = setup.receiver_client().get_lz_receive();
461
- assert!(receive_record.is_some());
462
- assert_eq!(receive_record.unwrap().value, 25);
463
- }
package/docs/oft-guide.md CHANGED
@@ -11,6 +11,21 @@ An OFT enables cross-chain token transfers through LayerZero. The framework prov
11
11
  - **Token types**: MintBurn and LockUnlock strategies
12
12
  - **Extensions**: Pausable, fee collection, rate limiting
13
13
 
14
+ ### Classic Assets Receiving Requirements
15
+
16
+ #### G-Address (EOA)
17
+
18
+ G-address recipients must meet two prerequisites before they can receive classic assets:
19
+
20
+ 1. **Account activation**: The account must hold a minimum of 1 XLM to exist on the Stellar network.
21
+ 2. **Trustline**: The account must have an explicit trustline for the classic asset being received.
22
+
23
+ If `lz_receive` fails due to unmet prerequisites, delivery can be retried once the recipient account is activated and the trustline is established.
24
+
25
+ #### C-Address (Smart Contract)
26
+
27
+ C-address recipients are not subject to these restrictions. As long as the contract address exists on-chain, it can receive assets directly.
28
+
14
29
  ## Architecture
15
30
 
16
31
  ```
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@layerzerolabs/protocol-stellar-v2",
3
- "version": "0.2.53",
3
+ "version": "0.2.55",
4
4
  "private": false,
5
5
  "license": "LZBL-1.2",
6
6
  "devDependencies": {
7
7
  "@types/node": "^22.18.6",
8
8
  "tsx": "^4.19.3",
9
9
  "typescript": "^5.8.2",
10
- "@layerzerolabs/common-node-utils": "0.2.53",
11
- "@layerzerolabs/stellar-ts-bindings-gen": "0.2.53",
12
- "@layerzerolabs/vm-tooling-stellar": "0.2.53"
10
+ "@layerzerolabs/common-node-utils": "0.2.55",
11
+ "@layerzerolabs/vm-tooling-stellar": "0.2.55",
12
+ "@layerzerolabs/stellar-ts-bindings-gen": "0.2.55"
13
13
  },
14
14
  "publishConfig": {
15
15
  "access": "restricted",