Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,13 @@ pub fn transfer_tokens(accounts: &[AccountInfo], args: TransferTokensArgs) -> Pr
from_associated_token_account.key,
to_associated_token_account.key,
owner.key,
&[owner.key, recipient.key],
&[owner.key],
args.quantity,
)?,
&[
mint_account.clone(),
from_associated_token_account.clone(),
to_associated_token_account.clone(),
owner.clone(),
recipient.clone(),
token_program.clone(),
],
)?;
Expand Down
27 changes: 26 additions & 1 deletion tokens/transfer-tokens/native/tests/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ describe('Transferring Tokens', () => {
await findAssociatedTokenAddress(mint, payer.address),
await findAssociatedTokenAddress(mint, recipientWallet.address),
payer,
recipientWallet,
recipientWallet.address,
payer,
programId,
quantity,
Expand All @@ -242,4 +242,29 @@ describe('Transferring Tokens', () => {
assert.equal(tokenBalance(toAta), '1', 'unexpected recipient NFT balance');
assert.equal(tokenBalance(fromAta), '0', 'unexpected sender NFT balance');
});

it('Transfer tokens to a wallet that does not sign the transaction!', async () => {
const mint = tokenMintKeypair.address;
const nonSigningRecipient = (await generateKeyPairSigner()).address;
const fromAta = await findAssociatedTokenAddress(mint, payer.address);
const toAta = await findAssociatedTokenAddress(mint, nonSigningRecipient);
const senderBalanceBefore = BigInt(tokenBalance(fromAta));
const quantity = 20n;

const ix = createTransferTokensInstruction(
mint,
fromAta,
toAta,
payer,
nonSigningRecipient,
payer,
programId,
quantity,
);

await sendTransaction(ix);

assert.equal(tokenBalance(toAta), quantity.toString(), 'unexpected recipient balance');
assert.equal(tokenBalance(fromAta), (senderBalanceBefore - quantity).toString(), 'unexpected sender balance');
});
});
4 changes: 2 additions & 2 deletions tokens/transfer-tokens/native/ts/instructions/transfer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export function createTransferTokensInstruction(
fromAssociatedTokenAccount: Address,
toAssociatedTokenAccount: Address,
owner: TransactionSigner,
recipient: TransactionSigner,
recipient: Address,
payer: TransactionSigner,
programId: Address,
quantity: bigint,
Expand All @@ -33,7 +33,7 @@ export function createTransferTokensInstruction(
{ address: fromAssociatedTokenAccount, role: AccountRole.WRITABLE },
{ address: toAssociatedTokenAccount, role: AccountRole.WRITABLE },
{ address: owner.address, role: AccountRole.WRITABLE_SIGNER, signer: owner },
{ address: recipient.address, role: AccountRole.WRITABLE_SIGNER, signer: recipient },
{ address: recipient, role: AccountRole.READONLY },
{ address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer },
{ address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY },
{ address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY },
Expand Down