@oracle-agent/oracle 0.35.19 → 0.35.21

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 (31) hide show
  1. package/dist/assets/skills/oracle-desk-product/SKILL.md +23 -17
  2. package/dist/assets/skills/oracle-mcp-install/SKILL.md +17 -22
  3. package/dist/assets/skills/protocol-api-key-integration/SKILL.md +14 -11
  4. package/dist/assets/skills/self-custodial-onchain-execution/SKILL.md +14 -13
  5. package/dist/assets/skills/trade-loop-circuit-breaker/SKILL.md +1 -1
  6. package/dist/bin/desk-server.mjs +30 -30
  7. package/dist/bin/oracle-data-mcp.mjs +17 -17
  8. package/dist/bin/oracle-gateway.mjs +3 -3
  9. package/dist/bin/oracle-public-server.mjs +5 -5
  10. package/dist/bin/oracle-telegram-mcp.mjs +5 -5
  11. package/dist/cli/commands/chat.mjs +200 -200
  12. package/dist/cli/commands/doctor.mjs +7 -7
  13. package/dist/cli/commands/eval.mjs +113 -113
  14. package/dist/cli/commands/extension-policy.mjs +1 -1
  15. package/dist/cli/commands/governance-prepare.mjs +5 -0
  16. package/dist/cli/commands/model.mjs +204 -204
  17. package/dist/cli/commands/portfolio-risk.mjs +4 -0
  18. package/dist/cli/commands/position-health.mjs +4 -0
  19. package/dist/cli/commands/safety-intelligence.mjs +4 -0
  20. package/dist/cli/commands/swap.mjs +12 -12
  21. package/dist/cli/commands/tax-lots.mjs +4 -0
  22. package/dist/cli/commands/telegram.mjs +6 -6
  23. package/dist/data/desk-data.mjs +26 -26
  24. package/dist/index.mjs +40 -40
  25. package/package.json +1 -1
  26. package/public/eval-report.json +22 -8
  27. package/public/oracle-splash/index.html +44 -23
  28. package/server.json +2 -2
  29. package/dist/assets/skills/oracle-best-execution.md +0 -27
  30. package/dist/assets/skills/oracle-desk.md +0 -27
  31. package/dist/assets/skills/oracle-receipts.md +0 -29
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oracle-agent/oracle",
3
- "version": "0.35.19",
3
+ "version": "0.35.21",
4
4
  "description": "Oracle: standalone multichain agent control plane with an optional encrypted, loopback-only self-hosted signer.",
5
5
  "license": "BUSL-1.1",
6
6
  "type": "module",
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "surface": "oracle-public-eval",
3
3
  "version": 1,
4
- "generatedAt": "2026-08-25T09:38:08.579375+00:00",
4
+ "generatedAt": "2026-08-26T03:16:16.859799+00:00",
5
5
  "source": {
6
- "commit": "499888d3d953eb93b69a4282b55444a1f47bb82c",
7
- "dirty": false,
6
+ "commit": "96d67d6a7d652950f3ecdc7b845376820922a580",
7
+ "dirty": true,
8
8
  "node": "v26.7.0"
9
9
  },
10
10
  "package": "@oracle-agent/oracle",
11
- "packageVersion": "0.35.18",
11
+ "packageVersion": "0.35.21",
12
12
  "methodology": "Reproduce locally: npx @oracle-agent/oracle eval guards|adversarial|fidelity --json. Dated, commit-stamped output; no chain state or live keys involved. A report is evidence of the pinned commit only.",
13
13
  "suites": {
14
14
  "guards": {
@@ -20,7 +20,7 @@
20
20
  {
21
21
  "name": "version",
22
22
  "ok": true,
23
- "detail": "oracle 0.35.18"
23
+ "detail": "oracle 0.35.20"
24
24
  },
25
25
  {
26
26
  "name": "help-loads",
@@ -47,6 +47,7 @@
47
47
  "adversarial": {
48
48
  "ok": true,
49
49
  "status": "passed",
50
+ "blocked": false,
50
51
  "packageTests": {
51
52
  "total": 159,
52
53
  "pass": 159,
@@ -70,11 +71,24 @@
70
71
  "expectedFiles": 9,
71
72
  "failures": []
72
73
  },
73
- "files": [],
74
- "cases": []
74
+ "coverage": [
75
+ "exact-confirmation",
76
+ "artifact-mutation",
77
+ "replay-idempotency",
78
+ "receipt-finality",
79
+ "autonomous-mint-gates",
80
+ "exact-nft-contract",
81
+ "hyperliquid-position-drift"
82
+ ]
75
83
  },
76
84
  "fidelity": {
77
- "ok": true
85
+ "ok": true,
86
+ "status": "passed",
87
+ "blocked": false,
88
+ "code": 0,
89
+ "signal": null,
90
+ "summary": "summary: 3/3 ok, 0 prepare-fail, 0 structural-fail, 0 sim-fail, 3 simulated",
91
+ "tail": "prepare-fidelity eval taker=0x70997970... generated=2026-08-26T03:15:52.383Z\nid status artifact sim liq% notes\nethereum-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\nbase-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\narbitrum-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\nsummary: 3/3 ok, 0 prepare-fail, 0 structural-fail, 0 sim-fail, 3 simulated\n\n"
78
92
  }
79
93
  },
80
94
  "adversarialClassesCovered": [
@@ -110,11 +110,7 @@ img{display:inline-block}
110
110
  .scene-rail{position:fixed;right:18px;top:50%;z-index:29;transform:translateY(-50%);display:grid;gap:11px;font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:rgba(201,218,236,.44)}
111
111
  .scene-rail span{position:relative;display:grid;place-items:center;width:30px;height:22px;border:1px solid rgba(124,196,255,.12);border-radius:999px;background:rgba(11,16,24,.40);transition:color .35s var(--ease),border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease)}
112
112
  body[data-scene="home"] .scene-rail span[data-scene-dot="home"],body[data-scene="orchestration"] .scene-rail span[data-scene-dot="orchestration"],body[data-scene="chains"] .scene-rail span[data-scene-dot="chains"],body[data-scene="cli"] .scene-rail span[data-scene-dot="cli"],body[data-scene="fees"] .scene-rail span[data-scene-dot="fees"]{color:#071018;border-color:rgba(184,240,255,.82);background:linear-gradient(180deg,var(--scene-a),var(--scene-b));transform:translateX(-4px)}
113
- body[data-scene="home"]{--scene-a:#7CC4FF;--scene-b:#50D2C1;--scene-soft:rgba(124,196,255,.16)}
114
- body[data-scene="orchestration"]{--scene-a:#A7D8FF;--scene-b:#9945FF;--scene-soft:rgba(153,69,255,.12)}
115
- body[data-scene="chains"]{--scene-a:#50D2C1;--scene-b:#D7FF4D;--scene-soft:rgba(80,210,193,.13)}
116
- body[data-scene="cli"]{--scene-a:#F4F9FE;--scene-b:#7CC4FF;--scene-soft:rgba(244,249,254,.12)}
117
- body[data-scene="fees"]{--scene-a:#D7FF4D;--scene-b:#F0B90B;--scene-soft:rgba(240,185,11,.12)}
113
+ body[data-scene="home"],body[data-scene="orchestration"],body[data-scene="chains"],body[data-scene="cli"],body[data-scene="fees"]{--scene-a:#7CC4FF;--scene-b:#50D2C1;--scene-soft:rgba(124,196,255,.16)}
118
114
 
119
115
  /* ── orbital oracle mark ───────────────────────────── */
120
116
  .orbital{position:relative;display:inline-block}
@@ -1117,6 +1113,10 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1117
1113
  .js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
1118
1114
  .js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
1119
1115
  .js .rv.done{transform:none;will-change:auto}
1116
+ .js .home-kicker.rv.in{transition-delay:.04s}
1117
+ .js .home-title.rv.in{transition-delay:.14s}
1118
+ .js .hero-sub.rv.in{transition-delay:.26s}
1119
+ .js .home-stats.rv.in{transition-delay:.34s}
1120
1120
 
1121
1121
 
1122
1122
  .section{position:relative}
@@ -1272,7 +1272,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1272
1272
  <div class="hero-split">
1273
1273
  <div class="hero-lede">
1274
1274
  <p class="home-kicker rv">self-custody agent control</p>
1275
- <h1 class="home-title rv">Trade every chain<br>from <em>one</em> agent</h1>
1275
+ <h1 class="home-title rv" data-split>Trade every chain<br>from <em>one</em> agent</h1>
1276
1276
  <p class="hero-sub rv">Hyperliquid, EVM, Bitcoin, Solana, Stable and Robinhood Chain in a single control plane. Oracle reads state, prices routes and prepares the transaction. Your wallet signs it.</p>
1277
1277
  <div class="home-actions">
1278
1278
  <a class="enter-cta primary" href="#cli">Download</a>
@@ -1326,14 +1326,14 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1326
1326
  <div class="home-stats rv" aria-label="Oracle surface metrics">
1327
1327
  <div class="home-stat"><b id="hero-protocol-count" data-count="220">220</b><span>protocols / venues wired</span></div>
1328
1328
  <div class="home-stat"><b id="hero-provider-count" data-count="122">122</b><span>data providers</span></div>
1329
- <div class="home-stat"><b id="hero-op-count" data-count="535">535</b><span>data operations</span></div>
1329
+ <div class="home-stat"><b id="hero-op-count" data-count="527">527</b><span>data operations</span></div>
1330
1330
  <div class="home-stat"><b id="hero-chain-count">14 + EVM</b><span>chains wired</span></div>
1331
1331
  </div>
1332
1332
  </div>
1333
1333
  </section>
1334
1334
  <section class="section" id="orchestration">
1335
1335
  <p class="section-label rv">Profiles</p>
1336
- <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
1336
+ <h2 class="section-title rv" data-split>Multi-profile. <em>Customizable.</em></h2>
1337
1337
  <p class="section-lede rv">Input hits the Oracle control plane and routes across venue profiles, multi-chain EVM, Bitcoin, Solana, and the protocol builder. Any MCP harness drives a single agent.</p>
1338
1338
 
1339
1339
  <div class="graph-shell rv">
@@ -1670,7 +1670,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1670
1670
  </div>
1671
1671
 
1672
1672
  <p class="section-label rv">Self-custodial agents</p>
1673
- <h2 class="section-title rv">No third party holds your keys. Not even Oracle.</h2>
1673
+ <h2 class="section-title rv" data-split>No third party holds your keys. Not even Oracle.</h2>
1674
1674
  <div class="selfcustody-grid">
1675
1675
  <div>
1676
1676
  <h4>Everything runs on your machine</h4>
@@ -1885,7 +1885,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1885
1885
 
1886
1886
  <section class="section" id="chains">
1887
1887
  <p class="section-label rv">Chains</p>
1888
- <h2 class="section-title rv">Where you can <em>operate.</em></h2>
1888
+ <h2 class="section-title rv" data-split>Where you can <em>operate.</em></h2>
1889
1889
  <p class="section-lede rv">Every built-in EVM chain exposes the full scanner set. <b>Route</b> means Oracle can price and prepare a swap there. Register any extra EVM chain with a chain id and an RPC; unsupported paths fail closed.</p>
1890
1890
  <div class="chain-grid" id="chain-grid"></div>
1891
1891
  <div class="hl-surface rv">
@@ -1902,7 +1902,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1902
1902
  </section>
1903
1903
  <section class="section cli-section" id="cli">
1904
1904
  <p class="section-label rv">Oracle CLI</p>
1905
- <h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
1905
+ <h2 class="section-title rv" data-split>One surface. <em>Every chain.</em></h2>
1906
1906
  <div class="cli-install rv">
1907
1907
  <div class="cli-install-cmd"><code>curl -fsSL https://oracle.demi.la/install.sh | bash</code> <span class="cli-install-hint">then oracle setup model && oracle chat</span></div>
1908
1908
  </div>
@@ -1940,7 +1940,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1940
1940
 
1941
1941
  <section class="section" id="fees">
1942
1942
  <p class="section-label rv">Fees</p>
1943
- <h2 class="section-title rv">5 bps. <em>Holders zero.</em></h2>
1943
+ <h2 class="section-title rv" data-split>5 bps. <em>Holders zero.</em></h2>
1944
1944
  <p class="section-lede rv">5 basis points (0.05%) on swaps Oracle routes. Eligible Hyperliquid orders can add a 1–2 bps builder fee after wallet approval. Both show before you sign.</p>
1945
1945
  <div class="moat-grid rv" style="margin-top:28px">
1946
1946
  <article class="moat-card">
@@ -2480,10 +2480,28 @@ var activeLenis = null;
2480
2480
  root.querySelectorAll("[data-split]").forEach(function (el) {
2481
2481
  if (el.dataset.splitDone) return;
2482
2482
  el.dataset.splitDone = "1";
2483
- el.innerHTML = el.textContent.split(/(\s+)/).map(function (w) {
2484
- if (/^\s+$/.test(w)) return w;
2485
- return '<span class="word-mask"><span>' + w + '</span></span>';
2486
- }).join("");
2483
+ function wrap(node) {
2484
+ var frag = document.createDocumentFragment();
2485
+ Array.prototype.slice.call(node.childNodes).forEach(function (child) {
2486
+ if (child.nodeType === 3) {
2487
+ child.textContent.split(/(\s+)/).forEach(function (w) {
2488
+ if (!w) return;
2489
+ if (/^\s+$/.test(w)) { frag.appendChild(document.createTextNode(w)); return; }
2490
+ var m = document.createElement("span"); m.className = "word-mask";
2491
+ var s = document.createElement("span"); s.textContent = w;
2492
+ m.appendChild(s); frag.appendChild(m);
2493
+ });
2494
+ } else if (child.nodeType === 1) {
2495
+ var clone = child.cloneNode(false);
2496
+ clone.appendChild(wrap(child));
2497
+ frag.appendChild(clone);
2498
+ }
2499
+ });
2500
+ return frag;
2501
+ }
2502
+ var out = wrap(el);
2503
+ el.innerHTML = "";
2504
+ el.appendChild(out);
2487
2505
  });
2488
2506
  }
2489
2507
  function initPremiumMotion() {
@@ -2499,14 +2517,17 @@ var activeLenis = null;
2499
2517
  }
2500
2518
  splitWords(document);
2501
2519
  if (window.ScrollTrigger) {
2502
- gsap.fromTo("[data-split] .word-mask > span", { yPercent:112, rotate:2 }, { yPercent:0, rotate:0, duration:1.1, ease:"power4.out", stagger:.035, scrollTrigger:{ trigger:"[data-split]", start:"top 78%" }, clearProps:"transform" });
2520
+ document.querySelectorAll("[data-split]").forEach(function (el) {
2521
+ el.classList.add("in", "done");
2522
+ gsap.fromTo(el.querySelectorAll(".word-mask > span"), { yPercent:112 }, { yPercent:0, duration:1.05, ease:"power4.out", stagger:.04, scrollTrigger:{ trigger:el, start:"top 82%" }, clearProps:"transform" });
2523
+ });
2503
2524
  gsap.to(".hero-art", { yPercent:18, scale:.9, ease:"none", scrollTrigger:{ trigger:".home", start:"top top", end:"bottom top", scrub:true } });
2504
- gsap.fromTo(".hero-installer", { y:24, rotateX:2, filter:"brightness(.92)" }, { y:0, rotateX:0, filter:"brightness(1)", duration:1.1, ease:"power4.out", scrollTrigger:{ trigger:".hero-installer", start:"top 88%" }, clearProps:"transform,filter" });
2505
- gsap.fromTo(".motion-card", { y:80, rotateX:8, scale:.965 }, { y:0, rotateX:0, scale:1, duration:1.25, ease:"power4.out", stagger:.08, scrollTrigger:{ trigger:".operator-grid", start:"top 82%" }, clearProps:"transform" });
2506
- gsap.to(".motion-command", { y:-54, rotateX:4, rotateY:-5, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 76%", end:"bottom top", scrub:true } });
2507
- gsap.fromTo(".chain", { y:42, rotateX:6, opacity:.55 }, { y:0, rotateX:0, opacity:1, duration:.9, ease:"power3.out", stagger:.035, scrollTrigger:{ trigger:"#chains", start:"top 76%" }, clearProps:"transform,opacity" });
2508
- gsap.fromTo(".strategy-card", { y:46, rotateX:7, opacity:.58 }, { y:0, rotateX:0, opacity:1, duration:1.05, ease:"power3.out", stagger:.025, scrollTrigger:{ trigger:".strategy-grid", start:"top 78%" }, clearProps:"transform,opacity" });
2509
- gsap.fromTo(".cli-proof", { scale:.94, rotateX:3, y:40 }, { scale:1, rotateX:0, y:0, ease:"none", scrollTrigger:{ trigger:".cli-proof", start:"top 86%", end:"bottom 38%", scrub:1 }, clearProps:"transform" });
2525
+ gsap.fromTo(".hero-installer", { y:26, filter:"brightness(.92)" }, { y:0, filter:"brightness(1)", duration:1.1, ease:"power4.out", scrollTrigger:{ trigger:".hero-installer", start:"top 88%" }, clearProps:"transform,filter" });
2526
+ gsap.fromTo(".motion-card", { y:44, scale:.97 }, { y:0, scale:1, duration:1.15, ease:"power4.out", stagger:.07, scrollTrigger:{ trigger:".operator-grid", start:"top 82%" }, clearProps:"transform" });
2527
+ gsap.to(".motion-command", { y:-54, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 76%", end:"bottom top", scrub:true } });
2528
+ gsap.fromTo(".chain", { y:28, opacity:.55 }, { y:0, opacity:1, duration:.85, ease:"power3.out", stagger:.03, scrollTrigger:{ trigger:"#chains", start:"top 76%" }, clearProps:"transform,opacity" });
2529
+ gsap.fromTo(".strategy-card", { y:30, opacity:.58 }, { y:0, opacity:1, duration:.95, ease:"power3.out", stagger:.025, scrollTrigger:{ trigger:".strategy-grid", start:"top 78%" }, clearProps:"transform,opacity" });
2530
+ gsap.fromTo(".cli-proof", { scale:.96, y:30 }, { scale:1, y:0, ease:"none", scrollTrigger:{ trigger:".cli-proof", start:"top 86%", end:"bottom 38%", scrub:1 }, clearProps:"transform" });
2510
2531
  gsap.to(".route-tree", { scale:1.018, ease:"none", transformOrigin:"50% 50%", scrollTrigger:{ trigger:".route-tree", start:"top 82%", end:"bottom 40%", scrub:1 } });
2511
2532
  gsap.to(".mega-oracle", { xPercent:-14, letterSpacing:".02em", ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
2512
2533
  }
package/server.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "name": "io.github.demi-hl/oracle",
4
4
  "description": "Keyless multichain crypto desk: chain reads + prepare-only unsigned txs. Your wallet signs.",
5
5
  "websiteUrl": "https://oracle.demi.la",
6
- "version": "0.35.19",
6
+ "version": "0.35.21",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@oracle-agent/oracle",
11
- "version": "0.35.19",
11
+ "version": "0.35.21",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },
@@ -1,27 +0,0 @@
1
- ---
2
- name: oracle-best-execution
3
- description: Use whenever swapping or bridging. The rule that the highest-output route wins.
4
- ---
5
-
6
- # Best execution
7
-
8
- ## One rule
9
- The highest **net output** (after gas + bridge + impact) wins. Not the best quote, not the shortest route, not the prettiest UI.
10
-
11
- ## Swap flow
12
- 1. `data dex_search` → resolve token to chain + address
13
- 2. `data dex_token` → get live pairs, liquidity, price
14
- 3. `exec evm_quote` → exact-input quote from Uniswap V3
15
- 4. `data best_swap_route` → compare across aggregators (Li.Fi, Paraswap, 0x, CoW)
16
- 5. `data best_bridge_route` → if cross-chain, rank by net output
17
- 6. `exec evm_prepare` → build unsigned tx
18
- 7. Report: best route, net output, slippage, gas estimate
19
-
20
- ## Comparison always in USD
21
- Convert gas + bridge fees to USD. 0.001 ETH ≠ 0.001 ETH across chains.
22
-
23
- ## Slippage
24
- - Stable pools: 0.1% default
25
- - Volatile pools: 0.5% default
26
- - Memecoins: 1-3% or auto-detect from depth
27
- - Block >1% slippage without explicit user approval
@@ -1,27 +0,0 @@
1
- ---
2
- name: oracle-desk
3
- description: Use when routing a crypto request to the right lane or comparing options across chains.
4
- ---
5
-
6
- # Oracle desk routing
7
-
8
- 1. **Which chain?** Resolve via DexScreener or user input. Never guess.
9
- 2. **Which lane?** Use public data and prepare providers for the resolved chain. Return unsigned transactions or typed-data intents for connected-wallet approval.
10
- 3. **Multi-chain?** Quote each option, synthesize. Same notional, include gas in USD, include bridge cost.
11
- 4. **Ambiguous?** Ask.
12
-
13
- ## Comparison rules
14
- - Same notional on each chain
15
- - Gas in USD (not native units)
16
- - Include bridge cost + time if cross-chain
17
- - Include price impact at request size
18
- - Note liquidity depth — cheapest at $100 may not be cheapest at $50k
19
-
20
- ## Capability tiers
21
- - `read-only` — data only
22
- - `quote-only` — can price a route
23
- - `prepare` — returns unsigned tx
24
- - `intent` — typed-data order to sign
25
-
26
- ## Confidence
27
- State explicitly: high / moderate / low / unknown. Never invent chain facts.
@@ -1,29 +0,0 @@
1
- ---
2
- name: oracle-receipts
3
- description: Use whenever reporting the outcome of any on-chain action (swap, bridge, mint, send, list, accept-offer).
4
- ---
5
-
6
- # Receipt format
7
-
8
- ## Required fields
9
- - tx hash (full, with chain explorer link)
10
- - chain + chainId
11
- - action (swap/bridge/mint/send/list/accept-offer)
12
- - from → to (addresses)
13
- - amount in → amount out (with token symbols)
14
- - gas used + gas cost in USD
15
- - status: confirmed / pending / failed
16
-
17
- ## Explorer links
18
- - Ethereum: https://etherscan.io/tx/{hash}
19
- - Base: https://basescan.org/tx/{hash}
20
- - Arbitrum: https://arbiscan.io/tx/{hash}
21
- - Optimism: https://optimistic.etherscan.io/tx/{hash}
22
- - Polygon: https://polygonscan.com/tx/{hash}
23
- - BSC: https://bscscan.com/tx/{hash}
24
- - HyperEVM: https://www.hyperscan.com/tx/{hash}
25
-
26
- ## Never claim
27
- - "submitted" = confirmed. Only tx receipt with status=1 is confirmed.
28
- - A prepare is not a fill. Report prepare as "prepared, unsigned."
29
- - A sign is not a send. Report sign as "signed, not broadcast."