Use transfer checked instruction (#191)
This commit is contained in:
parent
b315d2a84e
commit
d368648476
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -259,6 +259,7 @@ function SendSplDialog({ onClose, publicKey, balanceInfo, onSubmitRef }) {
|
|||
new PublicKey(destinationAddress),
|
||||
amount,
|
||||
balanceInfo.mint,
|
||||
decimals,
|
||||
null,
|
||||
overrideDestinationCheck,
|
||||
);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue