# Metaplex agents and fair-launch curves

The fair-launch workspace can inspect a registered Metaplex Core agent without a wallet, display its confirmed owner and canonical token, and export an owner-checked association draft for a custom curve. A custom draft performs no mint, permanent registry binding, service call or delegation. The existing Genesis launch workspace remains the executable route for an agent-associated Genesis curve, subject to its own wallet review, provider availability, funding and transaction confirmation.

This guide covers the ten pasted Metaplex references supplied with the parallel fair-launch workspace. Their exact local bytes, attachment IDs, update labels and installed package versions are recorded in `agent-doc-inputs.json` (`audit/fairlaunch-2026-10-11/agent-doc-inputs.json`). A pasted guide is an implementation reference, not evidence that a service is available or that a transaction executed.

## Identity, token and authority

Four addresses have distinct roles:

| Address | Verified role | Relevant authority |
| --- | --- | --- |
| Agent Core asset | MPL Core account, including its current owner and AgentIdentity registration URI | Current Core owner; some Core operations have separate update authority |
| Agent Identity PDA | Derived from `['agent_identity', coreAsset]` under `1DREGFgysWYxLnRnKQnwrxnJQeSMk2HmGaC6whw2B2p` | Registry program; V1 and V2 require different decoders |
| Asset Signer PDA | Derived from `['mpl-core-execute', coreAsset]` under MPL Core | Core Execute lifecycle; the PDA has no private key |
| Fungible token mint | A separate token account address; an agent Core asset address is not this mint | Mint and launch program rules; canonical association requires the Genesis path |

The Core asset's NFT metadata URI and its AgentIdentity registration URI are separate fields. An off-chain registration document may advertise services, trust mechanisms and payment support. Those declarations cannot establish on-chain ownership, execution authority, delivered service or authorized payment. See [Mint an Agent](https://www.metaplex.com/docs/agents/mint-agent) and [Read Agent Data](https://www.metaplex.com/docs/agents/read-agent-data).

The new `agent-fairlaunch.ts` (`web-react/src/lib/agent-fairlaunch.ts`) reuses `inspectGenesisAgent`, then reads the Core asset and its derived Identity PDA in one confirmed RPC account batch. It verifies both pinned program owners, rejects executable/missing accounts, requires the Core AgentIdentity plugin, checks the registry account's version, exact size and embedded Core address, and hashes both account data buffers. V1 has no canonical-token field; V2's `agentToken` is decoded from the confirmed account rather than accepted from an indexed preview. Owner changes between the existing Genesis read and the confirmed batch stop preparation.

This is a confirmed account observation with a slot and timestamp. A downloadable JSON file is editable and is not a wallet signature, durable authorization grant or transaction receipt. A future chain client must repeat authority and account checks, construct a concrete reviewed transaction and verify its result.

## Native Genesis and custom curves

| Flow | Current implementation | Binding and execution boundary |
| --- | --- | --- |
| Native Genesis agent curve | Existing `GenesisSection` and `lib/launchpad/genesis.ts`; route `/launchpad/?mode=genesis&asset=<CoreAsset>&network=mainnet` or `devnet` | Can construct, simulate and request wallet-approved real transactions. Permanent binding is optional, irreversible and disabled on devnet in this workspace. No transaction was sent as part of this integration. |
| Musebook custom curve | `programs/musebook-fairlaunch` plus its local funding, rewards and venue tests | Undeployed custom program. The agent picker exports a metadata association draft; public signing remains unavailable. |
| Supplied parallel curve | `parallel/fairlaunch/core/src/curve.rs` and the supplied launch/reference programs | Explicit supplied source profile. A declared program address is not deployment evidence. The parent page supplies the selected program/source metadata to the same agent picker. |

For native Genesis, `GenesisLaunchParams.agentMint` names the **Core asset**, despite the parameter's name. The SDK receives `agent: { mint: coreAsset, setToken }`; the newly created fungible mint is returned separately in the receipt. The picker links to the existing flow with the Core asset and network, and never substitutes a guessed token mint. [Create an Agent Token](https://www.metaplex.com/docs/agents/create-agent-token) describes this Genesis integration.

`setAgentTokenV1` cannot bind an arbitrary custom-curve mint. The installed registry builder takes a `genesisAccount`, and the [identity program processor](https://github.com/metaplex-foundation/mpl-agent/blob/main/programs/mpl-agent-identity/src/processor/set_agent_token_v1.rs) validates the Genesis account owner, account type and mint-funding mode before extracting its base mint. It requires the agent's Asset Signer authority and prevents reassignment. `buildSetAgentToken` (`web-react/src/lib/rwa-agent-kit/identity.ts`) already wraps that instruction in Core Execute. A custom launch has no qualifying Genesis account merely because it creates a bonding curve.

The custom association export contains `coreAsset`, `identityPda`, `identityVersion`, `assetSigner`, `owner`, `network`, `launchProgram`, `curveKind`, `sourceCore`, `sourceCurve`, `canonicalBinding: false`, the existing canonical token, observation time/slot and both account hashes. `sourceCore` describes the confirmed Core/Identity observation; `sourceCurve` identifies the selected local source. It records no new fungible mint. Preparation refreshes the account observation, requires the connected wallet to match the current owner, rejects observations older than 60 seconds and fails if the wallet or selection changes during the read. The existing canonical token remains unchanged.

## Reused SDK and client interfaces

Installed versions observed for this integration are registry **0.2.6**, Core **1.8.0**, Genesis **0.43.0**, Umi/default bundle **1.6.0** and Token Metadata **3.4.0**. No package was added for the agent picker. Current guide examples mentioning Genesis 1.x must be adapted to the installed types; copying a newer example does not establish compatibility.

| Existing file/function | Reuse and constraints |
| --- | --- |
| `agentMint.ts` (`web-react/src/lib/agentMint.ts`): `prepareMetaplexCardMint(spec, a2aCard?, services?)`, `submitAgentMint(prepared, wallet, isCurrent)` | Existing same-origin unsigned mint preparation, exact instruction checks, simulation/cost review and receipt storage before broadcast. Do not replace browser review with the SDK's auto-submit convenience functions. |
| `metaplex-agents.ts` (`web-react/src/lib/metaplex-agents.ts`): `listMetaplexAgents`, `prepareAgentWallet`, `submitAgentWallet` | Indexed/public discovery and separately reviewed agent funding/withdrawal. An indexed owner is not the confirmed authority used by the new draft. |
| `rwa-agent-kit/umi.ts` (`web-react/src/lib/rwa-agent-kit/umi.ts`): `createAgentUmi(rpcUrl?, env?)` | Existing Core/Identity/Tools/Token Metadata plugin setup. No duplicate SDK client package is needed. |
| `rwa-agent-kit/identity.ts` (`web-react/src/lib/rwa-agent-kit/identity.ts`): register, executive/delegate/revoke builders and `buildSetAgentToken(umi, pairing, genesisAccount, collection?)` | Existing unsigned instruction builders. Registry registration requires an existing Core asset; canonical-token binding requires an authentic Genesis account. |
| `launchpad/genesis.ts` (`web-react/src/lib/launchpad/genesis.ts`): `inspectGenesisAgent(asset, network)`, `assertGenesisAuthority`, `runGenesisLaunch`, `recoverGenesisLaunch` | Owner/funding checks, unchanged wallet-signed messages, simulation, signature journal before submission and explicit recovery of partial/uncertain batches. |
| `GenesisSection.tsx` (`web-react/src/components/launchpad/GenesisSection.tsx`) | Existing concrete launch review and permanent-binding acknowledgement. The picker routes here rather than implementing a second Genesis signer. |
| `launch-identity-document.ts` (`web-react/src/lib/launch-identity-document.ts`) | Existing content-addressed DBC market association documents already distinguish association from a Genesis canonical token. They do not authorize a custom public launch. |

Registry SDK 0.2.6 exports `mintAgent(umi, config, input)` for unsigned construction and `mintAndSubmitAgent`/`signAndSendAgentTransaction` for signing and submission. Its convenience APIs do not replace Musebook's explicit wallet review. Existing user flows retain the browser wallet and their recovery receipt.

Metadata updates also require a precise program distinction. `token-metadata.ts` (`web-react/src/lib/token-metadata.ts`) and `token-metadata-wallet.ts` (`web-react/src/lib/token-metadata-wallet.ts`) implement reviewed legacy SPL Token Metadata updates, including update-authority checks; they reject Core and Token-2022 assets. Updating a Core NFT URI uses Core `updateV1`; updating an AgentIdentity registration URI uses Core `updateExternalPluginAdapterV1` with the AgentIdentity update variant. Installed Core 1.8.0 provides these builders, but this picker implements no new Core metadata publication/update workflow and invents no registry PUT endpoint. Publishing revised JSON and approving an on-chain URI update are separate actions.

## Ten supplied guides and their application

The manifest preserves full IDs and hashes. The IDs below identify the corresponding user-provided attachment, not a downloaded current-page snapshot.

| Pasted guide / attachment ID | Source-grounded application |
| --- | --- |
| [Mint an Agent](https://www.metaplex.com/docs/agents/mint-agent) — `0047837f-26ce-4730-8c52-d0461504aa98` | Core creation plus registry identity can be atomic. Reuse unsigned mint preparation and retain separate Core metadata/registration document fields. |
| [Register an Agent](https://www.metaplex.com/docs/agents/register-agent) — `f0f8df7c-1f3e-40e7-ad09-21d05e127bc1` | Existing Core assets can register identity through `registerIdentityV1`; verify the derived record and attached plugin before accepting them as registered agents. |
| [Read Agent Data](https://www.metaplex.com/docs/agents/read-agent-data) — `9b5b8263-a89e-44fe-b0f1-bd85f5e2848f` | Separate indexed discovery from direct Core/Identity account reads. Resolve public metadata as untrusted declarations and derive the Asset Signer. |
| [Agent Finance](https://www.metaplex.com/docs/agents/agent-finance) — `8badca65-32fd-4138-a39c-14daed2860cb` | Identity, treasury and token financing are distinct primitives. Native Genesis supports its canonical association; custom fair-launch association does not inherit that capability or Genesis fee terms. |
| [Agent Commerce](https://www.metaplex.com/docs/agents/agent-commerce) — `a1df948d-9a31-4f5a-9313-27e31b070743` | `services`, `x402Support` and trust declarations are discovery data. The picker fetches only the reviewed registration document and invokes no advertised endpoint. |
| [Create an Agent Token](https://www.metaplex.com/docs/agents/create-agent-token) — `7d5e74bc-2d76-47ac-a9b7-0a7611e8364c` | Reuse native Genesis launch and its once-only canonical-token option. Check installed SDK types and preserve Core asset versus returned fungible mint. |
| [Run an Agent](https://www.metaplex.com/docs/agents/run-an-agent) — `e0b3ba28-6b4f-4709-98ad-bc178f4ece6a` | Executive registration/delegation is a separate owner-controlled transaction. Revocation blocks future registry execution but does not unwind downstream token approvals or escrow state. |
| [Nori Overview](https://www.metaplex.com/docs/agents/nori) — `e7bc46e8-f70b-4b08-8589-06986fe7af93` | Paid inference, image and RPC services require an explicit service identity/payment path. A service response and a billing receipt prove different facts. Nori was not invoked. |
| [Delegate to Nori](https://www.metaplex.com/docs/agents/nori/delegate-to-nori) — `57142d7e-1560-4bfe-ae9d-e80b5b4bfbd0` | Verify the service origin/asset/executive before owner-reviewed delegation. Sponsored fee payment does not reduce delegated spending authority. No delegation was granted. |
| [Nori Example Agents](https://www.metaplex.com/docs/agents/nori/example-agents) — `2f4aa202-ae16-4614-b3dd-2a4ad12fa81b` | HTTP and A2A examples are paid calls, including read-only RPC calls. No example request was executed merely to inspect these guides. |

## Nori and execution remain separate

The existing `NoriRuntime` (`web-react/src/components/NoriRuntime.tsx`), `nori.ts` (`web-react/src/lib/nori.ts`), `nori-chain.ts` (`web-react/src/lib/nori-chain.ts`), `nori-delegation.ts` (`web-react/src/lib/nori-delegation.ts`) and `nori-billing.ts` (`web-react/src/lib/nori-billing.ts`) provide separate review, service identity, sponsored-delegation recovery and charge inspection. The new agent picker links to documentation and does not instantiate a Nori client, discover a paid service, sign a challenge, fund an Asset Signer, grant an executive or make a paid call.

An execution delegate can cause the Asset Signer to sign instructions through Core Execute. A rate-card acknowledgement or client setting is not an on-chain spending cap. Revocation stops future executions through that delegation path; prior SPL approvals and program-specific state need their own cleanup. The [Run an Agent security/lifecycle guide](https://www.metaplex.com/docs/agents/run-an-agent) and [Nori delegation guide](https://www.metaplex.com/docs/agents/nori/delegate-to-nori) explain these authority boundaries. Service origin and operator identity must be verified independently of an arbitrary public metadata endpoint.

## Verification and remaining evidence

Run the focused client checks from `web-react`:

```sh
node --test scripts/agent-fairlaunch.test.mjs
npx tsc -p tsconfig.app.json --noEmit
```

The ten focused tests passed during this integration. They cover owner/asset/network changes between reads, fresh observation and owner gates, forged observation copies, preserved canonical mint, source profile rejection, disabled custom signing, exact Genesis Core-asset route and public metadata fetching without credentials or service invocation. The account read dependencies in these tests are controlled fixtures; these results do not establish a successful live RPC lookup, public agent ownership, signed authorization, public Genesis launch, Nori delivery or production route availability. TypeScript passed for the implemented client and component.

The `AgentFairlaunch` (`web-react/src/components/launchpad/AgentFairlaunch.tsx`) component accepts typed `curveSources` containing each actual source path, declared program ID and `undeployed-prototype` status. It is wired into `/fairlaunch/`; the completed desktop/mobile browser checks verified the public preview, invalid-agent rejection, disabled custom signing and native Genesis navigation. The wider fair-launch tests and local validator reports described in [`FAIRLAUNCH_INTEGRATION_LEDGER.md`](/research/fairlaunch/integration-ledger.md) establish separate program/accounting behavior; their local transactions are not Metaplex agent minting or canonical-binding evidence.

Custom launch signing stays unavailable until a deployed program and reviewed client are attested. Any future release must verify source/binary/interface parity, selected network and mint semantics, fresh Core owner, exact account authority, wallet review and transaction confirmation. This documentation imports no automatic payment or delegation authority from the pasted references.
