{"entry":{"fixtureId":"xchain-multi-evm-bridge-v0","appSlug":"xchain-multi-evm-bridge","appName":"Nockchain<->multi-EVM Bridge (Arbitrum/Optimism)","reportId":"lab_xchain-multi-evm-bridge-v0_20260610225855223","generatedAt":"2026-06-10T22:58:55.223Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/xchain-multi-evm-bridge.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/xchain-multi-evm-bridge.report.md","reportHash":"sha256:c9c35cc927527b81661b41954c974ea0a5d21b5c5f8a7a7608784a33dbe73ce1","snapshotRoot":"e5abac4ada5d2ced","badgeCandidate":{"id":"badge-candidate-xchain-multi-evm-bridge","label":"Nockchain<->multi-EVM Bridge (Arbitrum/Optimism) Verification Candidate","reportSlug":"xchain-multi-evm-bridge","fixtureId":"xchain-multi-evm-bridge-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:c9c35cc927527b81661b41954c974ea0a5d21b5c5f8a7a7608784a33dbe73ce1","snapshotRoot":"e5abac4ada5d2ced","invariantPacks":[]}},"stepsPassed":1,"stepsTotal":1,"invariantsPassed":6,"invariantsTotal":6,"alertsTriggered":0,"snapshotsCaptured":2,"adapterObservationCount":0,"invariantPackCount":0},"report":{"reportId":"lab_xchain-multi-evm-bridge-v0_20260610225855223","fixtureId":"xchain-multi-evm-bridge-v0","generatedAt":"2026-06-10T22:58:55.223Z","app":{"name":"Nockchain<->multi-EVM Bridge (Arbitrum/Optimism)","slug":"xchain-multi-evm-bridge","version":"0.0.1","kernel":"xchain-multi-evm-model"},"environment":{"mode":"mock-fakenet","grpcEndpoint":"n/a","fakenetCommand":"model","notes":["Generalized cross-chain tester over the EVM chain registry (src/data/evm-chains.json): a correct Nockchain<->Arbitrum withdrawal with an Optimism endpoint.","Exercises chain-id-bound attestations, per-chain finality adequacy (Arbitrum L1-batch floor 64), per-(destChainId,id) replay namespacing, distinct EIP-712 domain separators, optimistic challenge-window respect, and registry-driven HTLC hashlock (Nockchain tip5 + Arbitrum keccak256).","Honest limit: a single-process MODEL of multiple chains (model-attested). See docs/xchain-security-model.md."]},"summary":{"status":"pass","stepsPassed":1,"stepsFailed":0,"invariantsPassed":6,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":2,"durationMs":17,"expectRejected":false,"rawStatus":"pass"},"invariantPacks":[],"steps":[{"id":"observe","type":"bridge","title":"Observe terminal joint multi-EVM state","status":"pass","expectation":"xchain.observed == true","observed":"true","beforeHash":"e5abf48bfe46f5bc","afterHash":"e5abac4ada5d2ced","stateDiffs":[{"path":"xchain.observed","before":"undefined","after":"true"}],"durationMs":19}],"invariants":[{"id":"chainid-bound","title":"Attestations bind their target chain id (no cross-EVM replay)","severity":"critical","status":"pass","observed":"all 1 message(s) bind their target chain id","expected":"every cross-chain message's signed payload binds its targetChainId (raw txs use EIP-155), under xchain.crosschain"},{"id":"finality-adequacy","title":"Each settle meets its chain's finality floor + basis","severity":"critical","status":"pass","observed":"all 1 settle(s) meet their chain's finality floor + basis","expected":"each settle has confirmations >= max(app, registry floor[chain]) on the chain's required basis, under xchain.finality"},{"id":"replay-namespacing","title":"Replay keyed per (destChainId, id)","severity":"critical","status":"pass","observed":"all 1 message(s) unique per (destChainId,id), source-scoped, correctly routed","expected":"each message unique per (destChainId,id), carries a sourceChainId, routed to its expected chain, under xchain.routing"},{"id":"domain-separator","title":"Distinct EIP-712 domain per endpoint; authorizations bound","severity":"critical","status":"pass","observed":"2 endpoint(s) have distinct, chain-bound, re-derived domains; authorizations match","expected":"each endpoint has a distinct (chainId,verifyingContract) domain re-derived at verify; authorizations valid only at their bound endpoint, under xchain.domain"},{"id":"challenge-window","title":"No optimistic withdrawal credited before finalization","severity":"critical","status":"pass","observed":"optimistic-rollup withdrawal(s) credited only after L1-finalization / challenge window / LP-bond","expected":"no optimistic-rollup withdrawal credited before L1-finalization or its challenge window closes, under xchain.exits"},{"id":"hashlock-algo","title":"Each HTLC leg uses a hash its chain can compute (registry-driven)","severity":"critical","status":"pass","observed":"all 2 leg(s) lock the shared preimage under a chain-computable hash; commitments distinct","expected":"each HTLC leg locks the shared preimage under a hash its own chain can compute, with distinct per-chain commitments, under xchain.htlc"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"e5abf48bfe46f5bc","state":{"xchain":{"crosschain":{"messages":[{"id":"wd-001","targetChainId":42161,"attestation":{"signedPayloadIncludesChainId":true,"signedChainId":42161,"eip155":true},"attestedBy":["n1","n2","n3"]}]},"finality":{"appRequiredConfirmations":0,"settles":[{"id":"wd-001","chainId":42161,"confirmations":64,"confirmationBasis":"L1-batch","basedOnSoftConfirm":false}]},"routing":{"processed":[{"id":"wd-001","sourceChainId":0,"destChainId":42161,"sourceTxHash":"0xabc"}],"expectedRoute":{"wd-001":42161}},"domain":{"endpoints":[{"chainId":42161,"verifyingContract":"0xArb000000000000000000000000000000000001","domain":{"name":"NockBridge","version":"1","chainId":42161,"verifyingContract":"0xArb000000000000000000000000000000000001"},"derivesChainIdAtVerify":true},{"chainId":10,"verifyingContract":"0xOpt000000000000000000000000000000000002","domain":{"name":"NockBridge","version":"1","chainId":10,"verifyingContract":"0xOpt000000000000000000000000000000000002"},"derivesChainIdAtVerify":true}],"authorizations":[{"boundDomainHash":"4e9b6cc4983a05c5793e2481a70cbfb3844356047cbb98f2b004cd78dac6b93e","usedAtEndpoint":42161}]},"exits":{"now":700000,"withdrawals":[{"id":"wd-001","chainId":42161,"l2BurnBlockTime":0,"creditedAtTime":0,"finalizedOnL1":true,"instantLPexit":false}]},"htlc":{"preimage":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","legs":[{"chainId":0,"chain":"nockchain","hashAlgo":"tip5","commitment":"t1p5cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc","derivedFromSharedPreimage":true},{"chainId":42161,"chain":"arbitrum","hashAlgo":"keccak256","commitment":"keccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","derivedFromSharedPreimage":true}]}}}},{"label":"After observe","stateHash":"e5abac4ada5d2ced","state":{"xchain":{"crosschain":{"messages":[{"id":"wd-001","targetChainId":42161,"attestation":{"signedPayloadIncludesChainId":true,"signedChainId":42161,"eip155":true},"attestedBy":["n1","n2","n3"]}]},"finality":{"appRequiredConfirmations":0,"settles":[{"id":"wd-001","chainId":42161,"confirmations":64,"confirmationBasis":"L1-batch","basedOnSoftConfirm":false}]},"routing":{"processed":[{"id":"wd-001","sourceChainId":0,"destChainId":42161,"sourceTxHash":"0xabc"}],"expectedRoute":{"wd-001":42161}},"domain":{"endpoints":[{"chainId":42161,"verifyingContract":"0xArb000000000000000000000000000000000001","domain":{"name":"NockBridge","version":"1","chainId":42161,"verifyingContract":"0xArb000000000000000000000000000000000001"},"derivesChainIdAtVerify":true},{"chainId":10,"verifyingContract":"0xOpt000000000000000000000000000000000002","domain":{"name":"NockBridge","version":"1","chainId":10,"verifyingContract":"0xOpt000000000000000000000000000000000002"},"derivesChainIdAtVerify":true}],"authorizations":[{"boundDomainHash":"4e9b6cc4983a05c5793e2481a70cbfb3844356047cbb98f2b004cd78dac6b93e","usedAtEndpoint":42161}]},"exits":{"now":700000,"withdrawals":[{"id":"wd-001","chainId":42161,"l2BurnBlockTime":0,"creditedAtTime":0,"finalizedOnL1":true,"instantLPexit":false}]},"htlc":{"preimage":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","legs":[{"chainId":0,"chain":"nockchain","hashAlgo":"tip5","commitment":"t1p5cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc","derivedFromSharedPreimage":true},{"chainId":42161,"chain":"arbitrum","hashAlgo":"keccak256","commitment":"keccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","derivedFromSharedPreimage":true}]},"observed":true}},"stepId":"observe"}],"stateDiffs":[{"path":"xchain.observed","before":"undefined","after":"true"}],"nextActions":["Replace mock poke and peek execution with local fakenet adapter calls.","Replace command-backed fakenet metadata probes with stable gRPC-native probes once node surfaces are available.","Persist generated reports under a project workspace.","Add app-specific invariant packs as the NockApp interface stabilizes."]},"markdown":"# ✅ Nockchain<->multi-EVM Bridge (Arbitrum/Optimism) Lab Report\n\n> **PASS** — 1/1 steps · 6/6 invariants · 0 alerts · 17ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_xchain-multi-evm-bridge-v0_20260610225855223` |\n| Fixture | `xchain-multi-evm-bridge-v0` |\n| Status | ✅ pass |\n| Steps | 1 passed, 0 failed |\n| Invariants | 6 passed, 0 failed |\n| Alerts | 0 clear, 0 triggered |\n| Snapshots | 2 |\n\n## Steps\n\n- ✅ `observe` — true _(xchain.observed == true)_; e5abf48bfe46f5bc -> e5abac4ada5d2ced\n  - xchain.observed: undefined -> true\n\n## Invariants\n\n- ✅ `chainid-bound` — all 1 message(s) bind their target chain id _(expected every cross-chain message's signed payload binds its targetChainId (raw txs use EIP-155), under xchain.crosschain)_\n- ✅ `finality-adequacy` — all 1 settle(s) meet their chain's finality floor + basis _(expected each settle has confirmations >= max(app, registry floor[chain]) on the chain's required basis, under xchain.finality)_\n- ✅ `replay-namespacing` — all 1 message(s) unique per (destChainId,id), source-scoped, correctly routed _(expected each message unique per (destChainId,id), carries a sourceChainId, routed to its expected chain, under xchain.routing)_\n- ✅ `domain-separator` — 2 endpoint(s) have distinct, chain-bound, re-derived domains; authorizations match _(expected each endpoint has a distinct (chainId,verifyingContract) domain re-derived at verify; authorizations valid only at their bound endpoint, under xchain.domain)_\n- ✅ `challenge-window` — optimistic-rollup withdrawal(s) credited only after L1-finalization / challenge window / LP-bond _(expected no optimistic-rollup withdrawal credited before L1-finalization or its challenge window closes, under xchain.exits)_\n- ✅ `hashlock-algo` — all 2 leg(s) lock the shared preimage under a chain-computable hash; commitments distinct _(expected each HTLC leg locks the shared preimage under a hash its own chain can compute, with distinct per-chain commitments, under xchain.htlc)_\n\n## Alerts\n\n- No alert policies configured.\n\n## Adapter Observations\n\n- No adapter observations captured.\n\n## State Diffs\n\n- xchain.observed: undefined -> true\n\n## Snapshot Timeline\n\n- Initial state: e5abf48bfe46f5bc\n- After observe: e5abac4ada5d2ced\n\n","evidence":{"stateDiffCount":1,"snapshotCount":2,"alertCount":0,"triggeredAlertCount":0,"clearAlertCount":0,"triggeredCriticalAlertCount":0,"triggeredWarningAlertCount":0,"triggeredInfoAlertCount":0,"environmentMode":"mock-fakenet","grpcEndpoint":"n/a","environmentNoteCount":3,"nextActionCount":4,"firstNextAction":"Replace mock poke and peek execution with local fakenet adapter calls.","invariantPackCount":0,"invariantPackIds":[],"invariantPackDomains":[],"firstInvariantPackPath":"","changedPaths":["xchain.observed"],"markdownPreview":"# ✅ Nockchain<->multi-EVM Bridge (Arbitrum/Optimism) Lab Report"}}