@@ -150,6 +150,46 @@ impl ConfidentialTokenAccountMeta {
150
150
. unwrap ( ) ;
151
151
meta
152
152
}
153
+
154
+ async fn check_balances < T > (
155
+ & self ,
156
+ token : & Token < T , Keypair > ,
157
+ expected : ConfidentialTokenAccountBalances ,
158
+ ) where
159
+ T : SendTransaction ,
160
+ {
161
+ let state = token. get_account_info ( & self . token_account ) . await . unwrap ( ) ;
162
+ let extension = state
163
+ . get_extension :: < ConfidentialTransferAccount > ( )
164
+ . unwrap ( ) ;
165
+
166
+ assert_eq ! (
167
+ extension
168
+ . pending_balance
169
+ . decrypt( & self . elgamal_keypair. secret)
170
+ . unwrap( ) ,
171
+ expected. pending_balance,
172
+ ) ;
173
+ assert_eq ! (
174
+ extension
175
+ . available_balance
176
+ . decrypt( & self . elgamal_keypair. secret)
177
+ . unwrap( ) ,
178
+ expected. available_balance,
179
+ ) ;
180
+ assert_eq ! (
181
+ self . ae_key
182
+ . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) )
183
+ . unwrap( ) ,
184
+ expected. decryptable_available_balance,
185
+ ) ;
186
+ }
187
+ }
188
+
189
+ struct ConfidentialTokenAccountBalances {
190
+ pending_balance : u64 ,
191
+ available_balance : u64 ,
192
+ decryptable_available_balance : u64 ,
153
193
}
154
194
155
195
#[ tokio:: test]
@@ -411,14 +451,17 @@ async fn ct_deposit() {
411
451
assert_eq ! ( extension. pending_balance_credit_counter, 1 . into( ) ) ;
412
452
assert_eq ! ( extension. expected_pending_balance_credit_counter, 0 . into( ) ) ;
413
453
assert_eq ! ( extension. actual_pending_balance_credit_counter, 0 . into( ) ) ;
414
- assert_ne ! (
415
- extension. pending_balance,
416
- zk_token_elgamal:: pod:: ElGamalCiphertext :: zeroed( )
417
- ) ;
418
- assert_eq ! (
419
- extension. available_balance,
420
- zk_token_elgamal:: pod:: ElGamalCiphertext :: zeroed( )
421
- ) ;
454
+
455
+ alice_meta
456
+ . check_balances (
457
+ & token,
458
+ ConfidentialTokenAccountBalances {
459
+ pending_balance : 42 ,
460
+ available_balance : 0 ,
461
+ decryptable_available_balance : 0 ,
462
+ } ,
463
+ )
464
+ . await ;
422
465
423
466
let new_decryptable_available_balance = alice_meta. ae_key . encrypt ( 42_u64 ) ;
424
467
token
@@ -445,14 +488,17 @@ async fn ct_deposit() {
445
488
assert_eq ! ( extension. pending_balance_credit_counter, 1 . into( ) ) ;
446
489
assert_eq ! ( extension. expected_pending_balance_credit_counter, 1 . into( ) ) ;
447
490
assert_eq ! ( extension. actual_pending_balance_credit_counter, 1 . into( ) ) ;
448
- assert_eq ! (
449
- extension. pending_balance,
450
- zk_token_elgamal:: pod:: ElGamalCiphertext :: zeroed( )
451
- ) ;
452
- assert_ne ! (
453
- extension. available_balance,
454
- zk_token_elgamal:: pod:: ElGamalCiphertext :: zeroed( )
455
- ) ;
491
+
492
+ alice_meta
493
+ . check_balances (
494
+ & token,
495
+ ConfidentialTokenAccountBalances {
496
+ pending_balance : 0 ,
497
+ available_balance : 42 ,
498
+ decryptable_available_balance : 42 ,
499
+ } ,
500
+ )
501
+ . await ;
456
502
}
457
503
458
504
#[ tokio:: test]
@@ -474,6 +520,7 @@ async fn ct_withdraw() {
474
520
decimals,
475
521
..
476
522
} = context. token_context . unwrap ( ) ;
523
+
477
524
let alice_meta =
478
525
ConfidentialTokenAccountMeta :: with_tokens ( & token, & alice, & mint_authority, 42 , decimals)
479
526
. await ;
@@ -503,15 +550,17 @@ async fn ct_withdraw() {
503
550
. await
504
551
. unwrap ( ) ;
505
552
assert_eq ! ( state. base. amount, 21 ) ;
506
- let extension = state
507
- . get_extension :: < ConfidentialTransferAccount > ( )
508
- . unwrap ( ) ;
509
- assert_eq ! (
510
- alice_meta
511
- . ae_key
512
- . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) ) ,
513
- Some ( 21 ) ,
514
- ) ;
553
+
554
+ alice_meta
555
+ . check_balances (
556
+ & token,
557
+ ConfidentialTokenAccountBalances {
558
+ pending_balance : 0 ,
559
+ available_balance : 21 ,
560
+ decryptable_available_balance : 21 ,
561
+ } ,
562
+ )
563
+ . await ;
515
564
516
565
token
517
566
. confidential_transfer_withdraw (
@@ -532,15 +581,17 @@ async fn ct_withdraw() {
532
581
. await
533
582
. unwrap ( ) ;
534
583
assert_eq ! ( state. base. amount, 42 ) ;
535
- let extension = state
536
- . get_extension :: < ConfidentialTransferAccount > ( )
537
- . unwrap ( ) ;
538
- assert_eq ! (
539
- alice_meta
540
- . ae_key
541
- . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) ) ,
542
- Some ( 0 ) ,
543
- ) ;
584
+
585
+ alice_meta
586
+ . check_balances (
587
+ & token,
588
+ ConfidentialTokenAccountBalances {
589
+ pending_balance : 0 ,
590
+ available_balance : 0 ,
591
+ decryptable_available_balance : 0 ,
592
+ } ,
593
+ )
594
+ . await ;
544
595
545
596
token
546
597
. confidential_transfer_empty_account (
@@ -591,6 +642,17 @@ async fn ct_transfer() {
591
642
. await
592
643
. unwrap ( ) ;
593
644
645
+ alice_meta
646
+ . check_balances (
647
+ & token,
648
+ ConfidentialTokenAccountBalances {
649
+ pending_balance : 0 ,
650
+ available_balance : 42 ,
651
+ decryptable_available_balance : 42 ,
652
+ } ,
653
+ )
654
+ . await ;
655
+
594
656
// Self-transfer of N tokens
595
657
token
596
658
. confidential_transfer_transfer (
@@ -600,11 +662,22 @@ async fn ct_transfer() {
600
662
42 , // amount
601
663
42 , // available balance
602
664
& alice_meta. elgamal_keypair ,
603
- alice_meta. ae_key . encrypt ( 42_u64 ) ,
665
+ alice_meta. ae_key . encrypt ( 0_u64 ) ,
604
666
)
605
667
. await
606
668
. unwrap ( ) ;
607
669
670
+ alice_meta
671
+ . check_balances (
672
+ & token,
673
+ ConfidentialTokenAccountBalances {
674
+ pending_balance : 42 ,
675
+ available_balance : 0 ,
676
+ decryptable_available_balance : 0 ,
677
+ } ,
678
+ )
679
+ . await ;
680
+
608
681
token
609
682
. confidential_transfer_apply_pending_balance (
610
683
& alice_meta. token_account ,
@@ -615,19 +688,16 @@ async fn ct_transfer() {
615
688
. await
616
689
. unwrap ( ) ;
617
690
618
- let state = token
619
- . get_account_info ( & alice_meta. token_account )
620
- . await
621
- . unwrap ( ) ;
622
- let extension = state
623
- . get_extension :: < ConfidentialTransferAccount > ( )
624
- . unwrap ( ) ;
625
- assert_eq ! (
626
- alice_meta
627
- . ae_key
628
- . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) ) ,
629
- Some ( 42 ) ,
630
- ) ;
691
+ alice_meta
692
+ . check_balances (
693
+ & token,
694
+ ConfidentialTokenAccountBalances {
695
+ pending_balance : 0 ,
696
+ available_balance : 42 ,
697
+ decryptable_available_balance : 42 ,
698
+ } ,
699
+ )
700
+ . await ;
631
701
632
702
token
633
703
. confidential_transfer_transfer (
@@ -642,19 +712,16 @@ async fn ct_transfer() {
642
712
. await
643
713
. unwrap ( ) ;
644
714
645
- let state = token
646
- . get_account_info ( & alice_meta. token_account )
647
- . await
648
- . unwrap ( ) ;
649
- let extension = state
650
- . get_extension :: < ConfidentialTransferAccount > ( )
651
- . unwrap ( ) ;
652
- assert_eq ! (
653
- alice_meta
654
- . ae_key
655
- . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) ) ,
656
- Some ( 0 ) ,
657
- ) ;
715
+ alice_meta
716
+ . check_balances (
717
+ & token,
718
+ ConfidentialTokenAccountBalances {
719
+ pending_balance : 0 ,
720
+ available_balance : 0 ,
721
+ decryptable_available_balance : 0 ,
722
+ } ,
723
+ )
724
+ . await ;
658
725
659
726
token
660
727
. confidential_transfer_empty_account (
@@ -687,6 +754,8 @@ async fn ct_transfer() {
687
754
let extension = state
688
755
. get_extension :: < ConfidentialTransferAccount > ( )
689
756
. unwrap ( ) ;
757
+
758
+ // TODO: verify bob_meta pending and available balance once syscall lands
690
759
assert_eq ! (
691
760
bob_meta
692
761
. ae_key
@@ -711,6 +780,8 @@ async fn ct_transfer() {
711
780
let extension = state
712
781
. get_extension :: < ConfidentialTransferAccount > ( )
713
782
. unwrap ( ) ;
783
+
784
+ // TODO: verify bob_meta pending and available balance once syscall lands
714
785
assert_eq ! (
715
786
bob_meta
716
787
. ae_key
@@ -769,7 +840,20 @@ async fn ct_transfer_with_fee() {
769
840
. await
770
841
. unwrap ( ) ;
771
842
772
- // Self-transfer of N tokens
843
+ alice_meta
844
+ . check_balances (
845
+ & token,
846
+ ConfidentialTokenAccountBalances {
847
+ pending_balance : 0 ,
848
+ available_balance : 100 ,
849
+ decryptable_available_balance : 100 ,
850
+ } ,
851
+ )
852
+ . await ;
853
+
854
+ // Fee is 2.5%, so what is left is 97 in Alice account
855
+ //
856
+ // TODO: make self transfers not not take fees
773
857
token
774
858
. confidential_transfer_transfer_with_fee (
775
859
& alice_meta. token_account ,
@@ -778,13 +862,23 @@ async fn ct_transfer_with_fee() {
778
862
100 , // amount
779
863
100 , // available balance
780
864
& alice_meta. elgamal_keypair ,
781
- alice_meta. ae_key . encrypt ( 100_u64 ) ,
865
+ alice_meta. ae_key . encrypt ( 0_u64 ) ,
782
866
& epoch_info,
783
867
)
784
868
. await
785
869
. unwrap ( ) ;
786
870
787
- // Fee is 2.5%, so what is left in 97 in Alice account
871
+ alice_meta
872
+ . check_balances (
873
+ & token,
874
+ ConfidentialTokenAccountBalances {
875
+ pending_balance : 97 ,
876
+ available_balance : 0 ,
877
+ decryptable_available_balance : 0 ,
878
+ } ,
879
+ )
880
+ . await ;
881
+
788
882
token
789
883
. confidential_transfer_apply_pending_balance (
790
884
& alice_meta. token_account ,
@@ -795,19 +889,16 @@ async fn ct_transfer_with_fee() {
795
889
. await
796
890
. unwrap ( ) ;
797
891
798
- let state = token
799
- . get_account_info ( & alice_meta. token_account )
800
- . await
801
- . unwrap ( ) ;
802
- let extension = state
803
- . get_extension :: < ConfidentialTransferAccount > ( )
804
- . unwrap ( ) ;
805
- assert_eq ! (
806
- alice_meta
807
- . ae_key
808
- . decrypt( & extension. decryptable_available_balance. try_into( ) . unwrap( ) ) ,
809
- Some ( 97 ) ,
810
- ) ;
892
+ alice_meta
893
+ . check_balances (
894
+ & token,
895
+ ConfidentialTokenAccountBalances {
896
+ pending_balance : 0 ,
897
+ available_balance : 97 ,
898
+ decryptable_available_balance : 97 ,
899
+ } ,
900
+ )
901
+ . await ;
811
902
812
903
token
813
904
. confidential_transfer_transfer_with_fee (
@@ -823,6 +914,17 @@ async fn ct_transfer_with_fee() {
823
914
. await
824
915
. unwrap ( ) ;
825
916
917
+ alice_meta
918
+ . check_balances (
919
+ & token,
920
+ ConfidentialTokenAccountBalances {
921
+ pending_balance : 0 ,
922
+ available_balance : 0 ,
923
+ decryptable_available_balance : 0 ,
924
+ } ,
925
+ )
926
+ . await ;
927
+
826
928
let state = token
827
929
. get_account_info ( & alice_meta. token_account )
828
930
. await
@@ -878,6 +980,8 @@ async fn ct_transfer_with_fee() {
878
980
let extension = state
879
981
. get_extension :: < ConfidentialTransferAccount > ( )
880
982
. unwrap ( ) ;
983
+
984
+ // TODO: check pending and available balance once curve syscall lands
881
985
assert_eq ! (
882
986
bob_meta
883
987
. ae_key
@@ -902,6 +1006,8 @@ async fn ct_transfer_with_fee() {
902
1006
let extension = state
903
1007
. get_extension :: < ConfidentialTransferAccount > ( )
904
1008
. unwrap ( ) ;
1009
+
1010
+ // TODO: check pending and available balance once curve syscall lands
905
1011
assert_eq ! (
906
1012
bob_meta
907
1013
. ae_key
0 commit comments