120 lines
4.0 KiB
TypeScript
120 lines
4.0 KiB
TypeScript
import chai, { expect } from 'chai';
|
|
import chaiAsPromised from 'chai-as-promised';
|
|
chai.use(chaiAsPromised);
|
|
|
|
import {
|
|
Connection,
|
|
Keypair,
|
|
PublicKey,
|
|
Signer,
|
|
Transaction,
|
|
SystemProgram,
|
|
sendAndConfirmTransaction,
|
|
} from '@solana/web3.js';
|
|
import {
|
|
NATIVE_MINT,
|
|
NATIVE_MINT_2022,
|
|
TOKEN_PROGRAM_ID,
|
|
closeAccount,
|
|
getAccount,
|
|
createNativeMint,
|
|
createWrappedNativeAccount,
|
|
syncNative,
|
|
} from '../../src';
|
|
import { TEST_PROGRAM_ID, newAccountWithLamports, getConnection } from '../common';
|
|
|
|
describe('native', () => {
|
|
let connection: Connection;
|
|
let payer: Signer;
|
|
let owner: Keypair;
|
|
let account: PublicKey;
|
|
let amount: number;
|
|
let nativeMint: PublicKey;
|
|
before(async () => {
|
|
amount = 1_000_000_000;
|
|
connection = await getConnection();
|
|
payer = await newAccountWithLamports(connection, 100_000_000_000);
|
|
if (TEST_PROGRAM_ID == TOKEN_PROGRAM_ID) {
|
|
nativeMint = NATIVE_MINT;
|
|
} else {
|
|
nativeMint = NATIVE_MINT_2022;
|
|
await createNativeMint(connection, payer, undefined, nativeMint, TEST_PROGRAM_ID);
|
|
}
|
|
});
|
|
beforeEach(async () => {
|
|
owner = Keypair.generate();
|
|
account = await createWrappedNativeAccount(
|
|
connection,
|
|
payer,
|
|
owner.publicKey,
|
|
amount,
|
|
undefined,
|
|
undefined,
|
|
TEST_PROGRAM_ID,
|
|
nativeMint
|
|
);
|
|
});
|
|
it('works', async () => {
|
|
const accountInfo = await getAccount(connection, account, undefined, TEST_PROGRAM_ID);
|
|
expect(accountInfo.isNative).to.be.true;
|
|
expect(accountInfo.amount).to.eql(BigInt(amount));
|
|
});
|
|
it('syncNative', async () => {
|
|
let balance = 0;
|
|
const preInfo = await connection.getAccountInfo(account);
|
|
expect(preInfo).to.not.be.null;
|
|
if (preInfo != null) {
|
|
balance = preInfo.lamports;
|
|
}
|
|
|
|
// transfer lamports into the native account
|
|
const additionalLamports = 100;
|
|
await sendAndConfirmTransaction(
|
|
connection,
|
|
new Transaction().add(
|
|
SystemProgram.transfer({
|
|
fromPubkey: payer.publicKey,
|
|
toPubkey: account,
|
|
lamports: additionalLamports,
|
|
})
|
|
),
|
|
[payer]
|
|
);
|
|
|
|
// no change in the amount
|
|
const preAccountInfo = await getAccount(connection, account, undefined, TEST_PROGRAM_ID);
|
|
expect(preAccountInfo.isNative).to.be.true;
|
|
expect(preAccountInfo.amount).to.eql(BigInt(amount));
|
|
|
|
// but change in lamports
|
|
const postInfo = await connection.getAccountInfo(account);
|
|
expect(postInfo).to.not.be.null;
|
|
if (postInfo !== null) {
|
|
expect(postInfo.lamports).to.eql(balance + additionalLamports);
|
|
}
|
|
|
|
// sync, amount changes
|
|
await syncNative(connection, payer, account, undefined, TEST_PROGRAM_ID);
|
|
const postAccountInfo = await getAccount(connection, account, undefined, TEST_PROGRAM_ID);
|
|
expect(postAccountInfo.isNative).to.be.true;
|
|
expect(postAccountInfo.amount).to.eql(BigInt(amount + additionalLamports));
|
|
});
|
|
it('closeAccount', async () => {
|
|
let balance = 0;
|
|
const preInfo = await connection.getAccountInfo(account);
|
|
expect(preInfo).to.not.be.null;
|
|
if (preInfo != null) {
|
|
balance = preInfo.lamports;
|
|
}
|
|
const destination = Keypair.generate().publicKey;
|
|
await closeAccount(connection, payer, account, destination, owner, [], undefined, TEST_PROGRAM_ID);
|
|
const nullInfo = await connection.getAccountInfo(account);
|
|
expect(nullInfo).to.be.null;
|
|
const destinationInfo = await connection.getAccountInfo(destination);
|
|
expect(destinationInfo).to.not.be.null;
|
|
if (destinationInfo != null) {
|
|
expect(destinationInfo.lamports).to.eql(balance);
|
|
}
|
|
});
|
|
});
|