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