@@ -56,6 +56,9 @@ const DECREMENT: RoleId = RoleId::new(2);
56
56
const INCREMENT_GUARDIAN : RoleId = RoleId :: new ( 4 ) ;
57
57
const DECREMENT_GUARDIAN : RoleId = RoleId :: new ( 5 ) ;
58
58
59
+ const GRANT_ROLE : RoleId = RoleId :: new ( 6 ) ;
60
+ const GRANT_ROLE_ADMIN : RoleId = RoleId :: new ( 7 ) ;
61
+
59
62
fn mk_wallet ( mnemonic : & str , bech32_prefix : & str ) -> LocalSigner {
60
63
LocalSigner :: new (
61
64
tiny_hderive:: bip32:: ExtendedPrivKey :: derive (
@@ -220,11 +223,13 @@ async fn main() -> Result<()> {
220
223
)
221
224
. await ?;
222
225
223
- schedule_increment ( & alice_client, & bob_client, & manager, & managed) . await ?;
226
+ // schedule_increment(&alice_client, &bob_client, &manager, &managed).await?;
227
+
228
+ // schedule_decrement_in_sub_msg(&alice_client, &bob_client, &manager, &managed).await?;
224
229
225
- schedule_decrement_in_sub_msg ( & alice_client, & bob_client, & manager, & managed) . await ?;
230
+ // schedule_increment_in_reply (&alice_client, &bob_client, &manager, &managed).await?;
226
231
227
- schedule_increment_in_reply ( & alice_client, & bob_client, & manager , & managed ) . await ?;
232
+ schedule_reentrant ( & alice_client, & bob_client, & charlie_client , & manager ) . await ?;
228
233
229
234
Ok ( ( ) )
230
235
}
@@ -544,6 +549,144 @@ async fn schedule_increment_in_reply(
544
549
Ok ( ( ) )
545
550
}
546
551
552
+ #[ instrument( skip_all) ]
553
+ async fn schedule_reentrant (
554
+ alice_client : & TxClient < impl WalletT , impl RpcT , impl GasFillerT > ,
555
+ bob_client : & TxClient < impl WalletT , impl RpcT , impl GasFillerT > ,
556
+ charlie_client : & TxClient < impl WalletT , impl RpcT , impl GasFillerT > ,
557
+ manager : & Bech32 < H256 > ,
558
+ ) -> Result < ( ) > {
559
+ execute (
560
+ alice_client,
561
+ manager,
562
+ [
563
+ & manager:: msg:: ExecuteMsg :: SetTargetFunctionRole {
564
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
565
+ selectors : vec ! [ Selector :: new( "grant_role" ) . to_owned( ) ] ,
566
+ role_id : GRANT_ROLE ,
567
+ } ,
568
+ & manager:: msg:: ExecuteMsg :: GrantRole {
569
+ account : Addr :: unchecked ( charlie_client. wallet ( ) . address ( ) . to_string ( ) ) ,
570
+ role_id : GRANT_ROLE ,
571
+ execution_delay : 10 ,
572
+ } ,
573
+ & manager:: msg:: ExecuteMsg :: GrantRole {
574
+ account : Addr :: unchecked ( charlie_client. wallet ( ) . address ( ) . to_string ( ) ) ,
575
+ role_id : RoleId :: new ( 11 ) ,
576
+ execution_delay : 20 ,
577
+ } ,
578
+ & manager:: msg:: ExecuteMsg :: SetRoleAdmin {
579
+ role_id : RoleId :: new ( 10 ) ,
580
+ admin : RoleId :: new ( 11 ) ,
581
+ } ,
582
+ & manager:: msg:: ExecuteMsg :: SetTargetFunctionRole {
583
+ role_id : GRANT_ROLE ,
584
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
585
+ selectors : vec ! [ Selector :: new( "grant_role" ) . to_owned( ) ] ,
586
+ } ,
587
+ ] ,
588
+ )
589
+ . await ?;
590
+
591
+ // let msg = manager::msg::ExecuteMsg::Schedule {
592
+ // target: Addr::unchecked(manager.to_string()),
593
+ // data: serde_json::to_string(&manager::msg::ExecuteMsg::GrantRole {
594
+ // account: Addr::unchecked(bob_client.wallet().address().to_string()),
595
+ // role_id: RoleId::new(7),
596
+ // execution_delay: 10,
597
+ // })
598
+ // .unwrap(),
599
+ // when: now() + 10,
600
+ // };
601
+ let msg = manager:: msg:: ExecuteMsg :: GrantRole {
602
+ role_id : RoleId :: new ( 10 ) ,
603
+ account : Addr :: unchecked ( bob_client. wallet ( ) . address ( ) . to_string ( ) ) ,
604
+ execution_delay : 0 ,
605
+ } ;
606
+ let data = to_json_string ( & msg) . unwrap ( ) ;
607
+ let operation_id = hash_operation ( charlie_client. wallet ( ) . address ( ) , manager, & msg) ;
608
+
609
+ info ! (
610
+ "charlie can't call grant_role since they have an execution delay, they must schedule the call"
611
+ ) ;
612
+ execute_expect_error (
613
+ charlie_client,
614
+ manager,
615
+ & msg,
616
+ AccessManagerError :: AccessManagerNotScheduled ( operation_id) ,
617
+ )
618
+ . await ?;
619
+
620
+ info ! ( "schedule grant_role call too soon" ) ;
621
+ execute_expect_error (
622
+ charlie_client,
623
+ manager,
624
+ & manager:: msg:: ExecuteMsg :: Schedule {
625
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
626
+ data : data. clone ( ) ,
627
+ when : now ( ) + 5 ,
628
+ } ,
629
+ AccessManagerError :: AccessManagerUnauthorizedCall {
630
+ caller : Addr :: unchecked ( charlie_client. wallet ( ) . address ( ) . to_string ( ) ) ,
631
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
632
+ selector : Selector :: new ( "grant_role" ) . to_owned ( ) ,
633
+ } ,
634
+ )
635
+ . await ?;
636
+
637
+ info ! ( "schedule grant_role call with correct delay" ) ;
638
+ let when = now ( ) + 25 ;
639
+ execute (
640
+ charlie_client,
641
+ manager,
642
+ [ manager:: msg:: ExecuteMsg :: Schedule {
643
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
644
+ data : data. clone ( ) ,
645
+ when,
646
+ } ] ,
647
+ )
648
+ . await ?;
649
+
650
+ info ! ( "execute scheduled call too soon" ) ;
651
+ execute_expect_error (
652
+ charlie_client,
653
+ manager,
654
+ & manager:: msg:: ExecuteMsg :: Execute {
655
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
656
+ data : data. clone ( ) ,
657
+ } ,
658
+ AccessManagerError :: AccessManagerNotReady ( operation_id) ,
659
+ )
660
+ . await ?;
661
+
662
+ info ! ( "scheduled op not ready" ) ;
663
+ execute_expect_error (
664
+ charlie_client,
665
+ manager,
666
+ & msg,
667
+ AccessManagerError :: AccessManagerNotReady ( operation_id) ,
668
+ )
669
+ . await ?;
670
+
671
+ wait_for_finalized_block_with ( alice_client. rpc ( ) . client ( ) , |block| {
672
+ block. block . header . time . seconds . inner ( ) as u64 > when
673
+ } )
674
+ . await ?;
675
+
676
+ info ! ( "execute scheduled call once ready" ) ;
677
+ execute (
678
+ charlie_client,
679
+ manager,
680
+ [ manager:: msg:: ExecuteMsg :: Execute {
681
+ target : Addr :: unchecked ( manager. to_string ( ) ) ,
682
+ data : data. clone ( ) ,
683
+ } ] ,
684
+ )
685
+ . await ?;
686
+
687
+ Ok ( ( ) )
688
+ }
689
+
547
690
fn now ( ) -> u64 {
548
691
std:: time:: SystemTime :: now ( )
549
692
. duration_since ( std:: time:: UNIX_EPOCH )
@@ -668,6 +811,7 @@ async fn execute(
668
811
Ok ( ( ) )
669
812
}
670
813
814
+ // #[track_caller]
671
815
async fn execute_expect_error (
672
816
signer : & TxClient < impl WalletT , impl RpcT , impl GasFillerT > ,
673
817
contract : & Bech32 < H256 > ,
0 commit comments