@varun-ai07/covenant-mcp 1.2.0 → 1.2.2
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 +485 -398
- package/dist/abis/AgentWallet.json +415 -0
- package/dist/abis/COVENANTRouter.json +173 -0
- package/dist/abis/CapabilityVerifier.json +213 -0
- package/dist/abis/Groth16Verifier.json +36 -0
- package/dist/abis/Groth16VerifierCapability.json +36 -0
- package/dist/abis/Groth16VerifierReputation.json +36 -0
- package/dist/abis/LitProtocolIntegration.json +703 -0
- package/dist/abis/ReputationVerifier.json +213 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +38 -1
- package/dist/config.js.map +1 -1
- package/dist/handlers/transactions.d.ts.map +1 -1
- package/dist/handlers/transactions.js +274 -27
- package/dist/handlers/transactions.js.map +1 -1
- package/dist/handlers/wallet.d.ts +3 -1
- package/dist/handlers/wallet.d.ts.map +1 -1
- package/dist/handlers/wallet.js +82 -2
- package/dist/handlers/wallet.js.map +1 -1
- package/dist/lib/cache.d.ts +53 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +154 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/events.d.ts +73 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +203 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/tools/batches.d.ts.map +1 -1
- package/dist/tools/batches.js +4 -3
- package/dist/tools/batches.js.map +1 -1
- package/dist/tools/collectives.d.ts.map +1 -1
- package/dist/tools/collectives.js +15 -6
- package/dist/tools/collectives.js.map +1 -1
- package/dist/tools/escrow.d.ts.map +1 -1
- package/dist/tools/escrow.js +8 -6
- package/dist/tools/escrow.js.map +1 -1
- package/dist/tools/insurance.d.ts.map +1 -1
- package/dist/tools/insurance.js +7 -4
- package/dist/tools/insurance.js.map +1 -1
- package/dist/tools/receipts.d.ts.map +1 -1
- package/dist/tools/receipts.js +49 -61
- package/dist/tools/receipts.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +52 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +217 -0
- package/dist/utils.js.map +1 -0
- package/package.json +1 -1
package/dist/utils.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COVENANT MCP Utilities
|
|
3
|
+
* Helper functions for encoding and data conversion
|
|
4
|
+
*/
|
|
5
|
+
import { pad, toHex } from "viem";
|
|
6
|
+
/**
|
|
7
|
+
* Convert a string to bytes32 format.
|
|
8
|
+
* Handles IPFS CIDs and other task description hashes.
|
|
9
|
+
*
|
|
10
|
+
* For strings <= 31 chars: Encodes as UTF-8 bytes, padded right
|
|
11
|
+
* For strings > 31 chars: Truncates to fit
|
|
12
|
+
* For hex strings starting with 0x: Validates length and pads if needed
|
|
13
|
+
*/
|
|
14
|
+
export function stringToBytes32(str) {
|
|
15
|
+
// If it's already a 0x-prefixed hex string
|
|
16
|
+
if (str.startsWith("0x")) {
|
|
17
|
+
// If it's exactly 66 chars (0x + 64 hex digits), it's already bytes32
|
|
18
|
+
if (str.length === 66) {
|
|
19
|
+
return str;
|
|
20
|
+
}
|
|
21
|
+
// If shorter, pad to 32 bytes (left-pad for numbers)
|
|
22
|
+
if (str.length < 66) {
|
|
23
|
+
return pad(str, { size: 32 });
|
|
24
|
+
}
|
|
25
|
+
// If longer, truncate
|
|
26
|
+
return str.slice(0, 66);
|
|
27
|
+
}
|
|
28
|
+
// For plaintext strings, encode to hex and pad
|
|
29
|
+
// Convert string to UTF-8 bytes, then to hex
|
|
30
|
+
const encoder = new TextEncoder();
|
|
31
|
+
const bytes = encoder.encode(str);
|
|
32
|
+
// bytes32 is 32 bytes, strings can use up to 31 bytes (last byte is length)
|
|
33
|
+
// For simplicity, we truncate to 31 bytes and pad
|
|
34
|
+
const truncatedBytes = bytes.slice(0, 31);
|
|
35
|
+
const hexString = toHex(truncatedBytes);
|
|
36
|
+
// Pad to 32 bytes (right-pad for string data)
|
|
37
|
+
return pad(hexString, { size: 32, dir: "right" });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convert an array of strings to bytes32 format.
|
|
41
|
+
*/
|
|
42
|
+
export function stringsToBytes32(strings) {
|
|
43
|
+
return strings.map(stringToBytes32);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Decode bytes32 back to string (for display purposes).
|
|
47
|
+
* Falls back to hex string if not UTF-8 decodable.
|
|
48
|
+
*/
|
|
49
|
+
export function bytes32ToString(bytes32) {
|
|
50
|
+
try {
|
|
51
|
+
// Remove 0x prefix and decode hex as UTF-8
|
|
52
|
+
const hex = bytes32.slice(2);
|
|
53
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
54
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
55
|
+
bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
|
|
56
|
+
}
|
|
57
|
+
// Find null terminator or trailing zeros
|
|
58
|
+
let end = bytes.findIndex(b => b === 0);
|
|
59
|
+
if (end === -1)
|
|
60
|
+
end = bytes.length;
|
|
61
|
+
const decoder = new TextDecoder();
|
|
62
|
+
return decoder.decode(bytes.slice(0, end));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// If decoding fails, return hex representation
|
|
66
|
+
return bytes32;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Convert a numeric ID to bytes32 format.
|
|
71
|
+
* Left-pads the number to 32 bytes.
|
|
72
|
+
*/
|
|
73
|
+
export function numberToBytes32(num) {
|
|
74
|
+
// Convert to hex and left-pad to 32 bytes
|
|
75
|
+
const hex = typeof num === 'bigint'
|
|
76
|
+
? `0x${num.toString(16)}`
|
|
77
|
+
: `0x${num.toString(16)}`;
|
|
78
|
+
return pad(hex, { size: 32 });
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate that a string is a valid bytes32.
|
|
82
|
+
*/
|
|
83
|
+
export function isBytes32(str) {
|
|
84
|
+
return /^0x[0-9a-fA-F]{64}$/.test(str);
|
|
85
|
+
}
|
|
86
|
+
// ============================================================
|
|
87
|
+
// IPFS Gateway Configuration with Fallbacks
|
|
88
|
+
// ============================================================
|
|
89
|
+
// Gateway priority list (dedicated Pinata first, then public gateways)
|
|
90
|
+
const IPFS_GATEWAYS = [
|
|
91
|
+
// Dedicated Pinata gateway (requires PINATA_GATEWAY in env)
|
|
92
|
+
process.env.PINATA_GATEWAY,
|
|
93
|
+
// Public Pinata gateway
|
|
94
|
+
"https://gateway.pinata.cloud",
|
|
95
|
+
// IPFS.io public gateway
|
|
96
|
+
"https://ipfs.io",
|
|
97
|
+
// Cloudflare IPFS gateway
|
|
98
|
+
"https://cloudflare-ipfs.com",
|
|
99
|
+
// dWeb gateway
|
|
100
|
+
"https://dweb.link",
|
|
101
|
+
].filter(Boolean);
|
|
102
|
+
// Cache for gateway health status
|
|
103
|
+
const gatewayHealth = new Map();
|
|
104
|
+
/**
|
|
105
|
+
* Get the best available IPFS gateway
|
|
106
|
+
*/
|
|
107
|
+
export function getBestGateway() {
|
|
108
|
+
// Check for dedicated gateway first
|
|
109
|
+
if (process.env.PINATA_GATEWAY) {
|
|
110
|
+
return process.env.PINATA_GATEWAY;
|
|
111
|
+
}
|
|
112
|
+
// Fall back to first available gateway
|
|
113
|
+
return IPFS_GATEWAYS[0] || "https://ipfs.io";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build an IPFS URL for a CID
|
|
117
|
+
*/
|
|
118
|
+
export function buildIpfsUrl(cid, gateway) {
|
|
119
|
+
const gw = gateway || getBestGateway();
|
|
120
|
+
// Handle different CID formats
|
|
121
|
+
if (cid.startsWith("Qm") || cid.startsWith("baf")) {
|
|
122
|
+
return `${gw}/ipfs/${cid}`;
|
|
123
|
+
}
|
|
124
|
+
// Already a URL
|
|
125
|
+
if (cid.startsWith("http")) {
|
|
126
|
+
return cid;
|
|
127
|
+
}
|
|
128
|
+
return `${gw}/ipfs/${cid}`;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Fetch from IPFS with gateway fallback
|
|
132
|
+
*/
|
|
133
|
+
export async function fetchFromIpfs(cid, timeoutMs = 30000) {
|
|
134
|
+
const errors = [];
|
|
135
|
+
// Sort gateways by health
|
|
136
|
+
const sortedGateways = [...IPFS_GATEWAYS].sort((a, b) => {
|
|
137
|
+
const healthA = gatewayHealth.get(a);
|
|
138
|
+
const healthB = gatewayHealth.get(b);
|
|
139
|
+
if (!healthA && !healthB)
|
|
140
|
+
return 0;
|
|
141
|
+
if (!healthA)
|
|
142
|
+
return 1;
|
|
143
|
+
if (!healthB)
|
|
144
|
+
return -1;
|
|
145
|
+
// Prefer lower latency and fewer failures
|
|
146
|
+
const scoreA = healthA.latency + (healthA.failures * 1000);
|
|
147
|
+
const scoreB = healthB.latency + (healthB.failures * 1000);
|
|
148
|
+
return scoreA - scoreB;
|
|
149
|
+
});
|
|
150
|
+
// Try each gateway in order
|
|
151
|
+
for (const gateway of sortedGateways) {
|
|
152
|
+
try {
|
|
153
|
+
const url = buildIpfsUrl(cid, gateway);
|
|
154
|
+
const controller = new AbortController();
|
|
155
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
156
|
+
const start = Date.now();
|
|
157
|
+
const response = await fetch(url, {
|
|
158
|
+
signal: controller.signal,
|
|
159
|
+
headers: {
|
|
160
|
+
"Accept": "application/json, text/plain, */*",
|
|
161
|
+
"User-Agent": "COVENANT-MCP/1.0",
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
clearTimeout(timeoutId);
|
|
165
|
+
if (response.ok) {
|
|
166
|
+
// Update health metrics
|
|
167
|
+
gatewayHealth.set(gateway, {
|
|
168
|
+
latency: Date.now() - start,
|
|
169
|
+
lastCheck: Date.now(),
|
|
170
|
+
failures: gatewayHealth.get(gateway)?.failures || 0,
|
|
171
|
+
});
|
|
172
|
+
return response;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
177
|
+
// Mark gateway as failed
|
|
178
|
+
const current = gatewayHealth.get(gateway) || { latency: 0, lastCheck: 0, failures: 0 };
|
|
179
|
+
gatewayHealth.set(gateway, {
|
|
180
|
+
...current,
|
|
181
|
+
failures: current.failures + 1,
|
|
182
|
+
lastCheck: Date.now(),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
throw new Error(`Failed to fetch ${cid} from all gateways: ${errors.map(e => e.message).join(", ")}`);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check gateway health
|
|
190
|
+
*/
|
|
191
|
+
export async function checkGatewayHealth() {
|
|
192
|
+
const results = {};
|
|
193
|
+
await Promise.all(IPFS_GATEWAYS.map(async (gateway) => {
|
|
194
|
+
try {
|
|
195
|
+
const start = Date.now();
|
|
196
|
+
const response = await fetch(`${gateway}/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn`, {
|
|
197
|
+
method: "HEAD",
|
|
198
|
+
signal: AbortSignal.timeout(5000),
|
|
199
|
+
});
|
|
200
|
+
const latency = Date.now() - start;
|
|
201
|
+
results[gateway] = {
|
|
202
|
+
healthy: response.ok,
|
|
203
|
+
latency,
|
|
204
|
+
};
|
|
205
|
+
gatewayHealth.set(gateway, {
|
|
206
|
+
latency,
|
|
207
|
+
lastCheck: Date.now(),
|
|
208
|
+
failures: response.ok ? 0 : (gatewayHealth.get(gateway)?.failures || 0) + 1,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
results[gateway] = { healthy: false, latency: -1 };
|
|
213
|
+
}
|
|
214
|
+
}));
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|