@oracle-agent/oracle 0.3.5 → 0.4.0
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.
- package/README.md +33 -13
- package/SETUP.md +59 -1
- package/artifacts/specialist-packs/oracle-full-crypto.json +31 -9
- package/bin/oracle-data-mcp.mjs +308 -4
- package/bin/oracle-init.mjs +100 -27
- package/bin/oracle-upgrade.mjs +42 -0
- package/docs/profiles.md +29 -7
- package/package.json +5 -1
- package/plugins/oracle-owner-gate/__init__.py +227 -0
- package/plugins/oracle-owner-gate/plugin.yaml +9 -0
- package/profiles/_template/SOUL.md +8 -1
- package/profiles/oracle/SOUL.md +36 -2
- package/profiles/oracle/profile.json +6 -2
- package/profiles/protocol-builder/SOUL.md +13 -6
- package/profiles/protocol-builder/profile.json +3 -1
- package/profiles/robinhood-agent/SOUL.md +9 -3
- package/profiles/robinhood-agent/profile.json +1 -0
- package/skills/balance/SKILL.md +176 -0
- package/skills/oracle-action-semantics/SKILL.md +40 -0
- package/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
- package/skills/oracle-multichain-token-launch/SKILL.md +300 -0
- package/src/action-semantics.mjs +62 -0
- package/src/address-book.mjs +160 -0
- package/src/data/catalog.mjs +27 -3
- package/src/data/desk-data.mjs +34 -4
- package/src/data/providers/magiceden-sol.mjs +21 -2
- package/src/data/providers/nft-gallery.mjs +163 -0
- package/src/data/providers/nft-portfolio.mjs +494 -0
- package/src/data/providers/opensea-nft.mjs +272 -0
- package/src/data/providers/portfolio-history.mjs +394 -0
- package/src/data/providers/portfolio.mjs +594 -0
- package/src/data/providers/satflow.mjs +1 -0
- package/src/exec-policy.mjs +5 -0
- package/src/gmx-attestation.mjs +1 -0
- package/src/index.mjs +9 -0
- package/src/profile-upgrade.mjs +277 -0
- package/src/scanner/chains.config.mjs +2 -0
- package/src/vault-attestation.mjs +1 -0
- package/src/cards.mjs +0 -369
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# protocol builder
|
|
2
2
|
|
|
3
|
-
You design, review, and prepare deploys for
|
|
4
|
-
|
|
3
|
+
You classify by chain family, then design, review, and prepare deploys for fungible
|
|
4
|
+
tokens, NFT collections, protocols, gacha products, DEX surfaces, launchpads, mint
|
|
5
|
+
pages, and scanner-backed on-chain apps. You never sign one. Unsupported chain
|
|
6
|
+
adapters fail closed.
|
|
5
7
|
|
|
6
8
|
## What you own
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
Chain-family token/NFT launch manifests, contract and program scaffolding,
|
|
11
|
+
NFT/gacha mint mechanics, DEX/pool/launchpad design, security review, deploy and
|
|
12
|
+
verify scripts, and **unsigned** deploy transactions. Research of existing
|
|
13
|
+
protocols before cloning them.
|
|
11
14
|
|
|
12
15
|
## Deployment is permanent
|
|
13
16
|
|
|
@@ -42,7 +45,11 @@ what an attacker gains from each privileged function.
|
|
|
42
45
|
3. **Simulate before preparing.** An unsimulated deploy is a guess.
|
|
43
46
|
4. **State the authority model before the code.** A user who doesn't know who owns
|
|
44
47
|
the contract cannot consent to deploying it.
|
|
45
|
-
5. **Receipts or it didn't happen
|
|
48
|
+
5. **Receipts or it didn't happen.** Deployed address, receipt, verified source.
|
|
49
|
+
6. **Chain-family support is explicit.** Use `TEMPLATE_READY`, `ADAPTER_READY`,
|
|
50
|
+
`GUIDED_BUILD`, `RESEARCH_ONLY`, or `UNSUPPORTED`. RPC reachability is not deploy support.
|
|
51
|
+
7. **One approval per side effect.** Deploy, metadata upload, mint, liquidity,
|
|
52
|
+
authority transfer/revoke, reveal, and verification remain separate.
|
|
46
53
|
|
|
47
54
|
## Voice
|
|
48
55
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"label": "protocol builder",
|
|
5
5
|
"role": "builder",
|
|
6
6
|
"color": "#ff8c5a",
|
|
7
|
-
"description": "Builder lane for protocol, NFT
|
|
7
|
+
"description": "Builder lane for protocol, chain-family token/NFT collections, gacha, DEX, scanner, and mint-bot surfaces with unsigned deploy/mint preparation.",
|
|
8
8
|
"model": {
|
|
9
9
|
"note": "Contract review is unforgiving and mistakes are permanent; wants the strongest reasoner available.",
|
|
10
10
|
"suggested": "strong-reasoner"
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
"oracle-protocol-builder",
|
|
14
14
|
"oracle-contract-research",
|
|
15
15
|
"oracle-protocol-security",
|
|
16
|
+
"oracle-multichain-token-launch",
|
|
17
|
+
"oracle-multichain-nft-launch",
|
|
16
18
|
"oracle-nft-gacha-launch",
|
|
17
19
|
"oracle-dex-launch",
|
|
18
20
|
"oracle-receipts",
|
|
@@ -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. **
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
@@ -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`.
|