Skip to content

Events & Callbacks

TokenFlight communicates with your application through callback functions. There are no DOM CustomEvents.

Available Callbacks

CallbackTriggerPayload
onSwapSuccess(data)Order filled successfullySwapSuccessData
onSwapError(data)Any execution error occursSwapErrorData
onWalletConnected(data)Wallet connects or address changesWalletConnectedData
onQuoteReceived(data)New quote arrives from the APIQuoteResponse
onAmountChanged(data)User changes an editable amountAmountChangedData
onConnectWallet()User clicks "Connect Wallet" and no adapter is provided
onAccountModal()User clicks the wallet address button

Callback Payloads

ts
interface SwapSuccessData {
  orderId: string;
  fromToken: string;
  toToken: string;
  fromAmount: string;
  toAmount: string;
  txHash: string;
}

interface SwapErrorData {
  code: string;
  message: string;
  details?: unknown;
}

interface WalletConnectedData {
  address: string;
  chainType: string;
}

interface AmountChangedData {
  amount: string;
  direction: "from" | "to";
}

Three Ways to Pass Callbacks

1. registerWidgetElement() Defaults

js

registerWidgetElement({
  callbacks: {
    onSwapSuccess: (data) => {
      analytics.track('swap_success', {
        from: data.fromToken,
        to: data.toToken,
        txHash: data.txHash,
      });
    },
    onSwapError: (error) => {
      console.error(`[${error.code}] ${error.message}`);
    },
    onConnectWallet: () => {
      myWalletModal.open();
    },
  },
});
html
<tokenflight-widget
  to-token="eip155:8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
  trade-type="EXACT_OUTPUT"
  amount="100"
  theme="dark"
></tokenflight-widget>

2. Element __callbacks

js

registerWidgetElement();

const widgetEl = document.querySelector('tokenflight-widget');
widgetEl.__callbacks = {
  onSwapSuccess: (data) => showConfirmationDialog(data),
};

3. Imperative Constructor Callbacks

js

const widget = new TokenFlightWidget({
  container: '#widget',
  config: {
    toToken: { chainId: 8453, address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' },
    tradeType: 'EXACT_OUTPUT',
    amount: '100',
    theme: 'dark',
  },
  callbacks: {
    onSwapSuccess: (data) => console.log('Order:', data.orderId),
    onSwapError: (error) => showErrorToast(error.message),
    onWalletConnected: ({ address, chainType }) => {
      console.log(`Connected: ${address} (${chainType})`);
    },
    onAmountChanged: ({ amount, direction }) => {
      console.log(`Amount changed: ${amount} (${direction})`);
    },
    onQuoteReceived: (quote) => console.log('Quote:', quote),
    onConnectWallet: () => myWalletModal.open(),
    onAccountModal: () => myAccountModal.open(),
  },
});

widget.initialize();

Analytics Example

js

const widget = new TokenFlightWidget({
  container: '#widget',
  config: {
    toToken: { chainId: 8453, address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' },
    tradeType: 'EXACT_OUTPUT',
    amount: '100',
    theme: 'dark',
  },
  callbacks: {
    onSwapSuccess: (data) => {
      analytics.track('swap_completed', {
        orderId: data.orderId,
        fromToken: data.fromToken,
        toToken: data.toToken,
        txHash: data.txHash,
      });
    },
    onSwapError: (error) => {
      analytics.track('swap_error', {
        code: error.code,
        message: error.message,
      });
    },
  },
});