solana-program-library/stake-pool/py/tests/test_deposit_withdraw_stake.py

53 lines
2.6 KiB
Python

import pytest
from solana.rpc.commitment import Confirmed
from solana.keypair import Keypair
from spl.token.instructions import get_associated_token_address
from stake.actions import create_stake, delegate_stake
from stake.constants import STAKE_LEN
from stake.state import StakeState
from stake_pool.actions import deposit_stake, withdraw_stake, update_stake_pool
from stake_pool.constants import MINIMUM_ACTIVE_STAKE
from stake_pool.state import StakePool
@pytest.mark.asyncio
async def test_deposit_withdraw_stake(async_client, validators, payer, stake_pool_addresses, waiter):
(stake_pool_address, validator_list_address, _) = stake_pool_addresses
resp = await async_client.get_account_info(stake_pool_address, commitment=Confirmed)
data = resp['result']['value']['data']
stake_pool = StakePool.decode(data[0], data[1])
validator = next(iter(validators))
stake_amount = MINIMUM_ACTIVE_STAKE
stake = Keypair()
await create_stake(async_client, payer, stake, payer.public_key, stake_amount)
stake = stake.public_key
await delegate_stake(async_client, payer, payer, stake, validator)
resp = await async_client.get_account_info(stake, commitment=Confirmed)
data = resp['result']['value']['data']
stake_state = StakeState.decode(data[0], data[1])
token_account = get_associated_token_address(payer.public_key, stake_pool.pool_mint)
pre_pool_token_balance = await async_client.get_token_account_balance(token_account, Confirmed)
pre_pool_token_balance = int(pre_pool_token_balance['result']['value']['amount'])
print(stake_state)
await waiter.wait_for_next_epoch(async_client)
await update_stake_pool(async_client, payer, stake_pool_address)
await deposit_stake(async_client, payer, stake_pool_address, validator, stake, token_account)
pool_token_balance = await async_client.get_token_account_balance(token_account, Confirmed)
pool_token_balance = pool_token_balance['result']['value']['amount']
resp = await async_client.get_minimum_balance_for_rent_exemption(STAKE_LEN)
stake_rent_exemption = resp['result']
assert pool_token_balance == str(stake_amount + stake_rent_exemption + pre_pool_token_balance)
destination_stake = Keypair()
await withdraw_stake(
async_client, payer, payer, destination_stake, stake_pool_address, validator,
payer.public_key, token_account, stake_amount
)
pool_token_balance = await async_client.get_token_account_balance(token_account, Confirmed)
pool_token_balance = pool_token_balance['result']['value']['amount']
assert pool_token_balance == str(stake_rent_exemption + pre_pool_token_balance)