ccip-router 0.1.0 → 0.1.1

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 CHANGED
@@ -6,6 +6,32 @@ EIP-3668 defines how clients talk to CCIP-Read gateways. It says nothing about h
6
6
 
7
7
  No ENS required. No agents required. Any CCIP-Read project can plug in a resolver and get a mesh-ready gateway in minutes.
8
8
 
9
+ **→ [Integration guide](GUIDE.md)** — install, quickstart, attestation setup, contracts, mesh join.
10
+
11
+ ---
12
+
13
+ ## What you can build
14
+
15
+ ccip-router is a general-purpose CCIP-Read gateway. The resolver function is yours — the mesh, signing, and attestation pipeline come wired up around it.
16
+
17
+ **ENS name resolution**
18
+ Point an ENS `wildcard` or `offchainLookup` resolver at your gateway. ccip-router handles the EIP-3668 `/{sender}/{data}.json` endpoint, signs every response, and replicates it to peer nodes — so your ENS names stay live even if one gateway goes down.
19
+
20
+ **Off-chain data for on-chain contracts**
21
+ Any smart contract that uses `OffchainLookup` can delegate reads to ccip-router. Store token metadata, user profiles, game state, or permit trees off-chain and serve them through a verifiable gateway rather than a trusted API.
22
+
23
+ **Audit trail for AI agents**
24
+ Wrap an AI inference function with `withWyriwe()`. Every call gets a cryptographic receipt: what input the agent received, what model processed it, what it returned — EIP-712 signed and replicated across the mesh. Useful anywhere you need a tamper-evident log of AI output (legal, compliance, multi-agent workflows).
25
+
26
+ **Model Context Protocol (MCP) gateway**
27
+ Run ccip-router as the transport layer for an MCP server. Tool calls arrive as CCIP-Read requests; attestations prove what the model saw and returned. Any peer can verify a past call without trusting your node.
28
+
29
+ **Redundant resolver mesh**
30
+ Run the same namespace across multiple nodes. Records sync every five minutes over `GET /records`. If one node goes offline its records are already on the others — no single point of failure, no custom failover logic.
31
+
32
+ **Any verifiable off-chain lookup**
33
+ If your contract needs off-chain data and you want proof it wasn't tampered with, ccip-router gives you the signed record, the peer-replicated history, and an optional on-chain anchor — all from a single resolver function.
34
+
9
35
  ---
10
36
 
11
37
  ## Architecture
@@ -97,14 +123,15 @@ Both contracts are permissionless — no owner, no admin. One deployment per cha
97
123
  |---|---|---|
98
124
  | `AttestationIndex` | [`0x107D706112225aC57eCf6692FBbDC283fb6E3698`](https://sepolia.etherscan.io/address/0x107D706112225aC57eCf6692FBbDC283fb6E3698) | Anchors EIP-712 `WyriweAttestation` records on-chain. Stores `signerOf[commitmentHash]` and `commitmentOf[inputHash]`. |
99
125
  | `NodeRegistry` | [`0x6be4966596A9CBaa7260ab6EbbFFA69bBC9a42b7`](https://sepolia.etherscan.io/address/0x6be4966596A9CBaa7260ab6EbbFFA69bBC9a42b7) | Public directory of nodes. `register(url, sig)` proves key ownership via EIP-191 — the relayer (`msg.sender`) does not need to be the signing key. |
126
+ | `WyriweAttestationVerifier` | [`0x9515D6e53D2D45C1CFE6181943ca11C150C2bf61`](https://sepolia.etherscan.io/address/0x9515D6e53D2D45C1CFE6181943ca11C150C2bf61) | ERC-8183 `IAttestationVerifier` implementation. `verify(commitmentHash, abi.encode(WyriweAttestation, sig))` — recovers signer, recomputes OCP commitment, returns bool. No external calls. |
100
127
 
101
128
  Deployed by [`0xFf9a176577Fb42b6bc9c19fd05a241e8fCd0ca14`](https://sepolia.etherscan.io/address/0xFf9a176577Fb42b6bc9c19fd05a241e8fCd0ca14) · Solc 0.8.24 · optimizer 200 runs.
102
129
 
103
130
  **To use on Sepolia:** open the admin panel → Deploy contracts → select Sepolia → "Use these addresses →". Addresses are saved to config automatically, no deployment needed.
104
131
 
105
- **To deploy to another chain:** open the admin panel → Deploy contracts → select the chain → connect wallet → two transactions (one per contract). No private key is stored — MetaMask signs everything in-browser.
132
+ **To deploy to another chain:** open the admin panel → Deploy contracts → select the chain → connect wallet → three transactions (one per contract). No private key is stored — MetaMask signs everything in-browser.
106
133
 
107
- Source: [`contracts/AttestationIndex.sol`](contracts/AttestationIndex.sol) · [`contracts/NodeRegistry.sol`](contracts/NodeRegistry.sol)
134
+ Source: [`contracts/AttestationIndex.sol`](contracts/AttestationIndex.sol) · [`contracts/NodeRegistry.sol`](contracts/NodeRegistry.sol) · [`contracts/WyriweAttestationVerifier.sol`](contracts/WyriweAttestationVerifier.sol)
108
135
 
109
136
  ---
110
137
 
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ /// @title IAttestationVerifier
5
+ /// @notice ERC-8183 attestation verifier interface.
6
+ /// Called by settlement contracts via the attested complete() overload:
7
+ /// IAttestationVerifier.verify(job.reason, proof)
8
+ /// The verifier owns the proof encoding scheme entirely.
9
+ interface IAttestationVerifier {
10
+ function verify(bytes32 attestationHash, bytes calldata proof) external view returns (bool);
11
+ }
@@ -0,0 +1,117 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ import { IAttestationVerifier } from "./IAttestationVerifier.sol";
5
+
6
+ /// @title WyriweAttestationVerifier
7
+ /// @notice IAttestationVerifier implementation for WYRIWE / OCP attestations.
8
+ ///
9
+ /// Mapping for ERC-8183 attested settlement:
10
+ /// attestationHash = commitmentHash
11
+ /// = keccak256(abi.encode(agentId, modelHash, inputHash, outputHash, timestamp))
12
+ /// proof = abi.encode(WyriweAttestation attestation, bytes signature)
13
+ ///
14
+ /// verify() recovers the gateway signer from the EIP-712 signature, recomputes
15
+ /// commitmentHash from the decoded struct, and checks both against attestationHash.
16
+ /// No external contract calls — fully self-contained.
17
+ contract WyriweAttestationVerifier is IAttestationVerifier {
18
+
19
+ // ── Types ─────────────────────────────────────────────────────────────────
20
+
21
+ struct WyriweAttestation {
22
+ bytes32 agentId;
23
+ address registry; // ERC-8004 registry — EIP-712 verifyingContract
24
+ bytes32 modelHash;
25
+ bytes32 rawInputHash;
26
+ bytes32 sanitizationPipelineHash;
27
+ bytes32 inputHash; // WYRIWE anchor — must be included in commitmentHash
28
+ bytes32 outputHash;
29
+ bytes32 commitmentHash; // OCP observation commitment — this == attestationHash
30
+ uint256 timestamp;
31
+ }
32
+
33
+ // ── Constants ─────────────────────────────────────────────────────────────
34
+
35
+ bytes32 private constant DOMAIN_TYPEHASH = keccak256(
36
+ "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
37
+ );
38
+
39
+ bytes32 private constant ATTESTATION_TYPEHASH = keccak256(
40
+ "WyriweAttestation(bytes32 agentId,address registry,bytes32 modelHash,"
41
+ "bytes32 rawInputHash,bytes32 sanitizationPipelineHash,bytes32 inputHash,"
42
+ "bytes32 outputHash,bytes32 commitmentHash,uint256 timestamp)"
43
+ );
44
+
45
+ // ── IAttestationVerifier ──────────────────────────────────────────────────
46
+
47
+ /// @notice Verify a WYRIWE attestation proof.
48
+ /// @param attestationHash The commitmentHash stored as job.reason in ERC-8183.
49
+ /// @param proof abi.encode(WyriweAttestation attestation, bytes signature)
50
+ /// @return true if:
51
+ /// 1. The recomputed OCP commitmentHash matches attestationHash.
52
+ /// 2. The EIP-712 signature over the struct is valid (non-zero signer recovered).
53
+ function verify(
54
+ bytes32 attestationHash,
55
+ bytes calldata proof
56
+ ) external view returns (bool) {
57
+ (WyriweAttestation memory a, bytes memory sig) = abi.decode(
58
+ proof,
59
+ (WyriweAttestation, bytes)
60
+ );
61
+
62
+ // ── 1. Recompute and check commitmentHash ──────────────────────────
63
+ // OCP observation commitment: binds agentId, modelHash, inputHash (WYRIWE anchor),
64
+ // outputHash, and timestamp. inputHash is an explicit named field — independently
65
+ // verifiable from the struct without trusting the verifier for the binding.
66
+ bytes32 recomputed = keccak256(abi.encode(
67
+ a.agentId,
68
+ a.modelHash,
69
+ a.inputHash,
70
+ a.outputHash,
71
+ a.timestamp
72
+ ));
73
+ if (recomputed != attestationHash) return false;
74
+ if (a.commitmentHash != attestationHash) return false;
75
+
76
+ // ── 2. Verify EIP-712 signature ────────────────────────────────────
77
+ // Domain: name="WyriweAttestation", version="1", chainId=block.chainid,
78
+ // verifyingContract=a.registry (ERC-8004 registry, NOT this contract).
79
+ bytes32 domainSeparator = keccak256(abi.encode(
80
+ DOMAIN_TYPEHASH,
81
+ keccak256("WyriweAttestation"),
82
+ keccak256("1"),
83
+ block.chainid,
84
+ a.registry
85
+ ));
86
+
87
+ bytes32 structHash = keccak256(abi.encode(
88
+ ATTESTATION_TYPEHASH,
89
+ a.agentId, a.registry, a.modelHash,
90
+ a.rawInputHash, a.sanitizationPipelineHash,
91
+ a.inputHash, a.outputHash,
92
+ a.commitmentHash, a.timestamp
93
+ ));
94
+
95
+ bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
96
+ address signer = _recover(digest, sig);
97
+
98
+ return signer != address(0);
99
+ }
100
+
101
+ // ── Internal ──────────────────────────────────────────────────────────────
102
+
103
+ function _recover(bytes32 digest, bytes memory sig) internal pure returns (address) {
104
+ if (sig.length != 65) return address(0);
105
+ bytes32 r;
106
+ bytes32 s;
107
+ uint8 v;
108
+ assembly {
109
+ r := mload(add(sig, 32))
110
+ s := mload(add(sig, 64))
111
+ v := byte(0, mload(add(sig, 96)))
112
+ }
113
+ if (v < 27) v += 27;
114
+ if (v != 27 && v != 28) return address(0);
115
+ return ecrecover(digest, v, r, s);
116
+ }
117
+ }
@@ -102,6 +102,22 @@ export declare const ATTESTATION_INDEX_ABI: readonly [{
102
102
  readonly indexed: false;
103
103
  }];
104
104
  }];
105
+ export declare const WYRIWE_ATTESTATION_VERIFIER_ABI: readonly [{
106
+ readonly type: "function";
107
+ readonly name: "verify";
108
+ readonly inputs: readonly [{
109
+ readonly name: "attestationHash";
110
+ readonly type: "bytes32";
111
+ }, {
112
+ readonly name: "proof";
113
+ readonly type: "bytes";
114
+ }];
115
+ readonly outputs: readonly [{
116
+ readonly name: "";
117
+ readonly type: "bool";
118
+ }];
119
+ readonly stateMutability: "view";
120
+ }];
105
121
  export declare const NODE_REGISTRY_ABI: readonly [{
106
122
  readonly type: "function";
107
123
  readonly name: "register";
@@ -1 +1 @@
1
- {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../../src/chain/abi.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDxB,CAAA;AAEV,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCpB,CAAA"}
1
+ {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../../src/chain/abi.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDxB,CAAA;AAEV,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;EAWlC,CAAA;AAEV,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCpB,CAAA"}
package/dist/chain/abi.js CHANGED
@@ -55,6 +55,18 @@ export const ATTESTATION_INDEX_ABI = [
55
55
  ],
56
56
  },
57
57
  ];
58
+ export const WYRIWE_ATTESTATION_VERIFIER_ABI = [
59
+ {
60
+ type: 'function',
61
+ name: 'verify',
62
+ inputs: [
63
+ { name: 'attestationHash', type: 'bytes32' },
64
+ { name: 'proof', type: 'bytes' },
65
+ ],
66
+ outputs: [{ name: '', type: 'bool' }],
67
+ stateMutability: 'view',
68
+ },
69
+ ];
58
70
  export const NODE_REGISTRY_ABI = [
59
71
  {
60
72
  type: 'function', name: 'register',
@@ -1 +1 @@
1
- {"version":3,"file":"abi.js","sourceRoot":"","sources":["../../src/chain/abi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"abi.js","sourceRoot":"","sources":["../../src/chain/abi.ts"],"names":[],"mappings":"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"}
package/dist/lib.d.ts CHANGED
@@ -6,7 +6,7 @@ export type { DB, MeshRecord, PeerState } from './db/types.js';
6
6
  export { publishAttestation, checkOnChain } from './chain/publish.js';
7
7
  export type { ChainOpts, PublishResult, OnChainProof } from './chain/publish.js';
8
8
  export { registerNode } from './chain/register.js';
9
- export { ATTESTATION_INDEX_ABI, NODE_REGISTRY_ABI } from './chain/abi.js';
9
+ export { ATTESTATION_INDEX_ABI, NODE_REGISTRY_ABI, WYRIWE_ATTESTATION_VERIFIER_ABI } from './chain/abi.js';
10
10
  export { makeVni, verifyVni, fetchPeerVni } from './mesh/vni.js';
11
11
  export type { SignedVni, VniDocument } from './mesh/vni.js';
12
12
  //# sourceMappingURL=lib.d.ts.map
package/dist/lib.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
package/dist/lib.js CHANGED
@@ -3,6 +3,6 @@ export { CcipRouter } from './router/index.js';
3
3
  export { withWyriwe } from './attestation/withWyriwe.js';
4
4
  export { publishAttestation, checkOnChain } from './chain/publish.js';
5
5
  export { registerNode } from './chain/register.js';
6
- export { ATTESTATION_INDEX_ABI, NODE_REGISTRY_ABI } from './chain/abi.js';
6
+ export { ATTESTATION_INDEX_ABI, NODE_REGISTRY_ABI, WYRIWE_ATTESTATION_VERIFIER_ABI } from './chain/abi.js';
7
7
  export { makeVni, verifyVni, fetchPeerVni } from './mesh/vni.js';
8
8
  //# sourceMappingURL=lib.js.map
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccip-router",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "The coordination layer CCIP-Read was missing. Peer sync, deduplication, and cryptographic attestation for any CCIP-Read gateway.",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -23,16 +23,25 @@
23
23
  "dist/lib.d.ts.map",
24
24
  "dist/mesh",
25
25
  "dist/router",
26
+ "contracts/IAttestationVerifier.sol",
26
27
  "contracts/AttestationIndex.sol",
27
- "contracts/NodeRegistry.sol"
28
+ "contracts/NodeRegistry.sol",
29
+ "contracts/WyriweAttestationVerifier.sol"
28
30
  ],
29
31
  "keywords": [
30
- "ccip-read", "eip-3668", "ens", "ethereum", "gateway",
31
- "attestation", "wyriwe", "erc-8004", "ocp"
32
+ "ccip-read",
33
+ "eip-3668",
34
+ "ens",
35
+ "ethereum",
36
+ "gateway",
37
+ "attestation",
38
+ "wyriwe",
39
+ "erc-8004",
40
+ "ocp"
32
41
  ],
33
42
  "repository": {
34
43
  "type": "git",
35
- "url": "https://github.com/Echo-Merlini/ccip-router.git"
44
+ "url": "git+https://github.com/Echo-Merlini/ccip-router.git"
36
45
  },
37
46
  "homepage": "https://github.com/Echo-Merlini/ccip-router#readme",
38
47
  "scripts": {