Skip to content

Commit

Permalink
Transfers fail if the dropoff exceeds the maximum
Browse files Browse the repository at this point in the history
  • Loading branch information
feli-xlabs committed Jan 2, 2025
1 parent c8f3477 commit 0886d29
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 33 deletions.
27 changes: 16 additions & 11 deletions sdk/solana/tbrv3/idl/token_bridge_relayer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2006,61 +2006,66 @@ export type TokenBridgeRelayer = {
},
{
"code": 6007,
"name": "dropoffExceedingMaximum",
"msg": "dropoffExceedingMaximum"
},
{
"code": 6008,
"name": "feeExceedingMaximum",
"msg": "feeExceedingMaximum"
},
{
"code": 6008,
"code": 6009,
"name": "wrongFeeRecipient",
"msg": "wrongFeeRecipient"
},
{
"code": 6009,
"code": 6010,
"name": "wronglySetOptionalAccounts",
"msg": "wronglySetOptionalAccounts"
},
{
"code": 6010,
"code": 6011,
"name": "wrongMintAuthority",
"msg": "wrongMintAuthority"
},
{
"code": 6011,
"code": 6012,
"name": "invalidRecipient",
"msg": "invalidRecipient"
},
{
"code": 6012,
"code": 6013,
"name": "evmChainPriceNotSet",
"msg": "evmChainPriceNotSet"
},
{
"code": 6013,
"code": 6014,
"name": "chainPriceMismatch",
"msg": "chainPriceMismatch"
},
{
"code": 6014,
"code": 6015,
"name": "pausedTransfers",
"msg": "pausedTransfers"
},
{
"code": 6015,
"code": 6016,
"name": "invalidSendingPeer",
"msg": "invalidSendingPeer"
},
{
"code": 6016,
"code": 6017,
"name": "cannotRegisterSolana",
"msg": "cannotRegisterSolana"
},
{
"code": 6017,
"code": 6018,
"name": "invalidPeerAddress",
"msg": "invalidPeerAddress"
},
{
"code": 6018,
"code": 6019,
"name": "missingAssociatedTokenAccount",
"msg": "missingAssociatedTokenAccount"
}
Expand Down
4 changes: 4 additions & 0 deletions solana/programs/token-bridge-relayer/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ pub(crate) enum TokenBridgeRelayerError {
#[msg("AlreadyTheCanonicalPeer")]
AlreadyTheCanonicalPeer,

/// The dropoff amount it higher than the one authorized for the target chain.
#[msg("DropoffExceedingMaximum")]
DropoffExceedingMaximum,

/// Fee exceed what the user has set as a maximum.
#[msg("FeeExceedingMaximum")]
FeeExceedingMaximum,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,11 @@ pub fn transfer_tokens(
&[ctx.accounts.tbr_config.sender_bump],
];

require!(
dropoff_amount_micro <= ctx.accounts.chain_config.max_gas_dropoff_micro_token,
TokenBridgeRelayerError::DropoffExceedingMaximum
);

let transferred_amount = normalize_token_amount(transferred_amount, &ctx.accounts.mint);
let total_fees_lamports = calculate_total_fee(
&ctx.accounts.tbr_config,
Expand Down
20 changes: 20 additions & 0 deletions solana/tests/token-bridge-relayer-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,26 @@ describe('Token Bridge Relayer Program', () => {
expect(vaa.payload.payload.recipient).deep.equal(foreignAddress);
});

it('Fails to transfer a token due to dropoff exceeding maximum', async () => {
const gasDropoffAmount = 11_000_000; // ETH11
const unwrapIntent = false;
const transferredAmount = 321654n;

const tokenAccount = await barMint.mint(1_000_000_000n, unauthorizedClient.signer); //

const foreignAddress = $.universalAddress.generate();

const transferPromise = unauthorizedClient.transferTokens({
recipient: { address: foreignAddress, chain: ETHEREUM },
userTokenAccount: tokenAccount.publicKey,
transferredAmount,
gasDropoffAmount,
maxFeeLamports: 100_000_000n, // 0.1SOL max
unwrapIntent,
});
await assert.promise(transferPromise).failsWith('DropoffExceedingMaximum');
});

after(async () => {
await clientForeignToken.close();
});
Expand Down
27 changes: 16 additions & 11 deletions target/idl/token_bridge_relayer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2000,61 +2000,66 @@
},
{
"code": 6007,
"name": "DropoffExceedingMaximum",
"msg": "DropoffExceedingMaximum"
},
{
"code": 6008,
"name": "FeeExceedingMaximum",
"msg": "FeeExceedingMaximum"
},
{
"code": 6008,
"code": 6009,
"name": "WrongFeeRecipient",
"msg": "WrongFeeRecipient"
},
{
"code": 6009,
"code": 6010,
"name": "WronglySetOptionalAccounts",
"msg": "WronglySetOptionalAccounts"
},
{
"code": 6010,
"code": 6011,
"name": "WrongMintAuthority",
"msg": "WrongMintAuthority"
},
{
"code": 6011,
"code": 6012,
"name": "InvalidRecipient",
"msg": "InvalidRecipient"
},
{
"code": 6012,
"code": 6013,
"name": "EvmChainPriceNotSet",
"msg": "EvmChainPriceNotSet"
},
{
"code": 6013,
"code": 6014,
"name": "ChainPriceMismatch",
"msg": "ChainPriceMismatch"
},
{
"code": 6014,
"code": 6015,
"name": "PausedTransfers",
"msg": "PausedTransfers"
},
{
"code": 6015,
"code": 6016,
"name": "InvalidSendingPeer",
"msg": "InvalidSendingPeer"
},
{
"code": 6016,
"code": 6017,
"name": "CannotRegisterSolana",
"msg": "CannotRegisterSolana"
},
{
"code": 6017,
"code": 6018,
"name": "InvalidPeerAddress",
"msg": "InvalidPeerAddress"
},
{
"code": 6018,
"code": 6019,
"name": "MissingAssociatedTokenAccount",
"msg": "MissingAssociatedTokenAccount"
}
Expand Down
27 changes: 16 additions & 11 deletions target/types/token_bridge_relayer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2006,61 +2006,66 @@ export type TokenBridgeRelayer = {
},
{
"code": 6007,
"name": "dropoffExceedingMaximum",
"msg": "dropoffExceedingMaximum"
},
{
"code": 6008,
"name": "feeExceedingMaximum",
"msg": "feeExceedingMaximum"
},
{
"code": 6008,
"code": 6009,
"name": "wrongFeeRecipient",
"msg": "wrongFeeRecipient"
},
{
"code": 6009,
"code": 6010,
"name": "wronglySetOptionalAccounts",
"msg": "wronglySetOptionalAccounts"
},
{
"code": 6010,
"code": 6011,
"name": "wrongMintAuthority",
"msg": "wrongMintAuthority"
},
{
"code": 6011,
"code": 6012,
"name": "invalidRecipient",
"msg": "invalidRecipient"
},
{
"code": 6012,
"code": 6013,
"name": "evmChainPriceNotSet",
"msg": "evmChainPriceNotSet"
},
{
"code": 6013,
"code": 6014,
"name": "chainPriceMismatch",
"msg": "chainPriceMismatch"
},
{
"code": 6014,
"code": 6015,
"name": "pausedTransfers",
"msg": "pausedTransfers"
},
{
"code": 6015,
"code": 6016,
"name": "invalidSendingPeer",
"msg": "invalidSendingPeer"
},
{
"code": 6016,
"code": 6017,
"name": "cannotRegisterSolana",
"msg": "cannotRegisterSolana"
},
{
"code": 6017,
"code": 6018,
"name": "invalidPeerAddress",
"msg": "invalidPeerAddress"
},
{
"code": 6018,
"code": 6019,
"name": "missingAssociatedTokenAccount",
"msg": "missingAssociatedTokenAccount"
}
Expand Down

0 comments on commit 0886d29

Please sign in to comment.