Skip to content

Commit a349239

Browse files
authored
Merge pull request #83 from radixdlt/bugfix/deposit-or-refund
Disallow account `deposit*or_refund` methods
2 parents 619563e + 6b7a108 commit a349239

File tree

3 files changed

+142
-28
lines changed

3 files changed

+142
-28
lines changed

crates/radix-engine-toolkit/src/instruction_visitor/visitors/transaction_type/general_transaction_visitor.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -828,8 +828,6 @@ fn construct_fn_rules(entity_type: EntityType) -> FnRules {
828828
/* All deposit methods */
829829
ACCOUNT_DEPOSIT_IDENT,
830830
ACCOUNT_DEPOSIT_BATCH_IDENT,
831-
ACCOUNT_TRY_DEPOSIT_OR_REFUND_IDENT,
832-
ACCOUNT_TRY_DEPOSIT_BATCH_OR_REFUND_IDENT,
833831
ACCOUNT_TRY_DEPOSIT_OR_ABORT_IDENT,
834832
ACCOUNT_TRY_DEPOSIT_BATCH_OR_ABORT_IDENT,
835833
/* All proof creation methods */
@@ -851,6 +849,9 @@ fn construct_fn_rules(entity_type: EntityType) -> FnRules {
851849
ACCOUNT_REMOVE_RESOURCE_PREFERENCE_IDENT,
852850
ACCOUNT_ADD_AUTHORIZED_DEPOSITOR,
853851
ACCOUNT_REMOVE_AUTHORIZED_DEPOSITOR,
852+
/* Deposit or Refund */
853+
ACCOUNT_TRY_DEPOSIT_OR_REFUND_IDENT,
854+
ACCOUNT_TRY_DEPOSIT_BATCH_OR_REFUND_IDENT,
854855
/* All fee locking methods */
855856
ACCOUNT_LOCK_FEE_IDENT,
856857
ACCOUNT_LOCK_CONTINGENT_FEE_IDENT,

crates/radix-engine-toolkit/tests/execution.rs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use radix_engine_toolkit::instruction_visitor::visitors::transaction_type::unsta
3434
#[test]
3535
fn simple_transfer_is_picked_up_as_a_simple_account_transfer_transaction() {
3636
// Arrange
37-
let mut test_runner = TestRunnerBuilder::new().build();
37+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
3838
let (public_key1, _, account1) = test_runner.new_account(true);
3939
let (public_key2, _, account2) = test_runner.new_account(true);
4040

@@ -79,7 +79,7 @@ fn simple_transfer_is_picked_up_as_a_simple_account_transfer_transaction() {
7979
#[test]
8080
fn transfer_is_picked_up_as_an_account_transfer_transaction() {
8181
// Arrange
82-
let mut test_runner = TestRunnerBuilder::new().build();
82+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
8383
let (public_key1, _, account1) = test_runner.new_account(true);
8484
let (public_key2, _, account2) = test_runner.new_account(true);
8585
let (public_key3, _, account3) = test_runner.new_account(true);
@@ -131,7 +131,7 @@ fn transfer_is_picked_up_as_an_account_transfer_transaction() {
131131
#[test]
132132
fn complex_transfer_is_picked_up_as_an_general_transaction() {
133133
// Arrange
134-
let mut test_runner = TestRunnerBuilder::new().build();
134+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
135135
let (public_key1, _, account1) = test_runner.new_account(true);
136136
let (public_key2, _, account2) = test_runner.new_account(true);
137137
let (public_key3, _, account3) = test_runner.new_account(true);
@@ -267,7 +267,7 @@ fn general_transaction_handles_take_non_fungible_ids_from_worktop_correctly() {
267267
#[test]
268268
pub fn deposit_and_deposit_batch_of_nothing_should_not_result_in_an_error() {
269269
// Arrange
270-
let mut test_runner = TestRunnerBuilder::new().build();
270+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
271271
let (_, _, account) = test_runner.new_account(true);
272272

273273
let manifest = ManifestBuilder::new().deposit_batch(account).build();
@@ -294,7 +294,7 @@ fn test_manifest_with_lock_fee(
294294
arguments: impl ResolvableArguments,
295295
) {
296296
// Arrange
297-
let mut test_runner = TestRunnerBuilder::new().build();
297+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
298298
let (pk, _, account) = test_runner.new_account(true);
299299

300300
let manifest = ManifestBuilder::new()
@@ -347,7 +347,7 @@ fn manifest_with_a_lock_contingent_fee_should_not_be_conforming() {
347347
#[test]
348348
fn simple_stake_transaction_is_detected_by_the_stake_visitor() {
349349
// Arrange
350-
let mut test_runner = TestRunnerBuilder::new().build();
350+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
351351
let (_, _, account1) = test_runner.new_account(false);
352352
let (_, _, validator1, stake_unit1, _) =
353353
new_registered_validator(&mut test_runner);
@@ -382,7 +382,7 @@ fn simple_stake_transaction_is_detected_by_the_stake_visitor() {
382382
fn simple_stake_transaction_using_take_all_from_worktop_deposit_is_detected_by_the_stake_visitor(
383383
) {
384384
// Arrange
385-
let mut test_runner = TestRunnerBuilder::new().build();
385+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
386386
let (_, _, account1) = test_runner.new_account(false);
387387
let (_, _, validator1, stake_unit1, _) =
388388
new_registered_validator(&mut test_runner);
@@ -418,7 +418,7 @@ fn simple_stake_transaction_using_take_all_from_worktop_deposit_is_detected_by_t
418418
fn stake_with_multi_withdraw_and_multi_deposits_is_detected_as_stake_by_stake_visitor(
419419
) {
420420
// Arrange
421-
let mut test_runner = TestRunnerBuilder::new().build();
421+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
422422

423423
let (_, _, account1) = test_runner.new_account(false);
424424
let (_, _, validator1, stake_unit1, _) =
@@ -472,7 +472,7 @@ fn stake_with_multi_withdraw_and_multi_deposits_is_detected_as_stake_by_stake_vi
472472
fn staking_from_one_account_to_multiple_validators_is_detected_as_a_stake_transaction(
473473
) {
474474
// Arrange
475-
let mut test_runner = TestRunnerBuilder::new().build();
475+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
476476
let (_, _, account1) = test_runner.new_account(false);
477477
let (_, _, validator1, stake_unit1, _) =
478478
new_registered_validator(&mut test_runner);
@@ -520,7 +520,7 @@ fn staking_from_one_account_to_multiple_validators_is_detected_as_a_stake_transa
520520
#[test]
521521
fn staking_of_zero_xrd_is_considered_valid_by_the_stake_visitor() {
522522
// Arrange
523-
let mut test_runner = TestRunnerBuilder::new().build();
523+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
524524
let (_, _, account1) = test_runner.new_account(false);
525525
let (_, _, validator1, stake_unit1, _) =
526526
new_registered_validator(&mut test_runner);
@@ -555,7 +555,7 @@ fn staking_of_zero_xrd_is_considered_valid_by_the_stake_visitor() {
555555
fn staking_transaction_that_used_take_all_from_worktop_is_considered_valid_by_the_stake_visitor(
556556
) {
557557
// Arrange
558-
let mut test_runner = TestRunnerBuilder::new().build();
558+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
559559
let (_, _, account1) = test_runner.new_account(false);
560560
let (_, _, validator1, stake_unit1, _) =
561561
new_registered_validator(&mut test_runner);
@@ -590,7 +590,7 @@ fn staking_transaction_that_used_take_all_from_worktop_is_considered_valid_by_th
590590
fn staking_transaction_that_used_take_all_from_worktop_is_considered_valid_by_the_stake_visitor2(
591591
) {
592592
// Arrange
593-
let mut test_runner = TestRunnerBuilder::new().build();
593+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
594594
let (_, _, account1) = test_runner.new_account(false);
595595
let (_, _, validator1, stake_unit1, _) =
596596
new_registered_validator(&mut test_runner);
@@ -638,7 +638,7 @@ fn staking_transaction_that_used_take_all_from_worktop_is_considered_valid_by_th
638638
#[test]
639639
fn staking_but_not_using_all_withdrawn_xrd_invalidates_staking_transaction() {
640640
// Arrange
641-
let mut test_runner = TestRunnerBuilder::new().build();
641+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
642642
let (_, _, account1) = test_runner.new_account(false);
643643
let (_, _, validator1, _, _) = new_registered_validator(&mut test_runner);
644644

@@ -659,7 +659,7 @@ fn staking_but_not_using_all_withdrawn_xrd_invalidates_staking_transaction() {
659659
fn staking_and_withdrawing_from_one_account_and_depositing_into_another_invalidates_stake_transaction(
660660
) {
661661
// Arrange
662-
let mut test_runner = TestRunnerBuilder::new().build();
662+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
663663
let (_, _, account1) = test_runner.new_account(false);
664664
let (_, _, account2) = test_runner.new_account(false);
665665
let (_, _, validator1, _, _) = new_registered_validator(&mut test_runner);
@@ -680,7 +680,7 @@ fn staking_and_withdrawing_from_one_account_and_depositing_into_another_invalida
680680
#[test]
681681
fn simple_unstaking_is_recognized_by_unstaking_visitor() {
682682
// Arrange
683-
let mut test_runner = TestRunnerBuilder::new().build();
683+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
684684
let (_, _, account1) = test_runner.new_account(false);
685685
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
686686
new_registered_validator(&mut test_runner);
@@ -719,7 +719,7 @@ fn simple_unstaking_is_recognized_by_unstaking_visitor() {
719719
fn unstaking_with_take_from_worktop_by_amount_is_recognized_by_unstaking_visitor(
720720
) {
721721
// Arrange
722-
let mut test_runner = TestRunnerBuilder::new().build();
722+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
723723
let (_, _, account1) = test_runner.new_account(false);
724724
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
725725
new_registered_validator(&mut test_runner);
@@ -758,7 +758,7 @@ fn unstaking_with_take_from_worktop_by_amount_is_recognized_by_unstaking_visitor
758758
fn unstaking_with_take_from_worktop_by_amount_of_claim_nft_is_recognized_by_unstaking_visitor(
759759
) {
760760
// Arrange
761-
let mut test_runner = TestRunnerBuilder::new().build();
761+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
762762
let (_, _, account1) = test_runner.new_account(false);
763763
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
764764
new_registered_validator(&mut test_runner);
@@ -798,7 +798,7 @@ fn unstaking_with_take_from_worktop_by_amount_of_claim_nft_is_recognized_by_unst
798798
fn unstaking_with_take_all_from_worktop_of_claim_nft_is_recognized_by_unstaking_visitor(
799799
) {
800800
// Arrange
801-
let mut test_runner = TestRunnerBuilder::new().build();
801+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
802802
let (_, _, account1) = test_runner.new_account(false);
803803
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
804804
new_registered_validator(&mut test_runner);
@@ -838,7 +838,7 @@ fn unstaking_with_take_all_from_worktop_of_claim_nft_is_recognized_by_unstaking_
838838
fn unstaking_and_depositing_claim_nft_into_another_account_is_not_allowed_by_unstake_visitor(
839839
) {
840840
// Arrange
841-
let mut test_runner = TestRunnerBuilder::new().build();
841+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
842842
let (_, _, account1) = test_runner.new_account(false);
843843
let (_, _, account2) = test_runner.new_account(false);
844844
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
@@ -863,7 +863,7 @@ fn unstaking_and_depositing_claim_nft_into_another_account_is_not_allowed_by_uns
863863
fn unstaking_and_depositing_claim_nft_into_another_account_is_not_allowed_by_unstake_visitor2(
864864
) {
865865
// Arrange
866-
let mut test_runner = TestRunnerBuilder::new().build();
866+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
867867
let (_, _, account1) = test_runner.new_account(false);
868868
let (_, _, account2) = test_runner.new_account(false);
869869
let (_, _, validator1, stake_unit_resource, ..) =
@@ -886,7 +886,7 @@ fn unstaking_and_depositing_claim_nft_into_another_account_is_not_allowed_by_uns
886886
#[test]
887887
fn multiple_unstakes_is_recognized_by_unstaking_visitor() {
888888
// Arrange
889-
let mut test_runner = TestRunnerBuilder::new().build();
889+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
890890
let (_, _, account1) = test_runner.new_account(false);
891891
let (_, _, validator1, stake_unit_resource, claim_nft_resource) =
892892
new_registered_validator(&mut test_runner);
@@ -945,7 +945,7 @@ fn multiple_unstakes_is_recognized_by_unstaking_visitor() {
945945
#[test]
946946
fn simple_claim_transaction_can_be_caught_by_claim_visitor() {
947947
// Arrange
948-
let mut test_runner = TestRunnerBuilder::new().build();
948+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
949949
let (_, _, account1) = test_runner.new_account(false);
950950
let (_, _, validator1, _, claim_nft_resource) =
951951
new_registered_validator(&mut test_runner);
@@ -991,7 +991,7 @@ fn simple_claim_transaction_can_be_caught_by_claim_visitor() {
991991
#[test]
992992
fn stake_claim_with_multiple_nfts_can_be_caught_by_claim_visitor() {
993993
// Arrange
994-
let mut test_runner = TestRunnerBuilder::new().build();
994+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
995995
let (_, _, account1) = test_runner.new_account(false);
996996
let (_, _, validator1, _, claim_nft_resource) =
997997
new_registered_validator(&mut test_runner);
@@ -1059,7 +1059,7 @@ fn stake_claim_with_multiple_nfts_can_be_caught_by_claim_visitor() {
10591059
#[test]
10601060
fn simple_claim_transaction_can_be_caught_by_claim_visitor1() {
10611061
// Arrange
1062-
let mut test_runner = TestRunnerBuilder::new().build();
1062+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
10631063
let (_, _, account1) = test_runner.new_account(false);
10641064
let (_, _, validator1, _, claim_nft_resource) =
10651065
new_registered_validator(&mut test_runner);
@@ -1105,7 +1105,7 @@ fn simple_claim_transaction_can_be_caught_by_claim_visitor1() {
11051105
#[test]
11061106
fn simple_claim_transaction_can_be_caught_by_claim_visitor2() {
11071107
// Arrange
1108-
let mut test_runner = TestRunnerBuilder::new().build();
1108+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
11091109
let (_, _, account1) = test_runner.new_account(false);
11101110
let (_, _, validator1, _, claim_nft_resource) =
11111111
new_registered_validator(&mut test_runner);
@@ -1151,7 +1151,7 @@ fn simple_claim_transaction_can_be_caught_by_claim_visitor2() {
11511151
#[test]
11521152
fn simple_claim_transaction_can_be_caught_by_claim_visitor3() {
11531153
// Arrange
1154-
let mut test_runner = TestRunnerBuilder::new().build();
1154+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
11551155
let (_, _, account1) = test_runner.new_account(false);
11561156
let (_, _, validator1, _, claim_nft_resource) =
11571157
new_registered_validator(&mut test_runner);

crates/radix-engine-toolkit/tests/general_transaction_visitor.rs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,116 @@ fn account_add_authorized_depositor_method_is_disallowed_in_general_transaction(
135135
// Assert
136136
assert!(visitor.output().is_none())
137137
}
138+
139+
#[test]
140+
fn deposit_or_abort_is_valid_for_general_transaction_type() {
141+
// Arrange
142+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
143+
let (public_key1, _, account1) = test_runner.new_account(true);
144+
let (public_key2, _, account2) = test_runner.new_account(true);
145+
146+
let manifest = ManifestBuilder::new()
147+
.withdraw_from_account(account1, XRD, dec!("10"))
148+
.take_from_worktop(XRD, dec!("10"), "bucket")
149+
.try_deposit_or_abort(account2, None, "bucket")
150+
.build();
151+
let receipt = test_runner.preview_manifest(
152+
manifest.clone(),
153+
vec![public_key1.into(), public_key2.into()],
154+
0,
155+
PreviewFlags {
156+
use_free_credit: true,
157+
assume_all_signature_proofs: true,
158+
skip_epoch_check: true,
159+
},
160+
);
161+
receipt.expect_commit_success();
162+
163+
// Act
164+
let mut visitor = GeneralTransactionTypeVisitor::new(
165+
receipt
166+
.expect_commit_success()
167+
.execution_trace
168+
.as_ref()
169+
.unwrap(),
170+
);
171+
traverse(&manifest.instructions, &mut [&mut visitor]).unwrap();
172+
173+
// Assert
174+
assert!(visitor.output().is_some());
175+
}
176+
177+
#[test]
178+
fn deposit_or_refund_invalidates_general_transaction_type() {
179+
// Arrange
180+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
181+
let (public_key1, _, account1) = test_runner.new_account(true);
182+
let (public_key2, _, account2) = test_runner.new_account(true);
183+
184+
let manifest = ManifestBuilder::new()
185+
.withdraw_from_account(account1, XRD, dec!("10"))
186+
.take_from_worktop(XRD, dec!("10"), "bucket")
187+
.try_deposit_or_refund(account2, None, "bucket")
188+
.build();
189+
let receipt = test_runner.preview_manifest(
190+
manifest.clone(),
191+
vec![public_key1.into(), public_key2.into()],
192+
0,
193+
PreviewFlags {
194+
use_free_credit: true,
195+
assume_all_signature_proofs: true,
196+
skip_epoch_check: true,
197+
},
198+
);
199+
receipt.expect_commit_success();
200+
201+
// Act
202+
let mut visitor = GeneralTransactionTypeVisitor::new(
203+
receipt
204+
.expect_commit_success()
205+
.execution_trace
206+
.as_ref()
207+
.unwrap(),
208+
);
209+
traverse(&manifest.instructions, &mut [&mut visitor]).unwrap();
210+
211+
// Assert
212+
assert!(visitor.output().is_none());
213+
}
214+
215+
#[test]
216+
fn deposit_batch_or_refund_invalidates_general_transaction_type() {
217+
// Arrange
218+
let mut test_runner = TestRunnerBuilder::new().without_trace().build();
219+
let (public_key1, _, account1) = test_runner.new_account(true);
220+
let (public_key2, _, account2) = test_runner.new_account(true);
221+
222+
let manifest = ManifestBuilder::new()
223+
.withdraw_from_account(account1, XRD, dec!("10"))
224+
.try_deposit_entire_worktop_or_refund(account2, None)
225+
.build();
226+
let receipt = test_runner.preview_manifest(
227+
manifest.clone(),
228+
vec![public_key1.into(), public_key2.into()],
229+
0,
230+
PreviewFlags {
231+
use_free_credit: true,
232+
assume_all_signature_proofs: true,
233+
skip_epoch_check: true,
234+
},
235+
);
236+
receipt.expect_commit_success();
237+
238+
// Act
239+
let mut visitor = GeneralTransactionTypeVisitor::new(
240+
receipt
241+
.expect_commit_success()
242+
.execution_trace
243+
.as_ref()
244+
.unwrap(),
245+
);
246+
traverse(&manifest.instructions, &mut [&mut visitor]).unwrap();
247+
248+
// Assert
249+
assert!(visitor.output().is_none());
250+
}

0 commit comments

Comments
 (0)