token-2022: check pending and available balance on confidential token tests (#3145)

* token-2022: check pending and available balance on confidential token tests

* token-2022: cargo fmt
This commit is contained in:
samkim-crypto 2022-05-07 15:00:58 +09:00 committed by GitHub
parent 219b6a1b78
commit b6eb64b0b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 183 additions and 77 deletions

View File

@ -150,6 +150,46 @@ impl ConfidentialTokenAccountMeta {
.unwrap(); .unwrap();
meta meta
} }
async fn check_balances<T>(
&self,
token: &Token<T, Keypair>,
expected: ConfidentialTokenAccountBalances,
) where
T: SendTransaction,
{
let state = token.get_account_info(&self.token_account).await.unwrap();
let extension = state
.get_extension::<ConfidentialTransferAccount>()
.unwrap();
assert_eq!(
extension
.pending_balance
.decrypt(&self.elgamal_keypair.secret)
.unwrap(),
expected.pending_balance,
);
assert_eq!(
extension
.available_balance
.decrypt(&self.elgamal_keypair.secret)
.unwrap(),
expected.available_balance,
);
assert_eq!(
self.ae_key
.decrypt(&extension.decryptable_available_balance.try_into().unwrap())
.unwrap(),
expected.decryptable_available_balance,
);
}
}
struct ConfidentialTokenAccountBalances {
pending_balance: u64,
available_balance: u64,
decryptable_available_balance: u64,
} }
#[tokio::test] #[tokio::test]
@ -411,14 +451,17 @@ async fn ct_deposit() {
assert_eq!(extension.pending_balance_credit_counter, 1.into()); assert_eq!(extension.pending_balance_credit_counter, 1.into());
assert_eq!(extension.expected_pending_balance_credit_counter, 0.into()); assert_eq!(extension.expected_pending_balance_credit_counter, 0.into());
assert_eq!(extension.actual_pending_balance_credit_counter, 0.into()); assert_eq!(extension.actual_pending_balance_credit_counter, 0.into());
assert_ne!(
extension.pending_balance, alice_meta
zk_token_elgamal::pod::ElGamalCiphertext::zeroed() .check_balances(
); &token,
assert_eq!( ConfidentialTokenAccountBalances {
extension.available_balance, pending_balance: 42,
zk_token_elgamal::pod::ElGamalCiphertext::zeroed() available_balance: 0,
); decryptable_available_balance: 0,
},
)
.await;
let new_decryptable_available_balance = alice_meta.ae_key.encrypt(42_u64); let new_decryptable_available_balance = alice_meta.ae_key.encrypt(42_u64);
token token
@ -445,14 +488,17 @@ async fn ct_deposit() {
assert_eq!(extension.pending_balance_credit_counter, 1.into()); assert_eq!(extension.pending_balance_credit_counter, 1.into());
assert_eq!(extension.expected_pending_balance_credit_counter, 1.into()); assert_eq!(extension.expected_pending_balance_credit_counter, 1.into());
assert_eq!(extension.actual_pending_balance_credit_counter, 1.into()); assert_eq!(extension.actual_pending_balance_credit_counter, 1.into());
assert_eq!(
extension.pending_balance, alice_meta
zk_token_elgamal::pod::ElGamalCiphertext::zeroed() .check_balances(
); &token,
assert_ne!( ConfidentialTokenAccountBalances {
extension.available_balance, pending_balance: 0,
zk_token_elgamal::pod::ElGamalCiphertext::zeroed() available_balance: 42,
); decryptable_available_balance: 42,
},
)
.await;
} }
#[tokio::test] #[tokio::test]
@ -474,6 +520,7 @@ async fn ct_withdraw() {
decimals, decimals,
.. ..
} = context.token_context.unwrap(); } = context.token_context.unwrap();
let alice_meta = let alice_meta =
ConfidentialTokenAccountMeta::with_tokens(&token, &alice, &mint_authority, 42, decimals) ConfidentialTokenAccountMeta::with_tokens(&token, &alice, &mint_authority, 42, decimals)
.await; .await;
@ -503,15 +550,17 @@ async fn ct_withdraw() {
.await .await
.unwrap(); .unwrap();
assert_eq!(state.base.amount, 21); assert_eq!(state.base.amount, 21);
let extension = state
.get_extension::<ConfidentialTransferAccount>() alice_meta
.unwrap(); .check_balances(
assert_eq!( &token,
alice_meta ConfidentialTokenAccountBalances {
.ae_key pending_balance: 0,
.decrypt(&extension.decryptable_available_balance.try_into().unwrap()), available_balance: 21,
Some(21), decryptable_available_balance: 21,
); },
)
.await;
token token
.confidential_transfer_withdraw( .confidential_transfer_withdraw(
@ -532,15 +581,17 @@ async fn ct_withdraw() {
.await .await
.unwrap(); .unwrap();
assert_eq!(state.base.amount, 42); assert_eq!(state.base.amount, 42);
let extension = state
.get_extension::<ConfidentialTransferAccount>() alice_meta
.unwrap(); .check_balances(
assert_eq!( &token,
alice_meta ConfidentialTokenAccountBalances {
.ae_key pending_balance: 0,
.decrypt(&extension.decryptable_available_balance.try_into().unwrap()), available_balance: 0,
Some(0), decryptable_available_balance: 0,
); },
)
.await;
token token
.confidential_transfer_empty_account( .confidential_transfer_empty_account(
@ -591,6 +642,17 @@ async fn ct_transfer() {
.await .await
.unwrap(); .unwrap();
alice_meta
.check_balances(
&token,
ConfidentialTokenAccountBalances {
pending_balance: 0,
available_balance: 42,
decryptable_available_balance: 42,
},
)
.await;
// Self-transfer of N tokens // Self-transfer of N tokens
token token
.confidential_transfer_transfer( .confidential_transfer_transfer(
@ -600,11 +662,22 @@ async fn ct_transfer() {
42, // amount 42, // amount
42, // available balance 42, // available balance
&alice_meta.elgamal_keypair, &alice_meta.elgamal_keypair,
alice_meta.ae_key.encrypt(42_u64), alice_meta.ae_key.encrypt(0_u64),
) )
.await .await
.unwrap(); .unwrap();
alice_meta
.check_balances(
&token,
ConfidentialTokenAccountBalances {
pending_balance: 42,
available_balance: 0,
decryptable_available_balance: 0,
},
)
.await;
token token
.confidential_transfer_apply_pending_balance( .confidential_transfer_apply_pending_balance(
&alice_meta.token_account, &alice_meta.token_account,
@ -615,19 +688,16 @@ async fn ct_transfer() {
.await .await
.unwrap(); .unwrap();
let state = token alice_meta
.get_account_info(&alice_meta.token_account) .check_balances(
.await &token,
.unwrap(); ConfidentialTokenAccountBalances {
let extension = state pending_balance: 0,
.get_extension::<ConfidentialTransferAccount>() available_balance: 42,
.unwrap(); decryptable_available_balance: 42,
assert_eq!( },
alice_meta )
.ae_key .await;
.decrypt(&extension.decryptable_available_balance.try_into().unwrap()),
Some(42),
);
token token
.confidential_transfer_transfer( .confidential_transfer_transfer(
@ -642,19 +712,16 @@ async fn ct_transfer() {
.await .await
.unwrap(); .unwrap();
let state = token alice_meta
.get_account_info(&alice_meta.token_account) .check_balances(
.await &token,
.unwrap(); ConfidentialTokenAccountBalances {
let extension = state pending_balance: 0,
.get_extension::<ConfidentialTransferAccount>() available_balance: 0,
.unwrap(); decryptable_available_balance: 0,
assert_eq!( },
alice_meta )
.ae_key .await;
.decrypt(&extension.decryptable_available_balance.try_into().unwrap()),
Some(0),
);
token token
.confidential_transfer_empty_account( .confidential_transfer_empty_account(
@ -687,6 +754,8 @@ async fn ct_transfer() {
let extension = state let extension = state
.get_extension::<ConfidentialTransferAccount>() .get_extension::<ConfidentialTransferAccount>()
.unwrap(); .unwrap();
// TODO: verify bob_meta pending and available balance once syscall lands
assert_eq!( assert_eq!(
bob_meta bob_meta
.ae_key .ae_key
@ -711,6 +780,8 @@ async fn ct_transfer() {
let extension = state let extension = state
.get_extension::<ConfidentialTransferAccount>() .get_extension::<ConfidentialTransferAccount>()
.unwrap(); .unwrap();
// TODO: verify bob_meta pending and available balance once syscall lands
assert_eq!( assert_eq!(
bob_meta bob_meta
.ae_key .ae_key
@ -769,7 +840,20 @@ async fn ct_transfer_with_fee() {
.await .await
.unwrap(); .unwrap();
// Self-transfer of N tokens alice_meta
.check_balances(
&token,
ConfidentialTokenAccountBalances {
pending_balance: 0,
available_balance: 100,
decryptable_available_balance: 100,
},
)
.await;
// Fee is 2.5%, so what is left is 97 in Alice account
//
// TODO: make self transfers not not take fees
token token
.confidential_transfer_transfer_with_fee( .confidential_transfer_transfer_with_fee(
&alice_meta.token_account, &alice_meta.token_account,
@ -778,13 +862,23 @@ async fn ct_transfer_with_fee() {
100, // amount 100, // amount
100, // available balance 100, // available balance
&alice_meta.elgamal_keypair, &alice_meta.elgamal_keypair,
alice_meta.ae_key.encrypt(100_u64), alice_meta.ae_key.encrypt(0_u64),
&epoch_info, &epoch_info,
) )
.await .await
.unwrap(); .unwrap();
// Fee is 2.5%, so what is left in 97 in Alice account alice_meta
.check_balances(
&token,
ConfidentialTokenAccountBalances {
pending_balance: 97,
available_balance: 0,
decryptable_available_balance: 0,
},
)
.await;
token token
.confidential_transfer_apply_pending_balance( .confidential_transfer_apply_pending_balance(
&alice_meta.token_account, &alice_meta.token_account,
@ -795,19 +889,16 @@ async fn ct_transfer_with_fee() {
.await .await
.unwrap(); .unwrap();
let state = token alice_meta
.get_account_info(&alice_meta.token_account) .check_balances(
.await &token,
.unwrap(); ConfidentialTokenAccountBalances {
let extension = state pending_balance: 0,
.get_extension::<ConfidentialTransferAccount>() available_balance: 97,
.unwrap(); decryptable_available_balance: 97,
assert_eq!( },
alice_meta )
.ae_key .await;
.decrypt(&extension.decryptable_available_balance.try_into().unwrap()),
Some(97),
);
token token
.confidential_transfer_transfer_with_fee( .confidential_transfer_transfer_with_fee(
@ -823,6 +914,17 @@ async fn ct_transfer_with_fee() {
.await .await
.unwrap(); .unwrap();
alice_meta
.check_balances(
&token,
ConfidentialTokenAccountBalances {
pending_balance: 0,
available_balance: 0,
decryptable_available_balance: 0,
},
)
.await;
let state = token let state = token
.get_account_info(&alice_meta.token_account) .get_account_info(&alice_meta.token_account)
.await .await
@ -878,6 +980,8 @@ async fn ct_transfer_with_fee() {
let extension = state let extension = state
.get_extension::<ConfidentialTransferAccount>() .get_extension::<ConfidentialTransferAccount>()
.unwrap(); .unwrap();
// TODO: check pending and available balance once curve syscall lands
assert_eq!( assert_eq!(
bob_meta bob_meta
.ae_key .ae_key
@ -902,6 +1006,8 @@ async fn ct_transfer_with_fee() {
let extension = state let extension = state
.get_extension::<ConfidentialTransferAccount>() .get_extension::<ConfidentialTransferAccount>()
.unwrap(); .unwrap();
// TODO: check pending and available balance once curve syscall lands
assert_eq!( assert_eq!(
bob_meta bob_meta
.ae_key .ae_key