Skip to content

Transfer NFTs

Transferring an NFT sends the entire charm, unchanged, to a new output. This is a simple transfer, so it needs no app binary or contract proof — just asset preservation.

{
"version": 15,
"tx": {
"ins": ["<source_txid>:<vout>"],
"outs": [{ "0": { "ticker": "CHARMIX", "name": "Panoramix #1" } }],
"coins": [{ "amount": 1000, "dest": "<destination_hex>" }]
},
"app_public_inputs": { "n/<app_id>/<app_vk>": null }
}
FieldMeaning
version15.
app_public_inputsThe NFT app(s) involved; null for a simple transfer.
tx.insSource UTXO(s) (txid:vout).
tx.outsDestination charms, keyed by app index ("0", "1", …).
tx.coinsNative outputs (amount, hex dest from charms util dest).

The NFT content fields (ticker, name, description, image, image_hash, url, …) follow CHIP-0420. To send multiple NFTs, add their apps to app_public_inputs, their inputs to tx.ins, and the NFTs to tx.outs.

  1. Read the NFT’s content from the source UTXO (Display charms).
  2. Build the spell tx and app_public_inputs (Spell structure).
  3. Derive coins[].dest from the destination address with charms util dest --addr <address>.
  4. Prove by calling the Prover API.
  5. Sign and broadcast the returned transaction.