Skip to content
This repository was archived by the owner on Jun 16, 2025. It is now read-only.

Commit ed87b5b

Browse files
authored
solana: add refund token to transfer authority PDA (#167)
Co-authored-by: A5 Pickle <[email protected]>
1 parent a1763da commit ed87b5b

File tree

2 files changed

+34
-16
lines changed
  • solana

2 files changed

+34
-16
lines changed

solana/programs/token-router/src/processor/market_order/prepare.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub struct PrepareMarketOrder<'info> {
2929
TRANSFER_AUTHORITY_SEED_PREFIX,
3030
prepared_order.key().as_ref(),
3131
&args.hash().0,
32+
refund_token.key().as_ref()
3233
],
3334
bump,
3435
constraint = {
@@ -175,6 +176,14 @@ pub fn prepare_market_order(
175176
redeemer_message,
176177
} = args;
177178

179+
let token_program = &ctx.accounts.token_program;
180+
let sender_token = &ctx.accounts.sender_token;
181+
let custody_token = &ctx.accounts.prepared_custody_token;
182+
let refund_token = &ctx.accounts.refund_token;
183+
184+
let prepared_order = &mut ctx.accounts.prepared_order;
185+
let prepared_order_key = prepared_order.key();
186+
178187
// Finally transfer amount to custody token account. We perform exclusive or because we do not
179188
// want to allow specifying more than one authority.
180189
let order_sender = match (
@@ -184,10 +193,10 @@ pub fn prepare_market_order(
184193
(Some(sender), None) => {
185194
token::transfer(
186195
CpiContext::new(
187-
ctx.accounts.token_program.to_account_info(),
196+
token_program.to_account_info(),
188197
token::Transfer {
189-
from: ctx.accounts.sender_token.to_account_info(),
190-
to: ctx.accounts.prepared_custody_token.to_account_info(),
198+
from: sender_token.to_account_info(),
199+
to: custody_token.to_account_info(),
191200
authority: sender.to_account_info(),
192201
},
193202
),
@@ -197,20 +206,19 @@ pub fn prepare_market_order(
197206
sender.key()
198207
}
199208
(None, Some(program_transfer_authority)) => {
200-
let sender_token = &ctx.accounts.sender_token;
201-
202209
token::transfer(
203210
CpiContext::new_with_signer(
204-
ctx.accounts.token_program.to_account_info(),
211+
token_program.to_account_info(),
205212
token::Transfer {
206213
from: sender_token.to_account_info(),
207-
to: ctx.accounts.prepared_custody_token.to_account_info(),
214+
to: custody_token.to_account_info(),
208215
authority: program_transfer_authority.to_account_info(),
209216
},
210217
&[&[
211218
TRANSFER_AUTHORITY_SEED_PREFIX,
212-
ctx.accounts.prepared_order.key().as_ref(),
219+
prepared_order_key.as_ref(),
213220
&hashed_args.0,
221+
refund_token.key().as_ref(),
214222
&[ctx.bumps.program_transfer_authority.unwrap()],
215223
]],
216224
),
@@ -223,13 +231,13 @@ pub fn prepare_market_order(
223231
};
224232

225233
// Set the values in prepared order account.
226-
ctx.accounts.prepared_order.set_inner(PreparedOrder {
234+
prepared_order.set_inner(PreparedOrder {
227235
info: PreparedOrderInfo {
228236
order_sender,
229237
prepared_by: ctx.accounts.payer.key(),
230238
order_type: OrderType::Market { min_amount_out },
231-
src_token: ctx.accounts.sender_token.key(),
232-
refund_token: ctx.accounts.refund_token.key(),
239+
src_token: sender_token.key(),
240+
refund_token: refund_token.key(),
233241
target_chain,
234242
redeemer,
235243
prepared_custody_token_bump: ctx.bumps.prepared_custody_token,

solana/ts/src/tokenRouter/index.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,11 @@ export class TokenRouterProgram {
190190
return this.program.account.preparedFill.fetch(addr);
191191
}
192192

193-
transferAuthorityAddress(preparedOrder: PublicKey, args: PrepareMarketOrderArgs): PublicKey {
193+
transferAuthorityAddress(
194+
preparedOrder: PublicKey,
195+
args: PrepareMarketOrderArgs,
196+
refundToken: PublicKey,
197+
): PublicKey {
194198
const { amountIn, minAmountOut, targetChain, redeemer, redeemerMessage } = args;
195199
const hasher = new Keccak(256);
196200
hasher.update(uint64ToBN(amountIn).toBuffer("be", 8));
@@ -208,7 +212,12 @@ export class TokenRouterProgram {
208212
hasher.update(redeemerMessage);
209213

210214
return PublicKey.findProgramAddressSync(
211-
[Buffer.from("transfer-authority"), preparedOrder.toBuffer(), hasher.digest()],
215+
[
216+
Buffer.from("transfer-authority"),
217+
preparedOrder.toBuffer(),
218+
hasher.digest(),
219+
refundToken.toBuffer(),
220+
],
212221
this.ID,
213222
)[0];
214223
}
@@ -322,11 +331,12 @@ export class TokenRouterProgram {
322331
accounts: {
323332
preparedOrder: PublicKey;
324333
senderToken: PublicKey;
334+
refundToken: PublicKey;
325335
senderTokenAuthority?: PublicKey;
326336
},
327337
args: PrepareMarketOrderArgs,
328338
): Promise<{ transferAuthority: PublicKey; ix: TransactionInstruction }> {
329-
const { preparedOrder, senderToken } = accounts;
339+
const { preparedOrder, senderToken, refundToken } = accounts;
330340
const { amountIn } = args;
331341

332342
let { senderTokenAuthority } = accounts;
@@ -338,7 +348,7 @@ export class TokenRouterProgram {
338348
return tokenAccount.owner;
339349
})();
340350

341-
const transferAuthority = this.transferAuthorityAddress(preparedOrder, args);
351+
const transferAuthority = this.transferAuthorityAddress(preparedOrder, args, refundToken);
342352

343353
return {
344354
transferAuthority,
@@ -380,7 +390,7 @@ export class TokenRouterProgram {
380390
if (programTransferAuthority === undefined) {
381391
if (useTransferAuthority) {
382392
const approveResult = await this.approveTransferAuthorityIx(
383-
{ preparedOrder, senderToken, senderTokenAuthority },
393+
{ preparedOrder, senderToken, refundToken, senderTokenAuthority },
384394
args,
385395
);
386396
programTransferAuthority = approveResult.transferAuthority;

0 commit comments

Comments
 (0)