@oracle-agent/oracle 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +33 -13
  2. package/SETUP.md +59 -1
  3. package/artifacts/specialist-packs/oracle-full-crypto.json +31 -9
  4. package/bin/oracle-data-mcp.mjs +247 -4
  5. package/bin/oracle-init.mjs +100 -27
  6. package/bin/oracle-upgrade.mjs +42 -0
  7. package/docs/profiles.md +29 -7
  8. package/package.json +4 -1
  9. package/plugins/oracle-owner-gate/__init__.py +213 -0
  10. package/plugins/oracle-owner-gate/plugin.yaml +9 -0
  11. package/profiles/_template/SOUL.md +8 -1
  12. package/profiles/oracle/SOUL.md +17 -2
  13. package/profiles/oracle/profile.json +6 -2
  14. package/profiles/protocol-builder/SOUL.md +13 -6
  15. package/profiles/protocol-builder/profile.json +3 -1
  16. package/profiles/robinhood-agent/SOUL.md +9 -3
  17. package/profiles/robinhood-agent/profile.json +1 -0
  18. package/skills/balance/SKILL.md +176 -0
  19. package/skills/oracle-action-semantics/SKILL.md +40 -0
  20. package/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
  21. package/skills/oracle-multichain-token-launch/SKILL.md +300 -0
  22. package/src/action-semantics.mjs +62 -0
  23. package/src/data/catalog.mjs +27 -3
  24. package/src/data/desk-data.mjs +34 -4
  25. package/src/data/providers/magiceden-sol.mjs +21 -2
  26. package/src/data/providers/nft-gallery.mjs +163 -0
  27. package/src/data/providers/nft-portfolio.mjs +494 -0
  28. package/src/data/providers/opensea-nft.mjs +272 -0
  29. package/src/data/providers/portfolio-history.mjs +394 -0
  30. package/src/data/providers/portfolio.mjs +594 -0
  31. package/src/data/providers/satflow.mjs +1 -0
  32. package/src/exec-policy.mjs +5 -0
  33. package/src/gmx-attestation.mjs +1 -0
  34. package/src/index.mjs +9 -0
  35. package/src/profile-upgrade.mjs +277 -0
  36. package/src/scanner/chains.config.mjs +2 -0
  37. package/src/vault-attestation.mjs +1 -0
  38. package/src/cards.mjs +0 -369
@@ -34,9 +34,15 @@ that moves value.
34
34
  1. **Sell-simulation before any prepared buy.** No exception for a good story.
35
35
  2. **Never size against stale or virtual reserves.**
36
36
  3. **A fuzzy ticker match is not confirmation** — surface the CA.
37
- 4. **You do not sign.** Swaps are prepared for the user's wallet.
38
- 5. **Receipts or it didn't happen.**
39
- 6. **Floor price is not a bid.** Accept-offer fills at the bid; a listing waits
37
+ 4. **The public lane does not sign.** Ordinary swaps are prepared for the user's
38
+ wallet. The generic unattended signer remains `hl`/`poly`; a separately installed,
39
+ owner-gated EVM executor may handle one exact bounded Robinhood Chain action after
40
+ explicit `arm`. Verify that executor before claiming it is available.
41
+ 5. **Watch is alert-only.** `watch`, `watch this`, and `ping me` persist as
42
+ `active: true, actionMode: alert_only`. Only explicit `arm` can produce
43
+ `actionMode: execute`; never infer execution from a watch or legacy `status: armed`.
44
+ 6. **Receipts or it didn't happen.**
45
+ 7. **Floor price is not a bid.** Accept-offer fills at the bid; a listing waits
40
46
  for a buyer. Never conflate them.
41
47
 
42
48
  ## Voice
@@ -11,6 +11,7 @@
11
11
  },
12
12
  "skills": [
13
13
  "oracle-token-research",
14
+ "oracle-action-semantics",
14
15
  "oracle-receipts",
15
16
  "oracle-circuit-breaker",
16
17
  "oracle-best-execution",
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: balance
3
+ description: Use when the user says balance, holdings, portfolio, wallet balance, or invokes /balance. Call the deterministic read-only multichain portfolio tool and report coverage honestly.
4
+ ---
5
+
6
+ # Balance
7
+
8
+ Use `portfolio_snapshot` for every fresh balance request. It runs the deterministic
9
+ multichain balance and NFT inventory reads once, then records one compact local
10
+ observation so the user can build history without a separate tracker.
11
+
12
+ Use `portfolio_history` for balance-history requests and `portfolio_value_graph`
13
+ for charts. Use `portfolio_balance` only when the user explicitly asks for a
14
+ non-recorded read or when local history storage is unavailable.
15
+
16
+ This skill is read-only. Public addresses are identifiers, not signing rights.
17
+ Never request a private key, seed phrase, wallet export, session key, or signature.
18
+
19
+ ## Trigger
20
+
21
+ Run this workflow when the user:
22
+
23
+ - invokes `/balance`;
24
+ - says `balance` by itself;
25
+ - asks for holdings, wallet balance, portfolio, net assets, or assets across chains;
26
+ - supplies one or more public wallet addresses and asks what they hold.
27
+
28
+ ## Address routing
29
+
30
+ Parse only public addresses supplied with the request:
31
+
32
+ - `0x...` maps to `addresses.evm` and `addresses.hyperliquid` unless the user
33
+ explicitly assigns different addresses;
34
+ - a Solana base58 public key maps to `addresses.solana`;
35
+ - a Bitcoin `bc1`, `1`, or `3` address maps to `addresses.bitcoin`;
36
+ - explicit labels such as `evm:`, `solana:`, `bitcoin:`, and `hyperliquid:` win.
37
+
38
+ If no addresses are in the request, call `portfolio_snapshot` with an empty object.
39
+ The tool uses configured public-address defaults:
40
+
41
+ - `ORACLE_EVM_ADDRESS`, with legacy fallback `ORACLE_DEFAULT_ADDRESS`;
42
+ - `ORACLE_SOLANA_ADDRESS`;
43
+ - `ORACLE_BITCOIN_ADDRESS`;
44
+ - `ORACLE_HYPERLIQUID_ADDRESS`, with EVM fallback.
45
+
46
+ If every family returns `not-configured`, ask only for the missing public addresses.
47
+ Do not call a zero address a user wallet and do not report missing families as zero.
48
+
49
+ ## Mandatory call
50
+
51
+ Call `portfolio_snapshot`:
52
+
53
+ ```json
54
+ {
55
+ "addresses": {
56
+ "evm": "optional public address",
57
+ "solana": "optional public key",
58
+ "bitcoin": "optional public address",
59
+ "hyperliquid": "optional public address"
60
+ },
61
+ "includeTokens": true,
62
+ "includeCollectibles": true,
63
+ "includePrices": true,
64
+ "includeNfts": true
65
+ }
66
+ ```
67
+
68
+ Omit address fields the user did not supply. Omit `evmChainIds` unless the user
69
+ asks for a subset. The default queries every configured EVM chain. Read fungible
70
+ and chain details from `result.balance`, NFT holdings from `result.nfts`, and the
71
+ combined historical observation from `result.snapshot`.
72
+
73
+ Never call a chain write, prepare, sign, send, submit, execute, or broadcast tool
74
+ while answering a balance request. The compact profile-local history append made
75
+ by `portfolio_snapshot` is allowed and contains no keys or executable payloads.
76
+
77
+ ## Coverage contract
78
+
79
+ The current aggregator covers:
80
+
81
+ - native balances on every configured EVM chain;
82
+ - Solana SOL plus SPL Token and Token-2022 accounts;
83
+ - Bitcoin BTC plus Runes and inscriptions when an address indexer is configured;
84
+ - Hyperliquid HyperCore spot balances and perp account state;
85
+ - OpenSea-supported EVM/Solana NFT inventory and Bitcoin inscriptions where the
86
+ configured providers expose owner data;
87
+ - profile-local snapshots and an SVG known-value history graph.
88
+
89
+ It must explicitly report unsupported or unavailable surfaces:
90
+
91
+ - EVM token and NFT enumeration is unavailable without an address indexer;
92
+ - Solana token accounts are unverified until metadata confirms symbol and spam
93
+ status;
94
+ - a Solana amount of one with zero decimals is only a collectible candidate;
95
+ - Bitcoin Runes and inscriptions require an address-indexed provider;
96
+ - Cosmos requires a chain-specific bech32 address and LCD/RPC adapter;
97
+ - Sui and Aptos remain unsupported until their balance adapters are installed;
98
+ - any provider failure is `unavailable`, never a zero balance;
99
+ - NFT prices are provider estimates, not executable bids.
100
+
101
+ ## History and graph
102
+
103
+ For “balance history”, “portfolio history”, or a date range, call
104
+ `portfolio_history` with the same public addresses and the requested `since`,
105
+ `until`, and `limit`. Keep `null` values unavailable. Do not interpolate them.
106
+
107
+ For “graph”, “chart”, or “show me performance”, call `portfolio_value_graph`.
108
+ State the returned `summary.changeUsd`, `summary.changePct`, point count, and
109
+ whether any plotted snapshots were incomplete. The image plots known priced
110
+ value, not guaranteed liquidation value or net worth.
111
+
112
+ ## Response format
113
+
114
+ Start with:
115
+
116
+ ```text
117
+ Balance, <queriedAt>
118
+ Known priced value: $<knownUsd> (not a complete total)
119
+ Coverage: <ok>/<requestedSurfaces> surfaces live
120
+ ```
121
+
122
+ If `valuation.complete` is true, you may remove the parenthetical. Do not rename
123
+ `knownUsd` to `total`, `net worth`, or `portfolio value` when coverage is partial.
124
+
125
+ Then show nonzero assets first, grouped by family:
126
+
127
+ ```text
128
+ EVM
129
+ Ethereum: 0.42 ETH $...
130
+ Base: 18.1 ETH $...
131
+
132
+ Solana
133
+ SOL: ...
134
+ SPL: <mint> <amount> unverified
135
+
136
+ Bitcoin
137
+ BTC: ...
138
+ Runes: ...
139
+ Inscriptions: ...
140
+
141
+ Hyperliquid
142
+ Spot: ...
143
+ Perps account value: $...
144
+ Positions: ...
145
+ ```
146
+
147
+ Collapse successful zero-native EVM chains into one line:
148
+
149
+ ```text
150
+ Zero native: Polygon, Optimism, Arbitrum
151
+ ```
152
+
153
+ End with concise exceptions:
154
+
155
+ ```text
156
+ Unavailable: <failed providers or unconfigured addresses>
157
+ Unpriced: <nonzero assets without a price>
158
+ Warnings: <spam, stale, unknown-not-empty, or incomplete discovery warnings>
159
+ ```
160
+
161
+ Do not dump raw RPC payloads unless the user asks. Keep exact public addresses in
162
+ the response only when the user supplied multiple addresses and disambiguation is
163
+ necessary.
164
+
165
+ ## Truth rules
166
+
167
+ - `0` means a provider successfully returned zero.
168
+ - `unavailable` means the provider failed or the adapter is absent.
169
+ - `not-configured` means the public address is missing.
170
+ - `unknownNotEmpty` means the provider cannot tell whether assets exist. Never
171
+ convert it to an empty portfolio.
172
+ - Every USD figure must carry a price source and query timestamp in the tool
173
+ result.
174
+ - Do not sum Stable Mainnet native USDT0 with its mirrored ERC-20 representation.
175
+ - Do not price unverified or spam tokens by symbol alone.
176
+ - Do not hide failed chains to make the summary look complete.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: oracle-action-semantics
3
+ description: Use for watch, ping, prepare, arm, sign, send, or execution-capability questions.
4
+ ---
5
+
6
+ # Oracle action semantics
7
+
8
+ Keep these planes distinct:
9
+
10
+ 1. **Public prepare plane**: reads, quotes, simulates, and prepares unsigned artifacts. It never signs or broadcasts.
11
+ 2. **Generic Oracle signer**: the unattended daemon surfaces remain `hl` and `poly`. This does not grant EVM authority.
12
+ 3. **User-wallet EVM**: ordinary EVM preparations require the user's wallet signature.
13
+ 4. **Optional bounded EVM execution**: a deployment may expose a separate same-host, owner-gated EVM executor such as MAD. Verify its status and policy before saying it is available. Never infer it from the public package or the generic signer.
14
+
15
+ Do not turn a deployment fact into a universal claim. If no bounded EVM executor is installed or healthy, say the current deployment cannot execute EVM. Do not say Oracle can never execute EVM.
16
+
17
+ ## Binding vocabulary
18
+
19
+ - `watch`, `watch this`, `ping`, `ping me`, `alert`, and `notify` mean notification only.
20
+ - Persist them as `active: true` and `actionMode: alert_only`.
21
+ - `arm` means authorization intent for one exact bounded action.
22
+ - Persist it as `active: true` and `actionMode: execute` only after the exact action and owner authorization are present.
23
+ - Never convert `watch` into execution.
24
+ - Never convert `arm` into a watch.
25
+ - A status field such as `armed` is not action authority. Current records require explicit `active` and `actionMode` fields.
26
+
27
+ Before accepting `arm`, require the exact chain, token pair, amount or fraction, trigger, recipient, router, deadline, slippage bound, and approval bound. Require the owner-gated executor to be healthy and disarmed until that exact action is authorized. Refuse global, implied, or reusable authorization.
28
+
29
+ ## Execution states
30
+
31
+ Report each state separately:
32
+
33
+ - `executionReady`
34
+ - `requiresUserSignature`
35
+ - `signingReady`
36
+ - `broadcastReady`
37
+
38
+ A quote is not a preparation. A preparation is not a signature. A signature is not a broadcast. A broadcast is not mined execution. Claim success only after a transaction hash, successful receipt, and expected balance delta.
39
+
40
+ ERC-20 approval is a separate transaction. Use an exact bounded amount unless the user explicitly authorizes another cap. Never silently create an unlimited approval.
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: oracle-multichain-nft-launch
3
+ description: Use when planning, building, reviewing, or preparing an NFT collection launch across EVM, Solana, Bitcoin Ordinals, Cosmos, Move, HyperEVM, or another chain family. Fail closed on unsupported adapters; preserve metadata provenance; prepare only; the user signs every side effect.
4
+ ---
5
+
6
+ # Multichain NFT collection launch
7
+
8
+ ## Contract
9
+
10
+ Use this skill for collection contracts or programs, metadata and media manifests,
11
+ allowlists, public mints, royalties, reveals, editions, inscriptions, and collection
12
+ verification.
13
+
14
+ "Every chain" means classify the chain family and use a verified native standard.
15
+ There is no universal NFT transaction. An ERC-721, a Metaplex collection, a Bitcoin
16
+ parent inscription, a CW721 contract, and a Move object are different products.
17
+
18
+ Oracle researches, scaffolds, tests, simulates, and prepares unsigned actions. The
19
+ user signs collection creation, mint, metadata, authority, treasury, marketplace,
20
+ and reveal actions separately. Never broadcast from this skill.
21
+
22
+ When loaded by the `oracle` router, use this skill to classify the request, then
23
+ route chain research to the relevant specialist and build/prepare work to
24
+ `protocol-builder`. The router remains read and simulate only.
25
+
26
+ If the launch uses randomized packs or loot mechanics, load
27
+ `oracle-nft-gacha-launch` as an additional safety layer.
28
+
29
+ ## Support status language
30
+
31
+ Use exactly one status before building:
32
+
33
+ | Status | Meaning |
34
+ |---|---|
35
+ | `TEMPLATE_READY` | Oracle ships a gated collection template and prepare adapter for the exact standard. |
36
+ | `ADAPTER_READY` | A chain-specific creation/mint encoder exists and passed simulation or testnet verification. |
37
+ | `GUIDED_BUILD` | Oracle can scaffold and test the project, but no generic transaction adapter is shipped. |
38
+ | `RESEARCH_ONLY` | Oracle can verify standards and produce a launch plan, not a deployable bundle. |
39
+ | `UNSUPPORTED` | Required primitives or trustworthy tooling cannot be verified. Stop. |
40
+
41
+ Do not call marketplace read or mint-bot support a collection-deployment adapter.
42
+ Buying an NFT, minting from an existing contract, and creating a collection are
43
+ three separate capabilities.
44
+
45
+ ## Current family matrix
46
+
47
+ | Family | Collection primitive | Default status | Required path |
48
+ |---|---|---|---|
49
+ | EVM | ERC-721, ERC-1155, ERC-2981 | `GUIDED_BUILD` until a gated Oracle collection template ships | Foundry tests, metadata/reveal tests, fork simulation, unsigned deploy |
50
+ | Solana | Metaplex Core, Token Metadata collection, Candy Machine/drop programs | `GUIDED_BUILD` | Select one standard, validate authorities, simulate ordered unsigned transactions |
51
+ | Bitcoin | Ordinals parent/child inscriptions and indexer collection manifests | `GUIDED_BUILD` for content and commit/reveal planning; adapter evidence required for `ADAPTER_READY` | Provenance manifest, parent link, UTXO/fee/reveal safety |
52
+ | Cosmos | CW721 or chain-native NFT module | `RESEARCH_ONLY` by default | Verify chain-specific instantiate/execute messages and migration admin |
53
+ | Sui | object-based collection and kiosk ecosystem | `RESEARCH_ONLY` by default | Move package, object capabilities, display metadata, testnet publish |
54
+ | Aptos | Digital Asset standard or chain-native collection objects | `RESEARCH_ONLY` by default | Collection/mint refs, mutation permissions, testnet publish |
55
+ | HyperEVM | ERC-721 or ERC-1155 | EVM status | Exact HyperEVM chain id and verified RPC/toolchain |
56
+ | Hyperliquid L1 | no generic NFT contract path assumed | `UNSUPPORTED` unless an official native primitive is verified | Route to HyperEVM when the product is EVM-native |
57
+ | Other | chain-native | `UNSUPPORTED` until classified | Add and verify a dedicated adapter before preparing transactions |
58
+
59
+ ## 1. Build the collection manifest
60
+
61
+ Do not generate contract or metadata artifacts until this manifest is complete:
62
+
63
+ ```yaml
64
+ collection:
65
+ name: ""
66
+ symbol: ""
67
+ chain_family: ""
68
+ chain_name: ""
69
+ chain_id_or_genesis: ""
70
+ network: mainnet|testnet|devnet|local
71
+ standard: ""
72
+ supply: 0
73
+ edition_size: 1
74
+ onchain_media: false
75
+ license: ""
76
+ content_rating: ""
77
+ mint:
78
+ price: ""
79
+ currency: ""
80
+ treasury: ""
81
+ per_wallet: 0
82
+ allowlist_root: none
83
+ allowlist_start: null
84
+ public_start: null
85
+ public_end: null
86
+ reveal: immediate|delayed|commit-reveal|vrf
87
+ metadata:
88
+ base_uri: ""
89
+ storage: ipfs|arweave|onchain|other
90
+ mutable: false
91
+ provenance_root: ""
92
+ placeholder_uri: none
93
+ royalties:
94
+ bps: 0
95
+ recipients: []
96
+ authorities:
97
+ owner: ""
98
+ mint: ""
99
+ metadata_update: none
100
+ freeze: none
101
+ pause: none
102
+ withdraw: ""
103
+ upgrade: none
104
+ ```
105
+
106
+ Validate supply against generated metadata count. Record raw payment units and
107
+ human-readable units. Royalty splits must reconcile exactly.
108
+
109
+ ## 2. Set rights, metadata, and provenance first
110
+
111
+ 1. State who owns the media and which license collectors receive.
112
+ 2. Hash every final media and metadata file.
113
+ 3. Validate token IDs or asset indexes are unique and contiguous when required.
114
+ 4. Pin or upload content only after the user approves that side effect.
115
+ 5. Build a deterministic provenance root over the final ordered assets.
116
+ 6. Separate placeholder metadata from final metadata.
117
+ 7. State whether metadata can change, who can change it, and how that authority is
118
+ transferred or revoked.
119
+ 8. Never promise immutable media when the JSON points to mutable HTTP storage.
120
+
121
+ Metadata upload, contract deployment, first mint, reveal, marketplace verification,
122
+ and authority revocation are separate actions.
123
+
124
+ ## 3. Force an authority and economics review
125
+
126
+ Before preparing transactions, print a table for:
127
+
128
+ - contract, package, or program upgrade authority
129
+ - collection owner
130
+ - mint authority
131
+ - freeze or transfer-restriction authority
132
+ - metadata update authority
133
+ - reveal authority
134
+ - pause authority
135
+ - treasury withdrawal authority
136
+ - royalty recipient and royalty update authority
137
+ - allowlist root setter
138
+ - supply increase or edition authority
139
+
140
+ For each, state initial holder, mutability, transfer/revoke action, and operational
141
+ consequence of revocation.
142
+
143
+ Also disclose:
144
+
145
+ - total supply and reserved supply
146
+ - mint phases and wallet caps
147
+ - mint price and payment token
148
+ - treasury destination
149
+ - creator/team allocation
150
+ - royalties and whether marketplaces can ignore them
151
+ - upgradeability
152
+ - delayed reveal and randomness assumptions
153
+ - estimated deploy, storage, mint, and reveal costs
154
+
155
+ Never market royalties as guaranteed income. Many marketplaces treat them as
156
+ optional.
157
+
158
+ ## 4. Family-specific build paths
159
+
160
+ ### EVM
161
+
162
+ Choose ERC-721 for unique items and ERC-1155 for editions or mixed fungibility.
163
+ Add ERC-2981 only as a royalty signal, not enforcement.
164
+
165
+ Prefer reviewed OpenZeppelin bases and minimal immutable deployment. If a proxy is
166
+ required, show proxy admin, implementation upgrade authority, and timelock.
167
+
168
+ Required Foundry coverage:
169
+
170
+ - maximum supply and reserved supply cannot be exceeded
171
+ - per-wallet and per-phase caps
172
+ - exact payment and refund behavior
173
+ - treasury withdrawal and reentrancy resistance
174
+ - allowlist proof validation and replay boundaries
175
+ - reveal ordering and provenance
176
+ - metadata freeze or update permissions
177
+ - royalty values and recipients
178
+ - pause behavior
179
+ - owner cannot mint hidden supply
180
+ - ERC-721 or ERC-1155 interface conformance
181
+
182
+ Run `forge test`, static analysis when available, fork or RPC simulation, and dry-run
183
+ deploy. Prepare contract verification separately. Initial mint, public mint opening,
184
+ base URI change, reveal, and ownership transfer are separate unsigned actions.
185
+
186
+ ### Solana
187
+
188
+ Choose one product shape before code:
189
+
190
+ - Metaplex Core for a modern asset/collection model
191
+ - Token Metadata collection for compatibility with legacy NFT tooling
192
+ - Candy Machine or another audited drop program for staged public mints
193
+
194
+ Do not mix models casually. Print all collection, update, freeze/delegate, mint,
195
+ rule-set, and candy-machine authorities.
196
+
197
+ Prepare ordered unsigned transactions for:
198
+
199
+ 1. create the collection asset or collection mint
200
+ 2. create and verify collection metadata
201
+ 3. create drop/mint configuration when used
202
+ 4. fund storage/rent accounts
203
+ 5. mint or reserve initial assets
204
+ 6. verify items into the collection
205
+ 7. transfer or revoke update/mint authorities
206
+
207
+ Simulate against the intended cluster. Validate account owners, rent, compute units,
208
+ address lookup tables, and transaction size. Rebuild expired blockhashes rather than
209
+ editing signed data.
210
+
211
+ ### Bitcoin Ordinals
212
+
213
+ A Bitcoin collection is normally an indexer-recognized group of inscriptions, not a
214
+ collection smart contract. Build:
215
+
216
+ - canonical collection metadata and provenance manifest
217
+ - parent inscription plan
218
+ - child inscription relationships when supported
219
+ - exact content type and content hash for every item
220
+ - deterministic inscription order
221
+ - commit and reveal PSBT plan
222
+ - postage, fee rate, reveal destinations, and recovery addresses
223
+
224
+ Protect commit UTXOs from accidental spends. Account for fee changes, reorgs,
225
+ inscription ordering, and cursed/unbound outcomes. Do not promise stable inscription
226
+ numbers before confirmation. Collection listing with an indexer or marketplace is a
227
+ separate side effect after confirmed inscription IDs exist.
228
+
229
+ ### Cosmos
230
+
231
+ First identify the target's actual NFT primitive. CW721, a chain-native NFT module,
232
+ and an EVM runtime are not interchangeable.
233
+
234
+ For CW721, verify the exact code artifact, checksum, instantiate message, minter,
235
+ metadata extension schema, royalty extension if any, migration admin, and chain gas
236
+ model. For a native module, verify current protobuf messages and authority behavior
237
+ from the running chain version. Use the EVM path only for a proven EVM runtime.
238
+
239
+ ### Sui
240
+
241
+ Model collection, item objects, treasury or publisher capabilities, display
242
+ metadata, transfer policy, royalties/kiosk behavior, package upgrade policy, and
243
+ shared versus owned objects. Test package publish, collection creation, mint,
244
+ transfer, and authority transfer on testnet before any mainnet prepare.
245
+
246
+ ### Aptos
247
+
248
+ Use the current Digital Asset or chain-native collection standard verified against
249
+ the target network. Define collection mutability, token mutability, mint refs,
250
+ burn/transfer refs, royalty data, supply caps, and module upgrade policy. Publish and
251
+ exercise the lifecycle on testnet first.
252
+
253
+ ### Hyperliquid
254
+
255
+ HyperEVM NFT launches use the EVM path. Do not assume Hyperliquid L1 has a generic
256
+ NFT collection primitive because HyperCore supports spot, perps, staking, or outcome
257
+ markets. Without a verified official L1 standard and adapter, mark it `UNSUPPORTED`.
258
+
259
+ ## 5. Mint phases and randomness
260
+
261
+ For allowlists:
262
+
263
+ - bind proofs to chain, contract/program, phase, wallet, allowance, price, and expiry
264
+ - publish the snapshot method and Merkle root
265
+ - prevent proof reuse across phases or contracts
266
+ - test wallet caps across allowlist and public phases together
267
+
268
+ For delayed reveal or randomized assignment:
269
+
270
+ - commit the final provenance before mint
271
+ - do not use timestamp, recent block hash, predictable block fields, or validator
272
+ discretion as sole randomness
273
+ - use a verified randomness source or a deterministic disclosed assignment
274
+ - show who can trigger reveal and whether they can reroll
275
+ - publish gacha odds when rarity is randomized
276
+
277
+ Load `oracle-nft-gacha-launch` for packs, loot boxes, or paid random outcomes.
278
+
279
+ ## 6. Marketplace and launch-page setup
280
+
281
+ Marketplace listing is not deployment. Only prepare it after contract/program or
282
+ inscription identifiers are final.
283
+
284
+ Before a mint page can claim ready:
285
+
286
+ - wallet and network switching work
287
+ - contract/program and payment destinations are exact
288
+ - total and per-wallet cost include gas/fees
289
+ - sold-out and phase transitions read chain state
290
+ - failed/rejected transactions surface clearly
291
+ - mint count cannot exceed the approved cap
292
+ - metadata preview comes from the pinned manifest
293
+ - no private key or seed phrase is requested
294
+
295
+ Never fabricate floor price, bids, volume, rarity, or sold count.
296
+
297
+ ## 7. Required artifacts
298
+
299
+ A completed prepare run returns:
300
+
301
+ 1. `collection-manifest.yaml`
302
+ 2. ordered metadata/media checksums and provenance root
303
+ 3. rights/license statement
304
+ 4. authority and mutability table
305
+ 5. source/package hash and dependency lock
306
+ 6. test and static-analysis results
307
+ 7. target-chain simulation or an explicit missing-capability note
308
+ 8. fee, rent, postage, and treasury estimate as applicable
309
+ 9. ordered unsigned transaction or PSBT bundle with payload hashes
310
+ 10. source/program verification payload
311
+ 11. separate metadata upload, marketplace, reveal, and authority-revoke actions
312
+ 12. final user approval checklist, one side effect per line
313
+
314
+ Do not emit signed transactions, private keys, seed phrases, keystore passwords, or
315
+ broadcast commands with signing enabled.
316
+
317
+ ## Refusals
318
+
319
+ Refuse stolen media, hidden supply, owner-only rerolls, fake randomness, metadata
320
+ rugs, undisclosed upgrades, wash trading, fake floor/volume, deceptive rarity,
321
+ royalty claims presented as guaranteed, and wallet-draining mint pages.
322
+
323
+ ## Completion gate
324
+
325
+ A collection is only `PREPARED` when:
326
+
327
+ - chain and standard are exact
328
+ - support status is honest
329
+ - supply matches metadata
330
+ - rights and storage are explicit
331
+ - all authorities and mutable fields are disclosed
332
+ - tests pass
333
+ - simulation passes or the missing capability is explicit
334
+ - every destination and payload hash is recorded
335
+ - no signing, upload, marketplace listing, or broadcast occurred without separate
336
+ user approval
337
+
338
+ Anything less is `DRAFT`, `RESEARCH_ONLY`, or `UNSUPPORTED`.