YUPPIE CAPITAL // TECHNICAL DOCUMENTATION

DOCUMENT: YC/TECH/01 REFERENCE DATE: 2026-08-19 / MAINNET LIVE FORMAT: PRODUCTION REFERENCE

MAINNET OWNER GUIDE / PROTOCOL REFERENCE

YUPPIES

How to identify, fund, configure, activate, monitor, and safely transfer a Yuppie, followed by the production architecture, V1 adapter boundaries, scheduler, fees, and onchain artwork system.

DOCUMENT SCOPE

This page documents the live Robinhood Chain deployment and its owner-facing contract workflows. It is a reference, not an execution interface. Every write still requires a wallet transaction and should be simulated before signing.

YUP SWAP HOOK ACCOUNT POLICY ADAPTER
MAXIMUM COLLECTION
10,000 TOKEN IDS
REPRESENTATION
DN-404 + MIRROR NFT
ACCOUNT STANDARD
ERC-6551
SCHEDULER
UNISWAP V4 HOOK
POLICY LIMIT
ONE PER ACCOUNT
NETWORK
ROBINHOOD CHAIN
01

Start here

Yuppies combines YUP, a DN-404 fungible token, with materialized mirror NFTs. Each live NFT has one deterministic ERC-6551 account. The NFT's current owner controls that account, chooses one deterministic policy, supplies capital, and may withdraw the account's assets.

A policy never wakes itself. A qualifying YUP swap or a permissionless processTurns transaction selects an eligible account. The account asks its policy for one bounded next action. If that action is a trade, an adapter settles it and returns the output to the same Yuppie account.

Owner setup from zero to active

  1. 1
    Own a materialized Yuppie

    Confirm mirror ownership, not only a fractional or skip-NFT YUP balance. Smart wallets may need to disable skipNFT before materialization.

  2. 2
    Resolve the account

    Read accountOf(tokenId). If materializationPending(tokenId) is true, anyone may call materializeAccount(tokenId).

  3. 3
    Choose a mandate

    Select one standalone template or one Trading Universe combining fixed markets, New Issues sources, or both.

  4. 4
    Prepare markets

    For V1 fixed markets, permissionlessly register a compatible unhooked v4 pool. For New Issues, select compatible launch-source contracts and submit eligible candidates through their registry path.

  5. 5
    Create the policy

    Call the appropriate factory with the account, market, oracle, limits, and strategy parameters. Configuration is immutable; review every field before signing.

  6. 6
    Fund the account

    Use depositERC20 after approving the account, or send native currency directly. Capital belongs to the account, not to a shared vault.

  7. 7
    Authorize and activate

    From the current NFT owner, call authorizePolicy(policy), then confirm isActivationReady() and canExecute(). Use refreshActiveSet() after direct balance changes.

  8. 8
    Trigger turns

    Wait for organic YUP heartbeats or call processTurns(maxTurns). New Issues entries deliberately require several separated turns.

  9. 9
    Monitor or stop

    Watch policy, adapter, and account events. To stop new actions, call deauthorizePolicy(); then withdraw assets you intend to keep.

TRANSFER WARNING

Control follows the NFT. Before selling, transferring, or intentionally dematerializing a Yuppie, empty its ERC-6551 account. Assets left inside become controlled by the NFT's next owner, or may remain stranded until that token ID materializes again.

02

Live Robinhood Chain deployment

Production chain ID is 4663. Contract names, symbols, or links may be copied by impersonators; verify the complete address before every interaction. The addresses below were read from the live deployment on 2026-08-19.

ContractProduction addressOwner-facing purpose
YUP token0x2f70500f...60a12fDFungible token, NFT lifecycle, account lookup, skip-NFT state
Yuppie mirror0x0840D878...b48Ad5dERC-721 ownership and transfers
Account registry0x4692C0E2...1A058741Deterministic ERC-6551 account derivation and deployment
Policy catalog0xeCc04aD0...867E3DE3Policy bindings, factories, execution delegates, adapters, and oracles
Trading Universe factory0xa67e058b...eb60bb0Owner-defined composite fixed-market and New Issues mandates
Grid / inventory factory0xa2a933cc...20ac0936Standalone fixed-market templates
Portfolio factory0xad45ddb6...46ce5061Standalone portfolio rebalance template
New Issues factory0xd8641131...ea17db33Standalone New Issues policy creation
V1 general-market adapter0x843C017E...Da422252Permissionlessly registered unhooked Uniswap v4 ERC-20 pairs
New Issues launchpad adapter0x600b83bb...b8bfc12fPools, Pons, Flap, and Sushi launch execution
Verified launch registry0x577Da405...d124d2d0Venue provenance and live launch records
Global candidate registry0xa24421f1...86a66ef0Bounded standalone New Issues candidate ring
Yuppie hook0x6609c879...d2c0c0ccYUP fees, TWAP observations, queues, and permissionless turns
Hook TWAP oracle0x4e24de70...82553cc8Live YUP/WETH rolling reference price

Current heartbeat fees

2% buy and 3% sell. The registrar may lower either rate to zero or restore it only up to those caps.

Adapter status

Both V1 adapters are deployed and approved. Registration or approval does not itself create a policy, fund an account, or cause a trade.

Artwork status

The live art store is currently unfrozen. The renderer may be replaced until a future irreversible freeze.

03

Architecture and component roles

TRANSACTION SOURCEROUTER / AGGREGATOR / SPONSOR
SCHEDULING + FEESYUPPIE HOOK
ASSET CUSTODYERC-6551 ACCOUNT
DECISIONOWNER-AUTHORIZED POLICY
SETTLEMENTAPPROVED ADAPTER + ACTION MARKET
ComponentRoleDoes not control
Yuppies / YuppieMirrorDN-404 supply, mirror lifecycle, account recognition, metadata entry pointPolicy decisions
YuppieAccountRegistryCanonical deterministic account derivation and deploymentAccount assets
YuppieAccountAsset custody, epoch state, policy authorization, approvals, withdrawalsScheduler order
YuppiePolicyCatalogFactory provenance, policy binding, adapter and oracle approval, revocationAccount ownership
Policy contractsImmutable configuration and deterministic action selectionAssets outside the bound account
Swap adaptersValidated market settlement and minimum-output enforcementPolicy selection
YuppieHookHeartbeat pools, account queues, turn processing, fee accountingPolicy parameters or account capital
Art store / rendererOnchain layer data, SVG composition, token metadataTrading state
04

DN-404 token and NFT lifecycle

The fungible component uses 18 decimals and a maximum supply corresponding to 10,000 whole units. The mirror exposes numbered NFT ownership. Whole-unit balance changes materialize or dematerialize mirror representations through DN-404 lifecycle rules.

  1. 1
    Materialization

    A whole-unit crossing assigns a mirror token ID and prepares its canonical account.

  2. 2
    Transfer

    Mirror transfer changes current account control without moving account contents.

  3. 3
    Dematerialization

    A fungible tail burn removes the mirror representation. The account and its contents remain at the deterministic address.

  4. 4
    ID reuse

    The token ID enters the burned-ID pool and remains eligible for rematerialization under a new ownership epoch.

protectYuppie(protectedId, sacrificialId) allows an owner with multiple materialized IDs to choose which owned ID is moved to the burn tail. The operation requires a distinct sacrificial ID owned by the same caller.

skipNFT and missing mirror NFTs

DN-404 supports skipNFT for exchanges, contracts, and wallets that want fungible YUP without mirror NFTs. Read getSkipNFT(holder) on the YUP contract. A wallet that wants materialized NFTs may call the inherited setSkipNFT(false) from that same address before acquiring whole units. Some smart wallets default to skip-NFT behavior. Disabling the flag does not identify a particular desired token ID; DN-404 assignment follows the balance lifecycle.

NOT LOST YUP

A whole YUP balance without a mirror usually indicates skip-NFT state or pending lifecycle work. The fungible balance remains in the holder address. Never send a private key or seed phrase to support.

Recursive ownership

A canonical Yuppie account holds YUP. Whole-unit YUP crossings inside that account materialize child Yuppies owned by the parent account. Parent and child accounts retain separate balances, policies, epochs, and scheduler membership. A selected parent turn does not recursively execute a child turn.

05

Token-bound accounts, funding, and withdrawals

Each token ID maps to one deterministic ERC-6551 account using the configured registry, implementation, chain ID, mirror address, and token ID. The account's current owner is derived from current mirror ownership.

Supported custody

  • Native currency
  • ERC-20 tokens
  • ERC-721 tokens
  • ERC-1155 tokens

Owner operations

  • Authorize or remove one policy
  • Deposit ERC-20 capital
  • Withdraw supported assets
  • Perform bounded descendant-owner actions

Resolve and prepare an account

  1. 1
    Find the address

    Call YUP.accountOf(tokenId). The result is deterministic even before code is deployed there.

  2. 2
    Check lifecycle state

    Call materializationPending(tokenId). For a currently owned live ID, anyone may complete owed work with materializeAccount(tokenId).

  3. 3
    Verify control

    Read account.owner() and confirm it matches the current mirror owner before funding or authorizing a policy.

Deposit capital

Any address may fund a Yuppie. For ERC-20 capital, first approve the Yuppie account for the exact amount, then call account.depositERC20(asset, amount). The account pulls the tokens from the caller and reconciles scheduler eligibility. Native currency may be sent directly to the account; call refreshActiveSet() afterward when that balance affects activation.

account = YUP.accountOf(tokenId)
ERC20.approve(account, amount)
account.depositERC20(asset, amount)
account.refreshActiveSet()

Withdraw assets

Only the current NFT owner may use the typed withdrawal functions. The owner chooses the recipient. Deauthorize the policy first when winding down an account, then withdraw each known balance.

account.deauthorizePolicy()
account.withdrawETH(recipient, amount)
account.withdrawERC20(asset, recipient, amount)
account.withdrawERC721(collection, recipient, tokenId)
account.withdrawERC1155(collection, recipient, tokenId, amount, data)

The account is not a general arbitrary-call executor. Policy execution is restricted to the configured hook, the currently authorized catalogued policy, registered approval pairs, and approved adapter paths. ERC-6551 signer validity and ERC-1271 signature validity follow the current owner.

Descendant-owner commands use a closed command set and an ownership path capped at 64 addresses. The path verifies direct child relationships at each step. This owner-control recursion is separate from heartbeat execution.

06

Transfer, sale, and dematerialization safety

An ownership epoch is the interval during which one current mirror owner controls an account. A transfer, dematerialization, or other lifecycle transition closes the prior epoch before opening control for a new owner.

StateOn epoch transition
Authorized policyCleared
Active, deferred, and urgent membershipReconciled against current eligibility
Tracked token allowancesRevoked where the token permits reset
Account balances and NFTsRemain in the account
Policy contract storagePersists, but staged actions are checked against the current epoch

Approval pairs created through the account are recorded. If a token rejects an approval reset, transfer fails closed until the current owner acknowledges an abandoned approval entry. That entry remains queryable. Permit authority created outside this registry is outside the account's approval-pair list and requires independent allowance inspection.

Before selling or transferring the NFT

  1. 1
    Stop trading

    Call deauthorizePolicy() and confirm activePolicy() is zero.

  2. 2
    Inventory the account

    Inspect native currency, every known ERC-20, NFT, ERC-1155, child Yuppie, allowance, and abandoned-approval disclosure.

  3. 3
    Withdraw what you intend to keep

    Account contents do not move to the seller when the NFT moves.

  4. 4
    Transfer only after verification

    The buyer becomes the account controller through mirror ownership. Treat account contents as part of the sale unless removed beforehand.

HYBRID-ASSET RISK

Sending fungible YUP can dematerialize a mirror. If that ID's account still holds assets, control may be unavailable until the same ID materializes again. A single Yuppie cannot be protected from this with protectYuppie; that function requires a second owned sacrificial ID.

07

Policy creation, authorization, and activation

An account authorizes at most one policy at a time. Policy configuration is immutable for each deployed policy. A configuration change replaces the active policy with a distinct deployed instance.

Factory

Creates a configured policy and registers its binding to an account.

Catalog

Records approved factories, adapters, oracles, policy bindings, and live-policy status.

Owner

Grants authority by authorizing the registered policy on the bound account.

Factory creation alone grants no account authority. Adapters verify that their caller is an approved policy or execution delegate for the named payer account. Catalog revocation invalidates a live policy independently of account ownership.

Choose the policy surface

SurfaceUse it whenImportant boundary
Standalone Grid / Inventory / PortfolioOne fixed pair and one template are enoughAdapter and oracle must be catalog-approved
Standalone New IssuesOne launch mandate should use the global verified candidate pathLaunchpad adapter must be approved
Trading UniverseThe Yuppie should combine up to eight fixed markets and up to four New Issues modulesOwner-selected economic inputs are immutable and validated mechanically at construction

Create and activate

  1. 1
    Build the immutable configuration

    Use canonical token units, bounded input sizes, reserves, exposure, liquidity, slippage, cooldown, and strategy parameters.

  2. 2
    Call the factory

    The factory deploys the policy and registers it for exactly one account. Creating a policy does not authorize it.

  3. 3
    Authorize from the NFT owner

    Call account.authorizePolicy(policy). Authorizing a replacement clears the prior policy and tracked approvals.

  4. 4
    Meet activation capital

    Fund the configured activation asset and confirm isActivationReady(), canExecute(), and scheduler membership.

Policy state is not migrated when replacing a policy. Account assets remain in the account, but staged entries, armed actions, grid levels, and New Issues positions recorded inside the old policy do not move into the replacement.

Typical immutable controls

  • Input or position size
  • Market and asset identifiers
  • Minimum liquidity
  • Maximum price deviation
  • Cooldown duration
  • Exposure and reserve limits
  • Stop-loss thresholds
  • Take-profit thresholds
  • Trailing-stop thresholds
  • Maximum concurrent positions
08

V1 fixed-market setup

The V1 general-market adapter is an execution surface for owner-selected Uniswap v4 pools. Pool registration is permissionless; the protocol does not manually list every token. A Yuppie still trades only the immutable markets selected in its authorized policy.

What V1 accepts

RequirementV1 behavior
AssetsTwo ordered ERC-20 contract addresses; native currency is not accepted by this adapter
Uniswap versionUniswap v4 through the production PoolManager and StateView
HooksThe registered action pool must be unhooked
Pool feeMust be below the v4 fee denominator
Main YUP heartbeat poolExplicitly forbidden in V1
Registration authorityAnyone may call registerPool; registration does not authorize any Yuppie
Execution authorityOnly a policy or execution delegate bound to the payer account may swap

Register and configure a market

  1. 1
    Inspect the pool

    Confirm PoolManager, both token contracts, ordering, fee, tick spacing, hook address, initialized price, active liquidity, and trading behavior.

  2. 2
    Register the PoolKey

    Call registerPool(PoolKey) on the V1 adapter. The returned marketId is the pool ID the policy must pin.

  3. 3
    Select a reference price

    Fixed-market policies require a compatible price oracle for the same ordered asset pair. The oracle's live market must differ from the execution market.

  4. 4
    Build the policy

    Set asset units, maximum inputs, minimum reserves, maximum exposures, minimum liquidity, slippage, spot-deviation limit, cooldown, and strategy parameters.

  5. 5
    Fund and authorize

    Deposit one or both assets into the Yuppie account, authorize the policy, and verify activation before triggering turns.

marketId = GENERAL_ADAPTER.registerPool({
  currency0,
  currency1,
  fee,
  tickSpacing,
  hooks: address(0)
})

Reference price versus execution price

The adapter exposes current pool liquidity, pool fee, and a fee-adjusted spot quote. The policy compares that live execution market with its configured reference oracle. Spot may suppress a trade; it does not replace the reference price. The deployed Hook TWAP oracle currently prices YUP/WETH from the main YUP pool. Arbitrary pairs require their own compatible price source.

V1 BOUNDARY

V1 rejects all hooked action pools, including the main YUP pool. This is an adapter limitation, not a permanent limit of the YUP token or Yuppie accounts. A future adapter can support compatible hooked pools and new policies without redeploying YUP, the mirror, or existing ERC-6551 accounts.

09

Heartbeat and sponsored scheduling

Organic heartbeat

A nonzero-fill swap through a registered hooked YUP pool is a heartbeat. Input-side fee work occurs in beforeSwap. Account selection occurs in afterSwap, after the realized balance delta is known. Each organic heartbeat evaluates at most one account.

The active queue is account-anchored and round-robin. The hook checks lifecycle, current policy binding, catalog status, and policy-reported capital eligibility. If the transaction lacks the gas required for both the bounded account frame and post-swap settlement reserve, optional account work is skipped and the cursor remains anchored.

Permissionless sponsored turns

processTurns(maxTurns) and processUrgentTurns(maxTurns) allow an external transaction sender to pay gas for bounded queue progress. The caller supplies only an inspection count from 1 through 32 and cannot select an account, asset, action, policy, or parameter.

HOOK.processTurns(8)
HOOK.processUrgentTurns(8)
QueuePurposeCursor effect
ActiveNormal discovery, management, and allowance-free workAdvances normal round-robin order
DeferredActions that require the full approval-bearing execution frameServiced before normal work by processTurns
UrgentPolicies reporting an already armed exitIndependent round-robin cursor; does not advance normal order

A sponsored call inspects at most one initial queue lap, processes an account at most once per block across sponsored lanes, and stops when its request, queue, or gas bound is reached. Processing occurs inside PoolManager.unlock so approved unhooked v4 action markets remain available.

The transaction sender pays gas and receives no protocol reimbursement. Calling either function does not guarantee a swap: the selected policy may observe, prepare, arm, hold, decline, or discover that its capital or market conditions are no longer valid. The caller advances the deterministic scheduler; the caller does not control its result.

Confirm scheduler membership

Read account.canExecute(), account.activePolicy(), and the hook's active, deferred, and urgent queue views. If an eligible funded account is missing after a direct transfer, call account.refreshActiveSet(). Do not repeatedly sponsor turns for an account that is not activation-ready.

10

Execution path and gas boundaries

A selected account asks its policy for one deterministic next action. For an approval-bearing execution, the account grants an exact temporary allowance to the approved spender, invokes the policy, and attempts to reset the allowance. A selected turn performs at most one policy action and at most one swap.

BoundaryOrganic fast pathSponsored full path
Hook to account1,200,000 gas16,000,000 gas
Isolated account frame1,050,000 gas14,000,000 gas
Policy stipend850,000 gas12,000,000 gas
Approval request60,000 gas
Sponsored request—32 inspections maximum

The organic fast path defers a valid nonzero approval request before granting an allowance. The account then joins the deferred queue for a full sponsored frame. These values are execution caps and reserves, not the amount consumed by every turn.

Trade authorization

Fixed-market policies derive minimum output from an independent reference price, configured asset units, fee, and slippage bounds. StateView spot data serves as a suppression check when the action market deviates from reference or does not satisfy the bound. The adapter enforces minimum output during settlement. The V1 general-market adapter excludes the heartbeat pool and every other hooked action pool.

Outcomes

A declined evaluation does not attempt a trade and does not increment the policy failure count. Three consecutive attempted-policy failures deauthorize the policy and remove the account from active scheduling.

What to monitor

Account state

  • activePolicy
  • currentEpoch
  • canExecute
  • fullExecutionPending
  • balances and tracked approvals

Execution events

  • UniverseTurn
  • NewIssuesTurn
  • V4SwapExecuted
  • LaunchpadSwapExecuted
  • policy authorization and failure events
11

Policy templates

01

GridTradingPolicy

Evaluates a fixed market against configured grid levels and bounded quote conditions.

02

InventoryMarketMakingPolicy

Evaluates a fixed market against configured inventory targets and execution limits.

03

PortfolioRebalancePolicy

Evaluates a two-asset portfolio and requests at most one exact-input single-hop rebalance fill when configured thresholds are met.

04

NewIssuesPolicy

Evaluates factory-proven launch candidates and manages up to two concurrent positions through a multi-turn state machine.

Trading Universe contracts compose bounded fixed-market configuration and isolated New Issues modules. Standalone templates require catalog-approved venues. The Trading Universe factory validates owner-selected inputs at construction and registers its modules as execution delegates for the bound account.

Grid, inventory, and portfolio templates accept a cooldown from zero through 30 days. Only a successful fill starts the cooldown. A zero value disables cooldown throttling.

12

New Issues setup and state machine

New Issues does not require an owner to preselect individual tokens. The owner selects one or more compatible launch-source contracts and immutable risk rules. Eligible token addresses are then submitted into a bounded candidate ring. The policy scans that ring over later turns and independently decides whether to observe, enter, manage, or discard each candidate.

Factory source, candidate registry, and adapter are different roles

ComponentWhat it proves or doesWho chooses or calls it
Launch sourceImplements launchpadTokenInfo(token) and reports market ID, creator, launch time, and live/graduated stateSelected by the owner when creating a Trading Universe mandate
Candidate registryStores a bounded sequence of source-proven token candidatesCandidate insertion is permissionless after source validation
Verified launch registryRevalidates production Pools, Pons, Flap, and Sushi venue factsThe standard live source; its initial launch record also requires the configured attestor signature
Launchpad adapterQuotes, checks liquidity, and settles WETH-normalized entries and exits across supported venuesCalled only by an authorized policy or registered execution delegate
Yuppie policyApplies age, liquidity, observation, creator, capital, exposure, stop, and profit rulesRuns when the scheduler selects the account
DISCOVERY BOUNDARY

The EVM cannot enumerate historical factory events by itself. A caller must submit each token address to the candidate path. That caller cannot force a purchase, choose trade size, change policy parameters, or bypass source and market checks.

Configure a New Issues mandate

  1. 1
    Select compatible sources

    A raw factory address works only if it exposes the required ILaunchpadFactoryRecords interface. Otherwise select a compatible source or registry that represents the factory.

  2. 2
    Set risk limits

    Choose quote asset, per-entry size, minimum quote reserve, maximum exposure, maximum positions, age window, liquidity floor, slippage, observation window, cooldown, stop loss, take profit, trailing stop, creator-balance response, and lifetime entries.

  3. 3
    Create the module or policy

    The Trading Universe factory creates an isolated source registry and candidate ring for each mandate. Up to four modules are allowed, with up to eight sources per module.

  4. 4
    Register an eligible launch

    For the standard live source, first register its signed and venue-verified launch record. Then permissionlessly call LaunchpadSwapAdapter.registerMarket(marketId) and submit the token to the applicable candidate registry.

  5. 5
    Fund and trigger

    Fund the configured quote asset, authorize the parent policy, and advance turns. Candidate submission alone never trades.

// Per-Trading-Universe candidate path
launchRegistry.registerCandidate(sourceIndex, token)

// Standard execution-market cache, after verified provenance
LAUNCHPAD_ADAPTER.registerMarket(marketId)

Candidate checks include provenance, launch age, market status, liquidity, price movement, creator identity, creator balance, denylist state, account capital, and position limits. The policy holds at most two positions per New Issues module.

TURN 1OBSERVErecord candidate and market state
TURN 2PREPARErevalidate candidate provenance
TURN 3COMMITconfirm separated observation
TURN 4ARMstore exact bounded intent
TURN 5TRADErequest approval and call adapter

Setup turns request no allowance. Entry stages are separated across turns and blocks. This prevents one transaction or one-block observation from completing the full entry path. It does not create an independent fair-value oracle; market conditions sustained across the full observation interval satisfy the configured checks.

Position management evaluates take profit, stop loss, trailing stop, maximum age, and a persistent reduction in creator token balance. Exits also use confirmation, arming, and execution on a subsequent selected turn. Only an already armed exit qualifies for the urgent queue; an armed entry does not.

13

Hook fees and mirror royalties

The live heartbeat rate is 200 basis points on buys and 300 basis points on sells. The immutable registrar may lower either rate independently to zero and later restore it, but may never raise it above the 200 / 300 basis-point launch caps. Read feeRates() for the current value before quoting. The fee currency is the non-YUP counter asset.

DirectionModeCallbackAccounting
BuyExact inputbeforeSwap2% of gross named counter input
BuyExact outputafterSwap2% grossed up over computed counter input
SellExact inputafterSwap3% deducted from gross counter output
SellExact outputbeforeSwap3% grossed up over named counter output

For orientations charged before execution, the hook compares the realized fill with the charged fee basis and rejects a partial fill rather than repricing the fee after the swap. Native and ERC-20 counter assets use PoolManager claim accounting. Claims accrue to the hook and are withdrawn separately by the immutable fee recipient.

These fees apply to registered hooked YUP heartbeat pools. They do not apply to V1 general-market action pools, which are unhooked. A nested policy swap through a future hooked action market would follow that market's configured hook rules.

The mirror reports a 500-basis-point ERC-2981 royalty in the marketplace-reported sale currency. ERC-2981 communicates royalty information; collection and enforcement are external to the contracts. Hook fees and mirror royalties are separate mechanisms.

14

Artwork, metadata, and provenance

The collection contains 10,000 canonical token IDs. Artwork is composed on a 24 by 24 indexed grid using a shared 84-color palette and enlarged with nearest-neighbor scaling to 3000 by 3000 pixels. Build outputs include PNG, SVG, and JSON representations.

Compiler

Deterministic allocation, layer constraints, exact trait quotas, duplicate checks, output hashes, and provenance records.

Onchain renderer

Indexed-palette run-length data in SSTORE2 blobs, token assignments, metadata fragments, SVG reconstruction, and base64 JSON output.

Renderer output depends on token ID and the configured art store. Account balance, policy state, execution history, and ownership epoch do not alter the artwork. A digest-confirmed art-store freeze seals the renderer pointer for the configured store.

LIVE UPGRADE STATE

The production art store is currently unfrozen. The token owner may select a replacement renderer whose store is valid while the current store remains unfrozen. Freezing is irreversible and permanently seals the active renderer path.

15

Trust, failure, and operational boundaries

BoundarySource behavior
Account authorityDerived from current mirror ownership and epoch validity
Policy authorityRequires current owner authorization and catalog binding
Market authorityStandalone factories require catalog-approved venues; Trading Universe owners select immutable economic inputs that are mechanically validated
Call scopeBounded gas frames, one policy action, and at most one swap per selected turn
ReentrancyAccount execution lock and non-recursive hook scheduling during nested policy swaps
Allowance scopeExact tracked approvals with reset attempts and explicit abandoned-entry disclosure
Failure containmentDeclines separated from attempted failures; three consecutive failures remove the policy
LivenessDepends on organic registered-pool swaps or externally submitted sponsored transactions

A token-bound account cannot originate an EVM transaction. The sender of an organic swap or sponsored processing transaction pays gas. The contracts provide no gas reimbursement. Oracle availability, stale data, liquidity, price deviation, catalog state, capital, ownership, and scheduler membership are independent conditions.

Third-party dependencies include Robinhood Chain execution, Uniswap v4 components, the canonical ERC-6551 registry, token contracts, price feeds, launch venues, routers, and marketplaces. The source contains validation and bounded-failure paths, but those dependencies remain separate systems.

Owner-selected does not mean risk-free

Permissionless pool or candidate registration is not project endorsement. A malicious token, hook, oracle, source, router, or shallow pool may revert, misprice, tax, blacklist, or otherwise produce economic loss. V1 limits each account action with immutable policy bounds, exact temporary allowance, minimum output, payer binding, one-swap execution, and failure isolation. Those controls reduce authority; they do not prove an asset is valuable or safe.

V1 versus future adapters

The current general-market adapter is immutable and accepts only unhooked v4 ERC-20 pools. It can coexist with later adapters. The catalog owner may approve a new adapter for standalone templates, and owners may create replacement policies that reference it. Existing YUP, mirror NFTs, accounts, balances, and unrelated policies do not need migration.

16

Selected interface reference

Signatures below identify primary read and control surfaces. They are not a complete ABI.

Token and lifecycle

accountOf(uint256 tokenId) → address
prepareAccount(uint256 tokenId) → address
materializeAccount(uint256 tokenId) → address
materializationPending(uint256 tokenId) → bool
getSkipNFT(address holder) → bool
setSkipNFT(bool state)
materializedSupply() → uint256
unmaterializedSupply() → uint256
protectYuppie(uint256 protectedId, uint256 sacrificialId)

Account

owner() → address
token() → (uint256 chainId, address tokenContract, uint256 tokenId)
authorizePolicy(address policy)
deauthorizePolicy()
activePolicy() → address
isActivationReady() → bool
canExecute() → bool
hasUrgentExit() → bool
hasDeferredExecution() → bool
refreshActiveSet()
depositERC20(address asset, uint256 amount)
withdrawETH(address recipient, uint256 amount)
withdrawERC20(address asset, address recipient, uint256 amount)

V1 general-market adapter

registerPool(PoolKey poolKey) → bytes32 marketId
poolKey(bytes32 marketId) → PoolKey
liquidity(bytes32 marketId, address asset0, address asset1) → uint256
swapFeePips(bytes32 marketId) → uint256
spotQuoteExactInput(bytes32 marketId, address assetIn, address assetOut, uint256 amountIn) → uint256

New Issues registration

VerifiedLaunchpadRegistry.registerLaunch(attestation, signature) → bytes32 marketId
LaunchpadSwapAdapter.registerMarket(bytes32 marketId)
LaunchpadCandidateRegistry.registerCandidate(address token) → uint256 sequence
TradingUniverseLaunchRegistry.registerCandidate(uint256 sourceIndex, address token) → uint256 sequence

Policy factories

createGrid(GridTradingPolicy.Config config) → address policy
createInventoryMarketMaking(InventoryMarketMakingPolicy.Config config) → address policy
create(PortfolioRebalancePolicy.Config config) → address policy
create(NewIssuesPolicyV2.Config config) → address policy
create(TradingUniversePolicy.Config config, NewIssuesMandateConfig[] mandates) → address policy

Scheduler and fees

activeCount() → uint256
urgentCount() → uint256
deferredCount() → uint256
nextActiveAccount() → address
nextUrgentAccount() → address
nextDeferredAccount() → address
processTurns(uint256 maxTurns) → (uint256 inspected, uint256 evaluated)
processUrgentTurns(uint256 maxTurns) → (uint256 inspected, uint256 evaluated)
feeRates() → (uint16 buyFeeBps, uint16 sellFeeBps)
feeClaimBalance(Currency currency) → uint256
withdrawFees(Currency currency) → uint256

Function signatures are orientation aids, not transaction recipes. Struct layouts, access control, approvals, canonical units, and constructor validation must be read from the exact deployed ABI before encoding a write.

17

Glossary

YUP
The fungible DN-404 component.
Yuppie
A collection character, mirror NFT, or associated token ID depending on context.
Materialization
Assignment of a mirror NFT when a whole-unit balance condition is crossed.
Token-bound account
The deterministic ERC-6551 account associated with one token ID.
Epoch
The period during which one current mirror owner controls an account.
Policy
An immutable, catalogued contract authorized to choose bounded account actions.
Heartbeat
A nonzero-fill swap through a registered YUP pool that schedules at most one account.
Sponsored turn
A permissionless transaction that pays gas to process bounded scheduler work.
Deferred queue
Accounts awaiting a full execution frame for an approval-bearing action.
Urgent queue
Accounts whose current policy reports an already armed exit.
Action market
The pool or venue an adapter uses for execution. The V1 general-market adapter accepts unhooked v4 ERC-20 pools.
Launch source
An owner-selected contract implementing launchpadTokenInfo(token) for New Issues provenance and live-state reads.
Candidate
A token address submitted to a bounded New Issues ring after its selected source returns a valid launch record.
Decline
A policy evaluation that requests no trade because configured conditions are not met.
Failure
An attempted policy execution that does not complete and counts toward shutdown under the scheduler's failure classification.