mango-v4/ts/client/scripts/archive/token-approve-test.ts

116 lines
3.5 KiB
TypeScript

import {
createApproveInstruction,
createCloseAccountInstruction,
createSyncNativeInstruction,
createTransferInstruction,
getAccount,
getAssociatedTokenAddress,
NATIVE_MINT,
} from '@solana/spl-token';
import {
Connection,
Keypair,
sendAndConfirmTransaction,
SystemProgram,
Transaction,
} from '@solana/web3.js';
import fs from 'fs';
async function main(): Promise<void> {
try {
let sig;
const conn = new Connection(process.env.MB_CLUSTER_URL!);
// load wallet 1
const w1 = Keypair.fromSecretKey(
Buffer.from(JSON.parse(fs.readFileSync(process.env.wallet1!, 'utf-8'))),
);
// load wallet 2
const w2 = Keypair.fromSecretKey(
Buffer.from(JSON.parse(fs.readFileSync(process.env.wallet2!, 'utf-8'))),
);
const w1WsolTA = await getAssociatedTokenAddress(NATIVE_MINT, w1.publicKey);
// const ataTransaction1 = new Transaction().add(
// createAssociatedTokenAccountInstruction(
// w1.publicKey,
// w1WsolTA,
// w1.publicKey,
// NATIVE_MINT,
// ),
// );
// await sendAndConfirmTransaction(conn, ataTransaction1, [w1]);
const w2WsolTA = await getAssociatedTokenAddress(NATIVE_MINT, w2.publicKey);
// const ataTransaction2 = new Transaction().add(
// createAssociatedTokenAccountInstruction(
// w2.publicKey,
// w2WsolTA,
// w2.publicKey,
// NATIVE_MINT,
// ),
// );
// await sendAndConfirmTransaction(conn, ataTransaction2, [w2]);
// wallet 1 wrap sol to wsol
const solTransferTransaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: w1.publicKey,
toPubkey: w1WsolTA,
lamports: 1,
}),
createSyncNativeInstruction(w1WsolTA),
);
sig = await sendAndConfirmTransaction(conn, solTransferTransaction, [w1]);
console.log(
`sig w1 wrapped some sol https://explorer.solana.com/tx/${sig}`,
);
// wallet 1 approve wallet 2 for some wsol
const tokenApproveTx = new Transaction().add(
createApproveInstruction(w1WsolTA, w2.publicKey, w1.publicKey, 1),
);
sig = await sendAndConfirmTransaction(conn, tokenApproveTx, [w1]);
console.log(
`sig w1 token approve w2 https://explorer.solana.com/tx/${sig}`,
);
// log delegate amount
let w2WsolAtaInfo = await getAccount(conn, w1WsolTA);
console.log(
`- delegate ${w2WsolAtaInfo.delegate}, amount ${w2WsolAtaInfo.delegatedAmount}`,
);
// wallet 2 transfer wsol from wallet 1 to wallet 2
const tokenTransferTx = new Transaction().add(
createTransferInstruction(w1WsolTA, w2WsolTA, w2.publicKey, 1),
);
sig = await sendAndConfirmTransaction(conn, tokenTransferTx, [w2], {
skipPreflight: true,
});
console.log(
`sig w1 transfer wsol to w2 https://explorer.solana.com/tx/${sig}`,
);
// log delegate amount
w2WsolAtaInfo = await getAccount(conn, w1WsolTA, 'finalized');
console.log(
`- delegate ${w2WsolAtaInfo.delegate}, amount ${w2WsolAtaInfo.delegatedAmount}`,
);
// wallet 2 unwrap all wsol
const closeAtaIx = new Transaction().add(
createCloseAccountInstruction(w2WsolTA, w2.publicKey, w2.publicKey),
);
sig = await sendAndConfirmTransaction(conn, closeAtaIx, [w2], {
skipPreflight: true,
});
console.log(`sig w2 unwrap wsol https://explorer.solana.com/tx/${sig}`);
} catch (error) {
console.log(error);
}
}
main();