This guide will walk you through the process of transferring NFTs from your wallet using the Crossmint transactions API.

Prerequisites

Ensure you have a wallet created. You can follow the Quickstart for server wallets to prepare one. You will need:

  • API Key: Ensure you have an API key with the scope: wallets:transactions.create
  • Wallet Address: The locator of the wallet you want to transfer the NFT from.
  • NFT Details: The contract address and token ID of the NFT you want to transfer.

Sending the Transaction

We will use the Create Transaction API.

First, we need to prepare the transaction data that will encode the transferFrom function call for the NFT contract:

import { encodeFunctionData } from 'viem';

const fromAddress = '0x...'; // Your wallet address
const toAddress = '0x...';   // Recipient address
const tokenId = '1';         // The NFT token ID

// Encode the transfer function data
const data = encodeFunctionData({
    abi: [{
        name: 'transferFrom',
        type: 'function',
        inputs: [
            { name: 'from', type: 'address' },
            { name: 'to', type: 'address' },
            { name: 'tokenId', type: 'uint256' }
        ],
        outputs: [],
        stateMutability: 'nonpayable'
    }],
    args: [fromAddress, toAddress, tokenId]
});
console.log(data);
// > 0x23b872dd0000000000000000000000000000000000000000000000000000000000000001

Now we can create the transaction using the encoded data:

const walletLocator = '0x...';
const apiKey = 'sk_staging...';
const signerAddress = '0x...';

async function sendTransaction() {
    const response = await fetch(
        `https://api.crossmint.com/2022-06-09/wallets/${walletLocator}/transactions`,
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-API-KEY': apiKey,
            },
            body: JSON.stringify({
                params: {
                    calls: [{
                        to: nftContractAddress,
                        value: '0',
                        data: data
                    }],
                    chain: 'polygon-amoy',
                },
            }),
        }
    );

    return await response.json();
}