@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.20
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 +245 -222
- package/.turbo/turbo-lint.log +77 -70
- package/.turbo/turbo-test.log +1385 -1221
- package/Cargo.lock +13 -3
- package/Cargo.toml +2 -0
- package/contracts/ERROR_SPEC.md +8 -1
- package/contracts/common-macros/src/contract_ttl.rs +18 -7
- package/contracts/common-macros/src/lib.rs +4 -4
- package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
- 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__upgradeable__snapshot_generated_upgradeable_code.snap +7 -12
- package/contracts/common-macros/src/upgradeable.rs +15 -21
- 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/send_uln302/send.rs +38 -64
- package/contracts/oapps/counter/Cargo.toml +1 -0
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +18 -2
- package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
- package/contracts/oapps/oft/src/oft.rs +29 -41
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +3 -25
- package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
- package/contracts/oapps/oft-core/src/oft_core.rs +247 -207
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +4 -4
- 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/src/buffer_reader.rs +1 -0
- package/contracts/utils/src/errors.rs +3 -1
- package/contracts/utils/src/tests/upgradeable.rs +372 -175
- package/contracts/utils/src/ttl_configurable.rs +3 -3
- package/contracts/utils/src/upgradeable.rs +48 -23
- package/contracts/workers/dvn/Cargo.toml +1 -0
- package/contracts/workers/dvn/src/auth.rs +12 -42
- package/contracts/workers/dvn/src/dvn.rs +16 -31
- 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 +1 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
- package/contracts/workers/executor/Cargo.toml +1 -0
- package/contracts/workers/executor/src/executor.rs +15 -26
- package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
- package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
- 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/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 +2 -1
- package/contracts/workers/price-feed/src/events.rs +1 -1
- package/contracts/workers/price-feed/src/lib.rs +3 -0
- package/contracts/workers/price-feed/src/price_feed.rs +6 -12
- 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 +0 -3
- 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 +1 -7
- package/contracts/workers/worker/src/tests/worker.rs +50 -42
- package/contracts/workers/worker/src/worker.rs +49 -58
- package/package.json +3 -3
- package/sdk/.turbo/turbo-test.log +220 -218
- package/sdk/dist/generated/bml.d.ts +12 -4
- package/sdk/dist/generated/bml.js +8 -6
- package/sdk/dist/generated/counter.d.ts +12 -4
- package/sdk/dist/generated/counter.js +8 -6
- package/sdk/dist/generated/dvn.d.ts +404 -365
- package/sdk/dist/generated/dvn.js +55 -53
- package/sdk/dist/generated/dvn_fee_lib.d.ts +224 -268
- package/sdk/dist/generated/dvn_fee_lib.js +22 -53
- package/sdk/dist/generated/endpoint.d.ts +12 -4
- package/sdk/dist/generated/endpoint.js +8 -6
- package/sdk/dist/generated/executor.d.ts +370 -326
- package/sdk/dist/generated/executor.js +47 -44
- package/sdk/dist/generated/executor_fee_lib.d.ts +258 -302
- package/sdk/dist/generated/executor_fee_lib.js +21 -52
- package/sdk/dist/generated/executor_helper.d.ts +26 -190
- package/sdk/dist/generated/executor_helper.js +22 -27
- 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 +49 -40
- package/sdk/dist/generated/oft.js +25 -23
- package/sdk/dist/generated/price_feed.d.ts +225 -269
- package/sdk/dist/generated/price_feed.js +22 -53
- package/sdk/dist/generated/sml.d.ts +12 -4
- package/sdk/dist/generated/sml.js +8 -6
- package/sdk/dist/generated/treasury.d.ts +12 -4
- package/sdk/dist/generated/treasury.js +8 -6
- package/sdk/dist/generated/uln302.d.ts +12 -4
- package/sdk/dist/generated/uln302.js +10 -8
- 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/upgrader.test.ts +2 -3
- package/tools/ts-bindings-gen/src/main.rs +2 -1
- /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
|
@@ -2,6 +2,10 @@ use common_macros::{contract_error, contract_trait, only_auth, storage};
|
|
|
2
2
|
use soroban_sdk::{assert_with_error, contractevent, contracttype, panic_with_error, Env};
|
|
3
3
|
use utils::ownable::Ownable;
|
|
4
4
|
|
|
5
|
+
// =========================================================================
|
|
6
|
+
// Types
|
|
7
|
+
// =========================================================================
|
|
8
|
+
|
|
5
9
|
#[contracttype]
|
|
6
10
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
7
11
|
#[repr(u8)]
|
|
@@ -19,21 +23,33 @@ pub struct RateLimit {
|
|
|
19
23
|
last_update: u64,
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
// =========================================================================
|
|
27
|
+
// Storage
|
|
28
|
+
// =========================================================================
|
|
29
|
+
|
|
22
30
|
#[storage]
|
|
23
31
|
pub enum RateLimitStorage {
|
|
24
32
|
#[persistent(RateLimit)]
|
|
25
33
|
RateLimit { direction: Direction, eid: u32 },
|
|
26
34
|
}
|
|
27
35
|
|
|
36
|
+
// =========================================================================
|
|
37
|
+
// Errors
|
|
38
|
+
// =========================================================================
|
|
39
|
+
|
|
28
40
|
#[contract_error]
|
|
29
41
|
pub enum RateLimitError {
|
|
30
|
-
ExceededRateLimit =
|
|
42
|
+
ExceededRateLimit = 3120,
|
|
31
43
|
InvalidTimestamp,
|
|
32
44
|
InvalidWindowSeconds,
|
|
33
45
|
InvalidLimit,
|
|
34
46
|
SameValue,
|
|
35
47
|
}
|
|
36
48
|
|
|
49
|
+
// =========================================================================
|
|
50
|
+
// Events
|
|
51
|
+
// =========================================================================
|
|
52
|
+
|
|
37
53
|
#[contractevent]
|
|
38
54
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
39
55
|
pub struct RateLimitSet {
|
|
@@ -59,33 +75,9 @@ pub struct RateLimitUnset {
|
|
|
59
75
|
pub eid: u32,
|
|
60
76
|
}
|
|
61
77
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if !RateLimitStorage::has_rate_limit(env, direction, eid) {
|
|
66
|
-
return 0;
|
|
67
|
-
}
|
|
68
|
-
let rate_limit = RateLimitStorage::rate_limit(env, direction, eid).unwrap();
|
|
69
|
-
let timestamp = env.ledger().timestamp();
|
|
70
|
-
assert_with_error!(env, timestamp >= rate_limit.last_update, RateLimitError::InvalidTimestamp);
|
|
71
|
-
let elapsed = timestamp - rate_limit.last_update;
|
|
72
|
-
let decay = (elapsed as i128) * rate_limit.limit / (rate_limit.window_seconds as i128);
|
|
73
|
-
if decay < rate_limit.in_flight_on_last_update {
|
|
74
|
-
rate_limit.in_flight_on_last_update - decay
|
|
75
|
-
} else {
|
|
76
|
-
0
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/// Checkpoints the current in-flight amount by applying decay and updating timestamp.
|
|
81
|
-
/// Used internally before modifying rate limit state.
|
|
82
|
-
fn checkpoint_rate_limit_in_flight(env: &Env, direction: &Direction, eid: u32) {
|
|
83
|
-
let in_flight = calculate_in_flight(env, direction, eid);
|
|
84
|
-
let mut rate_limit = RateLimitStorage::rate_limit(env, direction, eid).unwrap();
|
|
85
|
-
rate_limit.in_flight_on_last_update = in_flight;
|
|
86
|
-
rate_limit.last_update = env.ledger().timestamp();
|
|
87
|
-
RateLimitStorage::set_rate_limit(env, direction, eid, &rate_limit);
|
|
88
|
-
}
|
|
78
|
+
// =========================================================================
|
|
79
|
+
// Trait With Default Implementations
|
|
80
|
+
// =========================================================================
|
|
89
81
|
|
|
90
82
|
#[contract_trait]
|
|
91
83
|
pub trait RateLimiter: RateLimiterInternal + Ownable + Sized {
|
|
@@ -198,3 +190,35 @@ pub trait RateLimiterInternal {
|
|
|
198
190
|
RateLimitStorage::set_rate_limit(env, direction, eid, &rate_limit);
|
|
199
191
|
}
|
|
200
192
|
}
|
|
193
|
+
|
|
194
|
+
// =========================================================================
|
|
195
|
+
// Helper Functions
|
|
196
|
+
// =========================================================================
|
|
197
|
+
|
|
198
|
+
/// Helper function to calculate the current in-flight amount with decay.
|
|
199
|
+
/// Used by both public trait methods and internal implementations.
|
|
200
|
+
fn calculate_in_flight(env: &Env, direction: &Direction, eid: u32) -> i128 {
|
|
201
|
+
if !RateLimitStorage::has_rate_limit(env, direction, eid) {
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
let rate_limit = RateLimitStorage::rate_limit(env, direction, eid).unwrap();
|
|
205
|
+
let timestamp = env.ledger().timestamp();
|
|
206
|
+
assert_with_error!(env, timestamp >= rate_limit.last_update, RateLimitError::InvalidTimestamp);
|
|
207
|
+
let elapsed = timestamp - rate_limit.last_update;
|
|
208
|
+
let decay = (elapsed as i128) * rate_limit.limit / (rate_limit.window_seconds as i128);
|
|
209
|
+
if decay < rate_limit.in_flight_on_last_update {
|
|
210
|
+
rate_limit.in_flight_on_last_update - decay
|
|
211
|
+
} else {
|
|
212
|
+
0
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/// Checkpoints the current in-flight amount by applying decay and updating timestamp.
|
|
217
|
+
/// Used internally before modifying rate limit state.
|
|
218
|
+
fn checkpoint_rate_limit_in_flight(env: &Env, direction: &Direction, eid: u32) {
|
|
219
|
+
let in_flight = calculate_in_flight(env, direction, eid);
|
|
220
|
+
let mut rate_limit = RateLimitStorage::rate_limit(env, direction, eid).unwrap();
|
|
221
|
+
rate_limit.in_flight_on_last_update = in_flight;
|
|
222
|
+
rate_limit.last_update = env.ledger().timestamp();
|
|
223
|
+
RateLimitStorage::set_rate_limit(env, direction, eid, &rate_limit);
|
|
224
|
+
}
|
|
@@ -7,25 +7,36 @@ use crate::{
|
|
|
7
7
|
oft_types::{lock_unlock, mint_burn, OftType},
|
|
8
8
|
};
|
|
9
9
|
use common_macros::{contract_impl, storage};
|
|
10
|
-
use endpoint_v2::
|
|
11
|
-
use oapp::oapp_receiver::LzReceiveInternal;
|
|
10
|
+
use endpoint_v2::Origin;
|
|
12
11
|
use oapp_macros::oapp;
|
|
13
12
|
use oft_core::{
|
|
14
13
|
errors::OFTError,
|
|
14
|
+
impl_oft_lz_receive,
|
|
15
15
|
types::{OFTFeeDetail, OFTLimit, OFTReceipt, SendParam},
|
|
16
16
|
utils as oft_utils, OFTCore, OFTInternal,
|
|
17
17
|
};
|
|
18
18
|
use soroban_sdk::{assert_with_error, vec, Address, Bytes, BytesN, Env, Vec};
|
|
19
19
|
|
|
20
|
+
// =========================================================================
|
|
21
|
+
// Storage
|
|
22
|
+
// =========================================================================
|
|
23
|
+
|
|
20
24
|
#[storage]
|
|
21
25
|
enum OFTStorage {
|
|
22
26
|
#[instance(OftType)]
|
|
23
27
|
OftType,
|
|
24
28
|
}
|
|
25
29
|
|
|
30
|
+
// =========================================================================
|
|
31
|
+
// OFT Contract
|
|
32
|
+
// =========================================================================
|
|
33
|
+
|
|
26
34
|
#[oapp]
|
|
27
35
|
pub struct OFT;
|
|
28
36
|
|
|
37
|
+
// LzReceiveInternal implementation using default OFT receive logic
|
|
38
|
+
impl_oft_lz_receive!(OFT);
|
|
39
|
+
|
|
29
40
|
#[contract_impl]
|
|
30
41
|
impl OFT {
|
|
31
42
|
pub fn __constructor(
|
|
@@ -37,7 +48,7 @@ impl OFT {
|
|
|
37
48
|
shared_decimals: u32,
|
|
38
49
|
oft_type: OftType,
|
|
39
50
|
) {
|
|
40
|
-
|
|
51
|
+
Self::__initialize_oft(env, owner, token, endpoint, delegate, shared_decimals);
|
|
41
52
|
OFTStorage::set_oft_type(env, &oft_type);
|
|
42
53
|
}
|
|
43
54
|
|
|
@@ -51,9 +62,7 @@ impl OFT {
|
|
|
51
62
|
#[contract_impl(contracttrait)]
|
|
52
63
|
impl OFTCore for OFT {
|
|
53
64
|
fn quote_oft(env: &Env, send_param: &SendParam) -> (OFTLimit, Vec<OFTFeeDetail>, OFTReceipt) {
|
|
54
|
-
Self::
|
|
55
|
-
|
|
56
|
-
let oft_receipt = Self::__debit_view(env, send_param.amount_ld, send_param.min_amount_ld, send_param.dst_eid);
|
|
65
|
+
let (_, _, oft_receipt) = Self::__quote_oft(env, send_param);
|
|
57
66
|
|
|
58
67
|
// fee details (only include if there's an actual fee)
|
|
59
68
|
let fee_amount_ld = oft_receipt.amount_sent_ld - oft_receipt.amount_received_ld;
|
|
@@ -69,17 +78,15 @@ impl OFTCore for OFT {
|
|
|
69
78
|
|
|
70
79
|
(oft_limit, fee_details, oft_receipt)
|
|
71
80
|
}
|
|
72
|
-
|
|
73
|
-
fn quote_send(env: &Env, sender: &Address, send_param: &SendParam, pay_in_zro: bool) -> MessagingFee {
|
|
74
|
-
Self::__assert_not_paused(env);
|
|
75
|
-
oft_core::quote_send::<Self>(env, sender, send_param, pay_in_zro)
|
|
76
|
-
}
|
|
77
81
|
}
|
|
78
82
|
|
|
79
83
|
/// OFT behavior for standard OFT with extension hooks
|
|
80
84
|
impl OFTInternal for OFT {
|
|
85
|
+
/// Overrides default to add pausable check and fee calculation.
|
|
81
86
|
fn __debit_view(env: &Env, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
|
|
82
|
-
|
|
87
|
+
Self::__assert_not_paused(env);
|
|
88
|
+
|
|
89
|
+
let conversion_rate = Self::__decimal_conversion_rate(env);
|
|
83
90
|
|
|
84
91
|
// Apply the fee before dust removal to ensure the fee is calculated on the full amount and dust is not transferred
|
|
85
92
|
let fee = Self::__fee_view(env, dst_eid, amount_ld);
|
|
@@ -96,37 +103,34 @@ impl OFTInternal for OFT {
|
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
|
|
99
|
-
//
|
|
100
|
-
Self::__assert_not_paused(env);
|
|
101
|
-
|
|
102
|
-
// 2. Core debit logic (based on oft_type)
|
|
106
|
+
// Core debit logic (based on oft_type)
|
|
103
107
|
let oft_receipt = match Self::oft_type(env) {
|
|
104
108
|
OftType::LockUnlock => lock_unlock::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid),
|
|
105
109
|
OftType::MintBurn => mint_burn::debit::<Self>(env, sender, amount_ld, min_amount_ld, dst_eid),
|
|
106
110
|
};
|
|
107
111
|
|
|
108
|
-
//
|
|
112
|
+
// Rate limit checks (using amount_received_ld - the actual cross-chain amount)
|
|
109
113
|
Self::__consume_rate_limit_capacity(env, &Direction::Outbound, dst_eid, oft_receipt.amount_received_ld);
|
|
110
114
|
Self::__release_rate_limit_capacity(env, &Direction::Inbound, dst_eid, oft_receipt.amount_received_ld);
|
|
111
115
|
|
|
112
|
-
//
|
|
116
|
+
// Charge fee
|
|
113
117
|
let fee = oft_receipt.amount_sent_ld - oft_receipt.amount_received_ld;
|
|
114
|
-
Self::__charge_fee(env, &Self::
|
|
118
|
+
Self::__charge_fee(env, &Self::__token(env), sender, fee);
|
|
115
119
|
|
|
116
120
|
oft_receipt
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
fn __credit(env: &Env, to: &Address, amount_ld: i128, src_eid: u32) -> i128 {
|
|
120
|
-
//
|
|
124
|
+
// Pausable check
|
|
121
125
|
Self::__assert_not_paused(env);
|
|
122
126
|
|
|
123
|
-
//
|
|
127
|
+
// Core credit logic (based on mode)
|
|
124
128
|
let amount_credited = match Self::oft_type(env) {
|
|
125
129
|
OftType::LockUnlock => lock_unlock::credit::<Self>(env, to, amount_ld, src_eid),
|
|
126
130
|
OftType::MintBurn => mint_burn::credit::<Self>(env, to, amount_ld, src_eid),
|
|
127
131
|
};
|
|
128
132
|
|
|
129
|
-
//
|
|
133
|
+
// Rate limit checks (using amount_credited - the actual credited amount)
|
|
130
134
|
Self::__consume_rate_limit_capacity(env, &Direction::Inbound, src_eid, amount_credited);
|
|
131
135
|
Self::__release_rate_limit_capacity(env, &Direction::Outbound, src_eid, amount_credited);
|
|
132
136
|
|
|
@@ -134,40 +138,24 @@ impl OFTInternal for OFT {
|
|
|
134
138
|
}
|
|
135
139
|
}
|
|
136
140
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
env: &Env,
|
|
141
|
-
origin: &Origin,
|
|
142
|
-
guid: &BytesN<32>,
|
|
143
|
-
message: &Bytes,
|
|
144
|
-
extra_data: &Bytes,
|
|
145
|
-
executor: &Address,
|
|
146
|
-
value: i128,
|
|
147
|
-
) {
|
|
148
|
-
oft_core::lz_receive::<Self>(env, executor, origin, guid, message, extra_data, value)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// ==================== Extension Trait Implementations ====================
|
|
141
|
+
// =========================================================================
|
|
142
|
+
// Extension Trait Implementations
|
|
143
|
+
// =========================================================================
|
|
153
144
|
|
|
154
145
|
/// Pausable extension - allows pausing/unpausing the OFT
|
|
155
146
|
/// Default state: unpaused (all operations allowed)
|
|
156
147
|
#[contract_impl(contracttrait)]
|
|
157
148
|
impl OFTPausable for OFT {}
|
|
158
|
-
|
|
159
149
|
impl OFTPausableInternal for OFT {}
|
|
160
150
|
|
|
161
151
|
/// OFT Fee extension - allows collecting fees on transfers
|
|
162
152
|
/// Default state: 0 BPS (no fee collected)
|
|
163
153
|
#[contract_impl(contracttrait)]
|
|
164
154
|
impl OFTFee for OFT {}
|
|
165
|
-
|
|
166
155
|
impl OFTFeeInternal for OFT {}
|
|
167
156
|
|
|
168
157
|
/// Rate Limiter extension - allows rate limiting transfers
|
|
169
158
|
/// Default state: not set (rate_limit_capacity returns i128::MAX)
|
|
170
159
|
#[contract_impl(contracttrait)]
|
|
171
160
|
impl RateLimiter for OFT {}
|
|
172
|
-
|
|
173
161
|
impl RateLimiterInternal for OFT {}
|
|
@@ -4,29 +4,7 @@
|
|
|
4
4
|
//! Used when the OFT contract has mint/burn authority over the token.
|
|
5
5
|
|
|
6
6
|
use oft_core::{oft_core::OFTCore, types::OFTReceipt};
|
|
7
|
-
use soroban_sdk::{
|
|
8
|
-
|
|
9
|
-
/// Contract interface for mint and burn token operations.
|
|
10
|
-
///
|
|
11
|
-
/// This interface abstracts the token mint/burn functionality, allowing different
|
|
12
|
-
/// token implementations (e.g., StellarAssetContract, custom tokens) to be used
|
|
13
|
-
/// with the MintBurn OFT.
|
|
14
|
-
#[contractclient(name = "MintBurnTokenClient")]
|
|
15
|
-
pub trait MintBurnToken {
|
|
16
|
-
/// Mints tokens to the specified address.
|
|
17
|
-
///
|
|
18
|
-
/// # Parameters
|
|
19
|
-
/// * `to` - The address to mint tokens to
|
|
20
|
-
/// * `amount` - The amount of tokens to mint (must be non-negative)
|
|
21
|
-
fn mint(env: Env, to: Address, amount: i128);
|
|
22
|
-
|
|
23
|
-
/// Burns tokens from the specified address.
|
|
24
|
-
///
|
|
25
|
-
/// # Parameters
|
|
26
|
-
/// * `from` - The address to burn tokens from
|
|
27
|
-
/// * `amount` - The amount of tokens to burn (must be non-negative)
|
|
28
|
-
fn burn(env: Env, from: Address, amount: i128);
|
|
29
|
-
}
|
|
7
|
+
use soroban_sdk::{token::StellarAssetClient, Address, Env};
|
|
30
8
|
|
|
31
9
|
/// Debit tokens using MintBurn OFT type (burns tokens from sender).
|
|
32
10
|
///
|
|
@@ -47,7 +25,7 @@ pub fn debit<T: OFTCore>(
|
|
|
47
25
|
dst_eid: u32,
|
|
48
26
|
) -> OFTReceipt {
|
|
49
27
|
let receipt = T::__debit_view(env, amount_ld, min_amount_ld, dst_eid);
|
|
50
|
-
|
|
28
|
+
StellarAssetClient::new(env, &T::token(env)).burn(sender, &receipt.amount_received_ld);
|
|
51
29
|
receipt
|
|
52
30
|
}
|
|
53
31
|
|
|
@@ -62,6 +40,6 @@ pub fn debit<T: OFTCore>(
|
|
|
62
40
|
/// # Returns
|
|
63
41
|
/// The amount credited
|
|
64
42
|
pub fn credit<T: OFTCore>(env: &Env, to: &Address, amount_ld: i128, _src_eid: u32) -> i128 {
|
|
65
|
-
|
|
43
|
+
StellarAssetClient::new(env, &T::token(env)).mint(to, &amount_ld);
|
|
66
44
|
amount_ld
|
|
67
45
|
}
|
|
@@ -7,7 +7,7 @@ extern crate std;
|
|
|
7
7
|
use crate::{
|
|
8
8
|
self as oft_core,
|
|
9
9
|
integration_tests::utils::{address_to_peer_bytes32, peer_bytes32_to_address},
|
|
10
|
-
oft_core::{
|
|
10
|
+
oft_core::{lz_receive, OFTClient, OFTCore, OFTInternal},
|
|
11
11
|
storage::OFTStorage,
|
|
12
12
|
types::OFTReceipt,
|
|
13
13
|
};
|
|
@@ -53,7 +53,7 @@ impl TestOFT {
|
|
|
53
53
|
delegate: &Option<Address>,
|
|
54
54
|
shared_decimals: u32,
|
|
55
55
|
) {
|
|
56
|
-
|
|
56
|
+
Self::__initialize_oft(env, owner, token, endpoint, delegate, shared_decimals)
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|