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
- Add the Transfer Delegate plugin with the delegate address
- The delegate can now transfer the Asset once
- 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 Case | Transfer Delegate | Permanent 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
| Event | Authority Status |
|---|---|
| Plugin added | Active |
| Asset transferred | Revoked |
| New owner adds plugin | Active (new delegate) |
Who Can Transfer?
| Authority | Can Transfer? |
|---|---|
| Asset Owner | Yes (always) |
| Transfer Delegate | Yes (once) |
| Permanent Transfer Delegate | Yes (always) |
| Update Authority | No |
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?
- Seller adds Transfer Delegate with marketplace as authority
- When buyer pays, marketplace transfers Asset to buyer
- 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.
Related Plugins
- Permanent Transfer Delegate - Irrevocable transfer authority
- Freeze Delegate - Block transfers temporarily
- Burn Delegate - Allow delegate to burn Assets
Glossary
| Term | Definition |
|---|---|
| Transfer Delegate | Owner Managed plugin allowing one-time transfer authority |
| Owner Managed | Plugin type requiring owner signature to add |
| Escrowless | Selling without transferring to a holding account |
| Permanent Transfer Delegate | Irrevocable version added at creation |
