diff --git a/src/components/MergeAccountsDialog.js b/src/components/MergeAccountsDialog.js index 9a52ee3..7c8cacf 100644 --- a/src/components/MergeAccountsDialog.js +++ b/src/components/MergeAccountsDialog.js @@ -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, ); } } diff --git a/src/components/SendDialog.js b/src/components/SendDialog.js index 237e50a..767de84 100644 --- a/src/components/SendDialog.js +++ b/src/components/SendDialog.js @@ -259,6 +259,7 @@ function SendSplDialog({ onClose, publicKey, balanceInfo, onSubmitRef }) { new PublicKey(destinationAddress), amount, balanceInfo.mint, + decimals, null, overrideDestinationCheck, ); diff --git a/src/utils/tokens/index.js b/src/utils/tokens/index.js index 7d8d9fc..e2b05ea 100644 --- a/src/utils/tokens/index.js +++ b/src/utils/tokens/index.js @@ -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, diff --git a/src/utils/tokens/instructions.js b/src/utils/tokens/instructions.js index cde72f0..abc86e8 100644 --- a/src/utils/tokens/instructions.js +++ b/src/utils/tokens/instructions.js @@ -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, }); diff --git a/src/utils/wallet.js b/src/utils/wallet.js index 18667e4..47c9af8 100644 --- a/src/utils/wallet.js +++ b/src/utils/wallet.js @@ -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); };