@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.
- package/.turbo/turbo-build.log +795 -791
- package/.turbo/turbo-lint.log +325 -155
- package/.turbo/turbo-test.log +1398 -1277
- package/Cargo.lock +122 -111
- package/Cargo.toml +32 -16
- package/contracts/common-macros/Cargo.toml +7 -7
- package/contracts/common-macros/src/auth.rs +18 -37
- package/contracts/common-macros/src/contract_ttl.rs +18 -7
- package/contracts/common-macros/src/lib.rs +31 -14
- package/contracts/common-macros/src/lz_contract.rs +38 -7
- package/contracts/common-macros/src/storage.rs +251 -292
- package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
- package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
- package/contracts/common-macros/src/ttl_configurable.rs +2 -10
- package/contracts/common-macros/src/ttl_extendable.rs +2 -10
- package/contracts/common-macros/src/upgradeable.rs +61 -26
- package/contracts/common-macros/src/utils.rs +0 -9
- package/contracts/endpoint-v2/src/lib.rs +3 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
- package/contracts/layerzero-views/Cargo.toml +0 -1
- package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
- package/contracts/macro-integration-tests/Cargo.toml +5 -15
- package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
- package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
- package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
- package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
- package/contracts/message-libs/treasury/Cargo.toml +0 -2
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
- package/contracts/message-libs/uln-302/src/events.rs +4 -0
- package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
- package/contracts/oapps/counter/Cargo.toml +5 -6
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
- package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
- package/contracts/oapps/oapp/src/errors.rs +1 -1
- package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
- package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
- package/contracts/oapps/oapp/src/lib.rs +1 -0
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
- package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
- package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
- package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
- package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
- package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
- package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
- package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
- package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
- package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
- package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
- package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
- package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
- package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
- package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
- package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
- package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
- package/contracts/oapps/oft/src/oft.rs +45 -50
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
- package/contracts/oapps/oft-core/Cargo.toml +1 -4
- package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
- package/contracts/oapps/oft-core/src/errors.rs +3 -2
- package/contracts/oapps/oft-core/src/events.rs +6 -0
- package/contracts/oapps/oft-core/src/lib.rs +1 -1
- package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
- package/contracts/oapps/oft-core/src/storage.rs +7 -3
- package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
- package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
- package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
- package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
- package/contracts/upgrader/src/lib.rs +30 -57
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
- package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
- package/contracts/utils/Cargo.toml +0 -1
- package/contracts/utils/src/buffer_reader.rs +1 -0
- package/contracts/utils/src/errors.rs +4 -2
- package/contracts/utils/src/multisig.rs +17 -8
- package/contracts/utils/src/ownable.rs +6 -6
- package/contracts/utils/src/testing_utils.rs +124 -54
- package/contracts/utils/src/tests/multisig.rs +12 -12
- package/contracts/utils/src/tests/ownable.rs +6 -6
- package/contracts/utils/src/tests/testing_utils.rs +50 -167
- package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
- package/contracts/utils/src/tests/upgradeable.rs +372 -175
- package/contracts/utils/src/ttl_configurable.rs +13 -7
- package/contracts/utils/src/upgradeable.rs +48 -23
- package/contracts/workers/dvn/Cargo.toml +6 -6
- package/contracts/workers/dvn/src/auth.rs +12 -42
- package/contracts/workers/dvn/src/dvn.rs +15 -40
- package/contracts/workers/dvn/src/errors.rs +0 -1
- package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
- package/contracts/workers/dvn/src/lib.rs +4 -3
- package/contracts/workers/dvn/src/tests/auth.rs +1 -1
- package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
- package/contracts/workers/dvn/src/tests/setup.rs +5 -9
- package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
- package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
- package/contracts/workers/executor/Cargo.toml +4 -0
- package/contracts/workers/executor/src/executor.rs +15 -36
- package/contracts/workers/executor/src/lib.rs +2 -2
- package/contracts/workers/executor/src/tests/auth.rs +394 -0
- package/contracts/workers/executor/src/tests/executor.rs +410 -0
- package/contracts/workers/executor/src/tests/mod.rs +3 -0
- package/contracts/workers/executor/src/tests/setup.rs +250 -0
- package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
- package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
- package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
- package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
- package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
- package/contracts/workers/executor-helper/Cargo.toml +0 -1
- package/contracts/workers/executor-helper/src/lib.rs +3 -0
- package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
- package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
- package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
- package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
- package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
- package/contracts/workers/price-feed/Cargo.toml +7 -1
- package/contracts/workers/price-feed/src/events.rs +1 -1
- package/contracts/workers/price-feed/src/lib.rs +12 -4
- package/contracts/workers/price-feed/src/price_feed.rs +5 -21
- package/contracts/workers/price-feed/src/storage.rs +1 -1
- package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
- package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
- package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
- package/contracts/workers/price-feed/src/types.rs +1 -1
- package/contracts/workers/worker/src/errors.rs +1 -4
- package/contracts/workers/worker/src/lib.rs +0 -2
- package/contracts/workers/worker/src/storage.rs +32 -29
- package/contracts/workers/worker/src/tests/setup.rs +2 -8
- package/contracts/workers/worker/src/tests/worker.rs +96 -74
- package/contracts/workers/worker/src/worker.rs +75 -75
- package/docs/error-spec.md +55 -0
- package/docs/layerzero-v2-on-stellar.md +447 -0
- package/docs/oapp-guide.md +212 -0
- package/docs/oft-guide.md +314 -0
- package/package.json +3 -3
- package/sdk/.turbo/turbo-test.log +268 -263
- package/sdk/dist/generated/bml.d.ts +12 -4
- package/sdk/dist/generated/bml.js +9 -7
- package/sdk/dist/generated/counter.d.ts +306 -298
- package/sdk/dist/generated/counter.js +48 -46
- package/sdk/dist/generated/dvn.d.ts +450 -411
- package/sdk/dist/generated/dvn.js +66 -64
- package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
- package/sdk/dist/generated/dvn_fee_lib.js +33 -64
- package/sdk/dist/generated/endpoint.d.ts +108 -100
- package/sdk/dist/generated/endpoint.js +21 -19
- package/sdk/dist/generated/executor.d.ts +414 -370
- package/sdk/dist/generated/executor.js +58 -55
- package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
- package/sdk/dist/generated/executor_fee_lib.js +34 -65
- package/sdk/dist/generated/executor_helper.d.ts +26 -190
- package/sdk/dist/generated/executor_helper.js +23 -28
- package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
- package/sdk/dist/generated/layerzero_view.js +294 -0
- package/sdk/dist/generated/oft.d.ts +408 -385
- package/sdk/dist/generated/oft.js +89 -92
- package/sdk/dist/generated/price_feed.d.ts +385 -429
- package/sdk/dist/generated/price_feed.js +50 -81
- package/sdk/dist/generated/sml.d.ts +108 -100
- package/sdk/dist/generated/sml.js +21 -19
- package/sdk/dist/generated/treasury.d.ts +108 -100
- package/sdk/dist/generated/treasury.js +21 -19
- package/sdk/dist/generated/uln302.d.ts +108 -100
- package/sdk/dist/generated/uln302.js +23 -21
- package/sdk/dist/generated/upgrader.d.ts +189 -18
- package/sdk/dist/generated/upgrader.js +84 -4
- package/sdk/dist/index.d.ts +1 -0
- package/sdk/dist/index.js +2 -0
- package/sdk/package.json +1 -1
- package/sdk/src/index.ts +3 -0
- package/sdk/test/oft-sml.test.ts +4 -4
- package/sdk/test/suites/localnet.ts +84 -20
- package/sdk/test/upgrader.test.ts +2 -3
- package/tools/ts-bindings-gen/src/main.rs +2 -1
- package/contracts/ERROR_SPEC.md +0 -44
- package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
- /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.
|
|
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.
|
|
10
|
-
"@layerzerolabs/vm-tooling-stellar": "0.2.
|
|
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",
|