2021-11-29 03:07:15 -08:00
|
|
|
use anchor_spl::token::TokenAccount;
|
|
|
|
use solana_program_test::*;
|
|
|
|
use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer, transport::TransportError};
|
|
|
|
|
|
|
|
use program_test::*;
|
2021-12-03 00:52:48 -08:00
|
|
|
use voter_stake_registry::state::LockupKind;
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
mod program_test;
|
|
|
|
|
|
|
|
struct Balances {
|
|
|
|
token: u64,
|
|
|
|
vault: u64,
|
|
|
|
deposit: u64,
|
|
|
|
voter_weight: u64,
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn balances(
|
|
|
|
context: &TestContext,
|
|
|
|
registrar: &RegistrarCookie,
|
|
|
|
address: Pubkey,
|
|
|
|
voter: &VoterCookie,
|
2021-12-03 11:36:42 -08:00
|
|
|
voting_mint: &VotingMintConfigCookie,
|
2021-11-29 03:07:15 -08:00
|
|
|
deposit_id: u8,
|
|
|
|
) -> Balances {
|
|
|
|
// Advance slots to avoid caching of the UpdateVoterWeightRecord call
|
|
|
|
// TODO: Is this something that could be an issue on a live node?
|
|
|
|
context.solana.advance_clock_by_slots(2).await;
|
|
|
|
|
|
|
|
let token = context.solana.token_account_balance(address).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
let vault = voting_mint.vault_balance(&context.solana, &voter).await;
|
2021-11-29 03:07:15 -08:00
|
|
|
let deposit = voter.deposit_amount(&context.solana, deposit_id).await;
|
|
|
|
let vwr = context
|
|
|
|
.addin
|
2021-11-30 23:59:25 -08:00
|
|
|
.update_voter_weight_record(®istrar, &voter)
|
2021-11-29 03:07:15 -08:00
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
Balances {
|
|
|
|
token,
|
|
|
|
vault,
|
|
|
|
deposit,
|
|
|
|
voter_weight: vwr.voter_weight,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unaligned_references)]
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_deposit_no_locking() -> Result<(), TransportError> {
|
|
|
|
let context = TestContext::new().await;
|
2021-11-29 03:16:41 -08:00
|
|
|
let addin = &context.addin;
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let payer = &context.users[0].key;
|
|
|
|
let realm_authority = Keypair::new();
|
|
|
|
let realm = context
|
|
|
|
.governance
|
|
|
|
.create_realm(
|
|
|
|
"testrealm",
|
|
|
|
realm_authority.pubkey(),
|
|
|
|
&context.mints[0],
|
|
|
|
&payer,
|
|
|
|
&context.addin.program_id,
|
|
|
|
)
|
|
|
|
.await;
|
|
|
|
|
|
|
|
let voter_authority = &context.users[1].key;
|
2021-12-03 00:48:10 -08:00
|
|
|
let voter2_authority = &context.users[2].key;
|
2021-11-29 03:07:15 -08:00
|
|
|
let token_owner_record = realm
|
|
|
|
.create_token_owner_record(voter_authority.pubkey(), &payer)
|
|
|
|
.await;
|
2021-12-03 00:48:10 -08:00
|
|
|
let token_owner_record2 = realm
|
|
|
|
.create_token_owner_record(voter2_authority.pubkey(), &payer)
|
|
|
|
.await;
|
2021-11-29 03:07:15 -08:00
|
|
|
|
2021-12-01 23:06:45 -08:00
|
|
|
let registrar = addin
|
|
|
|
.create_registrar(&realm, &realm_authority, payer)
|
|
|
|
.await;
|
2021-12-03 11:36:42 -08:00
|
|
|
let mngo_voting_mint = addin
|
2021-12-05 07:59:22 -08:00
|
|
|
.configure_voting_mint(
|
|
|
|
®istrar,
|
|
|
|
&realm_authority,
|
|
|
|
payer,
|
|
|
|
0,
|
|
|
|
&context.mints[0],
|
2021-12-09 02:58:15 -08:00
|
|
|
0,
|
|
|
|
1.0,
|
|
|
|
10.0, // no locking, so has no effect
|
|
|
|
5 * 365 * 24 * 60 * 60,
|
2021-12-05 07:59:22 -08:00
|
|
|
None,
|
2022-02-09 00:45:57 -08:00
|
|
|
None,
|
2021-12-05 07:59:22 -08:00
|
|
|
)
|
2021-11-29 03:07:15 -08:00
|
|
|
.await;
|
|
|
|
|
2021-11-29 03:16:41 -08:00
|
|
|
let voter = addin
|
2021-12-03 00:48:10 -08:00
|
|
|
.create_voter(®istrar, &token_owner_record, &voter_authority, &payer)
|
2021-11-29 03:07:15 -08:00
|
|
|
.await;
|
|
|
|
|
2021-11-29 03:16:41 -08:00
|
|
|
let voter2 = addin
|
2021-12-03 00:48:10 -08:00
|
|
|
.create_voter(®istrar, &token_owner_record2, &voter2_authority, &payer)
|
2021-11-29 03:07:15 -08:00
|
|
|
.await;
|
|
|
|
|
|
|
|
let reference_account = context.users[1].token_accounts[0];
|
|
|
|
let get_balances = |depot_id| {
|
|
|
|
balances(
|
|
|
|
&context,
|
|
|
|
®istrar,
|
|
|
|
reference_account,
|
|
|
|
&voter,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-11-29 03:07:15 -08:00
|
|
|
depot_id,
|
|
|
|
)
|
|
|
|
};
|
2021-11-29 07:42:48 -08:00
|
|
|
let withdraw = |amount: u64| {
|
|
|
|
addin.withdraw(
|
|
|
|
®istrar,
|
|
|
|
&voter,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-11-29 07:42:48 -08:00
|
|
|
&voter_authority,
|
|
|
|
reference_account,
|
|
|
|
0,
|
|
|
|
amount,
|
|
|
|
)
|
|
|
|
};
|
2021-12-02 02:06:15 -08:00
|
|
|
let deposit = |deposit_id: u8, amount: u64| {
|
|
|
|
addin.deposit(
|
2021-11-29 07:42:48 -08:00
|
|
|
®istrar,
|
|
|
|
&voter,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-11-29 07:42:48 -08:00
|
|
|
&voter_authority,
|
|
|
|
reference_account,
|
2021-12-02 02:01:14 -08:00
|
|
|
deposit_id,
|
2021-11-29 07:42:48 -08:00
|
|
|
amount,
|
|
|
|
)
|
|
|
|
};
|
2021-11-29 03:07:15 -08:00
|
|
|
// test deposit and withdraw
|
2021-12-16 23:02:14 -08:00
|
|
|
let token = context
|
|
|
|
.solana
|
|
|
|
.token_account_balance(reference_account)
|
|
|
|
.await;
|
2021-11-29 03:07:15 -08:00
|
|
|
|
2021-11-29 03:16:41 -08:00
|
|
|
addin
|
2021-12-02 02:01:14 -08:00
|
|
|
.create_deposit_entry(
|
2021-11-29 03:07:15 -08:00
|
|
|
®istrar,
|
|
|
|
&voter,
|
|
|
|
&voter_authority,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-12-03 00:48:10 -08:00
|
|
|
0,
|
2021-12-02 11:05:36 -08:00
|
|
|
LockupKind::None,
|
2021-12-17 00:57:22 -08:00
|
|
|
None,
|
2021-11-29 03:07:15 -08:00
|
|
|
0,
|
2021-12-01 01:20:39 -08:00
|
|
|
false,
|
2021-11-29 03:07:15 -08:00
|
|
|
)
|
2021-11-29 07:42:48 -08:00
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-12-02 02:06:15 -08:00
|
|
|
deposit(0, 10000).await.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let after_deposit = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_deposit.token + after_deposit.vault);
|
2021-11-29 03:07:15 -08:00
|
|
|
assert_eq!(after_deposit.voter_weight, after_deposit.vault);
|
|
|
|
assert_eq!(after_deposit.vault, 10000);
|
|
|
|
assert_eq!(after_deposit.deposit, 10000);
|
|
|
|
|
|
|
|
// add to the existing deposit 0
|
2021-12-02 02:06:15 -08:00
|
|
|
deposit(0, 5000).await.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let after_deposit2 = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_deposit2.token + after_deposit2.vault);
|
2021-11-29 03:07:15 -08:00
|
|
|
assert_eq!(after_deposit2.voter_weight, after_deposit2.vault);
|
|
|
|
assert_eq!(after_deposit2.vault, 15000);
|
|
|
|
assert_eq!(after_deposit2.deposit, 15000);
|
|
|
|
|
|
|
|
// create a separate deposit (index 1)
|
2021-11-29 03:16:41 -08:00
|
|
|
addin
|
2021-12-02 02:01:14 -08:00
|
|
|
.create_deposit_entry(
|
2021-11-29 03:07:15 -08:00
|
|
|
®istrar,
|
|
|
|
&voter,
|
|
|
|
&voter_authority,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-12-03 00:48:10 -08:00
|
|
|
1,
|
2021-12-02 11:05:36 -08:00
|
|
|
LockupKind::None,
|
2021-12-17 00:57:22 -08:00
|
|
|
None,
|
2021-11-29 03:07:15 -08:00
|
|
|
0,
|
2021-12-01 01:20:39 -08:00
|
|
|
false,
|
2021-11-29 03:07:15 -08:00
|
|
|
)
|
2021-11-29 07:42:48 -08:00
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-12-02 02:06:15 -08:00
|
|
|
deposit(1, 7000).await.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let after_deposit3 = get_balances(1).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_deposit3.token + after_deposit3.vault);
|
2021-11-29 03:07:15 -08:00
|
|
|
assert_eq!(after_deposit3.voter_weight, after_deposit3.vault);
|
|
|
|
assert_eq!(after_deposit3.vault, 22000);
|
|
|
|
assert_eq!(after_deposit3.deposit, 7000);
|
|
|
|
|
2021-11-29 07:42:48 -08:00
|
|
|
withdraw(10000).await.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let after_withdraw1 = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_withdraw1.token + after_withdraw1.vault);
|
2021-11-29 03:07:15 -08:00
|
|
|
assert_eq!(after_withdraw1.voter_weight, after_withdraw1.vault);
|
|
|
|
assert_eq!(after_withdraw1.vault, 12000);
|
|
|
|
assert_eq!(after_withdraw1.deposit, 5000);
|
|
|
|
|
2021-11-29 07:42:48 -08:00
|
|
|
withdraw(5001).await.expect_err("withdrew too much");
|
2021-11-29 03:07:15 -08:00
|
|
|
|
2021-11-29 07:42:48 -08:00
|
|
|
withdraw(5000).await.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let after_withdraw2 = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_withdraw2.token + after_withdraw2.vault);
|
2021-11-29 03:07:15 -08:00
|
|
|
assert_eq!(after_withdraw2.voter_weight, after_withdraw2.vault);
|
|
|
|
assert_eq!(after_withdraw2.vault, 7000);
|
|
|
|
assert_eq!(after_withdraw2.deposit, 0);
|
|
|
|
|
2021-11-30 02:49:59 -08:00
|
|
|
// Close the empty deposit (closing deposits 1 and 2 fails)
|
2021-11-30 02:56:14 -08:00
|
|
|
addin
|
2021-12-02 02:08:18 -08:00
|
|
|
.close_deposit_entry(&voter, &voter_authority, 2)
|
2021-11-30 02:56:14 -08:00
|
|
|
.await
|
|
|
|
.expect_err("deposit not in use");
|
|
|
|
addin
|
2021-12-02 02:08:18 -08:00
|
|
|
.close_deposit_entry(&voter, &voter_authority, 1)
|
2021-11-30 02:56:14 -08:00
|
|
|
.await
|
|
|
|
.expect_err("deposit not empty");
|
|
|
|
addin
|
2021-12-02 02:08:18 -08:00
|
|
|
.close_deposit_entry(&voter, &voter_authority, 0)
|
2021-11-30 02:56:14 -08:00
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-11-30 02:49:59 -08:00
|
|
|
|
|
|
|
let after_close = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_close.token + after_close.vault);
|
2021-11-30 02:49:59 -08:00
|
|
|
assert_eq!(after_close.voter_weight, after_close.vault);
|
|
|
|
assert_eq!(after_close.vault, 7000);
|
|
|
|
assert_eq!(after_close.deposit, 0);
|
|
|
|
|
2021-11-29 03:07:15 -08:00
|
|
|
// check that the voter2 account is still at 0
|
2021-12-16 23:02:14 -08:00
|
|
|
context.solana.advance_clock_by_slots(2).await;
|
|
|
|
let voter2_deposit = voter.deposit_amount(&context.solana, 0).await;
|
|
|
|
let voter2_voter_weight = context
|
|
|
|
.addin
|
|
|
|
.update_voter_weight_record(®istrar, &voter2)
|
|
|
|
.await
|
|
|
|
.unwrap()
|
|
|
|
.voter_weight;
|
|
|
|
assert_eq!(voter2_deposit, 0);
|
|
|
|
assert_eq!(voter2_voter_weight, 0);
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
// now voter2 deposits
|
2021-11-29 03:16:41 -08:00
|
|
|
addin
|
2021-12-02 02:01:14 -08:00
|
|
|
.create_deposit_entry(
|
|
|
|
®istrar,
|
|
|
|
&voter2,
|
|
|
|
&voter2_authority,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-12-03 00:48:10 -08:00
|
|
|
5,
|
2021-12-02 11:05:36 -08:00
|
|
|
LockupKind::None,
|
2021-12-17 00:57:22 -08:00
|
|
|
None,
|
2021-12-03 02:38:45 -08:00
|
|
|
0,
|
2021-12-02 02:01:14 -08:00
|
|
|
false,
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
addin
|
2021-12-02 02:06:15 -08:00
|
|
|
.deposit(
|
2021-11-29 03:07:15 -08:00
|
|
|
®istrar,
|
|
|
|
&voter2,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-11-29 03:07:15 -08:00
|
|
|
&voter2_authority,
|
|
|
|
context.users[2].token_accounts[0],
|
2021-12-03 00:48:10 -08:00
|
|
|
5,
|
2021-11-29 03:07:15 -08:00
|
|
|
1000,
|
|
|
|
)
|
2021-12-02 02:01:14 -08:00
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-11-29 03:07:15 -08:00
|
|
|
|
|
|
|
let voter2_balances = balances(
|
|
|
|
&context,
|
|
|
|
®istrar,
|
|
|
|
reference_account,
|
|
|
|
&voter2,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-12-03 00:48:10 -08:00
|
|
|
5,
|
2021-11-29 03:07:15 -08:00
|
|
|
)
|
|
|
|
.await;
|
|
|
|
assert_eq!(voter2_balances.deposit, 1000);
|
|
|
|
assert_eq!(voter2_balances.voter_weight, 1000);
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(voter2_balances.vault, 1000);
|
2021-11-29 03:07:15 -08:00
|
|
|
|
2021-11-30 02:49:59 -08:00
|
|
|
// when voter1 deposits again, they can reuse deposit index 0
|
|
|
|
addin
|
2021-12-02 02:01:14 -08:00
|
|
|
.create_deposit_entry(
|
|
|
|
®istrar,
|
|
|
|
&voter,
|
|
|
|
&voter_authority,
|
2021-12-03 11:36:42 -08:00
|
|
|
&mngo_voting_mint,
|
2021-12-03 00:48:10 -08:00
|
|
|
0,
|
2021-12-02 11:05:36 -08:00
|
|
|
LockupKind::None,
|
2021-12-17 00:57:22 -08:00
|
|
|
None,
|
2021-12-03 02:38:45 -08:00
|
|
|
0,
|
2021-12-02 02:01:14 -08:00
|
|
|
false,
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-12-02 02:06:15 -08:00
|
|
|
deposit(0, 3000).await.unwrap();
|
2021-11-30 02:49:59 -08:00
|
|
|
|
|
|
|
let after_reuse = get_balances(0).await;
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(token, after_reuse.token + 7000 + 3000);
|
2021-11-30 02:49:59 -08:00
|
|
|
assert_eq!(after_reuse.voter_weight, 7000 + 3000);
|
2021-12-16 23:02:14 -08:00
|
|
|
assert_eq!(after_reuse.vault, 7000 + 3000);
|
2021-11-30 02:49:59 -08:00
|
|
|
assert_eq!(after_reuse.deposit, 3000);
|
|
|
|
|
2021-11-29 03:07:15 -08:00
|
|
|
Ok(())
|
|
|
|
}
|