@settlemint/sdk-eas 2.5.5-mainee49fe3a ā 2.5.5-pr8504cfe3
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 +92 -579
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -28,8 +28,6 @@
|
|
|
28
28
|
|
|
29
29
|
- [About](#about)
|
|
30
30
|
- [Examples](#examples)
|
|
31
|
-
- [Complete workflow](#complete-workflow)
|
|
32
|
-
- [Demo portal issue](#demo-portal-issue)
|
|
33
31
|
- [Simple eas workflow](#simple-eas-workflow)
|
|
34
32
|
- [API Reference](#api-reference)
|
|
35
33
|
- [Functions](#functions)
|
|
@@ -61,480 +59,6 @@
|
|
|
61
59
|
The SettleMint EAS SDK provides a lightweight wrapper for the Ethereum Attestation Service (EAS), enabling developers to easily create, manage, and verify attestations within their applications. It simplifies the process of working with EAS by handling contract interactions, schema management, and The Graph integration, while ensuring proper integration with the SettleMint platform. This allows developers to quickly implement document verification, identity attestation, and other EAS-based features without manual setup.
|
|
62
60
|
## Examples
|
|
63
61
|
|
|
64
|
-
### Complete workflow
|
|
65
|
-
|
|
66
|
-
```ts
|
|
67
|
-
/**
|
|
68
|
-
* Complete EAS Workflow Example
|
|
69
|
-
*
|
|
70
|
-
* This script demonstrates the complete EAS workflow:
|
|
71
|
-
* 1. Deploy EAS contracts
|
|
72
|
-
* 2. Register a schema
|
|
73
|
-
* 3. Create attestations
|
|
74
|
-
* 4. Extract UIDs from transaction events
|
|
75
|
-
* 5. Query schema and attestation data
|
|
76
|
-
* 6. Validate attestations
|
|
77
|
-
*/
|
|
78
|
-
|
|
79
|
-
import { waitForTransactionReceipt } from "@settlemint/sdk-portal";
|
|
80
|
-
import type { Address, Hex } from "viem";
|
|
81
|
-
import { encodeAbiParameters, parseAbiParameters } from "viem";
|
|
82
|
-
import { ZERO_ADDRESS, ZERO_BYTES32, createEASClient } from "../eas.js";
|
|
83
|
-
|
|
84
|
-
async function completeWorkflow() {
|
|
85
|
-
console.log("š Complete EAS Workflow");
|
|
86
|
-
console.log("========================");
|
|
87
|
-
console.log("Demonstrating full EAS functionality with real data\n");
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
!process.env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT ||
|
|
91
|
-
!process.env.SETTLEMINT_ACCESS_TOKEN ||
|
|
92
|
-
!process.env.SETTLEMINT_DEPLOYER_ADDRESS
|
|
93
|
-
) {
|
|
94
|
-
console.error("ā Missing required environment variables");
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const deployerAddress = process.env.SETTLEMINT_DEPLOYER_ADDRESS as Address;
|
|
99
|
-
|
|
100
|
-
// Initialize client
|
|
101
|
-
const client = createEASClient({
|
|
102
|
-
instance: process.env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT,
|
|
103
|
-
accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
|
|
104
|
-
debug: true,
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
console.log("šļø Step 1: Deploy EAS Contracts");
|
|
108
|
-
const deployment = await client.deploy(deployerAddress);
|
|
109
|
-
console.log("ā
Contracts deployed successfully:");
|
|
110
|
-
console.log(` EAS Address: ${deployment.easAddress}`);
|
|
111
|
-
console.log(` Schema Registry: ${deployment.schemaRegistryAddress}`);
|
|
112
|
-
console.log();
|
|
113
|
-
|
|
114
|
-
console.log("š Step 2: Register Schema");
|
|
115
|
-
const schemaRegistration = await client.registerSchema(
|
|
116
|
-
{
|
|
117
|
-
fields: [
|
|
118
|
-
{ name: "userAddress", type: "address" },
|
|
119
|
-
{ name: "score", type: "uint256" },
|
|
120
|
-
{ name: "category", type: "string" },
|
|
121
|
-
{ name: "verified", type: "bool" },
|
|
122
|
-
],
|
|
123
|
-
resolver: ZERO_ADDRESS,
|
|
124
|
-
revocable: true,
|
|
125
|
-
},
|
|
126
|
-
deployerAddress,
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
// Extract real schema UID from transaction
|
|
130
|
-
const schemaReceipt = await waitForTransactionReceipt(schemaRegistration.hash, {
|
|
131
|
-
portalGraphqlEndpoint: process.env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT!,
|
|
132
|
-
accessToken: process.env.SETTLEMINT_ACCESS_TOKEN!,
|
|
133
|
-
timeout: 60000,
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
let realSchemaUID: Hex | null = null;
|
|
137
|
-
if (schemaReceipt.receipt?.events) {
|
|
138
|
-
const events = Array.isArray(schemaReceipt.receipt.events)
|
|
139
|
-
? schemaReceipt.receipt.events
|
|
140
|
-
: Object.values(schemaReceipt.receipt.events);
|
|
141
|
-
|
|
142
|
-
for (const event of events) {
|
|
143
|
-
if (
|
|
144
|
-
typeof event === "object" &&
|
|
145
|
-
event &&
|
|
146
|
-
"args" in event &&
|
|
147
|
-
event.args &&
|
|
148
|
-
typeof event.args === "object" &&
|
|
149
|
-
"uid" in event.args
|
|
150
|
-
) {
|
|
151
|
-
realSchemaUID = (event.args as { uid: string }).uid as Hex;
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
console.log("ā
Schema registered successfully:");
|
|
158
|
-
console.log(` Transaction Hash: ${schemaRegistration.hash}`);
|
|
159
|
-
console.log(` Extracted Schema UID: ${realSchemaUID}`);
|
|
160
|
-
console.log();
|
|
161
|
-
|
|
162
|
-
console.log("šÆ Step 3: Create Attestation");
|
|
163
|
-
const testData = encodeAbiParameters(
|
|
164
|
-
parseAbiParameters("address userAddress, uint256 score, string category, bool verified"),
|
|
165
|
-
[deployerAddress, BigInt(95), "developer", true],
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
const attestation = await client.attest(
|
|
169
|
-
{
|
|
170
|
-
schema: realSchemaUID!,
|
|
171
|
-
data: {
|
|
172
|
-
recipient: deployerAddress,
|
|
173
|
-
expirationTime: BigInt(0),
|
|
174
|
-
revocable: true,
|
|
175
|
-
refUID: ZERO_BYTES32,
|
|
176
|
-
data: testData,
|
|
177
|
-
value: BigInt(0),
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
deployerAddress,
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
// Extract real attestation UID from transaction
|
|
184
|
-
const attestationReceipt = await waitForTransactionReceipt(attestation.hash, {
|
|
185
|
-
portalGraphqlEndpoint: process.env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT!,
|
|
186
|
-
accessToken: process.env.SETTLEMINT_ACCESS_TOKEN!,
|
|
187
|
-
timeout: 60000,
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
let realAttestationUID: Hex | null = null;
|
|
191
|
-
if (attestationReceipt.receipt?.events) {
|
|
192
|
-
const events = Array.isArray(attestationReceipt.receipt.events)
|
|
193
|
-
? attestationReceipt.receipt.events
|
|
194
|
-
: Object.values(attestationReceipt.receipt.events);
|
|
195
|
-
|
|
196
|
-
for (const event of events) {
|
|
197
|
-
if (
|
|
198
|
-
typeof event === "object" &&
|
|
199
|
-
event &&
|
|
200
|
-
"args" in event &&
|
|
201
|
-
event.args &&
|
|
202
|
-
typeof event.args === "object" &&
|
|
203
|
-
"uid" in event.args
|
|
204
|
-
) {
|
|
205
|
-
realAttestationUID = (event.args as { uid: string }).uid as Hex;
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
console.log("ā
Attestation created successfully:");
|
|
212
|
-
console.log(` Transaction Hash: ${attestation.hash}`);
|
|
213
|
-
console.log(` Extracted Attestation UID: ${realAttestationUID}`);
|
|
214
|
-
console.log();
|
|
215
|
-
|
|
216
|
-
console.log("š Step 4: Validate Data Existence");
|
|
217
|
-
|
|
218
|
-
// Test schema retrieval
|
|
219
|
-
console.log("š Testing Schema Retrieval:");
|
|
220
|
-
try {
|
|
221
|
-
const schema = await client.getSchema(realSchemaUID!);
|
|
222
|
-
console.log(` Schema Query: ${schema.uid ? "ā
SUCCESS" : "ā ļø No data returned"}`);
|
|
223
|
-
console.log(" Implementation: ā
Query executes successfully");
|
|
224
|
-
} catch (error) {
|
|
225
|
-
console.log(` ā Schema query failed: ${error}`);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Test attestation retrieval
|
|
229
|
-
console.log("š Testing Attestation Retrieval:");
|
|
230
|
-
try {
|
|
231
|
-
const attestationData = await client.getAttestation(realAttestationUID!);
|
|
232
|
-
console.log(` Attestation Query: ${attestationData.uid ? "ā
SUCCESS" : "ā ļø No data returned"}`);
|
|
233
|
-
console.log(" Implementation: ā
Query executes successfully");
|
|
234
|
-
} catch (error) {
|
|
235
|
-
console.log(` ā Attestation query failed: ${error}`);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Test validation
|
|
239
|
-
console.log("āļø Testing Attestation Validation:");
|
|
240
|
-
try {
|
|
241
|
-
const isValid = await client.isValidAttestation(realAttestationUID!);
|
|
242
|
-
console.log(` Validation Result: ${isValid ? "ā
VALID" : "ā INVALID"}`);
|
|
243
|
-
console.log(" Implementation: ā
Working - proves attestation exists");
|
|
244
|
-
} catch (error) {
|
|
245
|
-
console.log(` ā Validation failed: ${error}`);
|
|
246
|
-
}
|
|
247
|
-
console.log();
|
|
248
|
-
|
|
249
|
-
console.log("š EAS Implementation Status Report");
|
|
250
|
-
console.log("===================================");
|
|
251
|
-
console.log("ā
Contract Deployment: Working");
|
|
252
|
-
console.log("ā
Schema Registration: Working");
|
|
253
|
-
console.log("ā
Attestation Creation: Working");
|
|
254
|
-
console.log("ā
UID Extraction: Working");
|
|
255
|
-
console.log("ā
Attestation Validation: Working");
|
|
256
|
-
console.log("ā ļø Schema Queries: Implemented (Portal returns null)");
|
|
257
|
-
console.log("ā ļø Attestation Queries: Implemented (Portal returns null)");
|
|
258
|
-
console.log();
|
|
259
|
-
|
|
260
|
-
console.log("š Real Data Summary:");
|
|
261
|
-
console.log(`šļø EAS Contract: ${deployment.easAddress}`);
|
|
262
|
-
console.log(`š Schema Registry: ${deployment.schemaRegistryAddress}`);
|
|
263
|
-
console.log(`š Schema UID: ${realSchemaUID}`);
|
|
264
|
-
console.log(`šÆ Attestation UID: ${realAttestationUID}`);
|
|
265
|
-
console.log();
|
|
266
|
-
|
|
267
|
-
console.log("š Key Insights:");
|
|
268
|
-
console.log("⢠All write operations work correctly");
|
|
269
|
-
console.log("⢠All read method implementations are correct");
|
|
270
|
-
console.log("⢠Portal contract state queries return null (not an SDK issue)");
|
|
271
|
-
console.log("⢠Attestation validation proves data exists on-chain");
|
|
272
|
-
console.log("⢠UID extraction from transaction events works reliably");
|
|
273
|
-
console.log();
|
|
274
|
-
|
|
275
|
-
console.log("š§ For Production Use:");
|
|
276
|
-
console.log("⢠Use transaction receipts to extract UIDs");
|
|
277
|
-
console.log("⢠Consider The Graph subgraph for bulk queries");
|
|
278
|
-
console.log("⢠Validation methods can confirm attestation existence");
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
if (typeof require !== "undefined" && require.main === module) {
|
|
282
|
-
completeWorkflow().catch(console.error);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
export { completeWorkflow };
|
|
286
|
-
|
|
287
|
-
```
|
|
288
|
-
### Demo portal issue
|
|
289
|
-
|
|
290
|
-
```ts
|
|
291
|
-
/**
|
|
292
|
-
* Demo script to show Portal vs Besu RPC comparison
|
|
293
|
-
* Run this to demonstrate the issue with Portal GraphQL queries
|
|
294
|
-
*/
|
|
295
|
-
|
|
296
|
-
import { createPortalClient } from "@settlemint/sdk-portal";
|
|
297
|
-
import { loadEnv } from "@settlemint/sdk-utils/environment";
|
|
298
|
-
import { createLogger, requestLogger } from "@settlemint/sdk-utils/logging";
|
|
299
|
-
import { type Address, createPublicClient, type Hex, http } from "viem";
|
|
300
|
-
import type { introspection } from "../portal/portal-env.js";
|
|
301
|
-
|
|
302
|
-
// Test data from our deployment
|
|
303
|
-
const EAS_ADDRESS = "0x8da4813fe48efdb7fc7dd1bfee40fe20f01e53d5" as Address;
|
|
304
|
-
const SCHEMA_REGISTRY_ADDRESS = "0xe4aa2d08b2884d3673807f44f3248921808fd609" as Address;
|
|
305
|
-
const SCHEMA_UID = "0x08b2e2e97720789130096fe5442c7fb4e4e9e2b13b94da335f2d8fcb367de509" as Hex;
|
|
306
|
-
const ATTESTATION_UID = "0x525cdc37347b0472e4535513b0e555d482330ea7f3530bcad0053776779b8ae7" as Hex;
|
|
307
|
-
|
|
308
|
-
async function runDemo() {
|
|
309
|
-
console.log("Portal vs Besu RPC Comparison");
|
|
310
|
-
console.log("=============================\n");
|
|
311
|
-
|
|
312
|
-
// Load environment variables using SDK utilities
|
|
313
|
-
const env = await loadEnv(true, false);
|
|
314
|
-
const logger = createLogger();
|
|
315
|
-
|
|
316
|
-
if (!env.SETTLEMINT_ACCESS_TOKEN) {
|
|
317
|
-
console.error("ā Please set SETTLEMINT_ACCESS_TOKEN environment variable");
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
if (!env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT) {
|
|
322
|
-
console.error("ā Please set SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT environment variable");
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Use environment variables for RPC endpoint
|
|
327
|
-
const rpcUrl = env.SETTLEMINT_BLOCKCHAIN_NODE_JSON_RPC_ENDPOINT || env.SETTLEMINT_BLOCKCHAIN_NODE_OR_LOAD_BALANCER_JSON_RPC_ENDPOINT;
|
|
328
|
-
if (!rpcUrl) {
|
|
329
|
-
console.error("ā Please set SETTLEMINT_BLOCKCHAIN_NODE_JSON_RPC_ENDPOINT or SETTLEMINT_BLOCKCHAIN_NODE_OR_LOAD_BALANCER_JSON_RPC_ENDPOINT environment variable");
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// Create type-safe portal client using SDK
|
|
334
|
-
const { client: portalClient, graphql: portalGraphql } = createPortalClient<{
|
|
335
|
-
introspection: introspection;
|
|
336
|
-
disableMasking: true;
|
|
337
|
-
scalars: {
|
|
338
|
-
JSON: unknown;
|
|
339
|
-
};
|
|
340
|
-
}>(
|
|
341
|
-
{
|
|
342
|
-
instance: env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT,
|
|
343
|
-
accessToken: env.SETTLEMINT_ACCESS_TOKEN,
|
|
344
|
-
},
|
|
345
|
-
{
|
|
346
|
-
fetch: requestLogger(logger, "portal", fetch) as typeof fetch,
|
|
347
|
-
},
|
|
348
|
-
);
|
|
349
|
-
|
|
350
|
-
const besuClient = createPublicClient({
|
|
351
|
-
transport: http(rpcUrl, {
|
|
352
|
-
fetchOptions: {
|
|
353
|
-
headers: { "x-auth-token": env.SETTLEMINT_ACCESS_TOKEN },
|
|
354
|
-
},
|
|
355
|
-
}),
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
console.log("Configuration:");
|
|
359
|
-
console.log(`Portal: ${env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT}`);
|
|
360
|
-
console.log(`Besu RPC: ${rpcUrl}`);
|
|
361
|
-
console.log(`Schema UID: ${SCHEMA_UID}`);
|
|
362
|
-
console.log(`Attestation UID: ${ATTESTATION_UID}\n`);
|
|
363
|
-
|
|
364
|
-
// Test 1: isAttestationValid
|
|
365
|
-
console.log("TEST 1: isAttestationValid()");
|
|
366
|
-
console.log("============================\n");
|
|
367
|
-
|
|
368
|
-
try {
|
|
369
|
-
// Portal call with type-safe GraphQL
|
|
370
|
-
console.log("Portal GraphQL query:");
|
|
371
|
-
const validationQuery = portalGraphql(`
|
|
372
|
-
query IsAttestationValid($address: String!, $uid: String!) {
|
|
373
|
-
EAS(address: $address) {
|
|
374
|
-
isAttestationValid(uid: $uid)
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
`);
|
|
378
|
-
console.log("Query with variables:", {
|
|
379
|
-
address: EAS_ADDRESS,
|
|
380
|
-
uid: ATTESTATION_UID,
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
const portalValidResult = await portalClient.request(validationQuery, {
|
|
384
|
-
address: EAS_ADDRESS,
|
|
385
|
-
uid: ATTESTATION_UID,
|
|
386
|
-
});
|
|
387
|
-
console.log("\nPortal raw response:");
|
|
388
|
-
console.log(JSON.stringify(portalValidResult, null, 2));
|
|
389
|
-
|
|
390
|
-
// Besu call
|
|
391
|
-
console.log("\n\nBesu RPC call:");
|
|
392
|
-
console.log(`client.readContract({
|
|
393
|
-
address: "${EAS_ADDRESS}",
|
|
394
|
-
abi: EAS_ABI,
|
|
395
|
-
functionName: "isAttestationValid",
|
|
396
|
-
args: ["${ATTESTATION_UID}"]
|
|
397
|
-
})`);
|
|
398
|
-
|
|
399
|
-
const besuValidResult = await besuClient.readContract({
|
|
400
|
-
address: EAS_ADDRESS,
|
|
401
|
-
abi: [
|
|
402
|
-
{
|
|
403
|
-
inputs: [{ name: "uid", type: "bytes32" }],
|
|
404
|
-
name: "isAttestationValid",
|
|
405
|
-
outputs: [{ name: "", type: "bool" }],
|
|
406
|
-
stateMutability: "view",
|
|
407
|
-
type: "function",
|
|
408
|
-
},
|
|
409
|
-
],
|
|
410
|
-
functionName: "isAttestationValid",
|
|
411
|
-
args: [ATTESTATION_UID],
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
console.log("\nBesu raw response:", besuValidResult);
|
|
415
|
-
} catch (error) {
|
|
416
|
-
console.error("Error in validation test:", error);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// Test 2: getSchema
|
|
420
|
-
console.log("\n\nTEST 2: getSchema()");
|
|
421
|
-
console.log("==================\n");
|
|
422
|
-
|
|
423
|
-
try {
|
|
424
|
-
// Portal call with type-safe GraphQL
|
|
425
|
-
console.log("Portal GraphQL query:");
|
|
426
|
-
const schemaQuery = portalGraphql(`
|
|
427
|
-
query GetSchema($address: String!, $uid: String!) {
|
|
428
|
-
EASSchemaRegistry(address: $address) {
|
|
429
|
-
getSchema(uid: $uid) {
|
|
430
|
-
uid
|
|
431
|
-
resolver
|
|
432
|
-
revocable
|
|
433
|
-
schema
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
`);
|
|
438
|
-
console.log("Query with variables:", {
|
|
439
|
-
address: SCHEMA_REGISTRY_ADDRESS,
|
|
440
|
-
uid: SCHEMA_UID,
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
const portalSchemaResult = await portalClient.request(schemaQuery, {
|
|
444
|
-
address: SCHEMA_REGISTRY_ADDRESS,
|
|
445
|
-
uid: SCHEMA_UID,
|
|
446
|
-
});
|
|
447
|
-
console.log("\nPortal raw response:");
|
|
448
|
-
console.log(JSON.stringify(portalSchemaResult, null, 2));
|
|
449
|
-
|
|
450
|
-
// Besu call
|
|
451
|
-
console.log("\n\nBesu RPC call:");
|
|
452
|
-
console.log(`client.call({
|
|
453
|
-
to: "${SCHEMA_REGISTRY_ADDRESS}",
|
|
454
|
-
data: "0xa2ea7c6e${SCHEMA_UID.slice(2)}"
|
|
455
|
-
// getSchema(bytes32) function selector + schema UID
|
|
456
|
-
})`);
|
|
457
|
-
|
|
458
|
-
const besuSchemaResult = await besuClient.call({
|
|
459
|
-
to: SCHEMA_REGISTRY_ADDRESS,
|
|
460
|
-
data: `0xa2ea7c6e${SCHEMA_UID.slice(2)}` as Hex,
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
console.log("\nBesu raw response:");
|
|
464
|
-
console.log("- Data length:", besuSchemaResult.data?.length || 0, "bytes");
|
|
465
|
-
console.log("- Raw data (first 200 chars):", besuSchemaResult.data?.slice(0, 200) || "No data");
|
|
466
|
-
} catch (error) {
|
|
467
|
-
console.error("Error in schema test:", error);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Test 3: getAttestation
|
|
471
|
-
console.log("\n\nTEST 3: getAttestation()");
|
|
472
|
-
console.log("========================\n");
|
|
473
|
-
|
|
474
|
-
try {
|
|
475
|
-
// Portal call with type-safe GraphQL
|
|
476
|
-
console.log("Portal GraphQL query:");
|
|
477
|
-
const attestationQuery = portalGraphql(`
|
|
478
|
-
query GetAttestation($address: String!, $uid: String!) {
|
|
479
|
-
EAS(address: $address) {
|
|
480
|
-
getAttestation(uid: $uid) {
|
|
481
|
-
uid
|
|
482
|
-
schema
|
|
483
|
-
attester
|
|
484
|
-
recipient
|
|
485
|
-
time
|
|
486
|
-
expirationTime
|
|
487
|
-
revocable
|
|
488
|
-
refUID
|
|
489
|
-
data
|
|
490
|
-
revocationTime
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
`);
|
|
495
|
-
console.log("Query with variables:", {
|
|
496
|
-
address: EAS_ADDRESS,
|
|
497
|
-
uid: ATTESTATION_UID,
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
const portalAttestationResult = await portalClient.request(attestationQuery, {
|
|
501
|
-
address: EAS_ADDRESS,
|
|
502
|
-
uid: ATTESTATION_UID,
|
|
503
|
-
});
|
|
504
|
-
console.log("\nPortal raw response:");
|
|
505
|
-
console.log(JSON.stringify(portalAttestationResult, null, 2));
|
|
506
|
-
|
|
507
|
-
// Besu call
|
|
508
|
-
console.log("\n\nBesu RPC call:");
|
|
509
|
-
console.log(`client.call({
|
|
510
|
-
to: "${EAS_ADDRESS}",
|
|
511
|
-
data: "0xa3112a64${ATTESTATION_UID.slice(2)}"
|
|
512
|
-
// getAttestation(bytes32) function selector + attestation UID
|
|
513
|
-
})`);
|
|
514
|
-
|
|
515
|
-
const besuAttestationResult = await besuClient.call({
|
|
516
|
-
to: EAS_ADDRESS,
|
|
517
|
-
data: `0xa3112a64${ATTESTATION_UID.slice(2)}` as Hex,
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
console.log("\nBesu raw response:");
|
|
521
|
-
console.log("- Data length:", besuAttestationResult.data?.length || 0, "bytes");
|
|
522
|
-
console.log("- Raw data (first 200 chars):", besuAttestationResult.data?.slice(0, 200) || "No data");
|
|
523
|
-
} catch (error) {
|
|
524
|
-
console.error("Error in attestation test:", error);
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
console.log("\n\nComparison complete");
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// Run the demo
|
|
531
|
-
if (require.main === module) {
|
|
532
|
-
runDemo().catch(console.error);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
export { runDemo };
|
|
536
|
-
|
|
537
|
-
```
|
|
538
62
|
### Simple eas workflow
|
|
539
63
|
|
|
540
64
|
```ts
|
|
@@ -550,7 +74,7 @@ export { runDemo };
|
|
|
550
74
|
|
|
551
75
|
import type { Address, Hex } from "viem";
|
|
552
76
|
import { decodeAbiParameters, encodeAbiParameters, parseAbiParameters } from "viem";
|
|
553
|
-
import { ZERO_ADDRESS, ZERO_BYTES32, createEASClient } from "
|
|
77
|
+
import { ZERO_ADDRESS, ZERO_BYTES32, createEASClient } from "@settlemint/sdk-eas";
|
|
554
78
|
|
|
555
79
|
const CONFIG = {
|
|
556
80
|
instance: process.env.SETTLEMINT_PORTAL_GRAPHQL_ENDPOINT,
|
|
@@ -599,8 +123,7 @@ async function runEASWorkflow() {
|
|
|
599
123
|
console.log("š Simple EAS SDK Workflow");
|
|
600
124
|
console.log("===========================\n");
|
|
601
125
|
|
|
602
|
-
let
|
|
603
|
-
let schemaResult: { hash: Hex } | undefined;
|
|
126
|
+
let _deployedAddresses: { easAddress: Address; schemaRegistryAddress: Address };
|
|
604
127
|
|
|
605
128
|
// Step 1: Initialize EAS Client
|
|
606
129
|
console.log("š Step 1: Initialize EAS Client");
|
|
@@ -622,7 +145,7 @@ async function runEASWorkflow() {
|
|
|
622
145
|
console.log(` EAS: ${deployment.easAddress}`);
|
|
623
146
|
console.log(` Schema Registry: ${deployment.schemaRegistryAddress}\n`);
|
|
624
147
|
|
|
625
|
-
|
|
148
|
+
_deployedAddresses = {
|
|
626
149
|
easAddress: deployment.easAddress,
|
|
627
150
|
schemaRegistryAddress: deployment.schemaRegistryAddress,
|
|
628
151
|
};
|
|
@@ -640,7 +163,7 @@ async function runEASWorkflow() {
|
|
|
640
163
|
// Step 3: Register Schema
|
|
641
164
|
console.log("š Step 3: Register Schema");
|
|
642
165
|
try {
|
|
643
|
-
schemaResult = await client.registerSchema(
|
|
166
|
+
const schemaResult = await client.registerSchema(
|
|
644
167
|
{
|
|
645
168
|
fields: [
|
|
646
169
|
{ name: "user", type: "address", description: "User's wallet address" },
|
|
@@ -713,55 +236,68 @@ async function runEASWorkflow() {
|
|
|
713
236
|
|
|
714
237
|
// Step 5: Retrieve Schema
|
|
715
238
|
console.log("š Step 5: Retrieve Schema");
|
|
716
|
-
if (!schemaResult) {
|
|
717
|
-
console.log("ā ļø No schema registered, skipping retrieval test\n");
|
|
718
|
-
} else {
|
|
719
|
-
try {
|
|
720
|
-
const schema = await client.getSchema(schemaResult.hash);
|
|
721
|
-
console.log("ā
Schema retrieved successfully");
|
|
722
|
-
console.log(` UID: ${schema.uid}`);
|
|
723
|
-
console.log(` Resolver: ${schema.resolver}`);
|
|
724
|
-
console.log(` Revocable: ${schema.revocable}`);
|
|
725
|
-
console.log(` Schema: ${schema.schema}\n`);
|
|
726
|
-
} catch (error) {
|
|
727
|
-
console.log("ā ļø Schema retrieval failed:");
|
|
728
|
-
console.log(` ${error}\n`);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
// Step 6: Check Attestation Validity
|
|
733
|
-
console.log("š Step 6: Check Attestation Validity");
|
|
734
239
|
try {
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
console.log(
|
|
739
|
-
console.log(`
|
|
740
|
-
console.log(`
|
|
240
|
+
const schema = await client.getSchema(schemaResult.hash);
|
|
241
|
+
console.log("ā
Schema retrieved successfully");
|
|
242
|
+
console.log(` UID: ${schema.uid}`);
|
|
243
|
+
console.log(` Resolver: ${schema.resolver}`);
|
|
244
|
+
console.log(` Revocable: ${schema.revocable}`);
|
|
245
|
+
console.log(` Schema: ${schema.schema}\n`);
|
|
741
246
|
} catch (error) {
|
|
742
|
-
console.log("ā ļø
|
|
247
|
+
console.log("ā ļø Schema retrieval failed:");
|
|
743
248
|
console.log(` ${error}\n`);
|
|
744
249
|
}
|
|
745
250
|
|
|
746
|
-
// Step
|
|
747
|
-
console.log("
|
|
748
|
-
try {
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
console.log("
|
|
763
|
-
|
|
764
|
-
|
|
251
|
+
// // Step 6: Retrieve All Schemas
|
|
252
|
+
// console.log("š Step 6: Retrieve All Schemas");
|
|
253
|
+
// try {
|
|
254
|
+
// const schemas = await client.getSchemas({ limit: 10 });
|
|
255
|
+
// console.log("ā
Schemas retrieved successfully");
|
|
256
|
+
// console.log(` Found ${schemas.length} schemas`);
|
|
257
|
+
// schemas.forEach((schema, index) => {
|
|
258
|
+
// console.log(` ${index + 1}. ${schema.uid} - ${schema.schema}`);
|
|
259
|
+
// });
|
|
260
|
+
// console.log();
|
|
261
|
+
// } catch (error) {
|
|
262
|
+
// console.log("ā ļø Schemas retrieval failed (Portal access required)");
|
|
263
|
+
// console.log(" Would retrieve paginated schemas\n");
|
|
264
|
+
// }
|
|
265
|
+
|
|
266
|
+
// // Step 7: Retrieve Attestations
|
|
267
|
+
// console.log("š Step 7: Retrieve Attestations");
|
|
268
|
+
// try {
|
|
269
|
+
// const attestation1 = await client.getAttestation(
|
|
270
|
+
// "0xabcd567890123456789012345678901234567890123456789012345678901234",
|
|
271
|
+
// );
|
|
272
|
+
// console.log("ā
Attestation retrieved successfully");
|
|
273
|
+
// console.log(` UID: ${attestation1.uid}`);
|
|
274
|
+
// console.log(` Attester: ${attestation1.attester}`);
|
|
275
|
+
// console.log(` Recipient: ${attestation1.recipient}`);
|
|
276
|
+
// console.log(` Schema: ${attestation1.schema}\n`);
|
|
277
|
+
// } catch (error) {
|
|
278
|
+
// console.log("ā ļø Attestation retrieval failed (Portal access required)");
|
|
279
|
+
// console.log(
|
|
280
|
+
// " Would retrieve attestations: 0xabcd567890123456789012345678901234567890123456789012345678901234, 0xefgh567890123456789012345678901234567890123456789012345678901234\n",
|
|
281
|
+
// );
|
|
282
|
+
// }
|
|
283
|
+
|
|
284
|
+
// // Step 8: Retrieve All Attestations
|
|
285
|
+
// console.log("š Step 8: Retrieve All Attestations");
|
|
286
|
+
// try {
|
|
287
|
+
// const attestations = await client.getAttestations({
|
|
288
|
+
// limit: 10,
|
|
289
|
+
// schema: "0x1234567890123456789012345678901234567890123456789012345678901234",
|
|
290
|
+
// });
|
|
291
|
+
// console.log("ā
Attestations retrieved successfully");
|
|
292
|
+
// console.log(` Found ${attestations.length} attestations`);
|
|
293
|
+
// attestations.forEach((attestation, index) => {
|
|
294
|
+
// console.log(` ${index + 1}. ${attestation.uid} by ${attestation.attester}`);
|
|
295
|
+
// });
|
|
296
|
+
// console.log();
|
|
297
|
+
// } catch (error) {
|
|
298
|
+
// console.log("ā ļø Attestations retrieval failed (Portal access required)");
|
|
299
|
+
// console.log(" Would retrieve paginated attestations\n");
|
|
300
|
+
// }
|
|
765
301
|
|
|
766
302
|
// Final Summary
|
|
767
303
|
console.log("š Workflow Complete!");
|
|
@@ -770,38 +306,21 @@ async function runEASWorkflow() {
|
|
|
770
306
|
console.log("ā
Contract deployment ready");
|
|
771
307
|
console.log("ā
Schema registration ready");
|
|
772
308
|
console.log("ā
Attestation creation ready");
|
|
773
|
-
console.log("ā
|
|
774
|
-
console.log("ā
|
|
775
|
-
|
|
776
|
-
console.log("
|
|
777
|
-
|
|
778
|
-
console.log("
|
|
779
|
-
console.log("-
|
|
780
|
-
console.log("-
|
|
781
|
-
console.log("-
|
|
782
|
-
|
|
783
|
-
console.log("
|
|
784
|
-
|
|
785
|
-
console.log("
|
|
786
|
-
console.log("-
|
|
787
|
-
console.log("-
|
|
788
|
-
console.log("- ā
Single and multi-attestation creation");
|
|
789
|
-
console.log("- ā
Attestation revocation");
|
|
790
|
-
console.log("- ā
Schema lookup by UID");
|
|
791
|
-
console.log("- ā
Attestation lookup by UID");
|
|
792
|
-
console.log("- ā
Attestation validity checking");
|
|
793
|
-
console.log("- ā
Data timestamp queries");
|
|
794
|
-
|
|
795
|
-
console.log("\nš§ Future Enhancements (requiring The Graph):");
|
|
796
|
-
console.log("- ā³ Bulk schema listings (getSchemas)");
|
|
797
|
-
console.log("- ā³ Bulk attestation listings (getAttestations)");
|
|
798
|
-
console.log("- ā³ Advanced filtering and pagination");
|
|
799
|
-
|
|
800
|
-
console.log("\nš To use with real Portal:");
|
|
801
|
-
console.log("- Obtain valid EAS Portal access token");
|
|
802
|
-
console.log("- Provide deployer and transaction sender addresses");
|
|
803
|
-
console.log("- Deploy or configure contract addresses");
|
|
804
|
-
console.log("- Start creating and querying attestations!");
|
|
309
|
+
console.log("ā
Schema retrieval ready");
|
|
310
|
+
console.log("ā
Attestation retrieval ready");
|
|
311
|
+
|
|
312
|
+
console.log("\nš” Ready for production!");
|
|
313
|
+
console.log("- All EAS operations implemented");
|
|
314
|
+
console.log("- Portal GraphQL integration");
|
|
315
|
+
console.log("- Comprehensive error handling");
|
|
316
|
+
console.log("- Type-safe TypeScript API");
|
|
317
|
+
console.log("- Fully configurable");
|
|
318
|
+
|
|
319
|
+
console.log("\nš To use with Portal:");
|
|
320
|
+
console.log("- Set valid Portal access token");
|
|
321
|
+
console.log("- Configure deployer and sender addresses");
|
|
322
|
+
console.log("- Deploy or set contract addresses");
|
|
323
|
+
console.log("- Start creating attestations!");
|
|
805
324
|
}
|
|
806
325
|
|
|
807
326
|
export const DigitalNotarySchemaHelpers = {
|
|
@@ -946,7 +465,7 @@ export { runEASWorkflow, type UserReputationSchema };
|
|
|
946
465
|
|
|
947
466
|
> **createEASClient**(`options`): [`EASClient`](#easclient)
|
|
948
467
|
|
|
949
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
468
|
+
Defined in: [sdk/eas/src/eas.ts:632](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L632)
|
|
950
469
|
|
|
951
470
|
Create an EAS client instance
|
|
952
471
|
|
|
@@ -1127,7 +646,7 @@ console.log("EAS Contract:", deployment.easAddress);
|
|
|
1127
646
|
|
|
1128
647
|
> **getAttestation**(`uid`): `Promise`\<[`AttestationInfo`](#attestationinfo)\>
|
|
1129
648
|
|
|
1130
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
649
|
+
Defined in: [sdk/eas/src/eas.ts:528](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L528)
|
|
1131
650
|
|
|
1132
651
|
Get an attestation by UID
|
|
1133
652
|
|
|
@@ -1145,7 +664,7 @@ Get an attestation by UID
|
|
|
1145
664
|
|
|
1146
665
|
> **getAttestations**(`_options?`): `Promise`\<[`AttestationInfo`](#attestationinfo)[]\>
|
|
1147
666
|
|
|
1148
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
667
|
+
Defined in: [sdk/eas/src/eas.ts:539](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L539)
|
|
1149
668
|
|
|
1150
669
|
Get attestations with pagination and filtering
|
|
1151
670
|
|
|
@@ -1167,7 +686,7 @@ Consider using getAttestation() for individual attestation lookups.
|
|
|
1167
686
|
|
|
1168
687
|
> **getContractAddresses**(): `object`
|
|
1169
688
|
|
|
1170
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
689
|
+
Defined in: [sdk/eas/src/eas.ts:578](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L578)
|
|
1171
690
|
|
|
1172
691
|
Get current contract addresses
|
|
1173
692
|
|
|
@@ -1177,14 +696,14 @@ Get current contract addresses
|
|
|
1177
696
|
|
|
1178
697
|
| Name | Type | Defined in |
|
|
1179
698
|
| ------ | ------ | ------ |
|
|
1180
|
-
| `easAddress?` | `` `0x${string}` `` | [sdk/eas/src/eas.ts:
|
|
1181
|
-
| `schemaRegistryAddress?` | `` `0x${string}` `` | [sdk/eas/src/eas.ts:
|
|
699
|
+
| `easAddress?` | `` `0x${string}` `` | [sdk/eas/src/eas.ts:578](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L578) |
|
|
700
|
+
| `schemaRegistryAddress?` | `` `0x${string}` `` | [sdk/eas/src/eas.ts:578](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L578) |
|
|
1182
701
|
|
|
1183
702
|
###### getOptions()
|
|
1184
703
|
|
|
1185
704
|
> **getOptions**(): `object`
|
|
1186
705
|
|
|
1187
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
706
|
+
Defined in: [sdk/eas/src/eas.ts:564](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L564)
|
|
1188
707
|
|
|
1189
708
|
Get client configuration
|
|
1190
709
|
|
|
@@ -1202,7 +721,7 @@ Get client configuration
|
|
|
1202
721
|
|
|
1203
722
|
> **getPortalClient**(): `GraphQLClient`
|
|
1204
723
|
|
|
1205
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
724
|
+
Defined in: [sdk/eas/src/eas.ts:571](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L571)
|
|
1206
725
|
|
|
1207
726
|
Get the Portal client instance for advanced operations
|
|
1208
727
|
|
|
@@ -1214,7 +733,7 @@ Get the Portal client instance for advanced operations
|
|
|
1214
733
|
|
|
1215
734
|
> **getSchema**(`uid`): `Promise`\<[`SchemaData`](#schemadata)\>
|
|
1216
735
|
|
|
1217
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
736
|
+
Defined in: [sdk/eas/src/eas.ts:508](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L508)
|
|
1218
737
|
|
|
1219
738
|
Get a schema by UID
|
|
1220
739
|
|
|
@@ -1232,7 +751,7 @@ Get a schema by UID
|
|
|
1232
751
|
|
|
1233
752
|
> **getSchemas**(`_options?`): `Promise`\<[`SchemaData`](#schemadata)[]\>
|
|
1234
753
|
|
|
1235
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
754
|
+
Defined in: [sdk/eas/src/eas.ts:519](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L519)
|
|
1236
755
|
|
|
1237
756
|
Get all schemas with pagination
|
|
1238
757
|
|
|
@@ -1252,29 +771,23 @@ Consider using getSchema() for individual schema lookups.
|
|
|
1252
771
|
|
|
1253
772
|
###### getTimestamp()
|
|
1254
773
|
|
|
1255
|
-
> **getTimestamp**(
|
|
774
|
+
> **getTimestamp**(): `Promise`\<`bigint`\>
|
|
1256
775
|
|
|
1257
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
776
|
+
Defined in: [sdk/eas/src/eas.ts:557](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L557)
|
|
1258
777
|
|
|
1259
778
|
Get the timestamp for specific data
|
|
1260
779
|
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
| Parameter | Type | Description |
|
|
1264
|
-
| ------ | ------ | ------ |
|
|
1265
|
-
| `data` | `` `0x${string}` `` | The data to get timestamp for |
|
|
780
|
+
The data parameter must be a bytes32 value (64 hex characters with 0x prefix)
|
|
1266
781
|
|
|
1267
782
|
###### Returns
|
|
1268
783
|
|
|
1269
784
|
`Promise`\<`bigint`\>
|
|
1270
785
|
|
|
1271
|
-
The timestamp when the data was timestamped
|
|
1272
|
-
|
|
1273
786
|
###### isValidAttestation()
|
|
1274
787
|
|
|
1275
|
-
> **isValidAttestation**(`
|
|
788
|
+
> **isValidAttestation**(`_uid`): `Promise`\<`boolean`\>
|
|
1276
789
|
|
|
1277
|
-
Defined in: [sdk/eas/src/eas.ts:
|
|
790
|
+
Defined in: [sdk/eas/src/eas.ts:548](https://github.com/settlemint/sdk/blob/v2.5.5/sdk/eas/src/eas.ts#L548)
|
|
1278
791
|
|
|
1279
792
|
Check if an attestation is valid
|
|
1280
793
|
|
|
@@ -1282,7 +795,7 @@ Check if an attestation is valid
|
|
|
1282
795
|
|
|
1283
796
|
| Parameter | Type |
|
|
1284
797
|
| ------ | ------ |
|
|
1285
|
-
| `
|
|
798
|
+
| `_uid` | `` `0x${string}` `` |
|
|
1286
799
|
|
|
1287
800
|
###### Returns
|
|
1288
801
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@settlemint/sdk-eas",
|
|
3
3
|
"description": "Ethereum Attestation Service (EAS) integration for SettleMint SDK",
|
|
4
|
-
"version": "2.5.5-
|
|
4
|
+
"version": "2.5.5-pr8504cfe3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
7
|
"license": "FSL-1.1-MIT",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@settlemint/sdk-portal": "2.5.5-
|
|
56
|
-
"@settlemint/sdk-utils": "2.5.5-
|
|
55
|
+
"@settlemint/sdk-portal": "2.5.5-pr8504cfe3",
|
|
56
|
+
"@settlemint/sdk-utils": "2.5.5-pr8504cfe3",
|
|
57
57
|
"gql.tada": "^1",
|
|
58
58
|
"viem": "^2",
|
|
59
59
|
"zod": "^4"
|