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 +29 -2
- package/contracts/IAttestationVerifier.sol +11 -0
- package/contracts/WyriweAttestationVerifier.sol +117 -0
- package/dist/chain/abi.d.ts +16 -0
- package/dist/chain/abi.d.ts.map +1 -1
- package/dist/chain/abi.js +12 -0
- package/dist/chain/abi.js.map +1 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/package.json +14 -5
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 →
|
|
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
|
+
}
|
package/dist/chain/abi.d.ts
CHANGED
|
@@ -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";
|
package/dist/chain/abi.d.ts.map
CHANGED
|
@@ -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',
|
package/dist/chain/abi.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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.
|
|
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",
|
|
31
|
-
"
|
|
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": {
|