Skip to content

Support onchain transactions in your app built with XMTP

This package provides an XMTP content type to support sending transactions to a wallet for execution.

Currently, this content type is supported in the Browser, Node, and React Native SDKs only.

For an example of an agent that implements the transaction content type, see xmtp-transactions.

Install the package

Bash
# npm
npm i @xmtp/content-type-wallet-send-calls
 
# yarn
yarn add @xmtp/content-type-wallet-send-calls
 
# pnpm
pnpm i @xmtp/content-type-wallet-send-calls

Create a transaction request

With XMTP, a transaction request is represented using wallet_sendCalls with additional metadata for display.

TypeScript
const walletSendCalls: WalletSendCallsParams = {
  version: "1.0",
  from: "0x123...abc",
  chainId: "0x2105",
  calls: [
    {
      to: "0x456...def",
      value: "0x5AF3107A4000",
      metadata: {
        description: "Send 0.0001 ETH on base to 0x456...def",
        transactionType: "transfer",
        currency: "ETH",
        amount: 100000000000000,
        decimals: 18,
        toAddress: "0x456...def",
      },
    },
    {
      to: "0x789...cba",
      data: "0xdead...beef",
      metadata: {
        description: "Lend 10 USDC on base with Morpho @ 8.5% APY",
        transactionType: "lend",
        currency: "USDC",
        amount: 10000000,
        decimals: 6,
        platform: "morpho",
        apy: "8.5",
      },
    },
  ],
};

Send a transaction request

Once you have a transaction reference, you can send it as part of your conversation:

TypeScript
await conversation.messages.send(walletSendCalls, {
  contentType: ContentTypeWalletSendCalls,
});

Receive a transaction request

To receive and process a transaction request:

TypeScript
// Assume `loadLastMessage` is a thing you have
const message: DecodedMessage = await loadLastMessage();
 
if (!message.contentType.sameAs(ContentTypeWalletSendCalls)) {
  // Handle non-transaction request message
  return;
}
 
const walletSendCalls: WalletSendCallsParams = message.content;
// Process the transaction request here