@thurinlabs/identity-kit 1.3.2 → 1.3.3
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 +12 -0
- package/dist/{chunk-D7YTACXZ.js → chunk-3QHL7DEN.js} +46 -1
- package/dist/chunk-3QHL7DEN.js.map +1 -0
- package/dist/{chunk-HUJD6LYZ.cjs → chunk-CIMLLM5N.cjs} +52 -7
- package/dist/chunk-CIMLLM5N.cjs.map +1 -0
- package/dist/core.cjs +14 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +48 -1
- package/dist/core.d.ts +48 -1
- package/dist/core.js +13 -1
- package/dist/embed.global.js +94 -294
- package/dist/embed.global.js.map +1 -1
- package/dist/index.cjs +69 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +44 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-D7YTACXZ.js.map +0 -1
- package/dist/chunk-HUJD6LYZ.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -50,7 +50,13 @@
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
var _chunkCIMLLM5Ncjs = require('./chunk-CIMLLM5N.cjs');
|
|
54
60
|
|
|
55
61
|
// src/provider.tsx
|
|
56
62
|
var _react = require('react');
|
|
@@ -80,7 +86,7 @@ var defaultQueryClient = new (0, _reactquery.QueryClient)({
|
|
|
80
86
|
}
|
|
81
87
|
});
|
|
82
88
|
function createDefaultWagmiConfig(rpcUrl, network) {
|
|
83
|
-
const url = rpcUrl ||
|
|
89
|
+
const url = rpcUrl || _chunkCIMLLM5Ncjs.getRegistry.call(void 0, network).defaultRpcUrl;
|
|
84
90
|
if (network === "sepolia") return _wagmi.createConfig.call(void 0, { chains: [_chains.sepolia], transports: { [_chains.sepolia.id]: _wagmi.http.call(void 0, url) } });
|
|
85
91
|
if (network === "local") return _wagmi.createConfig.call(void 0, { chains: [_chains.foundry], transports: { [_chains.foundry.id]: _wagmi.http.call(void 0, url) } });
|
|
86
92
|
return _wagmi.createConfig.call(void 0, { chains: [_chains.mainnet], transports: { [_chains.mainnet.id]: _wagmi.http.call(void 0, url) } });
|
|
@@ -123,12 +129,12 @@ var _ens = require('viem/ens');
|
|
|
123
129
|
var _viem = require('viem');
|
|
124
130
|
function useAttestations(address) {
|
|
125
131
|
const config = useIdentityKitConfig();
|
|
126
|
-
const registry =
|
|
127
|
-
const chain =
|
|
132
|
+
const registry = _chunkCIMLLM5Ncjs.getRegistry.call(void 0, config.network, config.registryAddress);
|
|
133
|
+
const chain = _chunkCIMLLM5Ncjs.chainFor.call(void 0, config.network);
|
|
128
134
|
const owner = address;
|
|
129
135
|
const { data: rows, isLoading: rowsLoading } = _wagmi.useReadContract.call(void 0, {
|
|
130
136
|
address: registry.address,
|
|
131
|
-
abi:
|
|
137
|
+
abi: _chunkCIMLLM5Ncjs.REGISTRY_ABI,
|
|
132
138
|
functionName: "attestationsOf",
|
|
133
139
|
args: owner ? [owner] : void 0,
|
|
134
140
|
chainId: chain.id,
|
|
@@ -137,7 +143,7 @@ function useAttestations(address) {
|
|
|
137
143
|
const count = _nullishCoalesce(_optionalChain([rows, 'optionalAccess', _2 => _2.length]), () => ( 0));
|
|
138
144
|
const contracts = owner && rows ? rows.map((_, i) => ({
|
|
139
145
|
address: registry.address,
|
|
140
|
-
abi:
|
|
146
|
+
abi: _chunkCIMLLM5Ncjs.REGISTRY_ABI,
|
|
141
147
|
functionName: "getPayload",
|
|
142
148
|
args: [owner, BigInt(i)],
|
|
143
149
|
chainId: chain.id
|
|
@@ -162,8 +168,8 @@ function useAttestations(address) {
|
|
|
162
168
|
pgpSignature = _viem.hexToString.call(void 0, sigHex);
|
|
163
169
|
pgpPublicKey = _viem.hexToString.call(void 0, keyHex);
|
|
164
170
|
}
|
|
165
|
-
const fingerprint =
|
|
166
|
-
const verification = pgpPublicKey && pgpSignature ? await
|
|
171
|
+
const fingerprint = _chunkCIMLLM5Ncjs.bytesToFingerprint.call(void 0, row.fingerprint);
|
|
172
|
+
const verification = pgpPublicKey && pgpSignature ? await _chunkCIMLLM5Ncjs.verifyAttestation.call(void 0, { pgpPublicKey, pgpSignature, fingerprint, ethAddress: address }) : null;
|
|
167
173
|
const revokedAt = Number(row.revokedAt);
|
|
168
174
|
results.push({
|
|
169
175
|
index: i,
|
|
@@ -200,7 +206,7 @@ function useAttestations(address) {
|
|
|
200
206
|
function useEFPGraph(address) {
|
|
201
207
|
const { data, isLoading } = _reactquery.useQuery.call(void 0, {
|
|
202
208
|
queryKey: ["efp-graph", address],
|
|
203
|
-
queryFn: () =>
|
|
209
|
+
queryFn: () => _chunkCIMLLM5Ncjs.fetchEFPGraph.call(void 0, address),
|
|
204
210
|
enabled: !!address,
|
|
205
211
|
staleTime: 3e5
|
|
206
212
|
});
|
|
@@ -220,19 +226,19 @@ function usePGPProofs(fingerprint, armoredKey) {
|
|
|
220
226
|
queryKey: ["pgp-proofs", fingerprint, _nullishCoalesce(_optionalChain([armoredKey, 'optionalAccess', _6 => _6.length]), () => ( 0))],
|
|
221
227
|
queryFn: async () => {
|
|
222
228
|
if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] };
|
|
223
|
-
const keyInfo = await
|
|
229
|
+
const keyInfo = await _chunkCIMLLM5Ncjs.parsePgpKey.call(void 0, armoredKey);
|
|
224
230
|
if (!keyInfo) return { keyInfo: null, proofs: [] };
|
|
225
|
-
const identified = keyInfo.notations.map((n) =>
|
|
231
|
+
const identified = keyInfo.notations.map((n) => _chunkCIMLLM5Ncjs.identifyProof.call(void 0, n)).filter((p) => p !== null && p.provider !== "unknown");
|
|
226
232
|
const proofs = await Promise.all(
|
|
227
233
|
identified.map(async (proof) => {
|
|
228
|
-
const result = await
|
|
234
|
+
const result = await _chunkCIMLLM5Ncjs.verifyProof.call(void 0, proof, fingerprint, config.neynarApiKey);
|
|
229
235
|
return {
|
|
230
236
|
provider: proof.provider,
|
|
231
237
|
label: proof.label,
|
|
232
238
|
url: proof.url,
|
|
233
|
-
displayUrl:
|
|
234
|
-
href:
|
|
235
|
-
secondaryHref:
|
|
239
|
+
displayUrl: _chunkCIMLLM5Ncjs.displayUrl.call(void 0, proof),
|
|
240
|
+
href: _chunkCIMLLM5Ncjs.proofHref.call(void 0, proof),
|
|
241
|
+
secondaryHref: _chunkCIMLLM5Ncjs.proofSecondaryHref.call(void 0, proof),
|
|
236
242
|
status: result.verified ? "verified" : "unverified",
|
|
237
243
|
reason: result.reason
|
|
238
244
|
};
|
|
@@ -262,6 +268,29 @@ function usePGPProofs(fingerprint, armoredKey) {
|
|
|
262
268
|
};
|
|
263
269
|
}
|
|
264
270
|
|
|
271
|
+
// src/hooks/useSafeAvatar.ts
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
function useSafeAvatar(name, chainId) {
|
|
275
|
+
const { data: raw } = _wagmi.useEnsText.call(void 0, { name, key: "avatar", chainId, query: { enabled: !!name } });
|
|
276
|
+
const direct = _chunkCIMLLM5Ncjs.avatarUrl.call(void 0, raw);
|
|
277
|
+
const nft = direct ? null : _chunkCIMLLM5Ncjs.parseNftAvatar.call(void 0, raw);
|
|
278
|
+
const { data: tokenUri } = _wagmi.useReadContract.call(void 0, {
|
|
279
|
+
address: _optionalChain([nft, 'optionalAccess', _9 => _9.contract]),
|
|
280
|
+
abi: _chunkCIMLLM5Ncjs.NFT_AVATAR_ABI,
|
|
281
|
+
functionName: _optionalChain([nft, 'optionalAccess', _10 => _10.standard]) === "erc1155" ? "uri" : "tokenURI",
|
|
282
|
+
args: nft ? [nft.tokenId] : void 0,
|
|
283
|
+
chainId,
|
|
284
|
+
query: { enabled: !!nft && nft.chainId === chainId }
|
|
285
|
+
});
|
|
286
|
+
const { data: image } = _reactquery.useQuery.call(void 0, {
|
|
287
|
+
queryKey: ["thurin-nft-avatar", tokenUri, _optionalChain([nft, 'optionalAccess', _11 => _11.tokenId, 'access', _12 => _12.toString, 'call', _13 => _13()])],
|
|
288
|
+
queryFn: () => _chunkCIMLLM5Ncjs.nftAvatarImage.call(void 0, tokenUri, nft.tokenId).catch(() => null),
|
|
289
|
+
enabled: typeof tokenUri === "string" && !!nft
|
|
290
|
+
});
|
|
291
|
+
return _nullishCoalesce(_nullishCoalesce(direct, () => ( image)), () => ( null));
|
|
292
|
+
}
|
|
293
|
+
|
|
265
294
|
// src/hooks/useThurinIdentity.ts
|
|
266
295
|
function isAddress(value) {
|
|
267
296
|
return /^0x[0-9a-fA-F]{40}$/.test(value);
|
|
@@ -274,7 +303,7 @@ function safeNormalize(name) {
|
|
|
274
303
|
}
|
|
275
304
|
}
|
|
276
305
|
function useThurinIdentity(ensOrAddress) {
|
|
277
|
-
const chain =
|
|
306
|
+
const chain = _chunkCIMLLM5Ncjs.chainFor.call(void 0, useIdentityKitConfig().network);
|
|
278
307
|
const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false;
|
|
279
308
|
const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : void 0;
|
|
280
309
|
const { data: resolvedAddress } = _wagmi.useEnsAddress.call(void 0, {
|
|
@@ -289,11 +318,7 @@ function useThurinIdentity(ensOrAddress) {
|
|
|
289
318
|
query: { enabled: !!address }
|
|
290
319
|
});
|
|
291
320
|
const displayName = ensInput || ensName || null;
|
|
292
|
-
const
|
|
293
|
-
name: displayName ? safeNormalize(displayName) : void 0,
|
|
294
|
-
chainId: chain.id,
|
|
295
|
-
query: { enabled: !!displayName }
|
|
296
|
-
});
|
|
321
|
+
const ensAvatar = useSafeAvatar(displayName ? safeNormalize(displayName) : void 0, chain.id);
|
|
297
322
|
const {
|
|
298
323
|
claims,
|
|
299
324
|
totalClaims,
|
|
@@ -302,18 +327,18 @@ function useThurinIdentity(ensOrAddress) {
|
|
|
302
327
|
isLoading: claimsLoading
|
|
303
328
|
} = useAttestations(address);
|
|
304
329
|
const currentClaim = [...claims].reverse().find(
|
|
305
|
-
(c) => !c.revoked && _optionalChain([c, 'access',
|
|
330
|
+
(c) => !c.revoked && _optionalChain([c, 'access', _14 => _14.verification, 'optionalAccess', _15 => _15.verified]) && c.fingerprint === currentFingerprint
|
|
306
331
|
);
|
|
307
332
|
const {
|
|
308
333
|
keyInfo: pgpKeyInfo,
|
|
309
334
|
proofs,
|
|
310
335
|
isLoading: proofsLoading
|
|
311
|
-
} = usePGPProofs(currentFingerprint, _nullishCoalesce(_optionalChain([currentClaim, 'optionalAccess',
|
|
336
|
+
} = usePGPProofs(currentFingerprint, _nullishCoalesce(_optionalChain([currentClaim, 'optionalAccess', _16 => _16.pgpPublicKey]), () => ( null)));
|
|
312
337
|
const { efp, isLoading: efpLoading } = useEFPGraph(address);
|
|
313
338
|
return {
|
|
314
339
|
address,
|
|
315
340
|
ensName: displayName,
|
|
316
|
-
ensAvatar
|
|
341
|
+
ensAvatar,
|
|
317
342
|
claims,
|
|
318
343
|
totalClaims,
|
|
319
344
|
activeClaims,
|
|
@@ -347,7 +372,7 @@ function ThurinCard({ ens, address, theme = "thurin" }) {
|
|
|
347
372
|
}
|
|
348
373
|
const displayAddress = identity.address || null;
|
|
349
374
|
const verifiedProofs = identity.proofs.filter((p) => p.status === "verified").length;
|
|
350
|
-
const hasVerifiedPgp = identity.claims.some((c) => _optionalChain([c, 'access',
|
|
375
|
+
const hasVerifiedPgp = identity.claims.some((c) => _optionalChain([c, 'access', _17 => _17.verification, 'optionalAccess', _18 => _18.verified]) && !c.revoked);
|
|
351
376
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card", "data-thurin-theme": theme, children: [
|
|
352
377
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "a", { className: "thurin-card-header", href: profileUrl || void 0, target: "_blank", rel: "noopener noreferrer", children: [
|
|
353
378
|
identity.ensAvatar ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
@@ -373,13 +398,13 @@ function ThurinCard({ ens, address, theme = "thurin" }) {
|
|
|
373
398
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-label", children: "Proofs" })
|
|
374
399
|
] }),
|
|
375
400
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-stat", children: [
|
|
376
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-value", children: _nullishCoalesce(_optionalChain([identity, 'access',
|
|
401
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-value", children: _nullishCoalesce(_optionalChain([identity, 'access', _19 => _19.efp, 'optionalAccess', _20 => _20.followers]), () => ( 0)) }),
|
|
377
402
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-label", children: "Followers" })
|
|
378
403
|
] })
|
|
379
404
|
] }),
|
|
380
405
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-badges", children: [
|
|
381
406
|
hasVerifiedPgp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-badge thurin-card-badge--verified", children: "PGP Verified" }),
|
|
382
|
-
_optionalChain([identity, 'access',
|
|
407
|
+
_optionalChain([identity, 'access', _21 => _21.efp, 'optionalAccess', _22 => _22.hasEfp]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-badge thurin-card-badge--verified", children: "EFP" }),
|
|
383
408
|
identity.proofs.map((p, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
384
409
|
"span",
|
|
385
410
|
{
|
|
@@ -413,15 +438,15 @@ function safeNormalize2(name) {
|
|
|
413
438
|
}
|
|
414
439
|
}
|
|
415
440
|
function useEnsHint(name, verifiedFingerprint) {
|
|
416
|
-
const chain =
|
|
441
|
+
const chain = _chunkCIMLLM5Ncjs.chainFor.call(void 0, useIdentityKitConfig().network);
|
|
417
442
|
const ensName = name ? safeNormalize2(name) : void 0;
|
|
418
443
|
const { data, isLoading, refetch } = _wagmi.useEnsText.call(void 0, {
|
|
419
444
|
name: ensName,
|
|
420
|
-
key:
|
|
445
|
+
key: _chunkCIMLLM5Ncjs.ENS_HINT_KEY,
|
|
421
446
|
chainId: chain.id,
|
|
422
447
|
query: { enabled: !!ensName }
|
|
423
448
|
});
|
|
424
|
-
return { ...
|
|
449
|
+
return { ..._chunkCIMLLM5Ncjs.ensHintFor.call(void 0, _nullishCoalesce(data, () => ( null)), verifiedFingerprint), isLoading: !!ensName && isLoading, refetch: () => {
|
|
425
450
|
void refetch();
|
|
426
451
|
} };
|
|
427
452
|
}
|
|
@@ -429,20 +454,20 @@ function useEnsHint(name, verifiedFingerprint) {
|
|
|
429
454
|
// src/hooks/useRecords.ts
|
|
430
455
|
|
|
431
456
|
|
|
432
|
-
function useRecords(address, index, kinds =
|
|
457
|
+
function useRecords(address, index, kinds = _chunkCIMLLM5Ncjs.IDENTITY_KINDS, armoredKey) {
|
|
433
458
|
const config = useIdentityKitConfig();
|
|
434
|
-
const registry =
|
|
435
|
-
const chain =
|
|
459
|
+
const registry = _chunkCIMLLM5Ncjs.getRegistry.call(void 0, config.network, config.registryAddress);
|
|
460
|
+
const chain = _chunkCIMLLM5Ncjs.chainFor.call(void 0, config.network);
|
|
436
461
|
const owner = address;
|
|
437
462
|
const enabled = !!owner && index !== void 0 && index !== null;
|
|
438
|
-
const contracts = enabled ? kinds.map((kind) => ({ address: registry.address, abi:
|
|
463
|
+
const contracts = enabled ? kinds.map((kind) => ({ address: registry.address, abi: _chunkCIMLLM5Ncjs.REGISTRY_ABI, functionName: "record", args: [owner, BigInt(index), _chunkCIMLLM5Ncjs.recordKind.call(void 0, kind)], chainId: chain.id })) : [];
|
|
439
464
|
const { data: raw, isLoading: readLoading, refetch } = _wagmi.useReadContracts.call(void 0, { contracts, query: { enabled: contracts.length > 0 } });
|
|
440
|
-
const texts = (_nullishCoalesce(raw, () => ( []))).map((r) => r.status === "success" ?
|
|
465
|
+
const texts = (_nullishCoalesce(raw, () => ( []))).map((r) => r.status === "success" ? _chunkCIMLLM5Ncjs.decodeRecord.call(void 0, r.result) : "");
|
|
441
466
|
const { data: records, isLoading: parseLoading } = _reactquery.useQuery.call(void 0, {
|
|
442
467
|
queryKey: ["records", config.network, registry.address, address, index, kinds.join(","), texts.join(" "), _nullishCoalesce(armoredKey, () => ( ""))],
|
|
443
468
|
queryFn: async () => {
|
|
444
469
|
const out = [];
|
|
445
|
-
for (let i = 0; i < kinds.length; i++) if (texts[i]) out.push(await
|
|
470
|
+
for (let i = 0; i < kinds.length; i++) if (texts[i]) out.push(await _chunkCIMLLM5Ncjs.parseRecord.call(void 0, kinds[i], texts[i], { armoredKey: _nullishCoalesce(armoredKey, () => ( void 0)) }));
|
|
446
471
|
return out;
|
|
447
472
|
},
|
|
448
473
|
enabled: enabled && raw !== void 0
|
|
@@ -511,5 +536,12 @@ function useRecords(address, index, kinds = _chunkHUJD6LYZcjs.IDENTITY_KINDS, ar
|
|
|
511
536
|
|
|
512
537
|
|
|
513
538
|
|
|
514
|
-
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
exports.ARWEAVE_GATEWAY = _chunkCIMLLM5Ncjs.ARWEAVE_GATEWAY; exports.AUTHORIZATION_TYPES = _chunkCIMLLM5Ncjs.AUTHORIZATION_TYPES; exports.EIP712_NAME = _chunkCIMLLM5Ncjs.EIP712_NAME; exports.EIP712_VERSION = _chunkCIMLLM5Ncjs.EIP712_VERSION; exports.ENS_HINT_KEY = _chunkCIMLLM5Ncjs.ENS_HINT_KEY; exports.ENS_TEXT_RESOLVER_ABI = _chunkCIMLLM5Ncjs.ENS_TEXT_RESOLVER_ABI; exports.IDENTITY_KINDS = _chunkCIMLLM5Ncjs.IDENTITY_KINDS; exports.IPFS_GATEWAY = _chunkCIMLLM5Ncjs.IPFS_GATEWAY; exports.IdentityKitProvider = IdentityKitProvider; exports.KNOWN_KINDS = _chunkCIMLLM5Ncjs.KNOWN_KINDS; exports.MAX_RECORD_BYTES = _chunkCIMLLM5Ncjs.MAX_RECORD_BYTES; exports.NETWORKS = _chunkCIMLLM5Ncjs.NETWORKS; exports.NFT_AVATAR_ABI = _chunkCIMLLM5Ncjs.NFT_AVATAR_ABI; exports.REGISTRY_ABI = _chunkCIMLLM5Ncjs.REGISTRY_ABI; exports.REGISTRY_ADDRESS = _chunkCIMLLM5Ncjs.REGISTRY_ADDRESS; exports.ThurinCard = ThurinCard; exports.addPointer = _chunkCIMLLM5Ncjs.addPointer; exports.attestTypedData = _chunkCIMLLM5Ncjs.attestTypedData; exports.authorizationDigest = _chunkCIMLLM5Ncjs.authorizationDigest; exports.avatarUrl = _chunkCIMLLM5Ncjs.avatarUrl; exports.bytesToFingerprint = _chunkCIMLLM5Ncjs.bytesToFingerprint; exports.chainFor = _chunkCIMLLM5Ncjs.chainFor; exports.decodeRecord = _chunkCIMLLM5Ncjs.decodeRecord; exports.displayUrl = _chunkCIMLLM5Ncjs.displayUrl; exports.encodeRecord = _chunkCIMLLM5Ncjs.encodeRecord; exports.ensHintFor = _chunkCIMLLM5Ncjs.ensHintFor; exports.ensHintValue = _chunkCIMLLM5Ncjs.ensHintValue; exports.ensHintWrite = _chunkCIMLLM5Ncjs.ensHintWrite; exports.fetchEFPGraph = _chunkCIMLLM5Ncjs.fetchEFPGraph; exports.fetchEnsHint = _chunkCIMLLM5Ncjs.fetchEnsHint; exports.fetchRecords = _chunkCIMLLM5Ncjs.fetchRecords; exports.fingerprintHash = _chunkCIMLLM5Ncjs.fingerprintHash; exports.fingerprintToBytes = _chunkCIMLLM5Ncjs.fingerprintToBytes; exports.getRegistry = _chunkCIMLLM5Ncjs.getRegistry; exports.hasEmailUserID = _chunkCIMLLM5Ncjs.hasEmailUserID; exports.identifyProof = _chunkCIMLLM5Ncjs.identifyProof; exports.isNetworkName = _chunkCIMLLM5Ncjs.isNetworkName; exports.keyIdOf = _chunkCIMLLM5Ncjs.keyIdOf; exports.keyIdToBytes = _chunkCIMLLM5Ncjs.keyIdToBytes; exports.kindName = _chunkCIMLLM5Ncjs.kindName; exports.nftAvatarImage = _chunkCIMLLM5Ncjs.nftAvatarImage; exports.normalizeFingerprint = _chunkCIMLLM5Ncjs.normalizeFingerprint; exports.parseNftAvatar = _chunkCIMLLM5Ncjs.parseNftAvatar; exports.parsePgpKey = _chunkCIMLLM5Ncjs.parsePgpKey; exports.parsePointer = _chunkCIMLLM5Ncjs.parsePointer; exports.parseRecord = _chunkCIMLLM5Ncjs.parseRecord; exports.proofHref = _chunkCIMLLM5Ncjs.proofHref; exports.proofSecondaryHref = _chunkCIMLLM5Ncjs.proofSecondaryHref; exports.reattestTypedData = _chunkCIMLLM5Ncjs.reattestTypedData; exports.recordKind = _chunkCIMLLM5Ncjs.recordKind; exports.registryDomain = _chunkCIMLLM5Ncjs.registryDomain; exports.renderPointer = _chunkCIMLLM5Ncjs.renderPointer; exports.revokeTypedData = _chunkCIMLLM5Ncjs.revokeTypedData; exports.setRecordTypedData = _chunkCIMLLM5Ncjs.setRecordTypedData; exports.stripEmailUserIDs = _chunkCIMLLM5Ncjs.stripEmailUserIDs; exports.updateKeyTypedData = _chunkCIMLLM5Ncjs.updateKeyTypedData; exports.useAttestations = useAttestations; exports.useEFPGraph = useEFPGraph; exports.useEnsHint = useEnsHint; exports.usePGPProofs = usePGPProofs; exports.useRecords = useRecords; exports.useSafeAvatar = useSafeAvatar; exports.useThurinIdentity = useThurinIdentity; exports.verifyAttestation = _chunkCIMLLM5Ncjs.verifyAttestation; exports.verifyClearsigned = _chunkCIMLLM5Ncjs.verifyClearsigned; exports.verifyProof = _chunkCIMLLM5Ncjs.verifyProof;
|
|
515
547
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ben/code/thurinlabs/identity-kit/dist/index.cjs","../src/provider.tsx","../src/context.ts","../src/hooks/useThurinIdentity.ts","../src/hooks/useAttestations.ts","../src/hooks/useEFPGraph.ts","../src/hooks/usePGPProofs.ts","../src/components/ThurinCard/ThurinCard.tsx","../src/hooks/useEnsHint.ts","../src/hooks/useRecords.ts"],"names":["useQuery","jsx","safeNormalize","normalize"],"mappings":"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","file":"/home/ben/code/thurinlabs/identity-kit/dist/index.cjs","sourcesContent":[null,"import { type ReactNode, useMemo } from 'react'\nimport { WagmiProvider, createConfig, http, useConfig } from 'wagmi'\nimport { mainnet, sepolia, foundry } from 'wagmi/chains'\nimport { getRegistry } from './core/contract'\nimport type { NetworkName } from './core/contract'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { IdentityKitContext } from './context'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n retry: 1,\n },\n },\n})\n\nexport { chainFor } from './core/contract'\n\nfunction createDefaultWagmiConfig(rpcUrl: string | undefined, network: NetworkName) {\n const url = rpcUrl || getRegistry(network).defaultRpcUrl\n // Spelled out per network: wagmi types `transports` by the exact chain ids.\n if (network === 'sepolia') return createConfig({ chains: [sepolia], transports: { [sepolia.id]: http(url) } })\n if (network === 'local') return createConfig({ chains: [foundry], transports: { [foundry.id]: http(url) } })\n return createConfig({ chains: [mainnet], transports: { [mainnet.id]: http(url) } })\n}\n\nfunction WagmiDetector({ children, rpcUrl, network }: { children: ReactNode; rpcUrl?: string; network: NetworkName }) {\n // Try to use existing wagmi config\n let hasWagmi = false\n try {\n useConfig()\n hasWagmi = true\n } catch {\n // No WagmiProvider above us\n }\n\n const wagmiConfig = useMemo(() => createDefaultWagmiConfig(rpcUrl, network), [rpcUrl, network])\n\n if (hasWagmi) {\n return <>{children}</>\n }\n\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={defaultQueryClient}>\n {children}\n </QueryClientProvider>\n </WagmiProvider>\n )\n}\n\nexport interface IdentityKitProviderProps extends IdentityKitConfig {\n children: ReactNode\n}\n\nexport function IdentityKitProvider({\n children,\n rpcUrl,\n neynarApiKey,\n baseUrl = 'https://thurin.id',\n network = 'mainnet',\n registryAddress,\n}: IdentityKitProviderProps) {\n const config = useMemo(\n () => ({ rpcUrl, neynarApiKey, baseUrl, network, registryAddress }),\n [rpcUrl, neynarApiKey, baseUrl, network, registryAddress],\n )\n\n return (\n <IdentityKitContext.Provider value={config}>\n <WagmiDetector rpcUrl={rpcUrl} network={network}>\n {children}\n </WagmiDetector>\n </IdentityKitContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultConfig: IdentityKitConfig = {\n baseUrl: 'https://thurin.id',\n network: 'mainnet',\n}\n\nexport const IdentityKitContext = createContext<IdentityKitConfig>(defaultConfig)\n\nexport function useIdentityKitConfig(): IdentityKitConfig {\n return useContext(IdentityKitContext)\n}\n","import { useEnsAddress, useEnsName, useEnsAvatar } from 'wagmi'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { normalize } from 'viem/ens'\nimport { useAttestations } from './useAttestations'\nimport { useEFPGraph } from './useEFPGraph'\nimport { usePGPProofs } from './usePGPProofs'\nimport type { ThurinIdentity } from '../core/types'\n\nfunction isAddress(value: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(value)\n}\n\nfunction safeNormalize(name: string): string | undefined {\n try {\n return normalize(name)\n } catch {\n return undefined\n }\n}\n\nexport function useThurinIdentity(ensOrAddress: string | undefined | null): ThurinIdentity {\n const chain = chainFor(useIdentityKitConfig().network)\n const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false\n const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : undefined\n\n // Resolve ENS → address\n const { data: resolvedAddress } = useEnsAddress({\n name: ensInput,\n chainId: chain.id,\n query: { enabled: !!ensInput },\n })\n\n const address = isAddr ? ensOrAddress! : resolvedAddress ?? null\n\n // Reverse resolve address → ENS\n const { data: ensName } = useEnsName({\n address: address as `0x${string}` | undefined,\n chainId: chain.id,\n query: { enabled: !!address },\n })\n\n const displayName = ensInput || ensName || null\n\n const { data: ensAvatar } = useEnsAvatar({\n name: displayName ? safeNormalize(displayName) : undefined,\n chainId: chain.id,\n query: { enabled: !!displayName },\n })\n\n // On-chain attestations\n const {\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n isLoading: claimsLoading,\n } = useAttestations(address)\n\n // PGP proofs come from the key stored in the current attestation — the\n // latest claim that is active and whose signature verified (the same rule\n // useAttestations uses to pick currentFingerprint).\n const currentClaim = [...claims].reverse().find(\n (c) => !c.revoked && c.verification?.verified && c.fingerprint === currentFingerprint,\n )\n const {\n keyInfo: pgpKeyInfo,\n proofs,\n isLoading: proofsLoading,\n } = usePGPProofs(currentFingerprint, currentClaim?.pgpPublicKey ?? null)\n\n // EFP social graph\n const { efp, isLoading: efpLoading } = useEFPGraph(address)\n\n return {\n address,\n ensName: displayName,\n ensAvatar: ensAvatar ?? null,\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n pgpKeyInfo,\n proofs,\n efp,\n isLoading: claimsLoading || proofsLoading || efpLoading,\n error: null,\n }\n}\n","import { useReadContract, useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { hexToString } from 'viem'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { bytesToFingerprint } from '../core/fingerprint'\nimport { chainFor } from '../provider'\nimport { verifyAttestation } from '../core/pgp'\nimport { useIdentityKitConfig } from '../context'\nimport type { Attestation } from '../core/types'\n\n/**\n * On-chain attestations for an address, read straight from the v2 registry:\n * `attestationsOf` for the history, `getPayload` for each stored signature + key.\n * No event logs, so any RPC works. Each claim is verified off-chain.\n */\nexport function useAttestations(address: string | undefined | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n\n const { data: rows, isLoading: rowsLoading } = useReadContract({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'attestationsOf',\n args: owner ? [owner] : undefined,\n chainId: chain.id,\n query: { enabled: !!owner },\n })\n\n const count = rows?.length ?? 0\n\n const contracts = owner && rows\n ? rows.map((_, i) => ({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'getPayload' as const,\n args: [owner, BigInt(i)] as const,\n chainId: chain.id,\n }))\n : []\n\n const { data: payloads, isLoading: payloadsLoading } = useReadContracts({\n contracts,\n query: { enabled: contracts.length > 0 },\n })\n\n const payloadsReady = count === 0 || (payloads !== undefined && payloads.length === count)\n\n const { data: claims, isLoading: verifyLoading } = useQuery({\n queryKey: ['attestations', config.network, registry.address, address, count, payloadsReady],\n queryFn: async (): Promise<Attestation[]> => {\n if (!rows || !address) return []\n const results: Attestation[] = []\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const payload = payloads?.[i]\n let pgpSignature: string | null = null\n let pgpPublicKey: string | null = null\n if (payload && payload.status === 'success') {\n const [sigHex, keyHex] = payload.result as readonly [`0x${string}`, `0x${string}`]\n pgpSignature = hexToString(sigHex)\n pgpPublicKey = hexToString(keyHex)\n }\n\n const fingerprint = bytesToFingerprint(row.fingerprint)\n const verification = pgpPublicKey && pgpSignature\n ? await verifyAttestation({ pgpPublicKey, pgpSignature, fingerprint, ethAddress: address })\n : null\n\n const revokedAt = Number(row.revokedAt)\n results.push({\n index: i,\n fingerprint,\n createdAt: Number(row.createdAt),\n revoked: revokedAt !== 0,\n revokedAt: revokedAt === 0 ? null : revokedAt,\n messageVersion: Number(row.messageVersion),\n pgpSignature,\n pgpPublicKey,\n verification,\n })\n }\n return results\n },\n enabled: !!rows && payloadsReady,\n staleTime: 300_000,\n })\n\n const isLoading = rowsLoading || payloadsLoading || verifyLoading || (!!owner && rows !== undefined && !payloadsReady)\n\n const activeClaims = (claims || []).filter((c) => !c.revoked)\n // The current identity is the latest claim that is both active and has a\n // verified signature binding the key to this address. A claim whose signature\n // has not verified must not surface the key's proofs or user data.\n const verifiedClaims = activeClaims.filter((c) => c.verification?.verified)\n const currentFingerprint = verifiedClaims.length > 0\n ? verifiedClaims[verifiedClaims.length - 1].fingerprint\n : null\n\n return {\n claims: claims || [],\n totalClaims: count,\n activeClaims: activeClaims.length,\n currentFingerprint,\n isLoading,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { fetchEFPGraph } from '../core/efp'\nimport type { EFPGraph } from '../core/types'\n\nexport function useEFPGraph(address: string | undefined | null) {\n const { data, isLoading } = useQuery<EFPGraph | null>({\n queryKey: ['efp-graph', address],\n queryFn: () => fetchEFPGraph(address!),\n enabled: !!address,\n staleTime: 300_000,\n })\n\n return {\n efp: data ?? null,\n isLoading,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { parsePgpKey } from '../core/pgp'\nimport { identifyProof, verifyProof, displayUrl, proofHref, proofSecondaryHref } from '../core/proofs'\nimport { useIdentityKitConfig } from '../context'\nimport type { PGPKeyInfo, ProofResult } from '../core/types'\n\n/**\n * Proofs for an identity, read from the PGP key stored in its on-chain\n * attestation. No keyserver is consulted: keys.openpgp.org only serves user\n * IDs whose email is verified and drops non-email user IDs entirely, so it can\n * never carry the published (non-email) identity that holds the notations.\n *\n * @param fingerprint the attested fingerprint (proofs must name it)\n * @param armoredKey the attestation's `pgpPublicKey`\n */\nexport function usePGPProofs(fingerprint: string | undefined | null, armoredKey: string | undefined | null) {\n const config = useIdentityKitConfig()\n\n const { data } = useQuery({\n // The key is large; key the query on its length + fingerprint, which\n // changes whenever a different attestation's key is supplied.\n queryKey: ['pgp-proofs', fingerprint, armoredKey?.length ?? 0],\n queryFn: async (): Promise<{ keyInfo: PGPKeyInfo | null; proofs: ProofResult[] }> => {\n if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] }\n\n const keyInfo = await parsePgpKey(armoredKey)\n if (!keyInfo) return { keyInfo: null, proofs: [] }\n\n // Identify proofs from notations. Drop unrecognized targets (provider\n // 'unknown') so the card doesn't render \"Unknown\" badges for platforms\n // Thurin has no verifier for — matching the explorer's behavior.\n const identified = keyInfo.notations\n .map((n) => identifyProof(n))\n .filter((p): p is NonNullable<typeof p> => p !== null && p.provider !== 'unknown')\n\n // Verify all proofs in parallel\n const proofs: ProofResult[] = await Promise.all(\n identified.map(async (proof) => {\n const result = await verifyProof(proof, fingerprint, config.neynarApiKey)\n return {\n provider: proof.provider,\n label: proof.label,\n url: proof.url,\n displayUrl: displayUrl(proof),\n href: proofHref(proof),\n secondaryHref: proofSecondaryHref(proof),\n status: result.verified ? 'verified' as const : 'unverified' as const,\n reason: result.reason,\n }\n }),\n )\n\n // Collapse proofs that resolve to the same account — the same target is\n // often listed under both proof@thurin.id and proof@ariadne.id (and can\n // be reached via more than one proof URL). Key by provider + display\n // identity, preferring a verified result.\n const byAccount = new Map<string, ProofResult>()\n for (const p of proofs) {\n const key = `${p.provider}:${p.displayUrl}`\n const prev = byAccount.get(key)\n if (!prev || (p.status === 'verified' && prev.status !== 'verified')) {\n byAccount.set(key, p)\n }\n }\n\n return { keyInfo, proofs: [...byAccount.values()] }\n },\n enabled: !!fingerprint && !!armoredKey,\n staleTime: 300_000,\n })\n\n return {\n keyInfo: data?.keyInfo ?? null,\n proofs: data?.proofs ?? [],\n // Report loading whenever a fingerprint is set but its proofs haven't\n // resolved yet. Using react-query's own isLoading leaves a gap while the\n // query is enabling (fingerprint just became known), during which the card\n // would briefly paint without proof badges and then pop them in.\n isLoading: !!fingerprint && !!armoredKey && data === undefined,\n }\n}\n","import { useThurinIdentity } from '../../hooks/useThurinIdentity'\nimport { useIdentityKitConfig } from '../../context'\nimport type { Theme } from '../../core/types'\nimport '../../themes/index.css'\nimport './ThurinCard.css'\n\nfunction ThurinLogo() {\n return (\n <svg className=\"thurin-card-avatar-placeholder\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"var(--thurin-surface-deep)\" />\n <path d=\"M25 80 Q25 25 50 25 Q75 25 75 50\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M33 75 Q33 35 50 35 Q67 35 67 52\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M41 70 Q41 45 50 45 Q59 45 59 55\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M50 65 L50 53\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\nexport interface ThurinCardProps {\n ens?: string\n address?: string\n theme?: Theme\n}\n\nexport function ThurinCard({ ens, address, theme = 'thurin' }: ThurinCardProps) {\n const input = ens || address\n const identity = useThurinIdentity(input)\n const config = useIdentityKitConfig()\n\n const profileUrl = identity.address\n ? `${config.baseUrl}/eth/${identity.address}`\n : ens\n ? `${config.baseUrl}/ens/${ens}`\n : null\n\n if (identity.isLoading) {\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <div className=\"thurin-card-loading\">Loading identity...</div>\n </div>\n )\n }\n\n const displayAddress = identity.address || null\n\n const verifiedProofs = identity.proofs.filter((p) => p.status === 'verified').length\n const hasVerifiedPgp = identity.claims.some((c) => c.verification?.verified && !c.revoked)\n\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <a className=\"thurin-card-header\" href={profileUrl || undefined} target=\"_blank\" rel=\"noopener noreferrer\">\n {identity.ensAvatar ? (\n <img\n className=\"thurin-card-avatar\"\n src={identity.ensAvatar}\n alt={identity.ensName || ''}\n />\n ) : (\n <ThurinLogo />\n )}\n <div>\n {identity.ensName && (\n <div className=\"thurin-card-name\">{identity.ensName}</div>\n )}\n {displayAddress && (\n <div className=\"thurin-card-address\">{displayAddress}</div>\n )}\n </div>\n </a>\n\n <div className=\"thurin-card-stats\">\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{identity.activeClaims}</span>\n <span className=\"thurin-card-stat-label\">Attestations</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{verifiedProofs}</span>\n <span className=\"thurin-card-stat-label\">Proofs</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">\n {identity.efp?.followers ?? 0}\n </span>\n <span className=\"thurin-card-stat-label\">Followers</span>\n </div>\n </div>\n\n <div className=\"thurin-card-badges\">\n {hasVerifiedPgp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">PGP Verified</span>\n )}\n {identity.efp?.hasEfp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">EFP</span>\n )}\n {identity.proofs.map((p, i) => (\n <span\n key={i}\n className={`thurin-card-badge thurin-card-badge--${p.status === 'verified' ? 'verified' : 'unverified'}`}\n >\n {p.label}\n </span>\n ))}\n </div>\n\n {profileUrl && (\n <a\n className=\"thurin-card-link\"\n href={profileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on Thurin\n </a>\n )}\n </div>\n )\n}\n","import { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { ENS_HINT_KEY, ensHintFor, type EnsHint } from '../core/ensHint'\n\nfunction safeNormalize(name: string): string | undefined {\n try { return normalize(name) } catch { return undefined }\n}\n\n/**\n * A name's `id.thurin` record against the fingerprint the registry verifies for its\n * address. `state` is `match`, `unset`, or `mismatch`; the last one is the signal worth\n * showing — a name advertising a key its address has not claimed.\n */\nexport function useEnsHint(name: string | undefined | null, verifiedFingerprint: string | null | undefined): EnsHint & { isLoading: boolean; refetch: () => void } {\n const chain = chainFor(useIdentityKitConfig().network)\n const ensName = name ? safeNormalize(name) : undefined\n const { data, isLoading, refetch } = useEnsText({\n name: ensName,\n key: ENS_HINT_KEY,\n chainId: chain.id,\n query: { enabled: !!ensName },\n })\n return { ...ensHintFor(data ?? null, verifiedFingerprint), isLoading: !!ensName && isLoading, refetch: () => { void refetch() } }\n}\n","import { useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { chainFor } from '../provider'\nimport { useIdentityKitConfig } from '../context'\nimport { IDENTITY_KINDS, decodeRecord, parseRecord, recordKind, type ParsedRecord } from '../core/records'\n\n/**\n * The records on one claim, for the kinds given (default: the kinds an identity page shows),\n * read in one multicall and parsed. Kinds with no record are left out.\n */\nexport function useRecords(address: string | undefined | null, index: number | undefined | null, kinds: readonly string[] = IDENTITY_KINDS, armoredKey?: string | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n const enabled = !!owner && index !== undefined && index !== null\n\n const contracts = enabled\n ? kinds.map(kind => ({ address: registry.address, abi: REGISTRY_ABI, functionName: 'record' as const, args: [owner!, BigInt(index!), recordKind(kind)] as const, chainId: chain.id }))\n : []\n const { data: raw, isLoading: readLoading, refetch } = useReadContracts({ contracts, query: { enabled: contracts.length > 0 } })\n\n const texts = (raw ?? []).map(r => (r.status === 'success' ? decodeRecord(r.result as `0x${string}`) : ''))\n const { data: records, isLoading: parseLoading } = useQuery({\n queryKey: ['records', config.network, registry.address, address, index, kinds.join(','), texts.join(' '), armoredKey ?? ''],\n queryFn: async (): Promise<ParsedRecord[]> => {\n const out: ParsedRecord[] = []\n for (let i = 0; i < kinds.length; i++) if (texts[i]) out.push(await parseRecord(kinds[i], texts[i], { armoredKey: armoredKey ?? undefined }))\n return out\n },\n enabled: enabled && raw !== undefined,\n })\n\n return { records: records ?? [], isLoading: enabled && (readLoading || parseLoading), refetch: () => { void refetch() } }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/ben/code/thurinlabs/identity-kit/dist/index.cjs","../src/provider.tsx","../src/context.ts","../src/hooks/useThurinIdentity.ts","../src/hooks/useAttestations.ts","../src/hooks/useEFPGraph.ts","../src/hooks/usePGPProofs.ts","../src/hooks/useSafeAvatar.ts","../src/components/ThurinCard/ThurinCard.tsx","../src/hooks/useEnsHint.ts","../src/hooks/useRecords.ts"],"names":["useQuery","jsx","safeNormalize","normalize"],"mappings":"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","file":"/home/ben/code/thurinlabs/identity-kit/dist/index.cjs","sourcesContent":[null,"import { type ReactNode, useMemo } from 'react'\nimport { WagmiProvider, createConfig, http, useConfig } from 'wagmi'\nimport { mainnet, sepolia, foundry } from 'wagmi/chains'\nimport { getRegistry } from './core/contract'\nimport type { NetworkName } from './core/contract'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { IdentityKitContext } from './context'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n retry: 1,\n },\n },\n})\n\nexport { chainFor } from './core/contract'\n\nfunction createDefaultWagmiConfig(rpcUrl: string | undefined, network: NetworkName) {\n const url = rpcUrl || getRegistry(network).defaultRpcUrl\n // Spelled out per network: wagmi types `transports` by the exact chain ids.\n if (network === 'sepolia') return createConfig({ chains: [sepolia], transports: { [sepolia.id]: http(url) } })\n if (network === 'local') return createConfig({ chains: [foundry], transports: { [foundry.id]: http(url) } })\n return createConfig({ chains: [mainnet], transports: { [mainnet.id]: http(url) } })\n}\n\nfunction WagmiDetector({ children, rpcUrl, network }: { children: ReactNode; rpcUrl?: string; network: NetworkName }) {\n // Try to use existing wagmi config\n let hasWagmi = false\n try {\n useConfig()\n hasWagmi = true\n } catch {\n // No WagmiProvider above us\n }\n\n const wagmiConfig = useMemo(() => createDefaultWagmiConfig(rpcUrl, network), [rpcUrl, network])\n\n if (hasWagmi) {\n return <>{children}</>\n }\n\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={defaultQueryClient}>\n {children}\n </QueryClientProvider>\n </WagmiProvider>\n )\n}\n\nexport interface IdentityKitProviderProps extends IdentityKitConfig {\n children: ReactNode\n}\n\nexport function IdentityKitProvider({\n children,\n rpcUrl,\n neynarApiKey,\n baseUrl = 'https://thurin.id',\n network = 'mainnet',\n registryAddress,\n}: IdentityKitProviderProps) {\n const config = useMemo(\n () => ({ rpcUrl, neynarApiKey, baseUrl, network, registryAddress }),\n [rpcUrl, neynarApiKey, baseUrl, network, registryAddress],\n )\n\n return (\n <IdentityKitContext.Provider value={config}>\n <WagmiDetector rpcUrl={rpcUrl} network={network}>\n {children}\n </WagmiDetector>\n </IdentityKitContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultConfig: IdentityKitConfig = {\n baseUrl: 'https://thurin.id',\n network: 'mainnet',\n}\n\nexport const IdentityKitContext = createContext<IdentityKitConfig>(defaultConfig)\n\nexport function useIdentityKitConfig(): IdentityKitConfig {\n return useContext(IdentityKitContext)\n}\n","import { useEnsAddress, useEnsName } from 'wagmi'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { normalize } from 'viem/ens'\nimport { useAttestations } from './useAttestations'\nimport { useEFPGraph } from './useEFPGraph'\nimport { usePGPProofs } from './usePGPProofs'\nimport { useSafeAvatar } from './useSafeAvatar'\nimport type { ThurinIdentity } from '../core/types'\n\nfunction isAddress(value: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(value)\n}\n\nfunction safeNormalize(name: string): string | undefined {\n try {\n return normalize(name)\n } catch {\n return undefined\n }\n}\n\nexport function useThurinIdentity(ensOrAddress: string | undefined | null): ThurinIdentity {\n const chain = chainFor(useIdentityKitConfig().network)\n const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false\n const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : undefined\n\n // Resolve ENS → address\n const { data: resolvedAddress } = useEnsAddress({\n name: ensInput,\n chainId: chain.id,\n query: { enabled: !!ensInput },\n })\n\n const address = isAddr ? ensOrAddress! : resolvedAddress ?? null\n\n // Reverse resolve address → ENS\n const { data: ensName } = useEnsName({\n address: address as `0x${string}` | undefined,\n chainId: chain.id,\n query: { enabled: !!address },\n })\n\n const displayName = ensInput || ensName || null\n\n const ensAvatar = useSafeAvatar(displayName ? safeNormalize(displayName) : undefined, chain.id)\n\n // On-chain attestations\n const {\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n isLoading: claimsLoading,\n } = useAttestations(address)\n\n // PGP proofs come from the key stored in the current attestation — the\n // latest claim that is active and whose signature verified (the same rule\n // useAttestations uses to pick currentFingerprint).\n const currentClaim = [...claims].reverse().find(\n (c) => !c.revoked && c.verification?.verified && c.fingerprint === currentFingerprint,\n )\n const {\n keyInfo: pgpKeyInfo,\n proofs,\n isLoading: proofsLoading,\n } = usePGPProofs(currentFingerprint, currentClaim?.pgpPublicKey ?? null)\n\n // EFP social graph\n const { efp, isLoading: efpLoading } = useEFPGraph(address)\n\n return {\n address,\n ensName: displayName,\n ensAvatar,\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n pgpKeyInfo,\n proofs,\n efp,\n isLoading: claimsLoading || proofsLoading || efpLoading,\n error: null,\n }\n}\n","import { useReadContract, useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { hexToString } from 'viem'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { bytesToFingerprint } from '../core/fingerprint'\nimport { chainFor } from '../provider'\nimport { verifyAttestation } from '../core/pgp'\nimport { useIdentityKitConfig } from '../context'\nimport type { Attestation } from '../core/types'\n\n/**\n * On-chain attestations for an address, read straight from the v2 registry:\n * `attestationsOf` for the history, `getPayload` for each stored signature + key.\n * No event logs, so any RPC works. Each claim is verified off-chain.\n */\nexport function useAttestations(address: string | undefined | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n\n const { data: rows, isLoading: rowsLoading } = useReadContract({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'attestationsOf',\n args: owner ? [owner] : undefined,\n chainId: chain.id,\n query: { enabled: !!owner },\n })\n\n const count = rows?.length ?? 0\n\n const contracts = owner && rows\n ? rows.map((_, i) => ({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'getPayload' as const,\n args: [owner, BigInt(i)] as const,\n chainId: chain.id,\n }))\n : []\n\n const { data: payloads, isLoading: payloadsLoading } = useReadContracts({\n contracts,\n query: { enabled: contracts.length > 0 },\n })\n\n const payloadsReady = count === 0 || (payloads !== undefined && payloads.length === count)\n\n const { data: claims, isLoading: verifyLoading } = useQuery({\n queryKey: ['attestations', config.network, registry.address, address, count, payloadsReady],\n queryFn: async (): Promise<Attestation[]> => {\n if (!rows || !address) return []\n const results: Attestation[] = []\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const payload = payloads?.[i]\n let pgpSignature: string | null = null\n let pgpPublicKey: string | null = null\n if (payload && payload.status === 'success') {\n const [sigHex, keyHex] = payload.result as readonly [`0x${string}`, `0x${string}`]\n pgpSignature = hexToString(sigHex)\n pgpPublicKey = hexToString(keyHex)\n }\n\n const fingerprint = bytesToFingerprint(row.fingerprint)\n const verification = pgpPublicKey && pgpSignature\n ? await verifyAttestation({ pgpPublicKey, pgpSignature, fingerprint, ethAddress: address })\n : null\n\n const revokedAt = Number(row.revokedAt)\n results.push({\n index: i,\n fingerprint,\n createdAt: Number(row.createdAt),\n revoked: revokedAt !== 0,\n revokedAt: revokedAt === 0 ? null : revokedAt,\n messageVersion: Number(row.messageVersion),\n pgpSignature,\n pgpPublicKey,\n verification,\n })\n }\n return results\n },\n enabled: !!rows && payloadsReady,\n staleTime: 300_000,\n })\n\n const isLoading = rowsLoading || payloadsLoading || verifyLoading || (!!owner && rows !== undefined && !payloadsReady)\n\n const activeClaims = (claims || []).filter((c) => !c.revoked)\n // The current identity is the latest claim that is both active and has a\n // verified signature binding the key to this address. A claim whose signature\n // has not verified must not surface the key's proofs or user data.\n const verifiedClaims = activeClaims.filter((c) => c.verification?.verified)\n const currentFingerprint = verifiedClaims.length > 0\n ? verifiedClaims[verifiedClaims.length - 1].fingerprint\n : null\n\n return {\n claims: claims || [],\n totalClaims: count,\n activeClaims: activeClaims.length,\n currentFingerprint,\n isLoading,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { fetchEFPGraph } from '../core/efp'\nimport type { EFPGraph } from '../core/types'\n\nexport function useEFPGraph(address: string | undefined | null) {\n const { data, isLoading } = useQuery<EFPGraph | null>({\n queryKey: ['efp-graph', address],\n queryFn: () => fetchEFPGraph(address!),\n enabled: !!address,\n staleTime: 300_000,\n })\n\n return {\n efp: data ?? null,\n isLoading,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { parsePgpKey } from '../core/pgp'\nimport { identifyProof, verifyProof, displayUrl, proofHref, proofSecondaryHref } from '../core/proofs'\nimport { useIdentityKitConfig } from '../context'\nimport type { PGPKeyInfo, ProofResult } from '../core/types'\n\n/**\n * Proofs for an identity, read from the PGP key stored in its on-chain\n * attestation. No keyserver is consulted: keys.openpgp.org only serves user\n * IDs whose email is verified and drops non-email user IDs entirely, so it can\n * never carry the published (non-email) identity that holds the notations.\n *\n * @param fingerprint the attested fingerprint (proofs must name it)\n * @param armoredKey the attestation's `pgpPublicKey`\n */\nexport function usePGPProofs(fingerprint: string | undefined | null, armoredKey: string | undefined | null) {\n const config = useIdentityKitConfig()\n\n const { data } = useQuery({\n // The key is large; key the query on its length + fingerprint, which\n // changes whenever a different attestation's key is supplied.\n queryKey: ['pgp-proofs', fingerprint, armoredKey?.length ?? 0],\n queryFn: async (): Promise<{ keyInfo: PGPKeyInfo | null; proofs: ProofResult[] }> => {\n if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] }\n\n const keyInfo = await parsePgpKey(armoredKey)\n if (!keyInfo) return { keyInfo: null, proofs: [] }\n\n // Identify proofs from notations. Drop unrecognized targets (provider\n // 'unknown') so the card doesn't render \"Unknown\" badges for platforms\n // Thurin has no verifier for — matching the explorer's behavior.\n const identified = keyInfo.notations\n .map((n) => identifyProof(n))\n .filter((p): p is NonNullable<typeof p> => p !== null && p.provider !== 'unknown')\n\n // Verify all proofs in parallel\n const proofs: ProofResult[] = await Promise.all(\n identified.map(async (proof) => {\n const result = await verifyProof(proof, fingerprint, config.neynarApiKey)\n return {\n provider: proof.provider,\n label: proof.label,\n url: proof.url,\n displayUrl: displayUrl(proof),\n href: proofHref(proof),\n secondaryHref: proofSecondaryHref(proof),\n status: result.verified ? 'verified' as const : 'unverified' as const,\n reason: result.reason,\n }\n }),\n )\n\n // Collapse proofs that resolve to the same account — the same target is\n // often listed under both proof@thurin.id and proof@ariadne.id (and can\n // be reached via more than one proof URL). Key by provider + display\n // identity, preferring a verified result.\n const byAccount = new Map<string, ProofResult>()\n for (const p of proofs) {\n const key = `${p.provider}:${p.displayUrl}`\n const prev = byAccount.get(key)\n if (!prev || (p.status === 'verified' && prev.status !== 'verified')) {\n byAccount.set(key, p)\n }\n }\n\n return { keyInfo, proofs: [...byAccount.values()] }\n },\n enabled: !!fingerprint && !!armoredKey,\n staleTime: 300_000,\n })\n\n return {\n keyInfo: data?.keyInfo ?? null,\n proofs: data?.proofs ?? [],\n // Report loading whenever a fingerprint is set but its proofs haven't\n // resolved yet. Using react-query's own isLoading leaves a gap while the\n // query is enabling (fingerprint just became known), during which the card\n // would briefly paint without proof badges and then pop them in.\n isLoading: !!fingerprint && !!armoredKey && data === undefined,\n }\n}\n","import { useEnsText, useReadContract } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { avatarUrl, parseNftAvatar, nftAvatarImage, NFT_AVATAR_ABI } from '../core/avatar'\n\n/**\n * The avatar to show for a normalized ENS name, or null. Reads the raw `avatar` record and\n * loads only what `avatarUrl` allows (see core/avatar.ts); wagmi's useEnsAvatar would fetch\n * whatever host the name's owner chose.\n */\nexport function useSafeAvatar(name: string | undefined, chainId: number): string | null {\n const { data: raw } = useEnsText({ name, key: 'avatar', chainId, query: { enabled: !!name } })\n const direct = avatarUrl(raw)\n const nft = direct ? null : parseNftAvatar(raw)\n const { data: tokenUri } = useReadContract({\n address: nft?.contract,\n abi: NFT_AVATAR_ABI,\n functionName: nft?.standard === 'erc1155' ? 'uri' : 'tokenURI',\n args: nft ? [nft.tokenId] : undefined,\n chainId,\n query: { enabled: !!nft && nft.chainId === chainId },\n })\n const { data: image } = useQuery({\n queryKey: ['thurin-nft-avatar', tokenUri, nft?.tokenId.toString()],\n queryFn: () => nftAvatarImage(tokenUri as string, nft!.tokenId).catch(() => null),\n enabled: typeof tokenUri === 'string' && !!nft,\n })\n return direct ?? image ?? null\n}\n","import { useThurinIdentity } from '../../hooks/useThurinIdentity'\nimport { useIdentityKitConfig } from '../../context'\nimport type { Theme } from '../../core/types'\nimport '../../themes/index.css'\nimport './ThurinCard.css'\n\nfunction ThurinLogo() {\n return (\n <svg className=\"thurin-card-avatar-placeholder\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"var(--thurin-surface-deep)\" />\n <path d=\"M25 80 Q25 25 50 25 Q75 25 75 50\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M33 75 Q33 35 50 35 Q67 35 67 52\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M41 70 Q41 45 50 45 Q59 45 59 55\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M50 65 L50 53\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\nexport interface ThurinCardProps {\n ens?: string\n address?: string\n theme?: Theme\n}\n\nexport function ThurinCard({ ens, address, theme = 'thurin' }: ThurinCardProps) {\n const input = ens || address\n const identity = useThurinIdentity(input)\n const config = useIdentityKitConfig()\n\n const profileUrl = identity.address\n ? `${config.baseUrl}/eth/${identity.address}`\n : ens\n ? `${config.baseUrl}/ens/${ens}`\n : null\n\n if (identity.isLoading) {\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <div className=\"thurin-card-loading\">Loading identity...</div>\n </div>\n )\n }\n\n const displayAddress = identity.address || null\n\n const verifiedProofs = identity.proofs.filter((p) => p.status === 'verified').length\n const hasVerifiedPgp = identity.claims.some((c) => c.verification?.verified && !c.revoked)\n\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <a className=\"thurin-card-header\" href={profileUrl || undefined} target=\"_blank\" rel=\"noopener noreferrer\">\n {identity.ensAvatar ? (\n <img\n className=\"thurin-card-avatar\"\n src={identity.ensAvatar}\n alt={identity.ensName || ''}\n />\n ) : (\n <ThurinLogo />\n )}\n <div>\n {identity.ensName && (\n <div className=\"thurin-card-name\">{identity.ensName}</div>\n )}\n {displayAddress && (\n <div className=\"thurin-card-address\">{displayAddress}</div>\n )}\n </div>\n </a>\n\n <div className=\"thurin-card-stats\">\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{identity.activeClaims}</span>\n <span className=\"thurin-card-stat-label\">Attestations</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{verifiedProofs}</span>\n <span className=\"thurin-card-stat-label\">Proofs</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">\n {identity.efp?.followers ?? 0}\n </span>\n <span className=\"thurin-card-stat-label\">Followers</span>\n </div>\n </div>\n\n <div className=\"thurin-card-badges\">\n {hasVerifiedPgp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">PGP Verified</span>\n )}\n {identity.efp?.hasEfp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">EFP</span>\n )}\n {identity.proofs.map((p, i) => (\n <span\n key={i}\n className={`thurin-card-badge thurin-card-badge--${p.status === 'verified' ? 'verified' : 'unverified'}`}\n >\n {p.label}\n </span>\n ))}\n </div>\n\n {profileUrl && (\n <a\n className=\"thurin-card-link\"\n href={profileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on Thurin\n </a>\n )}\n </div>\n )\n}\n","import { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { ENS_HINT_KEY, ensHintFor, type EnsHint } from '../core/ensHint'\n\nfunction safeNormalize(name: string): string | undefined {\n try { return normalize(name) } catch { return undefined }\n}\n\n/**\n * A name's `id.thurin` record against the fingerprint the registry verifies for its\n * address. `state` is `match`, `unset`, or `mismatch`; the last one is the signal worth\n * showing — a name advertising a key its address has not claimed.\n */\nexport function useEnsHint(name: string | undefined | null, verifiedFingerprint: string | null | undefined): EnsHint & { isLoading: boolean; refetch: () => void } {\n const chain = chainFor(useIdentityKitConfig().network)\n const ensName = name ? safeNormalize(name) : undefined\n const { data, isLoading, refetch } = useEnsText({\n name: ensName,\n key: ENS_HINT_KEY,\n chainId: chain.id,\n query: { enabled: !!ensName },\n })\n return { ...ensHintFor(data ?? null, verifiedFingerprint), isLoading: !!ensName && isLoading, refetch: () => { void refetch() } }\n}\n","import { useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { chainFor } from '../provider'\nimport { useIdentityKitConfig } from '../context'\nimport { IDENTITY_KINDS, decodeRecord, parseRecord, recordKind, type ParsedRecord } from '../core/records'\n\n/**\n * The records on one claim, for the kinds given (default: the kinds an identity page shows),\n * read in one multicall and parsed. Kinds with no record are left out.\n */\nexport function useRecords(address: string | undefined | null, index: number | undefined | null, kinds: readonly string[] = IDENTITY_KINDS, armoredKey?: string | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n const enabled = !!owner && index !== undefined && index !== null\n\n const contracts = enabled\n ? kinds.map(kind => ({ address: registry.address, abi: REGISTRY_ABI, functionName: 'record' as const, args: [owner!, BigInt(index!), recordKind(kind)] as const, chainId: chain.id }))\n : []\n const { data: raw, isLoading: readLoading, refetch } = useReadContracts({ contracts, query: { enabled: contracts.length > 0 } })\n\n const texts = (raw ?? []).map(r => (r.status === 'success' ? decodeRecord(r.result as `0x${string}`) : ''))\n const { data: records, isLoading: parseLoading } = useQuery({\n queryKey: ['records', config.network, registry.address, address, index, kinds.join(','), texts.join(' '), armoredKey ?? ''],\n queryFn: async (): Promise<ParsedRecord[]> => {\n const out: ParsedRecord[] = []\n for (let i = 0; i < kinds.length; i++) if (texts[i]) out.push(await parseRecord(kinds[i], texts[i], { armoredKey: armoredKey ?? undefined }))\n return out\n },\n enabled: enabled && raw !== undefined,\n })\n\n return { records: records ?? [], isLoading: enabled && (readLoading || parseLoading), refetch: () => { void refetch() } }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { IdentityKitConfig, Theme, ThurinIdentity, Attestation, EFPGraph, PGPKeyInfo, ProofResult, EnsHint, ParsedRecord } from './core.cjs';
|
|
4
|
-
export { AUTHORIZATION_TYPES, AttestAuthorization, AuthorizationAction, EIP712_NAME, EIP712_VERSION, ENS_HINT_KEY, ENS_TEXT_RESOLVER_ABI, EnsHintState, EnsTextReader, IDENTITY_KINDS, KNOWN_KINDS, KnownKind, MAX_RECORD_BYTES, NETWORKS, NetworkName, Notation, PGPVerification, PointerEntry, PointerRecord, Proof, REGISTRY_ABI, REGISTRY_ADDRESS, ReattestAuthorization, RecordData, RecordReader, RegistryDeployment, RevokeAuthorization, SetRecordAuthorization, StrippedKey, SubkeyInfo, UpdateKeyAuthorization, addPointer, attestTypedData, authorizationDigest, bytesToFingerprint, chainFor, decodeRecord, displayUrl, encodeRecord, ensHintFor, ensHintValue, ensHintWrite, fetchEFPGraph, fetchEnsHint, fetchRecords, fingerprintHash, fingerprintToBytes, getRegistry, hasEmailUserID, identifyProof, isNetworkName, keyIdOf, keyIdToBytes, kindName, normalizeFingerprint, parsePgpKey, parsePointer, parseRecord, proofHref, proofSecondaryHref, reattestTypedData, recordKind, registryDomain, renderPointer, revokeTypedData, setRecordTypedData, stripEmailUserIDs, updateKeyTypedData, verifyAttestation, verifyClearsigned, verifyProof } from './core.cjs';
|
|
4
|
+
export { ARWEAVE_GATEWAY, AUTHORIZATION_TYPES, AttestAuthorization, AuthorizationAction, EIP712_NAME, EIP712_VERSION, ENS_HINT_KEY, ENS_TEXT_RESOLVER_ABI, EnsHintState, EnsTextReader, IDENTITY_KINDS, IPFS_GATEWAY, KNOWN_KINDS, KnownKind, MAX_RECORD_BYTES, NETWORKS, NFT_AVATAR_ABI, NetworkName, NftAvatar, Notation, PGPVerification, PointerEntry, PointerRecord, Proof, REGISTRY_ABI, REGISTRY_ADDRESS, ReattestAuthorization, RecordData, RecordReader, RegistryDeployment, RevokeAuthorization, SetRecordAuthorization, StrippedKey, SubkeyInfo, UpdateKeyAuthorization, addPointer, attestTypedData, authorizationDigest, avatarUrl, bytesToFingerprint, chainFor, decodeRecord, displayUrl, encodeRecord, ensHintFor, ensHintValue, ensHintWrite, fetchEFPGraph, fetchEnsHint, fetchRecords, fingerprintHash, fingerprintToBytes, getRegistry, hasEmailUserID, identifyProof, isNetworkName, keyIdOf, keyIdToBytes, kindName, nftAvatarImage, normalizeFingerprint, parseNftAvatar, parsePgpKey, parsePointer, parseRecord, proofHref, proofSecondaryHref, reattestTypedData, recordKind, registryDomain, renderPointer, revokeTypedData, setRecordTypedData, stripEmailUserIDs, updateKeyTypedData, verifyAttestation, verifyClearsigned, verifyProof } from './core.cjs';
|
|
5
5
|
import 'viem';
|
|
6
6
|
|
|
7
7
|
interface IdentityKitProviderProps extends IdentityKitConfig {
|
|
@@ -71,4 +71,11 @@ declare function useRecords(address: string | undefined | null, index: number |
|
|
|
71
71
|
refetch: () => void;
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The avatar to show for a normalized ENS name, or null. Reads the raw `avatar` record and
|
|
76
|
+
* loads only what `avatarUrl` allows (see core/avatar.ts); wagmi's useEnsAvatar would fetch
|
|
77
|
+
* whatever host the name's owner chose.
|
|
78
|
+
*/
|
|
79
|
+
declare function useSafeAvatar(name: string | undefined, chainId: number): string | null;
|
|
80
|
+
|
|
81
|
+
export { Attestation, EFPGraph, EnsHint, IdentityKitConfig, IdentityKitProvider, type IdentityKitProviderProps, PGPKeyInfo, ParsedRecord, ProofResult, Theme, ThurinCard, type ThurinCardProps, ThurinIdentity, useAttestations, useEFPGraph, useEnsHint, usePGPProofs, useRecords, useSafeAvatar, useThurinIdentity };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { IdentityKitConfig, Theme, ThurinIdentity, Attestation, EFPGraph, PGPKeyInfo, ProofResult, EnsHint, ParsedRecord } from './core.js';
|
|
4
|
-
export { AUTHORIZATION_TYPES, AttestAuthorization, AuthorizationAction, EIP712_NAME, EIP712_VERSION, ENS_HINT_KEY, ENS_TEXT_RESOLVER_ABI, EnsHintState, EnsTextReader, IDENTITY_KINDS, KNOWN_KINDS, KnownKind, MAX_RECORD_BYTES, NETWORKS, NetworkName, Notation, PGPVerification, PointerEntry, PointerRecord, Proof, REGISTRY_ABI, REGISTRY_ADDRESS, ReattestAuthorization, RecordData, RecordReader, RegistryDeployment, RevokeAuthorization, SetRecordAuthorization, StrippedKey, SubkeyInfo, UpdateKeyAuthorization, addPointer, attestTypedData, authorizationDigest, bytesToFingerprint, chainFor, decodeRecord, displayUrl, encodeRecord, ensHintFor, ensHintValue, ensHintWrite, fetchEFPGraph, fetchEnsHint, fetchRecords, fingerprintHash, fingerprintToBytes, getRegistry, hasEmailUserID, identifyProof, isNetworkName, keyIdOf, keyIdToBytes, kindName, normalizeFingerprint, parsePgpKey, parsePointer, parseRecord, proofHref, proofSecondaryHref, reattestTypedData, recordKind, registryDomain, renderPointer, revokeTypedData, setRecordTypedData, stripEmailUserIDs, updateKeyTypedData, verifyAttestation, verifyClearsigned, verifyProof } from './core.js';
|
|
4
|
+
export { ARWEAVE_GATEWAY, AUTHORIZATION_TYPES, AttestAuthorization, AuthorizationAction, EIP712_NAME, EIP712_VERSION, ENS_HINT_KEY, ENS_TEXT_RESOLVER_ABI, EnsHintState, EnsTextReader, IDENTITY_KINDS, IPFS_GATEWAY, KNOWN_KINDS, KnownKind, MAX_RECORD_BYTES, NETWORKS, NFT_AVATAR_ABI, NetworkName, NftAvatar, Notation, PGPVerification, PointerEntry, PointerRecord, Proof, REGISTRY_ABI, REGISTRY_ADDRESS, ReattestAuthorization, RecordData, RecordReader, RegistryDeployment, RevokeAuthorization, SetRecordAuthorization, StrippedKey, SubkeyInfo, UpdateKeyAuthorization, addPointer, attestTypedData, authorizationDigest, avatarUrl, bytesToFingerprint, chainFor, decodeRecord, displayUrl, encodeRecord, ensHintFor, ensHintValue, ensHintWrite, fetchEFPGraph, fetchEnsHint, fetchRecords, fingerprintHash, fingerprintToBytes, getRegistry, hasEmailUserID, identifyProof, isNetworkName, keyIdOf, keyIdToBytes, kindName, nftAvatarImage, normalizeFingerprint, parseNftAvatar, parsePgpKey, parsePointer, parseRecord, proofHref, proofSecondaryHref, reattestTypedData, recordKind, registryDomain, renderPointer, revokeTypedData, setRecordTypedData, stripEmailUserIDs, updateKeyTypedData, verifyAttestation, verifyClearsigned, verifyProof } from './core.js';
|
|
5
5
|
import 'viem';
|
|
6
6
|
|
|
7
7
|
interface IdentityKitProviderProps extends IdentityKitConfig {
|
|
@@ -71,4 +71,11 @@ declare function useRecords(address: string | undefined | null, index: number |
|
|
|
71
71
|
refetch: () => void;
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The avatar to show for a normalized ENS name, or null. Reads the raw `avatar` record and
|
|
76
|
+
* loads only what `avatarUrl` allows (see core/avatar.ts); wagmi's useEnsAvatar would fetch
|
|
77
|
+
* whatever host the name's owner chose.
|
|
78
|
+
*/
|
|
79
|
+
declare function useSafeAvatar(name: string | undefined, chainId: number): string | null;
|
|
80
|
+
|
|
81
|
+
export { Attestation, EFPGraph, EnsHint, IdentityKitConfig, IdentityKitProvider, type IdentityKitProviderProps, PGPKeyInfo, ParsedRecord, ProofResult, Theme, ThurinCard, type ThurinCardProps, ThurinIdentity, useAttestations, useEFPGraph, useEnsHint, usePGPProofs, useRecords, useSafeAvatar, useThurinIdentity };
|