Every valid create case from the PR contract suite (share.dto.spec.ts), executed for real against staging-api.phantom.app: OAuth login → POST /share → CockroachDB → public GET /share/:shareId.
kid = raw public key (hydra load-test recipe)/oauth2/token exchange with verifieruserId forwarding exercised| # | Case | Kind | HTTP | shareId | Result |
|---|---|---|---|---|---|
| 1 | Plain token card + spoofed sharer injected — stripped by server | token | POST 201 · GET 200 | KzrtsZMSNB | PASS |
| 2 | Token + open spot position | token | POST 201 · GET 200 | btuokFwyJV | PASS |
| 3 | Token + closed spot position | token | POST 201 · GET 200 | V3VfS583Qs | PASS |
| 4 | Plain perp market card | perpMarket | POST 201 · GET 200 | nUNvDRvDXy | PASS |
| 5 | Perp + open long 10x position | perpMarket | POST 201 · GET 200 | h7YhqoBaGI | PASS |
| 6 | Perp + closed short 5x position | perpMarket | POST 201 · GET 200 | 0T1JjSKmtf | PASS |
| 7 | Prediction + open yes position | predictionMarket | POST 201 · GET 200 | Go8qNxOmdn | PASS |
| 8 | Prediction + closed no position | predictionMarket | POST 201 · GET 200 | eJ10v9YWLd | PASS |
| 9 | Open token position card | openTokenPosition | POST 201 · GET 200 | A2iaxnzbVS | PASS |
| 10 | Open perp position card | openPerpPosition | POST 201 · GET 200 | lEyqMJbGL5 | PASS |
| 11 | Open prediction position card | openPredictionPosition | POST 201 · GET 200 | Kk0QagipO3 | PASS |
| 12 | Profile card | profile | POST 201 · GET 200 | DXW29udVUx | PASS |
| 13 | Chat card | chat | POST 201 · GET 200 | bLaMoiGCKQ | PASS |
| 14 | Token + price series (sparkline) | token | POST 201 · GET 200 | AV2OwZdAKS | PASS |
| 15 | Open perp position + price series | openPerpPosition | POST 201 · GET 200 | 4RmaHbImUK | PASS |
| 15 / 15 passed · 0 failed · shareIds link to the live public records | |||||
shareId + canonical phantom.com/ul/share/<id> URL.sharer: "spoofed-victim" in the body; the server discarded it (sharer: {} comes back).v = 1 and deepLinkPath echoed verbatim on every record.[A-Za-z0-9]{10}.{
"shareId": "h7YhqoBaGI",
"v": 1,
"payload": {
"kind": "perpMarket",
"caip19": "hypercore:mainnet/perp:BTC",
"priceUsd": "67450.50",
"change24hPct": "-1.8",
"position": {
"kind": "open", "side": "long", "leverage": "10",
"entryPriceUsd": "64200.00", "pnlUsd": "3250.50", "pnlPct": "5.06"
}
},
"sharer": {},
"deepLinkPath": "v1/perps/btc-usd",
"createdAt": "2026-07-31T22:17:41.769Z"
}
share CRDB client cert, database, or role existed in either environment. Added to the Pulumi stacks; merged 13:37.cockroachdb: {enabled: true, name: "share"} to both overlays. Merged 13:45 — migrate job succeeds, shares table created. The app pod then crash-loops on the next gap:serviceAccount: {create: true, name: share}. Crossplane provisioned the IRSA role; the pod restarted with secrets access. Merged 14:28.share service account. Production carries all three fixes, so it should come up cleanly first try.JSON.stringify equality. Values were byte-identical. Switched to a canonicalizing deep-equal and everything passed.share staging database if desired.