@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.21

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 (249) hide show
  1. package/.turbo/turbo-build.log +795 -791
  2. package/.turbo/turbo-lint.log +325 -155
  3. package/.turbo/turbo-test.log +1398 -1277
  4. package/Cargo.lock +122 -111
  5. package/Cargo.toml +32 -16
  6. package/contracts/common-macros/Cargo.toml +7 -7
  7. package/contracts/common-macros/src/auth.rs +18 -37
  8. package/contracts/common-macros/src/contract_ttl.rs +18 -7
  9. package/contracts/common-macros/src/lib.rs +31 -14
  10. package/contracts/common-macros/src/lz_contract.rs +38 -7
  11. package/contracts/common-macros/src/storage.rs +251 -292
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
  18. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  19. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  20. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  21. package/contracts/common-macros/src/upgradeable.rs +61 -26
  22. package/contracts/common-macros/src/utils.rs +0 -9
  23. package/contracts/endpoint-v2/src/lib.rs +3 -2
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  35. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  36. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  39. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  41. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  42. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  43. package/contracts/layerzero-views/Cargo.toml +0 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  45. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  49. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  50. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  51. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  64. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  65. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  66. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  67. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  68. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  69. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  70. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  71. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  72. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  73. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  75. package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
  76. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  78. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  80. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  81. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
  82. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  83. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  84. package/contracts/oapps/counter/Cargo.toml +5 -6
  85. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  86. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  89. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  90. package/contracts/oapps/oapp/src/lib.rs +1 -0
  91. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  92. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  93. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  94. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  95. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  96. package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
  97. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
  98. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
  99. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
  100. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  101. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  102. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  103. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  104. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  105. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  106. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  107. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  108. package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
  109. package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
  110. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
  111. package/contracts/oapps/oft/src/oft.rs +45 -50
  112. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  113. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
  114. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  115. package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
  116. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  117. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  118. package/contracts/oapps/oft-core/src/events.rs +6 -0
  119. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  120. package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
  121. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  122. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  123. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  124. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  125. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  126. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  127. package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
  128. package/contracts/upgrader/src/lib.rs +30 -57
  129. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  130. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  131. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  132. package/contracts/utils/Cargo.toml +0 -1
  133. package/contracts/utils/src/buffer_reader.rs +1 -0
  134. package/contracts/utils/src/errors.rs +4 -2
  135. package/contracts/utils/src/multisig.rs +17 -8
  136. package/contracts/utils/src/ownable.rs +6 -6
  137. package/contracts/utils/src/testing_utils.rs +124 -54
  138. package/contracts/utils/src/tests/multisig.rs +12 -12
  139. package/contracts/utils/src/tests/ownable.rs +6 -6
  140. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  141. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  142. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  143. package/contracts/utils/src/ttl_configurable.rs +13 -7
  144. package/contracts/utils/src/upgradeable.rs +48 -23
  145. package/contracts/workers/dvn/Cargo.toml +6 -6
  146. package/contracts/workers/dvn/src/auth.rs +12 -42
  147. package/contracts/workers/dvn/src/dvn.rs +15 -40
  148. package/contracts/workers/dvn/src/errors.rs +0 -1
  149. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  150. package/contracts/workers/dvn/src/lib.rs +4 -3
  151. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  152. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  153. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  154. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  155. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  156. package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
  157. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
  158. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  159. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
  160. package/contracts/workers/executor/Cargo.toml +4 -0
  161. package/contracts/workers/executor/src/executor.rs +15 -36
  162. package/contracts/workers/executor/src/lib.rs +2 -2
  163. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  164. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  165. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  166. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  167. package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
  168. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
  169. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  170. package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
  171. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  172. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  173. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  174. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  175. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  176. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  177. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  178. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  179. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  180. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  181. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  182. package/contracts/workers/price-feed/Cargo.toml +7 -1
  183. package/contracts/workers/price-feed/src/events.rs +1 -1
  184. package/contracts/workers/price-feed/src/lib.rs +12 -4
  185. package/contracts/workers/price-feed/src/price_feed.rs +5 -21
  186. package/contracts/workers/price-feed/src/storage.rs +1 -1
  187. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  188. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  189. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  190. package/contracts/workers/price-feed/src/types.rs +1 -1
  191. package/contracts/workers/worker/src/errors.rs +1 -4
  192. package/contracts/workers/worker/src/lib.rs +0 -2
  193. package/contracts/workers/worker/src/storage.rs +32 -29
  194. package/contracts/workers/worker/src/tests/setup.rs +2 -8
  195. package/contracts/workers/worker/src/tests/worker.rs +96 -74
  196. package/contracts/workers/worker/src/worker.rs +75 -75
  197. package/docs/error-spec.md +55 -0
  198. package/docs/layerzero-v2-on-stellar.md +447 -0
  199. package/docs/oapp-guide.md +212 -0
  200. package/docs/oft-guide.md +314 -0
  201. package/package.json +3 -3
  202. package/sdk/.turbo/turbo-test.log +268 -263
  203. package/sdk/dist/generated/bml.d.ts +12 -4
  204. package/sdk/dist/generated/bml.js +9 -7
  205. package/sdk/dist/generated/counter.d.ts +306 -298
  206. package/sdk/dist/generated/counter.js +48 -46
  207. package/sdk/dist/generated/dvn.d.ts +450 -411
  208. package/sdk/dist/generated/dvn.js +66 -64
  209. package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
  210. package/sdk/dist/generated/dvn_fee_lib.js +33 -64
  211. package/sdk/dist/generated/endpoint.d.ts +108 -100
  212. package/sdk/dist/generated/endpoint.js +21 -19
  213. package/sdk/dist/generated/executor.d.ts +414 -370
  214. package/sdk/dist/generated/executor.js +58 -55
  215. package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
  216. package/sdk/dist/generated/executor_fee_lib.js +34 -65
  217. package/sdk/dist/generated/executor_helper.d.ts +26 -190
  218. package/sdk/dist/generated/executor_helper.js +23 -28
  219. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  220. package/sdk/dist/generated/layerzero_view.js +294 -0
  221. package/sdk/dist/generated/oft.d.ts +408 -385
  222. package/sdk/dist/generated/oft.js +89 -92
  223. package/sdk/dist/generated/price_feed.d.ts +385 -429
  224. package/sdk/dist/generated/price_feed.js +50 -81
  225. package/sdk/dist/generated/sml.d.ts +108 -100
  226. package/sdk/dist/generated/sml.js +21 -19
  227. package/sdk/dist/generated/treasury.d.ts +108 -100
  228. package/sdk/dist/generated/treasury.js +21 -19
  229. package/sdk/dist/generated/uln302.d.ts +108 -100
  230. package/sdk/dist/generated/uln302.js +23 -21
  231. package/sdk/dist/generated/upgrader.d.ts +189 -18
  232. package/sdk/dist/generated/upgrader.js +84 -4
  233. package/sdk/dist/index.d.ts +1 -0
  234. package/sdk/dist/index.js +2 -0
  235. package/sdk/package.json +1 -1
  236. package/sdk/src/index.ts +3 -0
  237. package/sdk/test/oft-sml.test.ts +4 -4
  238. package/sdk/test/suites/localnet.ts +84 -20
  239. package/sdk/test/upgrader.test.ts +2 -3
  240. package/tools/ts-bindings-gen/src/main.rs +2 -1
  241. package/contracts/ERROR_SPEC.md +0 -44
  242. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  243. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
  244. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
  245. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
  246. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
  247. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  248. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  249. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -0,0 +1,314 @@
1
+ # Building OFTs on Stellar
2
+
3
+ This guide explains how to build Omnichain Fungible Tokens (OFTs) using the LayerZero V2 framework on Stellar.
4
+
5
+ ## Overview
6
+
7
+ An OFT enables cross-chain token transfers through LayerZero. The framework provides:
8
+
9
+ - **OFTCore**: Public interface for token transfers (quote, send)
10
+ - **OFTInternal**: Internal logic for debit/credit operations
11
+ - **Token types**: MintBurn and LockUnlock strategies
12
+ - **Extensions**: Pausable, fee collection, rate limiting
13
+
14
+ ## Architecture
15
+
16
+ ```
17
+ ┌─────────────────────────────────────────────────────────────┐
18
+ │ OFT Contract │
19
+ ├─────────────────────────────────────────────────────────────┤
20
+ │ OFTCore (public interface) │
21
+ │ ├── quote_oft() - Quote transfer limits and fees │
22
+ │ ├── quote_send() - Quote LayerZero messaging fees │
23
+ │ └── send() - Execute cross-chain transfer │
24
+ ├─────────────────────────────────────────────────────────────┤
25
+ │ OFTInternal (internal logic) │
26
+ │ ├── __debit() - Burn/lock tokens on send │
27
+ │ ├── __credit() - Mint/unlock tokens on receive │
28
+ │ └── __receive() - Handle incoming transfers │
29
+ ├─────────────────────────────────────────────────────────────┤
30
+ │ Extensions (optional) │
31
+ │ ├── OFTPausable - Pause/unpause operations │
32
+ │ ├── OFTFee - Collect transfer fees │
33
+ │ └── RateLimiter - Limit transfer volume │
34
+ └─────────────────────────────────────────────────────────────┘
35
+ ```
36
+
37
+ ## Token types
38
+
39
+ ### MintBurn
40
+
41
+ Burns tokens on send, mints on receive. Use when the OFT contract has mint/burn authority.
42
+
43
+ ```rust
44
+ use oft::mint_burn;
45
+
46
+ impl OFTInternal for MyOFT {
47
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
48
+ mint_burn::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid)
49
+ }
50
+
51
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, src_eid: u32) -> i128 {
52
+ mint_burn::credit::<Self>(env, to, amount_ld, src_eid)
53
+ }
54
+ }
55
+ ```
56
+
57
+ ### LockUnlock
58
+
59
+ Locks tokens in contract on send, unlocks on receive. Use for wrapping existing tokens (OFT Adapter pattern).
60
+
61
+ ```rust
62
+ use oft::lock_unlock;
63
+
64
+ impl OFTInternal for MyOFT {
65
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
66
+ lock_unlock::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid)
67
+ }
68
+
69
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, src_eid: u32) -> i128 {
70
+ lock_unlock::credit::<Self>(env, to, amount_ld, src_eid)
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## Quick start
76
+
77
+ ### Using the pre-built OFT
78
+
79
+ The `oft` crate provides a ready-to-use OFT with all extensions:
80
+
81
+ ```rust
82
+ use oft::OFT;
83
+
84
+ // Deploy with:
85
+ // - token: underlying token address
86
+ // - owner: contract owner
87
+ // - endpoint: LayerZero endpoint address
88
+ // - delegate: optional endpoint delegate
89
+ // - shared_decimals: cross-chain decimal precision
90
+ // - oft_type: OftType::MintBurn or OftType::LockUnlock
91
+ ```
92
+
93
+ ### Building a custom OFT
94
+
95
+ ```rust
96
+ use oapp_macros::oapp;
97
+ use oft_core::{OFTCore, OFTInternal, impl_oft_lz_receive, types::OFTReceipt};
98
+ use oft::mint_burn;
99
+
100
+ #[oapp]
101
+ pub struct MyOFT;
102
+
103
+ #[contract_impl]
104
+ impl MyOFT {
105
+ pub fn __constructor(
106
+ env: &Env,
107
+ token: &Address,
108
+ owner: &Address,
109
+ endpoint: &Address,
110
+ delegate: &Option<Address>,
111
+ ) {
112
+ // shared_decimals = 6 is common for cross-chain compatibility
113
+ Self::__initialize_oft(env, owner, token, endpoint, delegate, 6);
114
+ }
115
+ }
116
+
117
+ // Public interface
118
+ #[contract_impl(contracttrait)]
119
+ impl OFTCore for MyOFT {}
120
+
121
+ // Internal logic (NO #[contract_impl] - keeps methods private)
122
+ impl OFTInternal for MyOFT {
123
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
124
+ mint_burn::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid)
125
+ }
126
+
127
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, src_eid: u32) -> i128 {
128
+ mint_burn::credit::<Self>(env, to, amount_ld, src_eid)
129
+ }
130
+ }
131
+
132
+ // Receive handler
133
+ impl_oft_lz_receive!(MyOFT);
134
+ ```
135
+
136
+ ## Decimal handling
137
+
138
+ OFT uses "shared decimals" for cross-chain compatibility. Tokens are normalized to shared decimals when sent and converted back to local decimals when received.
139
+
140
+ ```
141
+ Local decimals: 18 (e.g., Ethereum token)
142
+ Shared decimals: 6 (cross-chain standard)
143
+ Decimal conversion rate: 10^(18-6) = 10^12
144
+
145
+ Send: 1.5 tokens (1_500_000_000_000_000_000 local) → 1_500_000 shared
146
+ Receive: 1_500_000 shared → 1.5 tokens in local decimals
147
+ ```
148
+
149
+ **Dust removal**: Amounts that can't be represented in shared decimals are "dust" and stay with the sender.
150
+
151
+ ```rust
152
+ // Example: sending 1.5000001 tokens with 6 shared decimals
153
+ // amount_sent_ld: 1_500_000 (dust removed)
154
+ // amount_received_ld: 1_500_000
155
+ // dust (stays with sender): 1
156
+ ```
157
+
158
+ ## Sending tokens
159
+
160
+ ```rust
161
+ // 1. Quote the transfer
162
+ let (limit, fee_details, receipt) = oft.quote_oft(&send_param);
163
+
164
+ // 2. Quote LayerZero fees
165
+ let messaging_fee = oft.quote_send(&from, &send_param, false);
166
+
167
+ // 3. Execute the transfer
168
+ let (msg_receipt, oft_receipt) = oft.send(&from, &send_param, &messaging_fee, &refund_address);
169
+ ```
170
+
171
+ ### SendParam structure
172
+
173
+ ```rust
174
+ SendParam {
175
+ dst_eid: u32, // Destination chain endpoint ID
176
+ to: BytesN<32>, // Recipient address (32 bytes)
177
+ amount_ld: i128, // Amount in local decimals
178
+ min_amount_ld: i128, // Minimum to receive (slippage protection)
179
+ extra_options: Bytes, // LayerZero execution options
180
+ compose_msg: Bytes, // Optional compose message
181
+ oft_cmd: Bytes, // Optional OFT command
182
+ }
183
+ ```
184
+
185
+ ## Receiving tokens
186
+
187
+ The `impl_oft_lz_receive!` macro handles receiving automatically:
188
+
189
+ 1. Decodes the OFT message
190
+ 2. Resolves the recipient address
191
+ 3. Credits tokens via `__credit`
192
+ 4. Optionally queues compose messages
193
+
194
+ For custom receive logic, implement `__receive` directly:
195
+
196
+ ```rust
197
+ impl OFTInternal for MyOFT {
198
+ fn __receive(
199
+ env: &Env,
200
+ origin: &Origin,
201
+ guid: &BytesN<32>,
202
+ message: &Bytes,
203
+ extra_data: &Bytes,
204
+ executor: &Address,
205
+ value: i128,
206
+ ) {
207
+ // Custom validation
208
+ validate_something(env);
209
+
210
+ // Call default implementation
211
+ <Self as OFTInternal>::__receive(env, origin, guid, message, extra_data, executor, value)
212
+ }
213
+
214
+ // ... __debit and __credit ...
215
+ }
216
+ ```
217
+
218
+ ## Extensions
219
+
220
+ ### Pausable
221
+
222
+ Allows pausing all OFT operations:
223
+
224
+ ```rust
225
+ use oft::pausable::{OFTPausable, OFTPausableInternal};
226
+
227
+ #[contract_impl(contracttrait)]
228
+ impl OFTPausable for MyOFT {}
229
+ impl OFTPausableInternal for MyOFT {}
230
+
231
+ // Override __debit_view or __credit to add pause check:
232
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, src_eid: u32) -> i128 {
233
+ Self::__assert_not_paused(env); // Add this check
234
+ mint_burn::credit::<Self>(env, to, amount_ld, src_eid)
235
+ }
236
+ ```
237
+
238
+ Usage:
239
+
240
+ ```rust
241
+ oft.set_paused(true); // Pause (owner only)
242
+ oft.set_paused(false); // Unpause (owner only)
243
+ oft.is_paused(); // Check status
244
+ ```
245
+
246
+ ### Fee collection
247
+
248
+ Collects fees on outbound transfers:
249
+
250
+ ```rust
251
+ use oft::oft_fee::{OFTFee, OFTFeeInternal};
252
+
253
+ #[contract_impl(contracttrait)]
254
+ impl OFTFee for MyOFT {}
255
+ impl OFTFeeInternal for MyOFT {}
256
+
257
+ // Override __debit_view to apply fee:
258
+ fn __debit_view(env: &Env, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
259
+ let fee = Self::__fee_view(env, dst_eid, amount_ld);
260
+ let amount_after_fee = amount_ld - fee;
261
+ // ... rest of logic
262
+ }
263
+ ```
264
+
265
+ Usage:
266
+
267
+ ```rust
268
+ oft.set_default_fee_bps(100); // 1% default fee (owner only)
269
+ oft.set_fee_bps(dst_eid, Some(50)); // 0.5% for specific destination
270
+ oft.set_fee_deposit_address(fee_addr); // Where fees go
271
+ ```
272
+
273
+ ### Rate limiter
274
+
275
+ Limits transfer volume per time window:
276
+
277
+ ```rust
278
+ use oft::rate_limiter::{Direction, RateLimiter, RateLimiterInternal, RateLimitConfig};
279
+
280
+ #[contract_impl(contracttrait)]
281
+ impl RateLimiter for MyOFT {}
282
+ impl RateLimiterInternal for MyOFT {}
283
+
284
+ // Call in __debit and __credit:
285
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
286
+ let receipt = mint_burn::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid);
287
+ Self::__consume_rate_limit_capacity(env, &Direction::Outbound, dst_eid, receipt.amount_received_ld);
288
+ receipt
289
+ }
290
+ ```
291
+
292
+ Usage:
293
+
294
+ ```rust
295
+ // Set rate limit: 1M tokens per hour for outbound to chain 30101
296
+ oft.set_rate_limit(
297
+ &Direction::Outbound,
298
+ 30101,
299
+ Some(RateLimitConfig { limit: 1_000_000_000_000, window_seconds: 3600 })
300
+ );
301
+
302
+ // Query capacity
303
+ let available = oft.rate_limit_capacity(&Direction::Outbound, 30101);
304
+ ```
305
+
306
+ ## Key traits summary
307
+
308
+ | Trait | Purpose | Exposed |
309
+ | ------------- | ------------------------- | ------- |
310
+ | `OFTCore` | Public transfer interface | Yes |
311
+ | `OFTInternal` | Debit/credit logic | No |
312
+ | `OFTPausable` | Pause/unpause operations | Yes |
313
+ | `OFTFee` | Fee configuration | Yes |
314
+ | `RateLimiter` | Rate limit configuration | Yes |
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@layerzerolabs/protocol-stellar-v2",
3
- "version": "0.2.19",
3
+ "version": "0.2.21",
4
4
  "private": false,
5
5
  "devDependencies": {
6
6
  "@types/node": "^22.18.6",
7
7
  "tsx": "^4.19.3",
8
8
  "typescript": "^5.8.2",
9
- "@layerzerolabs/common-node-utils": "0.2.19",
10
- "@layerzerolabs/vm-tooling-stellar": "0.2.19"
9
+ "@layerzerolabs/common-node-utils": "0.2.21",
10
+ "@layerzerolabs/vm-tooling-stellar": "0.2.21"
11
11
  },
12
12
  "publishConfig": {
13
13
  "access": "restricted",