Use transfer checked instruction (#191)

This commit is contained in:
Armani Ferrante 2021-04-16 00:38:46 +08:00 committed by GitHub
parent b315d2a84e
commit d368648476
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 46 deletions

View File

@ -115,6 +115,7 @@ export default function MergeAccountsDialog({ open, onClose }) {
assocTokAddr,
mintGroup,
mint,
tokenInfo.decimals,
wallet,
connection,
enqueueSnackbar,
@ -242,11 +243,11 @@ async function mergeMint(
assocTokAddr,
mintAccountSet,
mint,
decimals,
wallet,
connection,
enqueueSnackbar,
) {
console.log('mint', mint, mint.toString());
if (mintAccountSet.length === 0) {
return;
}
@ -292,6 +293,7 @@ async function mergeMint(
associatedTokenAccount,
tokenAccount.account.amount,
mint,
decimals,
);
}
}

View File

@ -259,6 +259,7 @@ function SendSplDialog({ onClose, publicKey, balanceInfo, onSubmitRef }) {
new PublicKey(destinationAddress),
amount,
balanceInfo.mint,
decimals,
null,
overrideDestinationCheck,
);

View File

@ -14,7 +14,7 @@ import {
memoInstruction,
mintTo,
TOKEN_PROGRAM_ID,
transfer,
transferChecked,
} from './instructions';
import {
ACCOUNT_LAYOUT,
@ -300,6 +300,7 @@ export async function transferTokens({
amount,
memo,
mint,
decimals,
overrideDestinationCheck,
}) {
const destinationAccountInfo = await connection.getAccountInfo(
@ -312,6 +313,8 @@ export async function transferTokens({
return await transferBetweenSplTokenAccounts({
connection,
owner,
mint,
decimals,
sourcePublicKey,
destinationPublicKey,
amount,
@ -339,6 +342,8 @@ export async function transferTokens({
return await transferBetweenSplTokenAccounts({
connection,
owner,
mint,
decimals,
sourcePublicKey,
destinationPublicKey: destinationSplTokenAccount.publicKey,
amount,
@ -353,44 +358,24 @@ export async function transferTokens({
amount,
memo,
mint,
decimals,
});
}
// SPL tokens only.
export async function transferAndClose({
connection,
owner,
sourcePublicKey,
destinationPublicKey,
amount,
}) {
const tx = createTransferBetweenSplTokenAccountsInstruction({
ownerPublicKey: owner.publicKey,
sourcePublicKey,
destinationPublicKey,
amount,
});
tx.add(
closeAccount({
source: sourcePublicKey,
destination: owner.publicKey,
owner: owner.publicKey,
}),
);
let signers = [];
return await signAndSendTransaction(connection, tx, owner, signers);
}
function createTransferBetweenSplTokenAccountsInstruction({
ownerPublicKey,
mint,
decimals,
sourcePublicKey,
destinationPublicKey,
amount,
memo,
}) {
let transaction = new Transaction().add(
transfer({
transferChecked({
source: sourcePublicKey,
mint,
decimals,
destination: destinationPublicKey,
owner: ownerPublicKey,
amount,
@ -405,6 +390,8 @@ function createTransferBetweenSplTokenAccountsInstruction({
async function transferBetweenSplTokenAccounts({
connection,
owner,
mint,
decimals,
sourcePublicKey,
destinationPublicKey,
amount,
@ -412,6 +399,8 @@ async function transferBetweenSplTokenAccounts({
}) {
const transaction = createTransferBetweenSplTokenAccountsInstruction({
ownerPublicKey: owner.publicKey,
mint,
decimals,
sourcePublicKey,
destinationPublicKey,
amount,
@ -429,6 +418,7 @@ async function createAndTransferToAccount({
amount,
memo,
mint,
decimals,
}) {
const [
createAccountInstruction,
@ -449,6 +439,8 @@ async function createAndTransferToAccount({
const transferBetweenAccountsTxn = createTransferBetweenSplTokenAccountsInstruction(
{
ownerPublicKey: owner.publicKey,
mint,
decimals,
sourcePublicKey,
destinationPublicKey: newAddress,
amount,

View File

@ -29,11 +29,6 @@ LAYOUT.addVariant(
'initializeMint',
);
LAYOUT.addVariant(1, BufferLayout.struct([]), 'initializeAccount');
LAYOUT.addVariant(
3,
BufferLayout.struct([BufferLayout.nu64('amount')]),
'transfer',
);
LAYOUT.addVariant(
7,
BufferLayout.struct([BufferLayout.nu64('amount')]),
@ -45,6 +40,11 @@ LAYOUT.addVariant(
'burn',
);
LAYOUT.addVariant(9, BufferLayout.struct([]), 'closeAccount');
LAYOUT.addVariant(
12,
BufferLayout.struct([BufferLayout.nu64('amount'), BufferLayout.u8('decimals')]),
'transferChecked',
);
const instructionMaxSpan = Math.max(
...Object.values(LAYOUT.registry).map((r) => r.span),
@ -96,16 +96,17 @@ export function initializeAccount({ account, mint, owner }) {
});
}
export function transfer({ source, destination, amount, owner }) {
export function transferChecked({ source, mint, destination, amount, decimals, owner }) {
let keys = [
{ pubkey: source, isSigner: false, isWritable: true },
{ pubkey: mint, isSigner: false, isWritable: false },
{ pubkey: destination, isSigner: false, isWritable: true },
{ pubkey: owner, isSigner: true, isWritable: false },
];
return new TransactionInstruction({
keys,
data: encodeTokenInstructionData({
transfer: { amount },
transferChecked: { amount, decimals },
}),
programId: TOKEN_PROGRAM_ID,
});

View File

@ -14,7 +14,6 @@ import {
getOwnedTokenAccounts,
nativeTransfer,
transferTokens,
transferAndClose,
} from './tokens';
import { TOKEN_PROGRAM_ID } from './tokens/instructions';
import {
@ -99,6 +98,7 @@ export class Wallet {
destination,
amount,
mint,
decimals,
memo = null,
overrideDestinationCheck = false,
) => {
@ -116,6 +116,7 @@ export class Wallet {
amount,
memo,
mint,
decimals,
overrideDestinationCheck,
});
};
@ -133,16 +134,6 @@ export class Wallet {
});
};
transferAndClose = async (source, destination, amount) => {
return await transferAndClose({
connection: this.connection,
owner: this,
sourcePublicKey: source,
destinationPublicKey: destination,
amount,
});
};
signTransaction = async (transaction) => {
return this.provider.signTransaction(transaction);
};