feat(web3.js): support withdraw from Vote account (#22932)
This commit is contained in:
166
web3.js/test/vote-program.test.ts
Normal file
166
web3.js/test/vote-program.test.ts
Normal file
@ -0,0 +1,166 @@
|
||||
import {expect, use} from 'chai';
|
||||
import chaiAsPromised from 'chai-as-promised';
|
||||
|
||||
import {
|
||||
Keypair,
|
||||
LAMPORTS_PER_SOL,
|
||||
VoteInit,
|
||||
VoteInstruction,
|
||||
VoteProgram,
|
||||
sendAndConfirmTransaction,
|
||||
SystemInstruction,
|
||||
Connection,
|
||||
} from '../src';
|
||||
import {helpers} from './mocks/rpc-http';
|
||||
import {url} from './url';
|
||||
|
||||
use(chaiAsPromised);
|
||||
|
||||
describe('VoteProgram', () => {
|
||||
it('createAccount', () => {
|
||||
const fromPubkey = Keypair.generate().publicKey;
|
||||
const newAccountPubkey = Keypair.generate().publicKey;
|
||||
const authorizedPubkey = Keypair.generate().publicKey;
|
||||
const nodePubkey = Keypair.generate().publicKey;
|
||||
const commission = 5;
|
||||
const voteInit = new VoteInit(
|
||||
nodePubkey,
|
||||
authorizedPubkey,
|
||||
authorizedPubkey,
|
||||
commission,
|
||||
);
|
||||
const lamports = 123;
|
||||
const transaction = VoteProgram.createAccount({
|
||||
fromPubkey,
|
||||
votePubkey: newAccountPubkey,
|
||||
voteInit,
|
||||
lamports,
|
||||
});
|
||||
expect(transaction.instructions).to.have.length(2);
|
||||
const [systemInstruction, voteInstruction] = transaction.instructions;
|
||||
const systemParams = {
|
||||
fromPubkey,
|
||||
newAccountPubkey,
|
||||
lamports,
|
||||
space: VoteProgram.space,
|
||||
programId: VoteProgram.programId,
|
||||
};
|
||||
expect(systemParams).to.eql(
|
||||
SystemInstruction.decodeCreateAccount(systemInstruction),
|
||||
);
|
||||
|
||||
const initParams = {votePubkey: newAccountPubkey, nodePubkey, voteInit};
|
||||
expect(initParams).to.eql(
|
||||
VoteInstruction.decodeInitializeAccount(voteInstruction),
|
||||
);
|
||||
});
|
||||
|
||||
it('initialize', () => {
|
||||
const newAccountPubkey = Keypair.generate().publicKey;
|
||||
const authorizedPubkey = Keypair.generate().publicKey;
|
||||
const nodePubkey = Keypair.generate().publicKey;
|
||||
const voteInit = new VoteInit(
|
||||
nodePubkey,
|
||||
authorizedPubkey,
|
||||
authorizedPubkey,
|
||||
5,
|
||||
);
|
||||
const initParams = {
|
||||
votePubkey: newAccountPubkey,
|
||||
nodePubkey,
|
||||
voteInit,
|
||||
};
|
||||
const initInstruction = VoteProgram.initializeAccount(initParams);
|
||||
expect(initParams).to.eql(
|
||||
VoteInstruction.decodeInitializeAccount(initInstruction),
|
||||
);
|
||||
});
|
||||
|
||||
it('withdraw', () => {
|
||||
const votePubkey = Keypair.generate().publicKey;
|
||||
const authorizedWithdrawerPubkey = Keypair.generate().publicKey;
|
||||
const toPubkey = Keypair.generate().publicKey;
|
||||
const params = {
|
||||
votePubkey,
|
||||
authorizedWithdrawerPubkey,
|
||||
lamports: 123,
|
||||
toPubkey,
|
||||
};
|
||||
const transaction = VoteProgram.withdraw(params);
|
||||
expect(transaction.instructions).to.have.length(1);
|
||||
const [withdrawInstruction] = transaction.instructions;
|
||||
expect(params).to.eql(VoteInstruction.decodeWithdraw(withdrawInstruction));
|
||||
});
|
||||
|
||||
if (process.env.TEST_LIVE) {
|
||||
it('live vote actions', async () => {
|
||||
const connection = new Connection(url, 'confirmed');
|
||||
|
||||
const newVoteAccount = Keypair.generate();
|
||||
const nodeAccount = Keypair.generate();
|
||||
|
||||
const payer = Keypair.generate();
|
||||
await helpers.airdrop({
|
||||
connection,
|
||||
address: payer.publicKey,
|
||||
amount: 12 * LAMPORTS_PER_SOL,
|
||||
});
|
||||
expect(await connection.getBalance(payer.publicKey)).to.eq(
|
||||
12 * LAMPORTS_PER_SOL,
|
||||
);
|
||||
|
||||
const authorized = Keypair.generate();
|
||||
await helpers.airdrop({
|
||||
connection,
|
||||
address: authorized.publicKey,
|
||||
amount: 12 * LAMPORTS_PER_SOL,
|
||||
});
|
||||
expect(await connection.getBalance(authorized.publicKey)).to.eq(
|
||||
12 * LAMPORTS_PER_SOL,
|
||||
);
|
||||
|
||||
const minimumAmount = await connection.getMinimumBalanceForRentExemption(
|
||||
VoteProgram.space,
|
||||
);
|
||||
|
||||
// Create initialized Vote account
|
||||
let createAndInitialize = VoteProgram.createAccount({
|
||||
fromPubkey: payer.publicKey,
|
||||
votePubkey: newVoteAccount.publicKey,
|
||||
voteInit: new VoteInit(
|
||||
nodeAccount.publicKey,
|
||||
authorized.publicKey,
|
||||
authorized.publicKey,
|
||||
5,
|
||||
),
|
||||
lamports: minimumAmount + 2 * LAMPORTS_PER_SOL,
|
||||
});
|
||||
|
||||
await sendAndConfirmTransaction(
|
||||
connection,
|
||||
createAndInitialize,
|
||||
[payer, newVoteAccount, nodeAccount],
|
||||
{preflightCommitment: 'confirmed'},
|
||||
);
|
||||
expect(await connection.getBalance(newVoteAccount.publicKey)).to.eq(
|
||||
minimumAmount + 2 * LAMPORTS_PER_SOL,
|
||||
);
|
||||
|
||||
// Withdraw from Vote account
|
||||
const recipient = Keypair.generate();
|
||||
let withdraw = VoteProgram.withdraw({
|
||||
votePubkey: newVoteAccount.publicKey,
|
||||
authorizedWithdrawerPubkey: authorized.publicKey,
|
||||
lamports: LAMPORTS_PER_SOL,
|
||||
toPubkey: recipient.publicKey,
|
||||
});
|
||||
|
||||
await sendAndConfirmTransaction(connection, withdraw, [authorized], {
|
||||
preflightCommitment: 'confirmed',
|
||||
});
|
||||
expect(await connection.getBalance(recipient.publicKey)).to.eq(
|
||||
LAMPORTS_PER_SOL,
|
||||
);
|
||||
}).timeout(10 * 1000);
|
||||
}
|
||||
});
|
Reference in New Issue
Block a user