Plugins

Transfer Delegate Plugin

Last updated January 31, 2026

The Transfer Delegate Plugin allows a designated authority to transfer Core Assets on behalf of the owner. Essential for escrowless marketplace sales, game mechanics, and subscription services.

What You'll Learn

  • Add the Transfer Delegate plugin to an Asset
  • Delegate transfer authority to a marketplace or program
  • Execute transfers as a delegate
  • Authority behavior on transfer

Summary

The Transfer Delegate is an Owner Managed plugin that allows a delegate to transfer an Asset. Once delegated, the authority can transfer the Asset to any address without owner approval.

  • Enable escrowless marketplace listings
  • Authority is revoked after transfer (one-time use)
  • Use Permanent Transfer Delegate for persistent authority
  • No additional arguments required

Out of Scope

Permanent transfer authority (see Permanent Transfer Delegate), collection-level transfers, and Token Metadata transfer authority (different system).

Quick Start

Jump to: Add Plugin · Delegate Authority · Transfer as Delegate

  1. Add the Transfer Delegate plugin with the delegate address
  2. The delegate can now transfer the Asset once
  3. After transfer, the authority is automatically revoked

Overview

The Transfer Delegate Plugin is a Owner Managed plugin that allows the authority of the Transfer Delegate Plugin to transfer the Asset at any time. The Transfer Plugin will work in areas such as:

  • Escrowless sale of the Asset: Transfer NFTs directly to buyers without needing an escrow account
  • Gaming scenario where the user swaps/loses their asset based on an event: Automatically transfer assets when game events occur
  • Subscription services: Transfer NFTs as part of a subscription service

When to Use Transfer vs Permanent Transfer Delegate

Use CaseTransfer DelegatePermanent Transfer Delegate
Marketplace listings✅ Best choice❌ Too risky
One-time transfers✅ Best choice❌ Overkill
Rental returns❌ Single use✅ Best choice
Game asset swaps✅ Best choice✅ Also works
Authority persists on transfer❌ Revokes✅ Persists
Choose Transfer Delegate for one-time escrowless sales (authority revokes after transfer).
Choose Permanent Transfer Delegate when authority must persist forever.

Warning!

The transfer delegate authority is temporary and will be reset upon asset transfer.

Works With

MPL Core Asset
MPL Core Collection

Arguments

The Transfer Plugin doesn't contain any arguments to pass in.

Functions

Add Transfer Delegate Plugin to an Asset

The addPlugin command adds the Transfer Delegate Plugin to an Asset. This plugin allows a delegate to transfer the Asset at any time.

Adding a Transfer Plugin to an MPL Core Asset

import { publicKey } from '@metaplex-foundation/umi'
import { addPlugin } from '@metaplex-foundation/mpl-core'
const assetAddress = publicKey('11111111111111111111111111111111')
const delegate = publicKey('22222222222222222222222222222222')
await addPlugin(umi, {
asset: assetAddress,
plugin: {
type: 'TransferDelegate',
authority: { type: 'Address', address: delegate },
},
}).sendAndConfirm(umi)

Delegate the Transfer Authority

The approvePluginAuthority command delegates the transfer authority to a different address. This allows another address to transfer the Asset while maintaining ownership.

Delegate the Transfer Authority

import { publicKey } from '@metaplex-foundation/umi'
import { approvePluginAuthority } from '@metaplex-foundation/mpl-core'
const asset = publicKey("11111111111111111111111111111111");
const collection = publicKey("22222222222222222222222222222222");
const delegateAddress = publicKey("33333333333333333333333333333333");
await approvePluginAuthority(umi, {
asset: asset,
collection: collection,
plugin: { type: "TransferDelegate" },
newAuthority: { type: "Address", address: delegateAddress },
}).sendAndConfirm(umi);

Transferring an Asset As Delegate

The transfer instruction transfers an Asset to another address using the transfer delegate authority.

Transfer an MPL Core Asset

import {
fetchAsset,
fetchCollection,
transfer,
} from "@metaplex-foundation/mpl-core";
import { publicKey } from "@metaplex-foundation/umi";
// Asset ID you wish to transfer
const assetId = publicKey("11111111111111111111111111111111");
// Fetch the Asset
const assetItem = await fetchAsset(umi, assetId);
// Fetch collection if Asset is apart of collection
const collectionItem =
assetItem.updateAuthority.type == "Collection" &&
assetItem.updateAuthority.address
? await fetchCollection(umi, assetItem.updateAuthority.address)
: undefined;
// Transfer the Core NFT Asset
const { signature } = await transfer(umi, {
asset: assetItem,
newOwner: publicKey("22222222222222222222222222222222"),
collection: collectionItem,
})
.sendAndConfirm(umi);

Updating Transfer Delegate Authority

Since the Transfer Delegate plugin doesn't contain plugin data to update (it's an empty object {}), the main "update" operation is changing the plugin authority. This allows you to delegate transfer permissions to different addresses.

Changing the Transfer Delegate Authority

You can change who has transfer authority using the approvePluginAuthority function:

Update Transfer Delegate Authority

import { publicKey } from '@metaplex-foundation/umi'
import { approvePluginAuthority } from '@metaplex-foundation/mpl-core'
(async () => {
const assetAddress = publicKey('11111111111111111111111111111111')
const newDelegate = publicKey('44444444444444444444444444444444')
// Change the transfer delegate to a new address
await approvePluginAuthority(umi, {
asset: assetAddress,
plugin: { type: 'TransferDelegate' },
newAuthority: { type: 'Address', address: newDelegate },
}).sendAndConfirm(umi)
})();

Revoking Transfer Delegate Authority

The transfer authority can be revoked using the revokePluginAuthority function, returning transfer control to the asset owner.

Revoke Transfer Delegate Authority

import { publicKey } from '@metaplex-foundation/umi'
import { revokePluginAuthority } from '@metaplex-foundation/mpl-core'
const assetAddress = publicKey('11111111111111111111111111111111')
await revokePluginAuthority(umi, {
asset: assetAddress,
plugin: { type: 'TransferDelegate' },
}).sendAndConfirm(umi)

Common Errors

Authority mismatch

Only the transfer delegate authority can transfer the Asset. Verify you're signing with the correct keypair.

Asset is frozen

Frozen Assets cannot be transferred. The freeze authority must thaw the Asset first.

Transfer delegate not found

The Asset doesn't have a Transfer Delegate plugin or authority was already revoked after a previous transfer.

Notes

  • Owner Managed: requires owner signature to add
  • Authority is automatically revoked after transfer
  • Each transfer requires re-delegation by the new owner
  • Frozen Assets cannot be transferred by delegates
  • Use Permanent Transfer Delegate for persistent authority

Quick Reference

Authority Lifecycle

EventAuthority Status
Plugin addedActive
Asset transferredRevoked
New owner adds pluginActive (new delegate)

Who Can Transfer?

AuthorityCan Transfer?
Asset OwnerYes (always)
Transfer DelegateYes (once)
Permanent Transfer DelegateYes (always)
Update AuthorityNo

FAQ

Why was my transfer authority revoked?

Transfer Delegate authority is automatically revoked after any transfer. This is by design for marketplace safety - the delegate can only transfer once.

How do I implement escrowless listings?

  1. Seller adds Transfer Delegate with marketplace as authority
  2. When buyer pays, marketplace transfers Asset to buyer
  3. Authority is revoked; seller can't double-list

What's the difference between Transfer Delegate and Permanent Transfer Delegate?

Transfer Delegate is revoked after one transfer. Permanent Transfer Delegate persists forever and can only be added at Asset creation.

Can I transfer a frozen Asset as a delegate?

No. Frozen Assets block all transfers including delegate transfers. Use Permanent Transfer Delegate with a Permanent Freeze Delegate for complex escrow scenarios.

Does the owner need to approve each transfer?

No. Once the Transfer Delegate is set, the delegate can transfer without owner approval. However, they can only do it once before authority is revoked.

Glossary

TermDefinition
Transfer DelegateOwner Managed plugin allowing one-time transfer authority
Owner ManagedPlugin type requiring owner signature to add
EscrowlessSelling without transferring to a holding account
Permanent Transfer DelegateIrrevocable version added at creation