@layerzerolabs/protocol-stellar-v2 0.2.15 → 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 (257) hide show
  1. package/.turbo/turbo-build.log +350 -309
  2. package/.turbo/turbo-lint.log +146 -108
  3. package/.turbo/turbo-test.log +1423 -1238
  4. package/Cargo.lock +12 -0
  5. package/Cargo.toml +3 -0
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +181 -30
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  13. package/contracts/common-macros/src/tests/mod.rs +2 -2
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  16. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +3 -3
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -21
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +2 -2
  21. package/contracts/common-macros/src/ttl_configurable.rs +19 -34
  22. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  23. package/contracts/common-macros/src/upgradeable.rs +5 -5
  24. package/contracts/common-macros/src/utils.rs +9 -0
  25. package/contracts/endpoint-v2/src/constants.rs +4 -4
  26. package/contracts/endpoint-v2/src/endpoint_v2.rs +38 -40
  27. package/contracts/endpoint-v2/src/errors.rs +4 -3
  28. package/contracts/endpoint-v2/src/events.rs +1 -1
  29. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  30. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  31. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  32. package/contracts/endpoint-v2/src/storage.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +3 -3
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +1 -1
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +3 -3
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +3 -3
  39. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +1 -1
  40. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +3 -3
  41. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +1 -1
  42. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +4 -4
  43. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +3 -6
  45. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +2 -2
  46. package/contracts/macro-integration-tests/tests/runtime/ownable/{only_owner_guard.rs → only_auth_guard.rs} +1 -1
  47. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +1 -1
  48. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +1 -1
  49. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +0 -1
  50. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.rs → only_auth_missing_env.rs} +3 -3
  51. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.stderr → only_auth_missing_env.stderr} +4 -4
  52. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +2 -3
  53. package/contracts/macro-integration-tests/tests/ui/ownable/pass/{only_owner_env_param_variants.rs → only_auth_env_param_variants.rs} +9 -9
  54. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +6 -6
  55. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  56. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +3 -3
  57. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +1 -2
  58. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +1 -2
  59. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +9 -9
  60. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +1 -1
  61. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +1 -1
  62. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +2 -2
  63. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  64. package/contracts/message-libs/treasury/src/errors.rs +2 -2
  65. package/contracts/message-libs/treasury/src/events.rs +1 -1
  66. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  67. package/contracts/message-libs/treasury/src/storage.rs +1 -1
  68. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  69. package/contracts/message-libs/treasury/src/treasury.rs +14 -16
  70. package/contracts/message-libs/uln-302/src/receive_uln.rs +13 -2
  71. package/contracts/message-libs/uln-302/src/send_uln.rs +23 -3
  72. package/contracts/message-libs/uln-302/src/uln302.rs +6 -24
  73. package/contracts/oapps/counter/Cargo.toml +14 -1
  74. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  75. package/contracts/oapps/counter/integration_tests/{setup.rs → setup_sml.rs} +48 -80
  76. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  77. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  78. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  79. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  80. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  81. package/contracts/oapps/counter/src/counter.rs +67 -43
  82. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  83. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  84. package/contracts/oapps/oapp/src/errors.rs +5 -1
  85. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +93 -78
  86. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  87. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  88. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  89. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  90. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -8
  91. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -17
  92. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -7
  93. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -15
  94. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  95. package/contracts/oapps/oapp-macros/src/lib.rs +113 -56
  96. package/contracts/oapps/oft/integration-tests/setup.rs +25 -7
  97. package/contracts/oapps/oft/src/errors.rs +6 -1
  98. package/contracts/oapps/oft/src/extensions/oft_fee.rs +8 -8
  99. package/contracts/oapps/oft/src/extensions/pausable.rs +4 -4
  100. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +5 -5
  101. package/contracts/oapps/oft/src/lib.rs +4 -2
  102. package/contracts/oapps/oft/src/oft.rs +24 -64
  103. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  104. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -3
  105. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  106. package/contracts/oapps/oft/src/storage.rs +2 -0
  107. package/contracts/oapps/oft/src/tests/extensions/setup.rs +36 -22
  108. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  109. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  110. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +5 -3
  111. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  112. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  113. package/contracts/oapps/oft/src/tests/test_utils.rs +45 -23
  114. package/contracts/oapps/oft/src/types.rs +20 -0
  115. package/contracts/oapps/oft-std/integration-tests/setup.rs +4 -2
  116. package/contracts/oapps/oft-std/src/oft.rs +24 -6
  117. package/contracts/upgrader/src/lib.rs +4 -4
  118. package/contracts/utils/src/auth.rs +44 -0
  119. package/contracts/utils/src/errors.rs +27 -5
  120. package/contracts/utils/src/lib.rs +3 -0
  121. package/contracts/utils/src/multisig.rs +211 -0
  122. package/contracts/utils/src/ownable.rs +12 -10
  123. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  124. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  125. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  126. package/contracts/utils/src/tests/mod.rs +1 -0
  127. package/contracts/utils/src/tests/multisig.rs +731 -0
  128. package/contracts/utils/src/tests/option_ext.rs +2 -5
  129. package/contracts/utils/src/tests/ownable.rs +16 -5
  130. package/contracts/utils/src/tests/ttl_configurable.rs +27 -16
  131. package/contracts/utils/src/tests/upgradeable.rs +4 -2
  132. package/contracts/utils/src/ttl_configurable.rs +23 -8
  133. package/contracts/utils/src/ttl_extendable.rs +27 -0
  134. package/contracts/utils/src/upgradeable.rs +2 -0
  135. package/contracts/workers/dvn/Cargo.toml +1 -1
  136. package/contracts/workers/dvn/src/auth.rs +7 -7
  137. package/contracts/workers/dvn/src/dvn.rs +10 -38
  138. package/contracts/workers/dvn/src/errors.rs +0 -7
  139. package/contracts/workers/dvn/src/events.rs +1 -14
  140. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  141. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  142. package/contracts/workers/dvn/src/storage.rs +3 -13
  143. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  144. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  145. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  146. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  147. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  148. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  149. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  150. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -6
  151. package/contracts/workers/executor/src/auth.rs +80 -16
  152. package/contracts/workers/executor/src/executor.rs +5 -31
  153. package/contracts/workers/executor/src/storage.rs +2 -9
  154. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  155. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +3 -6
  156. package/contracts/workers/executor-helper/Cargo.toml +1 -1
  157. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  158. package/contracts/workers/price-feed/Cargo.toml +1 -1
  159. package/contracts/workers/price-feed/src/price_feed.rs +7 -10
  160. package/contracts/workers/worker/src/errors.rs +4 -0
  161. package/contracts/workers/worker/src/tests/worker.rs +7 -6
  162. package/contracts/workers/worker/src/worker.rs +20 -16
  163. package/package.json +8 -5
  164. package/sdk/.turbo/turbo-build.log +1 -0
  165. package/sdk/.turbo/turbo-test.log +1009 -0
  166. package/sdk/dist/generated/bml.d.ts +65 -8
  167. package/sdk/dist/generated/bml.js +70 -34
  168. package/sdk/dist/generated/counter.d.ts +167 -42
  169. package/sdk/dist/generated/counter.js +86 -45
  170. package/sdk/dist/generated/dvn.d.ts +282 -229
  171. package/sdk/dist/generated/dvn.js +119 -81
  172. package/sdk/dist/generated/dvn_fee_lib.d.ts +142 -67
  173. package/sdk/dist/generated/dvn_fee_lib.js +64 -24
  174. package/sdk/dist/generated/endpoint.d.ts +97 -22
  175. package/sdk/dist/generated/endpoint.js +75 -37
  176. package/sdk/dist/generated/executor.d.ts +117 -85
  177. package/sdk/dist/generated/executor.js +102 -59
  178. package/sdk/dist/generated/executor_fee_lib.d.ts +162 -78
  179. package/sdk/dist/generated/executor_fee_lib.js +104 -57
  180. package/sdk/dist/generated/executor_helper.d.ts +133 -21
  181. package/sdk/dist/generated/executor_helper.js +99 -50
  182. package/sdk/dist/generated/oft_std.d.ts +233 -55
  183. package/sdk/dist/generated/oft_std.js +99 -54
  184. package/sdk/dist/generated/price_feed.d.ts +142 -67
  185. package/sdk/dist/generated/price_feed.js +64 -24
  186. package/sdk/dist/generated/sml.d.ts +113 -32
  187. package/sdk/dist/generated/sml.js +93 -49
  188. package/sdk/dist/generated/treasury.d.ts +896 -0
  189. package/sdk/dist/generated/treasury.js +219 -0
  190. package/sdk/dist/generated/uln302.d.ts +113 -32
  191. package/sdk/dist/generated/uln302.js +93 -49
  192. package/sdk/dist/generated/upgrader.d.ts +2 -2
  193. package/sdk/dist/generated/upgrader.js +1 -1
  194. package/sdk/dist/index.d.ts +2 -0
  195. package/sdk/dist/index.js +3 -0
  196. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  197. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  198. package/sdk/dist/wasm/counter.d.ts +1 -0
  199. package/sdk/dist/wasm/counter.js +2 -0
  200. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  201. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  202. package/sdk/dist/wasm/dvn.d.ts +1 -0
  203. package/sdk/dist/wasm/dvn.js +2 -0
  204. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  205. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  206. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  207. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  208. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  209. package/sdk/dist/wasm/executor-helper.js +2 -0
  210. package/sdk/dist/wasm/executor.d.ts +1 -0
  211. package/sdk/dist/wasm/executor.js +2 -0
  212. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  213. package/sdk/dist/wasm/layerzero-views.js +2 -0
  214. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  215. package/sdk/dist/wasm/oft-std.js +2 -0
  216. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  217. package/sdk/dist/wasm/price-feed.js +2 -0
  218. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  219. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  220. package/sdk/dist/wasm/treasury.d.ts +1 -0
  221. package/sdk/dist/wasm/treasury.js +2 -0
  222. package/sdk/dist/wasm/uln302.d.ts +1 -0
  223. package/sdk/dist/wasm/uln302.js +2 -0
  224. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  225. package/sdk/dist/wasm/upgrader.js +2 -0
  226. package/sdk/dist/wasm.d.ts +15 -0
  227. package/sdk/dist/wasm.js +15 -0
  228. package/sdk/package.json +4 -2
  229. package/sdk/src/index.ts +4 -0
  230. package/sdk/test/counter-sml.test.ts +376 -0
  231. package/sdk/test/counter-uln.test.ts +493 -0
  232. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +185 -310
  233. package/sdk/test/suites/constants.ts +22 -2
  234. package/sdk/test/suites/globalSetup.ts +450 -0
  235. package/sdk/test/suites/localnet.ts +23 -6
  236. package/sdk/test/upgrader.test.ts +7 -16
  237. package/sdk/test/utils.ts +558 -85
  238. package/sdk/vitest.config.ts +21 -0
  239. package/tools/ts-bindings-gen/src/main.rs +1 -0
  240. package/turbo.json +2 -0
  241. package/contracts/common-macros/src/contract_impl.rs +0 -52
  242. package/contracts/common-macros/src/ownable.rs +0 -41
  243. package/contracts/common-macros/src/tests/contract_impl.rs +0 -386
  244. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -12
  245. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +0 -50
  246. package/contracts/oapps/oapp-macros/src/oapp_core.rs +0 -41
  247. package/contracts/oapps/oapp-macros/src/oapp_full.rs +0 -21
  248. package/contracts/oapps/oapp-macros/src/oapp_options_type3.rs +0 -31
  249. package/contracts/oapps/oapp-macros/src/oapp_receiver.rs +0 -48
  250. package/contracts/oapps/oapp-macros/src/oapp_sender.rs +0 -21
  251. package/contracts/oapps/oapp-macros/src/util.rs +0 -107
  252. package/contracts/oapps/oft/src/constants.rs +0 -5
  253. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -152
  254. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  255. package/contracts/workers/dvn/src/multisig.rs +0 -157
  256. package/sdk/test/index.test.ts +0 -375
  257. /package/sdk/test/suites/{testUpgradeable.ts → dummyContractClient.ts} +0 -0
@@ -0,0 +1,493 @@
1
+ import { StrKey } from '@stellar/stellar-sdk';
2
+ import path from 'path';
3
+ import { beforeAll, describe, expect, inject, it } from 'vitest';
4
+
5
+ import { getFullyQualifiedRepoRootPath } from '@layerzerolabs/common-node-utils';
6
+ import { Options, PacketSerializer, PacketV1Codec } from '@layerzerolabs/lz-v2-utilities';
7
+
8
+ import { Client as CounterClient } from '../src/generated/counter';
9
+ import { Client as ExecutorHelperClient } from '../src/generated/executor_helper';
10
+ import { Client as Uln302Client } from '../src/generated/uln302';
11
+ import {
12
+ DEFAULT_DEPLOYER,
13
+ DVN_SIGNER,
14
+ DVN_VID,
15
+ EID,
16
+ EXECUTOR_ADMIN,
17
+ MSG_TYPE_COMPOSED_ABA,
18
+ MSG_TYPE_VANILLA,
19
+ NETWORK_PASSPHRASE,
20
+ } from './suites/constants';
21
+ import { deployContract } from './suites/deploy';
22
+ import { PacketSentEvent, scanPacketSentEvents } from './suites/scan';
23
+ import {
24
+ assertTransactionSucceeded,
25
+ createClient,
26
+ getNativeBalance,
27
+ signAndSendWithExecutorAuth,
28
+ signDvnAuthEntries,
29
+ } from './utils';
30
+
31
+ // Protocol addresses (will be injected from globalSetup in beforeAll)
32
+ let protocolAddresses: ReturnType<typeof inject<'protocolAddresses'>>;
33
+
34
+ // Counter-specific address
35
+ let counterAddress = '';
36
+
37
+ // Clients
38
+ let uln302Client: Uln302Client;
39
+ let counterClient: CounterClient;
40
+ let executorHelperClient: ExecutorHelperClient;
41
+
42
+ // NOTE: run `stellar contract build --features sandbox` before running the test
43
+
44
+ describe('Counter with ULN302 testing', async () => {
45
+ const repoRoot = await getFullyQualifiedRepoRootPath();
46
+ const wasmDir = path.join(
47
+ repoRoot,
48
+ 'contracts',
49
+ 'protocol',
50
+ 'stellar',
51
+ 'target',
52
+ 'wasm32v1-none',
53
+ 'release',
54
+ );
55
+
56
+ const COUNTER_WASM_PATH = path.join(wasmDir, 'counter.wasm');
57
+
58
+ beforeAll(async () => {
59
+ // Inject protocol addresses from globalSetup
60
+ protocolAddresses = inject('protocolAddresses');
61
+
62
+ console.log('\n📋 Protocol addresses injected from globalSetup');
63
+ console.log(' Endpoint:', protocolAddresses.endpointV2);
64
+ console.log(' ULN302:', protocolAddresses.uln302);
65
+ console.log(' DVN:', protocolAddresses.dvn);
66
+ console.log(' Executor:', protocolAddresses.executor);
67
+ console.log(' Executor Helper:', protocolAddresses.executorHelper);
68
+
69
+ // Create clients for protocol contracts
70
+ uln302Client = createClient(Uln302Client, protocolAddresses.uln302);
71
+ executorHelperClient = createClient(ExecutorHelperClient, protocolAddresses.executorHelper);
72
+ });
73
+
74
+ describe('Deploy Counter', () => {
75
+ it('Deploy Counter', async () => {
76
+ counterClient = await deployContract<CounterClient>(
77
+ CounterClient,
78
+ COUNTER_WASM_PATH,
79
+ {
80
+ owner: DEFAULT_DEPLOYER.publicKey(),
81
+ endpoint: protocolAddresses.endpointV2,
82
+ delegate: DEFAULT_DEPLOYER.publicKey(),
83
+ },
84
+ DEFAULT_DEPLOYER,
85
+ );
86
+
87
+ counterAddress = counterClient.options.contractId;
88
+ console.log('✅ Counter deployed:', counterAddress);
89
+ });
90
+
91
+ it('Set Counter Peer', async () => {
92
+ const peerBytes = StrKey.decodeContract(counterAddress);
93
+
94
+ const assembledTx = await counterClient.set_peer({
95
+ eid: EID,
96
+ peer: Buffer.from(peerBytes),
97
+ });
98
+ await assembledTx.signAndSend();
99
+
100
+ const { result: peer } = await counterClient.peer({
101
+ eid: EID,
102
+ });
103
+ expect(peer?.toString()).toBe(Buffer.from(peerBytes).toString());
104
+ console.log('✅ Counter peer set for EID', EID);
105
+ });
106
+ });
107
+
108
+ describe('Counter Increment with Composed ABA and Native Drop', async () => {
109
+ let incrementLedger = 0;
110
+ let packetSentEvent: PacketSentEvent;
111
+ let guid: Buffer;
112
+ let message: Buffer;
113
+ let packetHeader: Buffer;
114
+ let payloadHash: Buffer;
115
+ let composeValue: bigint;
116
+
117
+ // Native drop receiver - use DEFAULT_DEPLOYER as the receiver
118
+ const NATIVE_DROP_AMOUNT = 1000000n; // 0.1 XLM (in stroops)
119
+ let nativeDropReceiver: Buffer;
120
+
121
+ it('Counter Increment (Composed ABA with Native Drop)', async () => {
122
+ // Get the native drop receiver address (32 bytes)
123
+ nativeDropReceiver = Buffer.from(
124
+ StrKey.decodeEd25519PublicKey(DEFAULT_DEPLOYER.publicKey()),
125
+ );
126
+ const nativeDropReceiverHex = '0x' + nativeDropReceiver.toString('hex');
127
+
128
+ // First quote the return fee (for the lz_compose to send back a message)
129
+ // Return message uses vanilla type with lzReceive option
130
+ const returnOptions = Options.newOptions().addExecutorLzReceiveOption(200000n, 0n);
131
+
132
+ const { result: returnFee } = await counterClient.quote({
133
+ dst_eid: EID,
134
+ msg_type: MSG_TYPE_VANILLA,
135
+ options: Buffer.from(returnOptions.toBytes()),
136
+ pay_in_zro: false,
137
+ });
138
+ console.log('✅ Return fee for ComposedABA:', returnFee);
139
+
140
+ // Add 1% buffer to the return fee
141
+ const returnFeeWithBuffer = (returnFee.native_fee * 101n) / 100n;
142
+ composeValue = returnFeeWithBuffer;
143
+
144
+ // Build type 3 options with:
145
+ // 1. lz_receive option (gas only, no value)
146
+ // 2. native_drop option (amount + receiver)
147
+ // 3. lz_compose option (index + gas + value for return message)
148
+ const composedAbaOptions = Options.newOptions()
149
+ .addExecutorLzReceiveOption(200000n, 0n)
150
+ .addExecutorNativeDropOption(NATIVE_DROP_AMOUNT, nativeDropReceiverHex)
151
+ .addExecutorComposeOption(0, 200000n, returnFeeWithBuffer);
152
+
153
+ const optionsBuffer = Buffer.from(composedAbaOptions.toBytes());
154
+
155
+ const { result: fee } = await counterClient.quote({
156
+ dst_eid: EID,
157
+ msg_type: MSG_TYPE_COMPOSED_ABA,
158
+ options: optionsBuffer,
159
+ pay_in_zro: false,
160
+ });
161
+ console.log('✅ ComposedABA Fee:', fee);
162
+
163
+ const assembledTx = await counterClient.increment({
164
+ caller: DEFAULT_DEPLOYER.publicKey(),
165
+ dst_eid: EID,
166
+ msg_type: MSG_TYPE_COMPOSED_ABA,
167
+ options: optionsBuffer,
168
+ fee: fee,
169
+ });
170
+ const sentTx = await assembledTx.signAndSend();
171
+
172
+ // Extract ledger number from transaction response
173
+ const txResponse = sentTx.getTransactionResponse;
174
+ if (txResponse && 'ledger' in txResponse) {
175
+ incrementLedger = txResponse.ledger;
176
+ }
177
+
178
+ const { result: outboundCount } = await counterClient.outbound_count({
179
+ eid: EID,
180
+ });
181
+ expect(outboundCount).toBe(1n);
182
+ console.log('✅ Counter incremented (Composed ABA), outbound count:', outboundCount);
183
+ });
184
+
185
+ it('Scan PacketSent Events (Composed ABA)', async () => {
186
+ const packetSentEvents = await scanPacketSentEvents(
187
+ protocolAddresses.endpointV2,
188
+ incrementLedger,
189
+ );
190
+ expect(packetSentEvents.length).toBeGreaterThan(0);
191
+ packetSentEvent = packetSentEvents[0];
192
+ console.log(
193
+ `✅ PacketSent events scanned successfully. Found ${packetSentEvents.length} events`,
194
+ );
195
+ });
196
+
197
+ it('Extract Packet Header and Payload Hash (Composed ABA)', async () => {
198
+ const packet = PacketSerializer.deserialize(packetSentEvent.encoded_packet);
199
+ guid = Buffer.from(packet.guid.replace('0x', ''), 'hex');
200
+ message = Buffer.from(packet.message.replace('0x', ''), 'hex');
201
+
202
+ const codec = PacketV1Codec.from(packet);
203
+ packetHeader = Buffer.from(codec.header().replace('0x', ''), 'hex');
204
+ payloadHash = Buffer.from(codec.payloadHash().replace('0x', ''), 'hex');
205
+
206
+ console.log('✅ Packet header extracted, length:', packetHeader.length);
207
+ console.log(
208
+ '✅ Payload hash extracted:',
209
+ payloadHash.toString('hex').slice(0, 16) + '...',
210
+ );
211
+ });
212
+
213
+ it('DVN Verifies Message (Composed ABA)', async () => {
214
+ const verifyTx = await uln302Client.verify({
215
+ dvn: protocolAddresses.dvn,
216
+ packet_header: packetHeader,
217
+ payload_hash: payloadHash,
218
+ confirmations: 1n,
219
+ });
220
+
221
+ await signDvnAuthEntries(
222
+ protocolAddresses.dvn,
223
+ DVN_VID,
224
+ DEFAULT_DEPLOYER,
225
+ [DVN_SIGNER],
226
+ verifyTx,
227
+ NETWORK_PASSPHRASE,
228
+ );
229
+
230
+ await verifyTx.signAndSend();
231
+ console.log('✅ DVN verified message (Composed ABA)');
232
+
233
+ const { result: isVerifiable } = await uln302Client.verifiable({
234
+ packet_header: packetHeader,
235
+ payload_hash: payloadHash,
236
+ });
237
+ expect(isVerifiable).toBe(true);
238
+ });
239
+
240
+ it('Commit Verification (Composed ABA)', async () => {
241
+ const commitTx = await uln302Client.commit_verification({
242
+ packet_header: packetHeader,
243
+ payload_hash: payloadHash,
244
+ });
245
+ await commitTx.signAndSend();
246
+ console.log('✅ Verification committed to endpoint (Composed ABA)');
247
+ });
248
+
249
+ it('Execute native_drop_and_execute (Composed ABA)', async () => {
250
+ // Execute native_drop + lz_receive together
251
+ // For ComposedABA, lz_receive will queue a compose message via send_compose
252
+ const origin = {
253
+ nonce: 1n, // First message
254
+ sender: Buffer.from(StrKey.decodeContract(counterAddress)),
255
+ src_eid: EID,
256
+ };
257
+
258
+ // Get the balance before native drop
259
+ const balanceBefore = await getNativeBalance(DEFAULT_DEPLOYER.publicKey());
260
+ console.log('💰 Balance before native drop:', balanceBefore);
261
+
262
+ const assembledTx = await executorHelperClient.native_drop_and_execute(
263
+ {
264
+ executor: protocolAddresses.executor,
265
+ admin: EXECUTOR_ADMIN.publicKey(),
266
+ origin,
267
+ dst_eid: EID,
268
+ oapp: counterAddress,
269
+ native_drop_params: [
270
+ {
271
+ receiver: DEFAULT_DEPLOYER.publicKey(),
272
+ amount: NATIVE_DROP_AMOUNT,
273
+ },
274
+ ],
275
+ execute_params: {
276
+ extra_data: Buffer.from([]),
277
+ gas_limit: 0n,
278
+ guid,
279
+ message,
280
+ origin,
281
+ receiver: counterAddress,
282
+ value: 0n, // No value for lz_receive, value is for lz_compose
283
+ },
284
+ },
285
+ {
286
+ simulate: false,
287
+ },
288
+ );
289
+
290
+ const txResult = await signAndSendWithExecutorAuth(
291
+ protocolAddresses.executor,
292
+ EXECUTOR_ADMIN,
293
+ assembledTx,
294
+ NETWORK_PASSPHRASE,
295
+ );
296
+
297
+ assertTransactionSucceeded(txResult, 'native_drop_and_execute (Composed ABA)');
298
+
299
+ // Verify native drop was received
300
+ const balanceAfter = await getNativeBalance(DEFAULT_DEPLOYER.publicKey());
301
+ console.log('💰 Balance after native drop:', balanceAfter);
302
+ const balanceIncrease = balanceAfter - balanceBefore;
303
+ expect(balanceIncrease).toBe(NATIVE_DROP_AMOUNT);
304
+ console.log('✅ Native drop received:', NATIVE_DROP_AMOUNT, 'stroops');
305
+
306
+ // Verify the counter state
307
+ const { result: inboundCount } = await counterClient.inbound_count({
308
+ eid: EID,
309
+ });
310
+ expect(inboundCount).toBe(1n);
311
+ console.log('✅ Inbound count from EID', EID, ':', inboundCount);
312
+ });
313
+
314
+ // Variables for tracking the return message
315
+ let composeLedger = 0;
316
+ let returnPacketSentEvent: PacketSentEvent;
317
+ let returnGuid: Buffer;
318
+ let returnMessage: Buffer;
319
+ let returnPacketHeader: Buffer;
320
+ let returnPayloadHash: Buffer;
321
+
322
+ it('Execute lz_compose (Composed ABA)', async () => {
323
+ // Now execute the compose message that was queued by lz_receive
324
+ // For ComposedABA, this will send a return message back to source
325
+ const assembledTx = await executorHelperClient.compose(
326
+ {
327
+ executor: protocolAddresses.executor,
328
+ params: {
329
+ from: counterAddress, // Compose message is from the counter
330
+ to: counterAddress, // And to the counter (self-compose)
331
+ guid,
332
+ index: 0,
333
+ message,
334
+ extra_data: Buffer.from([]),
335
+ value: composeValue,
336
+ gas_limit: 0n,
337
+ },
338
+ value_payer: EXECUTOR_ADMIN.publicKey(),
339
+ },
340
+ {
341
+ simulate: false,
342
+ },
343
+ );
344
+
345
+ const txResult = await signAndSendWithExecutorAuth(
346
+ protocolAddresses.executor,
347
+ EXECUTOR_ADMIN,
348
+ assembledTx,
349
+ NETWORK_PASSPHRASE,
350
+ );
351
+
352
+ assertTransactionSucceeded(txResult, 'lz_compose (Composed ABA)');
353
+
354
+ // Extract ledger number for scanning return packet
355
+ if ('ledger' in txResult) {
356
+ composeLedger = txResult.ledger;
357
+ }
358
+
359
+ // Verify composed count increased
360
+ const { result: composedCount } = await counterClient.composed_count();
361
+ expect(composedCount).toBe(1n);
362
+ console.log('✅ Composed count:', composedCount);
363
+
364
+ // Verify outbound count increased (return message was sent)
365
+ const { result: outboundCount } = await counterClient.outbound_count({
366
+ eid: EID,
367
+ });
368
+ expect(outboundCount).toBe(2n); // 1 original + 1 return message
369
+ console.log('✅ Outbound count (including return message):', outboundCount);
370
+ });
371
+
372
+ it('Scan Return PacketSent Events', async () => {
373
+ // Scan for the return packet sent by lz_compose
374
+ const packetSentEvents = await scanPacketSentEvents(
375
+ protocolAddresses.endpointV2,
376
+ composeLedger,
377
+ );
378
+ expect(packetSentEvents.length).toBeGreaterThan(0);
379
+ returnPacketSentEvent = packetSentEvents[0];
380
+ console.log(
381
+ `✅ Return PacketSent events scanned. Found ${packetSentEvents.length} events`,
382
+ );
383
+ });
384
+
385
+ it('Extract Return Packet Header and Payload Hash', async () => {
386
+ const packet = PacketSerializer.deserialize(returnPacketSentEvent.encoded_packet);
387
+ returnGuid = Buffer.from(packet.guid.replace('0x', ''), 'hex');
388
+ returnMessage = Buffer.from(packet.message.replace('0x', ''), 'hex');
389
+
390
+ const codec = PacketV1Codec.from(packet);
391
+ returnPacketHeader = Buffer.from(codec.header().replace('0x', ''), 'hex');
392
+ returnPayloadHash = Buffer.from(codec.payloadHash().replace('0x', ''), 'hex');
393
+
394
+ console.log('✅ Return packet header extracted, length:', returnPacketHeader.length);
395
+ console.log(
396
+ '✅ Return payload hash extracted:',
397
+ returnPayloadHash.toString('hex').slice(0, 16) + '...',
398
+ );
399
+ });
400
+
401
+ it('DVN Verifies Return Message', async () => {
402
+ const verifyTx = await uln302Client.verify({
403
+ dvn: protocolAddresses.dvn,
404
+ packet_header: returnPacketHeader,
405
+ payload_hash: returnPayloadHash,
406
+ confirmations: 1n,
407
+ });
408
+
409
+ await signDvnAuthEntries(
410
+ protocolAddresses.dvn,
411
+ DVN_VID,
412
+ DEFAULT_DEPLOYER,
413
+ [DVN_SIGNER],
414
+ verifyTx,
415
+ NETWORK_PASSPHRASE,
416
+ );
417
+
418
+ await verifyTx.signAndSend();
419
+ console.log('✅ DVN verified return message');
420
+
421
+ const { result: isVerifiable } = await uln302Client.verifiable({
422
+ packet_header: returnPacketHeader,
423
+ payload_hash: returnPayloadHash,
424
+ });
425
+ expect(isVerifiable).toBe(true);
426
+ });
427
+
428
+ it('Commit Verification (Return Message)', async () => {
429
+ const commitTx = await uln302Client.commit_verification({
430
+ packet_header: returnPacketHeader,
431
+ payload_hash: returnPayloadHash,
432
+ });
433
+ await commitTx.signAndSend();
434
+ console.log('✅ Verification committed for return message');
435
+ });
436
+
437
+ it('Receive Return Message (lz_receive)', async () => {
438
+ // Execute lz_receive for the return message (Vanilla type)
439
+ const origin = {
440
+ nonce: 2n, // Second message (return from ComposedABA)
441
+ sender: Buffer.from(StrKey.decodeContract(counterAddress)),
442
+ src_eid: EID,
443
+ };
444
+
445
+ const assembledTx = await executorHelperClient.execute(
446
+ {
447
+ executor: protocolAddresses.executor,
448
+ params: {
449
+ extra_data: Buffer.from([]),
450
+ gas_limit: 0n,
451
+ guid: returnGuid,
452
+ message: returnMessage,
453
+ origin,
454
+ receiver: counterAddress,
455
+ value: 0n,
456
+ },
457
+ value_payer: EXECUTOR_ADMIN.publicKey(),
458
+ },
459
+ {
460
+ simulate: false,
461
+ },
462
+ );
463
+
464
+ const txResult = await signAndSendWithExecutorAuth(
465
+ protocolAddresses.executor,
466
+ EXECUTOR_ADMIN,
467
+ assembledTx,
468
+ NETWORK_PASSPHRASE,
469
+ );
470
+
471
+ assertTransactionSucceeded(txResult, 'lz_receive (Return Message)');
472
+
473
+ // Verify final counter state
474
+ const { result: count } = await counterClient.count();
475
+ expect(count).toBe(2n);
476
+ console.log('✅ Final counter count:', count);
477
+
478
+ const { result: inboundCount } = await counterClient.inbound_count({
479
+ eid: EID,
480
+ });
481
+ expect(inboundCount).toBe(2n); // 1 composed ABA + 1 return
482
+ console.log('✅ Final inbound count from EID', EID, ':', inboundCount);
483
+
484
+ console.log('\n🎉 Counter Composed ABA with Native Drop - Full Round Trip completed!');
485
+ console.log(
486
+ ' Workflow: Send ComposedABA → DVN Verify → Commit → native_drop_and_execute',
487
+ );
488
+ console.log(
489
+ ' → lz_compose (sends return) → DVN Verify → Commit → lz_receive',
490
+ );
491
+ });
492
+ });
493
+ });