Skip to content

Commit 21a7b1a

Browse files
test(multi-collateral): add transfer utils
1 parent c4b9d2c commit 21a7b1a

File tree

3 files changed

+124
-21
lines changed

3 files changed

+124
-21
lines changed

workspace/apps/perpetuals/contracts/src/tests/flow_tests/infra.cairo

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,11 @@ pub impl FlowTestImpl of FlowTestExtendedTrait {
196196
) -> RequestInfo {
197197
self.flow_test_base.facade.transfer_request(:sender, :recipient, :amount)
198198
}
199+
fn transfer_spot_request(
200+
ref self: FlowTestExtended, sender: User, recipient: User, asset_id: AssetId, amount: u64,
201+
) -> RequestInfo {
202+
self.flow_test_base.facade.transfer_spot_request(:sender, :recipient, :asset_id, :amount)
203+
}
199204
fn transfer(ref self: FlowTestExtended, transfer_info: RequestInfo) {
200205
self.flow_test_base.facade.transfer(:transfer_info)
201206
}

workspace/apps/perpetuals/contracts/src/tests/flow_tests/perps_tests_facade.cairo

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,18 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
11411141

11421142
fn transfer_request(
11431143
ref self: PerpsTestsFacade, sender: User, recipient: User, amount: u64,
1144+
) -> RequestInfo {
1145+
self._transfer_request(:sender, recipient: recipient, asset_id: self.collateral_id, :amount)
1146+
}
1147+
1148+
fn transfer_spot_request(
1149+
ref self: PerpsTestsFacade, sender: User, recipient: User, asset_id: AssetId, amount: u64,
1150+
) -> RequestInfo {
1151+
self._transfer_request(:sender, recipient: recipient, :asset_id, :amount)
1152+
}
1153+
1154+
fn _transfer_request(
1155+
ref self: PerpsTestsFacade, sender: User, recipient: User, asset_id: AssetId, amount: u64,
11441156
) -> RequestInfo {
11451157
let expiration = Time::now().add(delta: Time::weeks(1));
11461158

@@ -1149,7 +1161,7 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
11491161
position_id: sender.position_id,
11501162
salt,
11511163
expiration,
1152-
collateral_id: self.collateral_id,
1164+
collateral_id: asset_id,
11531165
amount,
11541166
recipient: recipient.position_id,
11551167
};
@@ -1160,8 +1172,8 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
11601172
sender.account.set_as_caller(self.perpetuals_contract);
11611173
ICoreDispatcher { contract_address: self.perpetuals_contract }
11621174
.transfer_request(
1163-
signature,
1164-
asset_id: self.collateral_id,
1175+
:signature,
1176+
asset_id: asset_id,
11651177
recipient: recipient.position_id,
11661178
position_id: sender.position_id,
11671179
:amount,
@@ -1175,15 +1187,15 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
11751187
spied_event: self.get_last_event(contract_address: self.perpetuals_contract),
11761188
position_id: sender.position_id,
11771189
recipient: recipient.position_id,
1178-
collateral_id: self.collateral_id,
1190+
collateral_id: asset_id,
11791191
:amount,
11801192
:expiration,
11811193
transfer_request_hash: request_hash,
11821194
:salt,
11831195
);
11841196

11851197
RequestInfo {
1186-
asset_id: self.collateral_id,
1198+
asset_id,
11871199
recipient,
11881200
position_id: sender.position_id,
11891201
amount,
@@ -1197,13 +1209,18 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
11971209
let RequestInfo {
11981210
asset_id, recipient, position_id, amount, expiration, salt, request_hash,
11991211
} = transfer_info;
1200-
let dispatcher = IPositionsDispatcher { contract_address: self.perpetuals_contract };
1201-
let sender_balance_before = dispatcher
1202-
.get_position_assets(position_id: position_id)
1203-
.collateral_balance;
1204-
let recipient_balance_before = dispatcher
1205-
.get_position_assets(position_id: recipient.position_id)
1206-
.collateral_balance;
1212+
1213+
let sender_balance_before = if (asset_id == self.collateral_id) {
1214+
self.get_position_collateral_balance(position_id)
1215+
} else {
1216+
self.get_position_asset_balance(position_id, asset_id)
1217+
};
1218+
1219+
let recipient_balance_before = if (asset_id == self.collateral_id) {
1220+
self.get_position_collateral_balance(recipient.position_id)
1221+
} else {
1222+
self.get_position_asset_balance(recipient.position_id, asset_id)
1223+
};
12071224

12081225
let operator_nonce = self.get_nonce();
12091226
self.operator.set_as_caller(self.perpetuals_contract);
@@ -1223,16 +1240,32 @@ pub impl PerpsTestsFacadeImpl of PerpsTestsFacadeTrait {
12231240
request_hash: request_hash, expected_status: RequestStatus::PROCESSED,
12241241
);
12251242

1226-
self
1227-
.validate_collateral_balance(
1228-
position_id: position_id, expected_balance: sender_balance_before - amount.into(),
1229-
);
1243+
if (asset_id == self.collateral_id) {
1244+
self
1245+
.validate_collateral_balance(
1246+
:position_id, expected_balance: sender_balance_before - amount.into(),
1247+
);
12301248

1231-
self
1232-
.validate_collateral_balance(
1233-
position_id: recipient.position_id,
1234-
expected_balance: recipient_balance_before + amount.into(),
1235-
);
1249+
self
1250+
.validate_collateral_balance(
1251+
position_id: recipient.position_id,
1252+
expected_balance: recipient_balance_before + amount.into(),
1253+
);
1254+
} else {
1255+
self
1256+
.validate_asset_balance(
1257+
:position_id,
1258+
:asset_id,
1259+
expected_balance: sender_balance_before - amount.into(),
1260+
);
1261+
1262+
self
1263+
.validate_asset_balance(
1264+
position_id: recipient.position_id,
1265+
:asset_id,
1266+
expected_balance: recipient_balance_before + amount.into(),
1267+
);
1268+
}
12361269

12371270
assert_transfer_event_with_expected(
12381271
spied_event: self.get_last_event(contract_address: self.perpetuals_contract),

workspace/apps/perpetuals/contracts/src/tests/flow_tests/unit_flow_tests.cairo

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2481,3 +2481,68 @@ fn test_unfair_deleverage() {
24812481
deleveraged_quote: 204,
24822482
);
24832483
}
2484+
2485+
#[test]
2486+
fn test_spot_collateral_deposit_transfer_withdraw() {
2487+
// Setup.
2488+
let risk_factor_data = RiskFactorTiers {
2489+
tiers: array![10].span(), first_tier_boundary: MAX_U128, tier_size: 1,
2490+
};
2491+
let mut state: FlowTestBase = FlowTestBaseTrait::new();
2492+
2493+
// Create a custom spot collateral asset (not the base collateral).
2494+
let token = snforge_std::Token::STRK;
2495+
let erc20_contract_address = token.contract_address();
2496+
let asset_info = AssetInfoTrait::new_collateral(
2497+
asset_name: 'SPOT', :risk_factor_data, oracles_len: 1, :erc20_contract_address,
2498+
);
2499+
let asset_id = asset_info.asset_id;
2500+
state.facade.add_active_collateral(asset_info: @asset_info, initial_price: 100);
2501+
2502+
// Create users.
2503+
let user_1 = state.new_user_with_position();
2504+
let user_2 = state.new_user_with_position();
2505+
snforge_std::set_balance(target: user_1.account.address, new_balance: 5000000, :token);
2506+
snforge_std::set_balance(target: user_2.account.address, new_balance: 5000000, :token);
2507+
2508+
// Deposit spot collateral asset to user_1.
2509+
let deposit_info_user_1 = state
2510+
.facade
2511+
.deposit_spot(
2512+
depositor: user_1.account,
2513+
:asset_id,
2514+
position_id: user_1.position_id,
2515+
quantized_amount: 100000,
2516+
);
2517+
state.facade.process_deposit(deposit_info: deposit_info_user_1);
2518+
2519+
// Transfer partial amount from user_1 to user_2.
2520+
let transfer_info = state
2521+
.facade
2522+
.transfer_spot_request(sender: user_1, recipient: user_2, :asset_id, amount: 40000);
2523+
state.facade.transfer(:transfer_info);
2524+
// Withdraw from user_1 (first withdrawal).
2525+
let mut withdraw_info = state
2526+
.facade
2527+
.withdraw_spot_request(user: user_1, :asset_id, amount: 30000);
2528+
state.facade.withdraw(withdraw_info: withdraw_info);
2529+
2530+
// Withdraw from user_2 (second withdrawal).
2531+
withdraw_info = state.facade.withdraw_spot_request(user: user_2, :asset_id, amount: 40000);
2532+
state.facade.withdraw(withdraw_info: withdraw_info);
2533+
2534+
// Verify final balances.
2535+
let balance_user_1: i64 = state
2536+
.facade
2537+
.get_position_asset_balance(user_1.position_id, asset_id)
2538+
.into();
2539+
let balance_user_2: i64 = state
2540+
.facade
2541+
.get_position_asset_balance(user_2.position_id, asset_id)
2542+
.into();
2543+
2544+
// user_1: 100000 (deposit) - 40000 (transfer) - 30000 (withdraw) = 30000
2545+
assert_eq!(balance_user_1, 30000_i64);
2546+
// user_2: 40000 (transfer) - 40000 (withdraw) = 0
2547+
assert_eq!(balance_user_2, 0_i64);
2548+
}

0 commit comments

Comments
 (0)