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