Skip to content

Commit e670384

Browse files
committed
Test fixes
1 parent 38c34cf commit e670384

File tree

7 files changed

+233
-19
lines changed

7 files changed

+233
-19
lines changed

crates/sui-core/src/authority.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) Mysten Labs, Inc.
33
// SPDX-License-Identifier: Apache-2.0
44

5+
use crate::accumulators::AccumulatorSettlementTxBuilder;
56
use crate::accumulators::balance_read::AccountBalanceRead;
67
use crate::checkpoints::CheckpointBuilderError;
78
use crate::checkpoints::CheckpointBuilderResult;
@@ -3909,6 +3910,82 @@ impl AuthorityState {
39093910
Ok(new_epoch_store)
39103911
}
39113912

3913+
pub async fn settle_transactions_for_testing(
3914+
&self,
3915+
ckpt_seq: CheckpointSequenceNumber,
3916+
effects: &[TransactionEffects],
3917+
) {
3918+
let builder = AccumulatorSettlementTxBuilder::new(
3919+
Some(self.get_transaction_cache_reader().as_ref()),
3920+
effects,
3921+
ckpt_seq,
3922+
0,
3923+
);
3924+
let epoch_store = self.epoch_store_for_testing();
3925+
let epoch = epoch_store.epoch();
3926+
let (settlements, barrier) = builder.build_tx(
3927+
epoch_store.protocol_config(),
3928+
epoch,
3929+
epoch_store
3930+
.epoch_start_config()
3931+
.accumulator_root_obj_initial_shared_version()
3932+
.unwrap(),
3933+
ckpt_seq,
3934+
ckpt_seq,
3935+
);
3936+
3937+
let settlements: Vec<_> = settlements
3938+
.into_iter()
3939+
.map(|tx| {
3940+
VerifiedExecutableTransaction::new_system(
3941+
VerifiedTransaction::new_system_transaction(tx),
3942+
epoch,
3943+
)
3944+
})
3945+
.collect();
3946+
let barrier = VerifiedExecutableTransaction::new_system(
3947+
VerifiedTransaction::new_system_transaction(barrier),
3948+
epoch,
3949+
);
3950+
3951+
let assigned_versions = epoch_store
3952+
.assign_shared_object_versions_for_tests(
3953+
self.get_object_cache_reader().as_ref(),
3954+
&settlements,
3955+
)
3956+
.unwrap();
3957+
3958+
let version_map = assigned_versions.into_map();
3959+
3960+
for tx in settlements {
3961+
let env = ExecutionEnv::new()
3962+
.with_assigned_versions(version_map.get(&tx.key()).unwrap().clone());
3963+
let (effects, _) = self
3964+
.try_execute_immediately(&tx, env, &epoch_store)
3965+
.await
3966+
.unwrap();
3967+
assert!(effects.status().is_ok());
3968+
}
3969+
3970+
let assigned_versions = epoch_store
3971+
.assign_shared_object_versions_for_tests(
3972+
self.get_object_cache_reader().as_ref(),
3973+
std::slice::from_ref(&barrier),
3974+
)
3975+
.unwrap()
3976+
.0
3977+
.into_iter()
3978+
.next()
3979+
.unwrap()
3980+
.1;
3981+
let env = ExecutionEnv::new().with_assigned_versions(assigned_versions);
3982+
let (effects, _) = self
3983+
.try_execute_immediately(&barrier, env, &epoch_store)
3984+
.await
3985+
.unwrap();
3986+
assert!(effects.status().is_ok());
3987+
}
3988+
39123989
/// Advance the epoch store to the next epoch for testing only.
39133990
/// This only manually sets all the places where we have the epoch number.
39143991
/// It doesn't properly reconfigure the node, hence should be only used for testing.

crates/sui-core/src/unit_tests/coin_deny_list_tests.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,43 @@ async fn test_regulated_coin_v2_types() {
215215
// using the funds withdrawal argument in programmable transactions.
216216
#[tokio::test]
217217
async fn test_regulated_coin_v2_funds_withdraw_deny() {
218+
telemetry_subscribers::init_for_testing();
218219
let env = new_authority_and_publish("coin_deny_list_v2").await;
219220

220221
let metadata = env.extract_v2_metadata().await;
221222
let regulated_coin_type = metadata.regulated_coin_type();
222223
let deny_list_object_init_version = env.get_latest_object_ref(&SUI_DENY_LIST_OBJECT_ID).await.1;
223-
let env_gas_ref = env.get_latest_object_ref(&env.gas_object_id).await;
224+
let mut env_gas_ref = env.get_latest_object_ref(&env.gas_object_id).await;
224225
let deny_cap_ref = env.get_latest_object_ref(&metadata.deny_cap_id).await;
225226

226227
// Create a new account that will be denied for the regulated coin.
227228
let (denied_address, denied_keypair) = get_account_key_pair();
228229

230+
env.authority
231+
.settle_transactions_for_testing(0, std::slice::from_ref(&env.publish_effects))
232+
.await;
233+
234+
{
235+
// Fund the denied address
236+
let tx = TestTransactionBuilder::new(
237+
env.sender,
238+
env_gas_ref,
239+
env.authority.reference_gas_price_for_testing().unwrap(),
240+
)
241+
.transfer_funds_to_address_balance(100_000_000, regulated_coin_type.clone(), denied_address)
242+
.build_and_sign(&env.keypair);
243+
let effects = send_and_confirm_transaction_(&env.authority, None, tx, true)
244+
.await
245+
.unwrap()
246+
.1;
247+
assert!(effects.status().is_ok(), "Funding should succeed");
248+
env_gas_ref = effects.gas_object().0;
249+
250+
env.authority
251+
.settle_transactions_for_testing(1, std::slice::from_ref(&effects))
252+
.await;
253+
}
254+
229255
// Add the denied address to the regulated coin deny list.
230256
let add_tx = TestTransactionBuilder::new(
231257
env.sender,
@@ -392,6 +418,7 @@ async fn new_authority_and_publish(path: &str) -> TestEnv {
392418

393419
let mut protocol_config =
394420
ProtocolConfig::get_for_version(ProtocolVersion::max(), Chain::Unknown);
421+
protocol_config.enable_accumulators_for_testing();
395422
protocol_config
396423
.set_per_object_congestion_control_mode_for_testing(PerObjectCongestionControlMode::None);
397424

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
// Copyright (c) Mysten Labs, Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
module coin_deny_list_v2::regulated_coin {
5-
use sui::coin;
4+
module coin_deny_list_v2::regulated_coin;
65

7-
public struct REGULATED_COIN has drop {}
6+
use sui::coin;
87

9-
fun init(otw: REGULATED_COIN, ctx: &mut TxContext) {
10-
let (treasury_cap, deny_cap, metadata) = coin::create_regulated_currency_v2(
11-
otw,
12-
9,
13-
b"RC",
14-
b"REGULATED_COIN",
15-
b"A new regulated coin",
16-
option::none(),
17-
true,
18-
ctx
19-
);
20-
transfer::public_transfer(deny_cap, tx_context::sender(ctx));
21-
transfer::public_freeze_object(treasury_cap);
22-
transfer::public_freeze_object(metadata);
23-
}
8+
public struct REGULATED_COIN has drop {}
9+
10+
fun init(otw: REGULATED_COIN, ctx: &mut TxContext) {
11+
let (mut treasury_cap, deny_cap, metadata) = coin::create_regulated_currency_v2(
12+
otw,
13+
9,
14+
b"RC",
15+
b"REGULATED_COIN",
16+
b"A new regulated coin",
17+
option::none(),
18+
true,
19+
ctx,
20+
);
21+
transfer::public_transfer(deny_cap, tx_context::sender(ctx));
22+
23+
let coin = treasury_cap.mint(100_000_000, ctx);
24+
coin.send_funds(tx_context::sender(ctx));
25+
transfer::public_freeze_object(treasury_cap);
26+
transfer::public_freeze_object(metadata);
2427
}

crates/sui-test-transaction-builder/src/lib.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use sui_types::SUI_RANDOMNESS_STATE_OBJECT_ID;
1414
use sui_types::base_types::{FullObjectRef, ObjectID, ObjectRef, SequenceNumber, SuiAddress};
1515
use sui_types::crypto::{AccountKeyPair, Signature, Signer, get_key_pair};
1616
use sui_types::digests::TransactionDigest;
17+
use sui_types::gas_coin::GAS;
1718
use sui_types::multisig::{BitmapUnit, MultiSig, MultiSigPublicKey};
1819
use sui_types::multisig_legacy::{MultiSigLegacy, MultiSigPublicKeyLegacy};
1920
use sui_types::object::Owner;
@@ -294,6 +295,31 @@ impl TestTransactionBuilder {
294295
self
295296
}
296297

298+
pub fn transfer_sui_to_address_balance(mut self, amount: u64, recipient: SuiAddress) -> Self {
299+
self.test_data =
300+
TestTransactionData::TransferFundsToAddressBalance(TransferFundsToAddressBalanceData {
301+
amount,
302+
type_arg: GAS::type_tag(),
303+
recipient,
304+
});
305+
self
306+
}
307+
308+
pub fn transfer_funds_to_address_balance(
309+
mut self,
310+
amount: u64,
311+
type_arg: TypeTag,
312+
recipient: SuiAddress,
313+
) -> Self {
314+
self.test_data =
315+
TestTransactionData::TransferFundsToAddressBalance(TransferFundsToAddressBalanceData {
316+
amount,
317+
type_arg,
318+
recipient,
319+
});
320+
self
321+
}
322+
297323
pub fn split_coin(mut self, coin: ObjectRef, amounts: Vec<u64>) -> Self {
298324
self.test_data = TestTransactionData::SplitCoin(SplitCoinData { coin, amounts });
299325
self
@@ -368,6 +394,19 @@ impl TestTransactionBuilder {
368394
.unwrap_or(self.gas_price * TEST_ONLY_GAS_UNIT_FOR_TRANSFER),
369395
self.gas_price,
370396
),
397+
TestTransactionData::TransferFundsToAddressBalance(data) => {
398+
TransactionData::new_transfer_funds_to_address_balance(
399+
data.recipient,
400+
self.sender,
401+
data.amount,
402+
data.type_arg,
403+
self.gas_object,
404+
self.gas_budget
405+
.unwrap_or(self.gas_price * TEST_ONLY_GAS_UNIT_FOR_TRANSFER),
406+
self.gas_price,
407+
)
408+
.unwrap()
409+
}
371410
TestTransactionData::SplitCoin(data) => TransactionData::new_split_coin(
372411
self.sender,
373412
data.coin,
@@ -474,6 +513,7 @@ enum TestTransactionData {
474513
Move(MoveData),
475514
Transfer(TransferData),
476515
TransferSui(TransferSuiData),
516+
TransferFundsToAddressBalance(TransferFundsToAddressBalanceData),
477517
SplitCoin(SplitCoinData),
478518
Publish(PublishData),
479519
Programmable(ProgrammableTransaction),
@@ -507,6 +547,12 @@ struct TransferSuiData {
507547
recipient: SuiAddress,
508548
}
509549

550+
struct TransferFundsToAddressBalanceData {
551+
amount: u64,
552+
type_arg: TypeTag,
553+
recipient: SuiAddress,
554+
}
555+
510556
struct SplitCoinData {
511557
coin: ObjectRef,
512558
amounts: Vec<u64>,

crates/sui-types/src/balance.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ pub const BALANCE_STRUCT_NAME: &IdentStr = ident_str!("Balance");
1919
pub const BALANCE_CREATE_REWARDS_FUNCTION_NAME: &IdentStr = ident_str!("create_staking_rewards");
2020
pub const BALANCE_DESTROY_REBATES_FUNCTION_NAME: &IdentStr = ident_str!("destroy_storage_rebates");
2121

22+
pub const BALANCE_REDEEM_FUNDS_FUNCTION_NAME: &IdentStr = ident_str!("redeem_funds");
23+
pub const BALANCE_SEND_FUNDS_FUNCTION_NAME: &IdentStr = ident_str!("send_funds");
2224
#[serde_as]
2325
#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, JsonSchema)]
2426
pub struct Supply {

crates/sui-types/src/programmable_transaction_builder.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ use serde::Serialize;
1111

1212
use crate::{
1313
SUI_FRAMEWORK_PACKAGE_ID,
14+
balance::{
15+
BALANCE_MODULE_NAME, BALANCE_REDEEM_FUNDS_FUNCTION_NAME, BALANCE_SEND_FUNDS_FUNCTION_NAME,
16+
},
1417
base_types::{FullObjectID, FullObjectRef, ObjectID, ObjectRef, SuiAddress},
1518
move_package::PACKAGE_MODULE_NAME,
1619
transaction::{
1720
Argument, CallArg, Command, FundsWithdrawalArg, ObjectArg, ProgrammableTransaction,
1821
SharedObjectMutability,
1922
},
23+
type_input::TypeInput,
2024
};
2125

2226
#[cfg(test)]
@@ -278,6 +282,38 @@ impl ProgrammableTransactionBuilder {
278282
self.command(Command::TransferObjects(vec![coin_arg], rec_arg));
279283
}
280284

285+
pub fn redeem_funds(&mut self, amount: u64, type_arg: TypeTag) -> anyhow::Result<Argument> {
286+
let withdrawal_arg =
287+
FundsWithdrawalArg::balance_from_sender(amount, TypeInput::from(type_arg.clone()));
288+
let withdrawal_arg = self.funds_withdrawal(withdrawal_arg)?;
289+
Ok(self.programmable_move_call(
290+
SUI_FRAMEWORK_PACKAGE_ID,
291+
BALANCE_MODULE_NAME.to_owned(),
292+
BALANCE_REDEEM_FUNDS_FUNCTION_NAME.to_owned(),
293+
vec![type_arg],
294+
vec![withdrawal_arg],
295+
))
296+
}
297+
298+
pub fn transfer_balance(
299+
&mut self,
300+
recipient: SuiAddress,
301+
amount: u64,
302+
type_arg: TypeTag,
303+
) -> anyhow::Result<()> {
304+
let rec_arg = self.pure(recipient).unwrap();
305+
let balance = self.redeem_funds(amount, type_arg.clone())?;
306+
307+
self.programmable_move_call(
308+
SUI_FRAMEWORK_PACKAGE_ID,
309+
BALANCE_MODULE_NAME.to_owned(),
310+
BALANCE_SEND_FUNDS_FUNCTION_NAME.to_owned(),
311+
vec![type_arg],
312+
vec![balance, rec_arg],
313+
);
314+
Ok(())
315+
}
316+
281317
pub fn pay_all_sui(&mut self, recipient: SuiAddress) {
282318
let rec_arg = self.pure(recipient).unwrap();
283319
self.command(Command::TransferObjects(vec![Argument::GasCoin], rec_arg));

crates/sui-types/src/transaction.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,29 @@ impl TransactionData {
20702070
)
20712071
}
20722072

2073+
pub fn new_transfer_funds_to_address_balance(
2074+
recipient: SuiAddress,
2075+
sender: SuiAddress,
2076+
amount: u64,
2077+
type_arg: TypeTag,
2078+
gas_payment: ObjectRef,
2079+
gas_budget: u64,
2080+
gas_price: u64,
2081+
) -> anyhow::Result<Self> {
2082+
let pt = {
2083+
let mut builder = ProgrammableTransactionBuilder::new();
2084+
builder.transfer_balance(recipient, amount, type_arg)?;
2085+
builder.finish()
2086+
};
2087+
Ok(Self::new_programmable(
2088+
sender,
2089+
vec![gas_payment],
2090+
pt,
2091+
gas_budget,
2092+
gas_price,
2093+
))
2094+
}
2095+
20732096
pub fn new_transfer_sui_allow_sponsor(
20742097
recipient: SuiAddress,
20752098
sender: SuiAddress,

0 commit comments

Comments
 (0)