@thurinlabs/identity-kit 0.7.5 → 1.0.0

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/dist/index.cjs CHANGED
@@ -2,12 +2,1247 @@
2
2
  var _react = require('react');
3
3
  var _wagmi = require('wagmi');
4
4
  var _chains = require('wagmi/chains');
5
+
6
+ // src/core/abi.ts
7
+ var REGISTRY_ABI = [
8
+ {
9
+ "type": "function",
10
+ "name": "ATTEST_TYPEHASH",
11
+ "inputs": [],
12
+ "outputs": [
13
+ {
14
+ "name": "",
15
+ "type": "bytes32",
16
+ "internalType": "bytes32"
17
+ }
18
+ ],
19
+ "stateMutability": "view"
20
+ },
21
+ {
22
+ "type": "function",
23
+ "name": "DOMAIN_SEPARATOR",
24
+ "inputs": [],
25
+ "outputs": [
26
+ {
27
+ "name": "",
28
+ "type": "bytes32",
29
+ "internalType": "bytes32"
30
+ }
31
+ ],
32
+ "stateMutability": "view"
33
+ },
34
+ {
35
+ "type": "function",
36
+ "name": "EIP712_NAME",
37
+ "inputs": [],
38
+ "outputs": [
39
+ {
40
+ "name": "",
41
+ "type": "string",
42
+ "internalType": "string"
43
+ }
44
+ ],
45
+ "stateMutability": "view"
46
+ },
47
+ {
48
+ "type": "function",
49
+ "name": "EIP712_VERSION",
50
+ "inputs": [],
51
+ "outputs": [
52
+ {
53
+ "name": "",
54
+ "type": "string",
55
+ "internalType": "string"
56
+ }
57
+ ],
58
+ "stateMutability": "view"
59
+ },
60
+ {
61
+ "type": "function",
62
+ "name": "MAX_KEY_BYTES",
63
+ "inputs": [],
64
+ "outputs": [
65
+ {
66
+ "name": "",
67
+ "type": "uint256",
68
+ "internalType": "uint256"
69
+ }
70
+ ],
71
+ "stateMutability": "view"
72
+ },
73
+ {
74
+ "type": "function",
75
+ "name": "MAX_RECORD_BYTES",
76
+ "inputs": [],
77
+ "outputs": [
78
+ {
79
+ "name": "",
80
+ "type": "uint256",
81
+ "internalType": "uint256"
82
+ }
83
+ ],
84
+ "stateMutability": "view"
85
+ },
86
+ {
87
+ "type": "function",
88
+ "name": "MAX_SIG_BYTES",
89
+ "inputs": [],
90
+ "outputs": [
91
+ {
92
+ "name": "",
93
+ "type": "uint256",
94
+ "internalType": "uint256"
95
+ }
96
+ ],
97
+ "stateMutability": "view"
98
+ },
99
+ {
100
+ "type": "function",
101
+ "name": "MESSAGE_VERSION",
102
+ "inputs": [],
103
+ "outputs": [
104
+ {
105
+ "name": "",
106
+ "type": "uint8",
107
+ "internalType": "uint8"
108
+ }
109
+ ],
110
+ "stateMutability": "view"
111
+ },
112
+ {
113
+ "type": "function",
114
+ "name": "REATTEST_TYPEHASH",
115
+ "inputs": [],
116
+ "outputs": [
117
+ {
118
+ "name": "",
119
+ "type": "bytes32",
120
+ "internalType": "bytes32"
121
+ }
122
+ ],
123
+ "stateMutability": "view"
124
+ },
125
+ {
126
+ "type": "function",
127
+ "name": "REVOKE_TYPEHASH",
128
+ "inputs": [],
129
+ "outputs": [
130
+ {
131
+ "name": "",
132
+ "type": "bytes32",
133
+ "internalType": "bytes32"
134
+ }
135
+ ],
136
+ "stateMutability": "view"
137
+ },
138
+ {
139
+ "type": "function",
140
+ "name": "SET_RECORD_TYPEHASH",
141
+ "inputs": [],
142
+ "outputs": [
143
+ {
144
+ "name": "",
145
+ "type": "bytes32",
146
+ "internalType": "bytes32"
147
+ }
148
+ ],
149
+ "stateMutability": "view"
150
+ },
151
+ {
152
+ "type": "function",
153
+ "name": "UPDATE_KEY_TYPEHASH",
154
+ "inputs": [],
155
+ "outputs": [
156
+ {
157
+ "name": "",
158
+ "type": "bytes32",
159
+ "internalType": "bytes32"
160
+ }
161
+ ],
162
+ "stateMutability": "view"
163
+ },
164
+ {
165
+ "type": "function",
166
+ "name": "VERSION",
167
+ "inputs": [],
168
+ "outputs": [
169
+ {
170
+ "name": "",
171
+ "type": "uint8",
172
+ "internalType": "uint8"
173
+ }
174
+ ],
175
+ "stateMutability": "view"
176
+ },
177
+ {
178
+ "type": "function",
179
+ "name": "addressesFor",
180
+ "inputs": [
181
+ {
182
+ "name": "fingerprintHash",
183
+ "type": "bytes32",
184
+ "internalType": "bytes32"
185
+ }
186
+ ],
187
+ "outputs": [
188
+ {
189
+ "name": "",
190
+ "type": "address[]",
191
+ "internalType": "address[]"
192
+ }
193
+ ],
194
+ "stateMutability": "view"
195
+ },
196
+ {
197
+ "type": "function",
198
+ "name": "addressesForCount",
199
+ "inputs": [
200
+ {
201
+ "name": "fingerprintHash",
202
+ "type": "bytes32",
203
+ "internalType": "bytes32"
204
+ }
205
+ ],
206
+ "outputs": [
207
+ {
208
+ "name": "",
209
+ "type": "uint256",
210
+ "internalType": "uint256"
211
+ }
212
+ ],
213
+ "stateMutability": "view"
214
+ },
215
+ {
216
+ "type": "function",
217
+ "name": "addressesForRange",
218
+ "inputs": [
219
+ {
220
+ "name": "fingerprintHash",
221
+ "type": "bytes32",
222
+ "internalType": "bytes32"
223
+ },
224
+ {
225
+ "name": "start",
226
+ "type": "uint256",
227
+ "internalType": "uint256"
228
+ },
229
+ {
230
+ "name": "count",
231
+ "type": "uint256",
232
+ "internalType": "uint256"
233
+ }
234
+ ],
235
+ "outputs": [
236
+ {
237
+ "name": "out",
238
+ "type": "address[]",
239
+ "internalType": "address[]"
240
+ }
241
+ ],
242
+ "stateMutability": "view"
243
+ },
244
+ {
245
+ "type": "function",
246
+ "name": "attest",
247
+ "inputs": [
248
+ {
249
+ "name": "fingerprint",
250
+ "type": "bytes",
251
+ "internalType": "bytes"
252
+ },
253
+ {
254
+ "name": "pgpSignature",
255
+ "type": "bytes",
256
+ "internalType": "bytes"
257
+ },
258
+ {
259
+ "name": "pgpPublicKey",
260
+ "type": "bytes",
261
+ "internalType": "bytes"
262
+ }
263
+ ],
264
+ "outputs": [
265
+ {
266
+ "name": "index",
267
+ "type": "uint256",
268
+ "internalType": "uint256"
269
+ }
270
+ ],
271
+ "stateMutability": "nonpayable"
272
+ },
273
+ {
274
+ "type": "function",
275
+ "name": "attestFor",
276
+ "inputs": [
277
+ {
278
+ "name": "owner",
279
+ "type": "address",
280
+ "internalType": "address"
281
+ },
282
+ {
283
+ "name": "fingerprint",
284
+ "type": "bytes",
285
+ "internalType": "bytes"
286
+ },
287
+ {
288
+ "name": "pgpSignature",
289
+ "type": "bytes",
290
+ "internalType": "bytes"
291
+ },
292
+ {
293
+ "name": "pgpPublicKey",
294
+ "type": "bytes",
295
+ "internalType": "bytes"
296
+ },
297
+ {
298
+ "name": "deadline",
299
+ "type": "uint256",
300
+ "internalType": "uint256"
301
+ },
302
+ {
303
+ "name": "signature",
304
+ "type": "bytes",
305
+ "internalType": "bytes"
306
+ }
307
+ ],
308
+ "outputs": [
309
+ {
310
+ "name": "index",
311
+ "type": "uint256",
312
+ "internalType": "uint256"
313
+ }
314
+ ],
315
+ "stateMutability": "nonpayable"
316
+ },
317
+ {
318
+ "type": "function",
319
+ "name": "attestationCount",
320
+ "inputs": [
321
+ {
322
+ "name": "owner",
323
+ "type": "address",
324
+ "internalType": "address"
325
+ }
326
+ ],
327
+ "outputs": [
328
+ {
329
+ "name": "",
330
+ "type": "uint256",
331
+ "internalType": "uint256"
332
+ }
333
+ ],
334
+ "stateMutability": "view"
335
+ },
336
+ {
337
+ "type": "function",
338
+ "name": "attestationsOf",
339
+ "inputs": [
340
+ {
341
+ "name": "owner",
342
+ "type": "address",
343
+ "internalType": "address"
344
+ }
345
+ ],
346
+ "outputs": [
347
+ {
348
+ "name": "",
349
+ "type": "tuple[]",
350
+ "internalType": "struct PGPRegistry.Attestation[]",
351
+ "components": [
352
+ {
353
+ "name": "fingerprint",
354
+ "type": "bytes",
355
+ "internalType": "bytes"
356
+ },
357
+ {
358
+ "name": "createdAt",
359
+ "type": "uint64",
360
+ "internalType": "uint64"
361
+ },
362
+ {
363
+ "name": "revokedAt",
364
+ "type": "uint64",
365
+ "internalType": "uint64"
366
+ },
367
+ {
368
+ "name": "messageVersion",
369
+ "type": "uint8",
370
+ "internalType": "uint8"
371
+ },
372
+ {
373
+ "name": "keyPtr",
374
+ "type": "address",
375
+ "internalType": "address"
376
+ },
377
+ {
378
+ "name": "sigPtr",
379
+ "type": "address",
380
+ "internalType": "address"
381
+ }
382
+ ]
383
+ }
384
+ ],
385
+ "stateMutability": "view"
386
+ },
387
+ {
388
+ "type": "function",
389
+ "name": "attestationsOfRange",
390
+ "inputs": [
391
+ {
392
+ "name": "owner",
393
+ "type": "address",
394
+ "internalType": "address"
395
+ },
396
+ {
397
+ "name": "start",
398
+ "type": "uint256",
399
+ "internalType": "uint256"
400
+ },
401
+ {
402
+ "name": "count",
403
+ "type": "uint256",
404
+ "internalType": "uint256"
405
+ }
406
+ ],
407
+ "outputs": [
408
+ {
409
+ "name": "out",
410
+ "type": "tuple[]",
411
+ "internalType": "struct PGPRegistry.Attestation[]",
412
+ "components": [
413
+ {
414
+ "name": "fingerprint",
415
+ "type": "bytes",
416
+ "internalType": "bytes"
417
+ },
418
+ {
419
+ "name": "createdAt",
420
+ "type": "uint64",
421
+ "internalType": "uint64"
422
+ },
423
+ {
424
+ "name": "revokedAt",
425
+ "type": "uint64",
426
+ "internalType": "uint64"
427
+ },
428
+ {
429
+ "name": "messageVersion",
430
+ "type": "uint8",
431
+ "internalType": "uint8"
432
+ },
433
+ {
434
+ "name": "keyPtr",
435
+ "type": "address",
436
+ "internalType": "address"
437
+ },
438
+ {
439
+ "name": "sigPtr",
440
+ "type": "address",
441
+ "internalType": "address"
442
+ }
443
+ ]
444
+ }
445
+ ],
446
+ "stateMutability": "view"
447
+ },
448
+ {
449
+ "type": "function",
450
+ "name": "cancelAuthorization",
451
+ "inputs": [],
452
+ "outputs": [],
453
+ "stateMutability": "nonpayable"
454
+ },
455
+ {
456
+ "type": "function",
457
+ "name": "current",
458
+ "inputs": [
459
+ {
460
+ "name": "owner",
461
+ "type": "address",
462
+ "internalType": "address"
463
+ }
464
+ ],
465
+ "outputs": [
466
+ {
467
+ "name": "found",
468
+ "type": "bool",
469
+ "internalType": "bool"
470
+ },
471
+ {
472
+ "name": "index",
473
+ "type": "uint256",
474
+ "internalType": "uint256"
475
+ },
476
+ {
477
+ "name": "attestation",
478
+ "type": "tuple",
479
+ "internalType": "struct PGPRegistry.Attestation",
480
+ "components": [
481
+ {
482
+ "name": "fingerprint",
483
+ "type": "bytes",
484
+ "internalType": "bytes"
485
+ },
486
+ {
487
+ "name": "createdAt",
488
+ "type": "uint64",
489
+ "internalType": "uint64"
490
+ },
491
+ {
492
+ "name": "revokedAt",
493
+ "type": "uint64",
494
+ "internalType": "uint64"
495
+ },
496
+ {
497
+ "name": "messageVersion",
498
+ "type": "uint8",
499
+ "internalType": "uint8"
500
+ },
501
+ {
502
+ "name": "keyPtr",
503
+ "type": "address",
504
+ "internalType": "address"
505
+ },
506
+ {
507
+ "name": "sigPtr",
508
+ "type": "address",
509
+ "internalType": "address"
510
+ }
511
+ ]
512
+ }
513
+ ],
514
+ "stateMutability": "view"
515
+ },
516
+ {
517
+ "type": "function",
518
+ "name": "fingerprintsForKeyId",
519
+ "inputs": [
520
+ {
521
+ "name": "keyId",
522
+ "type": "bytes8",
523
+ "internalType": "bytes8"
524
+ }
525
+ ],
526
+ "outputs": [
527
+ {
528
+ "name": "",
529
+ "type": "bytes[]",
530
+ "internalType": "bytes[]"
531
+ }
532
+ ],
533
+ "stateMutability": "view"
534
+ },
535
+ {
536
+ "type": "function",
537
+ "name": "fingerprintsForKeyIdCount",
538
+ "inputs": [
539
+ {
540
+ "name": "keyId",
541
+ "type": "bytes8",
542
+ "internalType": "bytes8"
543
+ }
544
+ ],
545
+ "outputs": [
546
+ {
547
+ "name": "",
548
+ "type": "uint256",
549
+ "internalType": "uint256"
550
+ }
551
+ ],
552
+ "stateMutability": "view"
553
+ },
554
+ {
555
+ "type": "function",
556
+ "name": "fingerprintsForKeyIdRange",
557
+ "inputs": [
558
+ {
559
+ "name": "keyId",
560
+ "type": "bytes8",
561
+ "internalType": "bytes8"
562
+ },
563
+ {
564
+ "name": "start",
565
+ "type": "uint256",
566
+ "internalType": "uint256"
567
+ },
568
+ {
569
+ "name": "count",
570
+ "type": "uint256",
571
+ "internalType": "uint256"
572
+ }
573
+ ],
574
+ "outputs": [
575
+ {
576
+ "name": "out",
577
+ "type": "bytes[]",
578
+ "internalType": "bytes[]"
579
+ }
580
+ ],
581
+ "stateMutability": "view"
582
+ },
583
+ {
584
+ "type": "function",
585
+ "name": "getAttestation",
586
+ "inputs": [
587
+ {
588
+ "name": "owner",
589
+ "type": "address",
590
+ "internalType": "address"
591
+ },
592
+ {
593
+ "name": "index",
594
+ "type": "uint256",
595
+ "internalType": "uint256"
596
+ }
597
+ ],
598
+ "outputs": [
599
+ {
600
+ "name": "",
601
+ "type": "tuple",
602
+ "internalType": "struct PGPRegistry.Attestation",
603
+ "components": [
604
+ {
605
+ "name": "fingerprint",
606
+ "type": "bytes",
607
+ "internalType": "bytes"
608
+ },
609
+ {
610
+ "name": "createdAt",
611
+ "type": "uint64",
612
+ "internalType": "uint64"
613
+ },
614
+ {
615
+ "name": "revokedAt",
616
+ "type": "uint64",
617
+ "internalType": "uint64"
618
+ },
619
+ {
620
+ "name": "messageVersion",
621
+ "type": "uint8",
622
+ "internalType": "uint8"
623
+ },
624
+ {
625
+ "name": "keyPtr",
626
+ "type": "address",
627
+ "internalType": "address"
628
+ },
629
+ {
630
+ "name": "sigPtr",
631
+ "type": "address",
632
+ "internalType": "address"
633
+ }
634
+ ]
635
+ }
636
+ ],
637
+ "stateMutability": "view"
638
+ },
639
+ {
640
+ "type": "function",
641
+ "name": "getPayload",
642
+ "inputs": [
643
+ {
644
+ "name": "owner",
645
+ "type": "address",
646
+ "internalType": "address"
647
+ },
648
+ {
649
+ "name": "index",
650
+ "type": "uint256",
651
+ "internalType": "uint256"
652
+ }
653
+ ],
654
+ "outputs": [
655
+ {
656
+ "name": "pgpSignature",
657
+ "type": "bytes",
658
+ "internalType": "bytes"
659
+ },
660
+ {
661
+ "name": "pgpPublicKey",
662
+ "type": "bytes",
663
+ "internalType": "bytes"
664
+ }
665
+ ],
666
+ "stateMutability": "view"
667
+ },
668
+ {
669
+ "type": "function",
670
+ "name": "nonces",
671
+ "inputs": [
672
+ {
673
+ "name": "",
674
+ "type": "address",
675
+ "internalType": "address"
676
+ }
677
+ ],
678
+ "outputs": [
679
+ {
680
+ "name": "",
681
+ "type": "uint256",
682
+ "internalType": "uint256"
683
+ }
684
+ ],
685
+ "stateMutability": "view"
686
+ },
687
+ {
688
+ "type": "function",
689
+ "name": "reattest",
690
+ "inputs": [
691
+ {
692
+ "name": "revokeIndex",
693
+ "type": "uint256",
694
+ "internalType": "uint256"
695
+ },
696
+ {
697
+ "name": "fingerprint",
698
+ "type": "bytes",
699
+ "internalType": "bytes"
700
+ },
701
+ {
702
+ "name": "pgpSignature",
703
+ "type": "bytes",
704
+ "internalType": "bytes"
705
+ },
706
+ {
707
+ "name": "pgpPublicKey",
708
+ "type": "bytes",
709
+ "internalType": "bytes"
710
+ }
711
+ ],
712
+ "outputs": [
713
+ {
714
+ "name": "index",
715
+ "type": "uint256",
716
+ "internalType": "uint256"
717
+ }
718
+ ],
719
+ "stateMutability": "nonpayable"
720
+ },
721
+ {
722
+ "type": "function",
723
+ "name": "reattestFor",
724
+ "inputs": [
725
+ {
726
+ "name": "owner",
727
+ "type": "address",
728
+ "internalType": "address"
729
+ },
730
+ {
731
+ "name": "revokeIndex",
732
+ "type": "uint256",
733
+ "internalType": "uint256"
734
+ },
735
+ {
736
+ "name": "fingerprint",
737
+ "type": "bytes",
738
+ "internalType": "bytes"
739
+ },
740
+ {
741
+ "name": "pgpSignature",
742
+ "type": "bytes",
743
+ "internalType": "bytes"
744
+ },
745
+ {
746
+ "name": "pgpPublicKey",
747
+ "type": "bytes",
748
+ "internalType": "bytes"
749
+ },
750
+ {
751
+ "name": "deadline",
752
+ "type": "uint256",
753
+ "internalType": "uint256"
754
+ },
755
+ {
756
+ "name": "signature",
757
+ "type": "bytes",
758
+ "internalType": "bytes"
759
+ }
760
+ ],
761
+ "outputs": [
762
+ {
763
+ "name": "index",
764
+ "type": "uint256",
765
+ "internalType": "uint256"
766
+ }
767
+ ],
768
+ "stateMutability": "nonpayable"
769
+ },
770
+ {
771
+ "type": "function",
772
+ "name": "record",
773
+ "inputs": [
774
+ {
775
+ "name": "owner",
776
+ "type": "address",
777
+ "internalType": "address"
778
+ },
779
+ {
780
+ "name": "index",
781
+ "type": "uint256",
782
+ "internalType": "uint256"
783
+ },
784
+ {
785
+ "name": "kind",
786
+ "type": "bytes32",
787
+ "internalType": "bytes32"
788
+ }
789
+ ],
790
+ "outputs": [
791
+ {
792
+ "name": "",
793
+ "type": "bytes",
794
+ "internalType": "bytes"
795
+ }
796
+ ],
797
+ "stateMutability": "view"
798
+ },
799
+ {
800
+ "type": "function",
801
+ "name": "revoke",
802
+ "inputs": [
803
+ {
804
+ "name": "index",
805
+ "type": "uint256",
806
+ "internalType": "uint256"
807
+ }
808
+ ],
809
+ "outputs": [],
810
+ "stateMutability": "nonpayable"
811
+ },
812
+ {
813
+ "type": "function",
814
+ "name": "revokeFor",
815
+ "inputs": [
816
+ {
817
+ "name": "owner",
818
+ "type": "address",
819
+ "internalType": "address"
820
+ },
821
+ {
822
+ "name": "index",
823
+ "type": "uint256",
824
+ "internalType": "uint256"
825
+ },
826
+ {
827
+ "name": "deadline",
828
+ "type": "uint256",
829
+ "internalType": "uint256"
830
+ },
831
+ {
832
+ "name": "signature",
833
+ "type": "bytes",
834
+ "internalType": "bytes"
835
+ }
836
+ ],
837
+ "outputs": [],
838
+ "stateMutability": "nonpayable"
839
+ },
840
+ {
841
+ "type": "function",
842
+ "name": "setRecord",
843
+ "inputs": [
844
+ {
845
+ "name": "index",
846
+ "type": "uint256",
847
+ "internalType": "uint256"
848
+ },
849
+ {
850
+ "name": "kind",
851
+ "type": "bytes32",
852
+ "internalType": "bytes32"
853
+ },
854
+ {
855
+ "name": "value",
856
+ "type": "bytes",
857
+ "internalType": "bytes"
858
+ }
859
+ ],
860
+ "outputs": [],
861
+ "stateMutability": "nonpayable"
862
+ },
863
+ {
864
+ "type": "function",
865
+ "name": "setRecordFor",
866
+ "inputs": [
867
+ {
868
+ "name": "owner",
869
+ "type": "address",
870
+ "internalType": "address"
871
+ },
872
+ {
873
+ "name": "index",
874
+ "type": "uint256",
875
+ "internalType": "uint256"
876
+ },
877
+ {
878
+ "name": "kind",
879
+ "type": "bytes32",
880
+ "internalType": "bytes32"
881
+ },
882
+ {
883
+ "name": "value",
884
+ "type": "bytes",
885
+ "internalType": "bytes"
886
+ },
887
+ {
888
+ "name": "deadline",
889
+ "type": "uint256",
890
+ "internalType": "uint256"
891
+ },
892
+ {
893
+ "name": "signature",
894
+ "type": "bytes",
895
+ "internalType": "bytes"
896
+ }
897
+ ],
898
+ "outputs": [],
899
+ "stateMutability": "nonpayable"
900
+ },
901
+ {
902
+ "type": "function",
903
+ "name": "updateKey",
904
+ "inputs": [
905
+ {
906
+ "name": "index",
907
+ "type": "uint256",
908
+ "internalType": "uint256"
909
+ },
910
+ {
911
+ "name": "pgpPublicKey",
912
+ "type": "bytes",
913
+ "internalType": "bytes"
914
+ }
915
+ ],
916
+ "outputs": [],
917
+ "stateMutability": "nonpayable"
918
+ },
919
+ {
920
+ "type": "function",
921
+ "name": "updateKeyFor",
922
+ "inputs": [
923
+ {
924
+ "name": "owner",
925
+ "type": "address",
926
+ "internalType": "address"
927
+ },
928
+ {
929
+ "name": "index",
930
+ "type": "uint256",
931
+ "internalType": "uint256"
932
+ },
933
+ {
934
+ "name": "pgpPublicKey",
935
+ "type": "bytes",
936
+ "internalType": "bytes"
937
+ },
938
+ {
939
+ "name": "deadline",
940
+ "type": "uint256",
941
+ "internalType": "uint256"
942
+ },
943
+ {
944
+ "name": "signature",
945
+ "type": "bytes",
946
+ "internalType": "bytes"
947
+ }
948
+ ],
949
+ "outputs": [],
950
+ "stateMutability": "nonpayable"
951
+ },
952
+ {
953
+ "type": "event",
954
+ "name": "Attested",
955
+ "inputs": [
956
+ {
957
+ "name": "owner",
958
+ "type": "address",
959
+ "indexed": true,
960
+ "internalType": "address"
961
+ },
962
+ {
963
+ "name": "fingerprintHash",
964
+ "type": "bytes32",
965
+ "indexed": true,
966
+ "internalType": "bytes32"
967
+ },
968
+ {
969
+ "name": "index",
970
+ "type": "uint256",
971
+ "indexed": true,
972
+ "internalType": "uint256"
973
+ },
974
+ {
975
+ "name": "fingerprint",
976
+ "type": "bytes",
977
+ "indexed": false,
978
+ "internalType": "bytes"
979
+ },
980
+ {
981
+ "name": "messageVersion",
982
+ "type": "uint8",
983
+ "indexed": false,
984
+ "internalType": "uint8"
985
+ },
986
+ {
987
+ "name": "keyPtr",
988
+ "type": "address",
989
+ "indexed": false,
990
+ "internalType": "address"
991
+ },
992
+ {
993
+ "name": "sigPtr",
994
+ "type": "address",
995
+ "indexed": false,
996
+ "internalType": "address"
997
+ },
998
+ {
999
+ "name": "submitter",
1000
+ "type": "address",
1001
+ "indexed": false,
1002
+ "internalType": "address"
1003
+ }
1004
+ ],
1005
+ "anonymous": false
1006
+ },
1007
+ {
1008
+ "type": "event",
1009
+ "name": "KeyUpdated",
1010
+ "inputs": [
1011
+ {
1012
+ "name": "owner",
1013
+ "type": "address",
1014
+ "indexed": true,
1015
+ "internalType": "address"
1016
+ },
1017
+ {
1018
+ "name": "fingerprintHash",
1019
+ "type": "bytes32",
1020
+ "indexed": true,
1021
+ "internalType": "bytes32"
1022
+ },
1023
+ {
1024
+ "name": "index",
1025
+ "type": "uint256",
1026
+ "indexed": true,
1027
+ "internalType": "uint256"
1028
+ },
1029
+ {
1030
+ "name": "oldKeyPtr",
1031
+ "type": "address",
1032
+ "indexed": false,
1033
+ "internalType": "address"
1034
+ },
1035
+ {
1036
+ "name": "newKeyPtr",
1037
+ "type": "address",
1038
+ "indexed": false,
1039
+ "internalType": "address"
1040
+ },
1041
+ {
1042
+ "name": "submitter",
1043
+ "type": "address",
1044
+ "indexed": false,
1045
+ "internalType": "address"
1046
+ }
1047
+ ],
1048
+ "anonymous": false
1049
+ },
1050
+ {
1051
+ "type": "event",
1052
+ "name": "NonceUsed",
1053
+ "inputs": [
1054
+ {
1055
+ "name": "owner",
1056
+ "type": "address",
1057
+ "indexed": true,
1058
+ "internalType": "address"
1059
+ },
1060
+ {
1061
+ "name": "nonce",
1062
+ "type": "uint256",
1063
+ "indexed": false,
1064
+ "internalType": "uint256"
1065
+ }
1066
+ ],
1067
+ "anonymous": false
1068
+ },
1069
+ {
1070
+ "type": "event",
1071
+ "name": "RecordSet",
1072
+ "inputs": [
1073
+ {
1074
+ "name": "owner",
1075
+ "type": "address",
1076
+ "indexed": true,
1077
+ "internalType": "address"
1078
+ },
1079
+ {
1080
+ "name": "index",
1081
+ "type": "uint256",
1082
+ "indexed": true,
1083
+ "internalType": "uint256"
1084
+ },
1085
+ {
1086
+ "name": "kind",
1087
+ "type": "bytes32",
1088
+ "indexed": true,
1089
+ "internalType": "bytes32"
1090
+ },
1091
+ {
1092
+ "name": "submitter",
1093
+ "type": "address",
1094
+ "indexed": false,
1095
+ "internalType": "address"
1096
+ }
1097
+ ],
1098
+ "anonymous": false
1099
+ },
1100
+ {
1101
+ "type": "event",
1102
+ "name": "Revoked",
1103
+ "inputs": [
1104
+ {
1105
+ "name": "owner",
1106
+ "type": "address",
1107
+ "indexed": true,
1108
+ "internalType": "address"
1109
+ },
1110
+ {
1111
+ "name": "fingerprintHash",
1112
+ "type": "bytes32",
1113
+ "indexed": true,
1114
+ "internalType": "bytes32"
1115
+ },
1116
+ {
1117
+ "name": "index",
1118
+ "type": "uint256",
1119
+ "indexed": true,
1120
+ "internalType": "uint256"
1121
+ },
1122
+ {
1123
+ "name": "submitter",
1124
+ "type": "address",
1125
+ "indexed": false,
1126
+ "internalType": "address"
1127
+ }
1128
+ ],
1129
+ "anonymous": false
1130
+ },
1131
+ {
1132
+ "type": "error",
1133
+ "name": "AlreadyRevoked",
1134
+ "inputs": []
1135
+ },
1136
+ {
1137
+ "type": "error",
1138
+ "name": "AuthorizationExpired",
1139
+ "inputs": []
1140
+ },
1141
+ {
1142
+ "type": "error",
1143
+ "name": "DeploymentFailed",
1144
+ "inputs": []
1145
+ },
1146
+ {
1147
+ "type": "error",
1148
+ "name": "DuplicateActiveFingerprint",
1149
+ "inputs": []
1150
+ },
1151
+ {
1152
+ "type": "error",
1153
+ "name": "EmptyPublicKey",
1154
+ "inputs": []
1155
+ },
1156
+ {
1157
+ "type": "error",
1158
+ "name": "EmptySignature",
1159
+ "inputs": []
1160
+ },
1161
+ {
1162
+ "type": "error",
1163
+ "name": "IndexOutOfBounds",
1164
+ "inputs": []
1165
+ },
1166
+ {
1167
+ "type": "error",
1168
+ "name": "InvalidAuthorization",
1169
+ "inputs": []
1170
+ },
1171
+ {
1172
+ "type": "error",
1173
+ "name": "InvalidFingerprintLength",
1174
+ "inputs": []
1175
+ },
1176
+ {
1177
+ "type": "error",
1178
+ "name": "InvalidPointer",
1179
+ "inputs": []
1180
+ },
1181
+ {
1182
+ "type": "error",
1183
+ "name": "PublicKeyTooLarge",
1184
+ "inputs": []
1185
+ },
1186
+ {
1187
+ "type": "error",
1188
+ "name": "RecordTooLarge",
1189
+ "inputs": []
1190
+ },
1191
+ {
1192
+ "type": "error",
1193
+ "name": "SignatureTooLarge",
1194
+ "inputs": []
1195
+ }
1196
+ ];
1197
+
1198
+ // src/core/contract.ts
1199
+ var REGISTRY_ADDRESS = "0x9302E02e2869e129aC8516fE5eFFd51EA3082c09";
1200
+ var NETWORKS = {
1201
+ mainnet: {
1202
+ chainId: 1,
1203
+ address: REGISTRY_ADDRESS,
1204
+ deployBlock: 25962908n,
1205
+ // 2026-09-12, tx 0xda4c3a19cae4e71ffb02559a048403f664d5a7967c19d42158c39600ec63bad8
1206
+ explorerUrl: "https://etherscan.io",
1207
+ defaultRpcUrl: "https://ethereum-rpc.publicnode.com"
1208
+ },
1209
+ sepolia: {
1210
+ chainId: 11155111,
1211
+ address: REGISTRY_ADDRESS,
1212
+ deployBlock: 11683667n,
1213
+ // 2026-09-11, tx 0x3e40e8f5b9fbf82a4b8943561bcc9b964b2987de10640ac8ff3a1b4ef0725322
1214
+ explorerUrl: "https://sepolia.etherscan.io",
1215
+ defaultRpcUrl: "https://ethereum-sepolia-rpc.publicnode.com"
1216
+ },
1217
+ /** A local anvil instance (`anvil`, chain id 31337). Deploy with pgp-registry's Deploy script. */
1218
+ local: {
1219
+ chainId: 31337,
1220
+ address: REGISTRY_ADDRESS,
1221
+ deployBlock: 0n,
1222
+ explorerUrl: "",
1223
+ defaultRpcUrl: "http://127.0.0.1:8545"
1224
+ }
1225
+ };
1226
+ function isNetworkName(value) {
1227
+ return value === "mainnet" || value === "sepolia" || value === "local";
1228
+ }
1229
+ function getRegistry(network = "mainnet", addressOverride) {
1230
+ const r = NETWORKS[network];
1231
+ if (!r) throw new Error(`Unknown network: ${network}`);
1232
+ if (addressOverride && /^0x[0-9a-fA-F]{40}$/.test(addressOverride)) {
1233
+ return { ...r, address: addressOverride };
1234
+ }
1235
+ return r;
1236
+ }
1237
+
1238
+ // src/provider.tsx
5
1239
  var _reactquery = require('@tanstack/react-query');
6
1240
 
7
1241
  // src/context.ts
8
1242
 
9
1243
  var defaultConfig = {
10
- scryBaseUrl: "https://thurin.id"
1244
+ baseUrl: "https://thurin.id",
1245
+ network: "mainnet"
11
1246
  };
12
1247
  var IdentityKitContext = _react.createContext.call(void 0, defaultConfig);
13
1248
  function useIdentityKitConfig() {
@@ -24,22 +1259,25 @@ var defaultQueryClient = new (0, _reactquery.QueryClient)({
24
1259
  }
25
1260
  }
26
1261
  });
27
- function createDefaultWagmiConfig(rpcUrl) {
28
- return _wagmi.createConfig.call(void 0, {
29
- chains: [_chains.mainnet],
30
- transports: {
31
- [_chains.mainnet.id]: _wagmi.http.call(void 0, rpcUrl || "https://ethereum-rpc.publicnode.com")
32
- }
33
- });
1262
+ function chainFor(network = "mainnet") {
1263
+ if (network === "sepolia") return _chains.sepolia;
1264
+ if (network === "local") return _chains.foundry;
1265
+ return _chains.mainnet;
34
1266
  }
35
- function WagmiDetector({ children, rpcUrl }) {
1267
+ function createDefaultWagmiConfig(rpcUrl, network) {
1268
+ const url = rpcUrl || getRegistry(network).defaultRpcUrl;
1269
+ if (network === "sepolia") return _wagmi.createConfig.call(void 0, { chains: [_chains.sepolia], transports: { [_chains.sepolia.id]: _wagmi.http.call(void 0, url) } });
1270
+ if (network === "local") return _wagmi.createConfig.call(void 0, { chains: [_chains.foundry], transports: { [_chains.foundry.id]: _wagmi.http.call(void 0, url) } });
1271
+ return _wagmi.createConfig.call(void 0, { chains: [_chains.mainnet], transports: { [_chains.mainnet.id]: _wagmi.http.call(void 0, url) } });
1272
+ }
1273
+ function WagmiDetector({ children, rpcUrl, network }) {
36
1274
  let hasWagmi = false;
37
1275
  try {
38
1276
  _wagmi.useConfig.call(void 0, );
39
1277
  hasWagmi = true;
40
1278
  } catch (e) {
41
1279
  }
42
- const wagmiConfig = _react.useMemo.call(void 0, () => createDefaultWagmiConfig(rpcUrl), [rpcUrl]);
1280
+ const wagmiConfig = _react.useMemo.call(void 0, () => createDefaultWagmiConfig(rpcUrl, network), [rpcUrl, network]);
43
1281
  if (hasWagmi) {
44
1282
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
45
1283
  }
@@ -49,93 +1287,84 @@ function IdentityKitProvider({
49
1287
  children,
50
1288
  rpcUrl,
51
1289
  neynarApiKey,
52
- scryBaseUrl = "https://thurin.id"
1290
+ baseUrl = "https://thurin.id",
1291
+ network = "mainnet",
1292
+ registryAddress
53
1293
  }) {
54
1294
  const config = _react.useMemo.call(void 0,
55
- () => ({ rpcUrl, neynarApiKey, scryBaseUrl }),
56
- [rpcUrl, neynarApiKey, scryBaseUrl]
1295
+ () => ({ rpcUrl, neynarApiKey, baseUrl, network, registryAddress }),
1296
+ [rpcUrl, neynarApiKey, baseUrl, network, registryAddress]
57
1297
  );
58
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, IdentityKitContext.Provider, { value: config, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, WagmiDetector, { rpcUrl, children }) });
1298
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, IdentityKitContext.Provider, { value: config, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, WagmiDetector, { rpcUrl, network, children }) });
59
1299
  }
60
1300
 
61
- // src/hooks/useScryIdentity.ts
62
-
1301
+ // src/hooks/useThurinIdentity.ts
63
1302
 
64
1303
  var _ens = require('viem/ens');
65
1304
 
66
- // src/hooks/useSignetClaims.ts
67
-
1305
+ // src/hooks/useAttestations.ts
68
1306
 
69
1307
 
70
1308
  var _viem = require('viem');
71
1309
 
72
- // src/core/contract.ts
73
- var REGISTRY_ADDRESS = "0xf7a45BC662A78a6fb417ED5f52b3766cbf13EbBb";
74
- var CONTRACT_DEPLOY_BLOCK = 24515891n;
75
- var REGISTRY_ABI = [
76
- {
77
- name: "Attested",
78
- type: "event",
79
- inputs: [
80
- { name: "ethAddress", type: "address", indexed: true },
81
- { name: "fingerprintHash", type: "string", indexed: true },
82
- { name: "fingerprint", type: "string", indexed: false },
83
- { name: "pgpSignature", type: "string", indexed: false },
84
- { name: "pgpPublicKey", type: "string", indexed: false },
85
- { name: "index", type: "uint256", indexed: false },
86
- { name: "timestamp", type: "uint256", indexed: false }
87
- ]
88
- },
89
- {
90
- name: "attestationCount",
91
- type: "function",
92
- stateMutability: "view",
93
- inputs: [{ name: "addr", type: "address" }],
94
- outputs: [{ name: "", type: "uint256" }]
95
- },
96
- {
97
- name: "getAttestation",
98
- type: "function",
99
- stateMutability: "view",
100
- inputs: [
101
- { name: "addr", type: "address" },
102
- { name: "index", type: "uint256" }
103
- ],
104
- outputs: [
105
- { name: "fingerprint", type: "string" },
106
- { name: "createdAt", type: "uint256" },
107
- { name: "revoked", type: "bool" }
108
- ]
109
- }
110
- ];
1310
+ // src/core/fingerprint.ts
111
1311
 
112
- // src/core/logs.ts
113
- var LOG_CHUNK_SIZE = 49999n;
114
- async function getLogsChunked(client, params) {
115
- const latest = await client.getBlockNumber();
116
- const fromBlock = _nullishCoalesce(params.fromBlock, () => ( CONTRACT_DEPLOY_BLOCK));
117
- const toBlock = params.toBlock === "latest" || !params.toBlock ? latest : params.toBlock;
118
- const allLogs = [];
119
- for (let start = fromBlock; start <= toBlock; start += LOG_CHUNK_SIZE) {
120
- const end = start + LOG_CHUNK_SIZE - 1n > toBlock ? toBlock : start + LOG_CHUNK_SIZE - 1n;
121
- const logs = await client.getLogs({
122
- ...params,
123
- fromBlock: start,
124
- toBlock: end
125
- });
126
- allLogs.push(...logs);
127
- }
128
- return allLogs;
1312
+ var FINGERPRINT_HEX = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
1313
+ function normalizeFingerprint(input) {
1314
+ const hex = input.replace(/^0x/i, "").replace(/\s+/g, "").toLowerCase();
1315
+ return FINGERPRINT_HEX.test(hex) ? hex : null;
1316
+ }
1317
+ function fingerprintToBytes(fingerprint) {
1318
+ const hex = normalizeFingerprint(fingerprint);
1319
+ if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`);
1320
+ return `0x${hex}`;
1321
+ }
1322
+ function bytesToFingerprint(bytes) {
1323
+ return bytes.replace(/^0x/i, "").toLowerCase();
1324
+ }
1325
+ function fingerprintHash(fingerprint) {
1326
+ return _viem.keccak256.call(void 0, fingerprintToBytes(fingerprint));
1327
+ }
1328
+ function keyIdOf(fingerprint) {
1329
+ const hex = normalizeFingerprint(fingerprint);
1330
+ if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`);
1331
+ return `0x${keyIdHex(hex)}`;
1332
+ }
1333
+ function keyIdHex(normalizedFingerprint) {
1334
+ return normalizedFingerprint.length === 64 ? normalizedFingerprint.slice(0, 16) : normalizedFingerprint.slice(-16);
1335
+ }
1336
+ function keyIdToBytes(keyId) {
1337
+ const hex = keyId.replace(/^0x/i, "").replace(/\s+/g, "").toLowerCase();
1338
+ return /^[0-9a-f]{16}$/.test(hex) ? `0x${hex}` : null;
129
1339
  }
130
1340
 
131
1341
  // src/core/pgp.ts
1342
+ function algorithmName(keyOrSubkey) {
1343
+ try {
1344
+ const info = keyOrSubkey.getAlgorithmInfo();
1345
+ const curve = (info.curve || "").toLowerCase();
1346
+ if (curve.startsWith("ed25519") || info.algorithm === "ed25519" || info.algorithm === "eddsaLegacy") return "Ed25519";
1347
+ if (curve.startsWith("curve25519") || info.algorithm === "x25519") return "Cv25519";
1348
+ if (curve.startsWith("ed448")) return "Ed448";
1349
+ if (curve.startsWith("curve448") || info.algorithm === "x448") return "X448";
1350
+ if (curve.startsWith("nistp") || curve.startsWith("p")) return `NIST P-${curve.replace(/\D/g, "")}`;
1351
+ if (curve.startsWith("secp")) return curve;
1352
+ if (curve.startsWith("brainpool")) return curve;
1353
+ if (info.algorithm.startsWith("rsa")) return info.bits ? `RSA ${info.bits}` : "RSA";
1354
+ if (info.algorithm.startsWith("dsa")) return info.bits ? `DSA ${info.bits}` : "DSA";
1355
+ if (info.algorithm.startsWith("elgamal")) return info.bits ? `ElGamal ${info.bits}` : "ElGamal";
1356
+ return info.curve || info.algorithm;
1357
+ } catch (e2) {
1358
+ return String(_nullishCoalesce(_optionalChain([keyOrSubkey, 'access', _2 => _2.keyPacket, 'optionalAccess', _3 => _3.algorithm]), () => ( "unknown")));
1359
+ }
1360
+ }
132
1361
  async function parsePgpKey(armoredKey) {
133
1362
  try {
134
1363
  const { readKey } = await Promise.resolve().then(() => _interopRequireWildcard(require("openpgp")));
135
1364
  const key = await readKey({ armoredKey });
136
1365
  const fingerprint = key.getFingerprint().toUpperCase();
137
- const algorithm = String(key.keyPacket.algorithm);
138
- const created = _nullishCoalesce(_optionalChain([key, 'access', _2 => _2.keyPacket, 'access', _3 => _3.created, 'optionalAccess', _4 => _4.toISOString, 'call', _5 => _5()]), () => ( null));
1366
+ const algorithm = algorithmName(key);
1367
+ const created = _nullishCoalesce(_optionalChain([key, 'access', _4 => _4.keyPacket, 'access', _5 => _5.created, 'optionalAccess', _6 => _6.toISOString, 'call', _7 => _7()]), () => ( null));
139
1368
  const expiration = await key.getExpirationTime();
140
1369
  const expires = expiration && expiration !== Infinity ? new Date(expiration).toISOString() : null;
141
1370
  const userIDs = [];
@@ -152,7 +1381,7 @@ async function parsePgpKey(armoredKey) {
152
1381
  cert.signatureType,
153
1382
  { userID: user.userID, key: key.keyPacket }
154
1383
  );
155
- } catch (e2) {
1384
+ } catch (e3) {
156
1385
  continue;
157
1386
  }
158
1387
  userVerified = true;
@@ -170,17 +1399,17 @@ async function parsePgpKey(armoredKey) {
170
1399
  }
171
1400
  }
172
1401
  if (userVerified) {
173
- const uid = _optionalChain([user, 'access', _6 => _6.userID, 'optionalAccess', _7 => _7.userID]);
1402
+ const uid = _optionalChain([user, 'access', _8 => _8.userID, 'optionalAccess', _9 => _9.userID]);
174
1403
  if (uid) userIDs.push(uid);
175
1404
  }
176
1405
  }
177
1406
  const subkeys = key.subkeys.map((sk) => ({
178
- algorithm: String(sk.keyPacket.algorithm),
179
- created: _nullishCoalesce(_optionalChain([sk, 'access', _8 => _8.keyPacket, 'access', _9 => _9.created, 'optionalAccess', _10 => _10.toISOString, 'call', _11 => _11()]), () => ( null)),
1407
+ algorithm: algorithmName(sk),
1408
+ created: _nullishCoalesce(_optionalChain([sk, 'access', _10 => _10.keyPacket, 'access', _11 => _11.created, 'optionalAccess', _12 => _12.toISOString, 'call', _13 => _13()]), () => ( null)),
180
1409
  fingerprint: sk.getFingerprint().toUpperCase()
181
1410
  }));
182
1411
  return { fingerprint, userIDs, algorithm, created, expires, notations, subkeys };
183
- } catch (e3) {
1412
+ } catch (e4) {
184
1413
  return null;
185
1414
  }
186
1415
  }
@@ -208,17 +1437,50 @@ async function verifyAttestation({
208
1437
  return { verified: false, reason: "Signed message does not contain ETH address" };
209
1438
  }
210
1439
  return { verified: true };
211
- } catch (e4) {
1440
+ } catch (e5) {
212
1441
  return { verified: false, reason: "Signature verification failed" };
213
1442
  }
214
1443
  }
1444
+ var EMAIL_UID = /@/;
1445
+ async function stripEmailUserIDs(armoredKey) {
1446
+ try {
1447
+ const { readKey } = await Promise.resolve().then(() => _interopRequireWildcard(require("openpgp")));
1448
+ const key = await readKey({ armoredKey });
1449
+ const kept = [];
1450
+ const removed = [];
1451
+ const users = key.users.filter((u) => {
1452
+ const uid = _optionalChain([u, 'access', _14 => _14.userID, 'optionalAccess', _15 => _15.userID]);
1453
+ if (!uid) return false;
1454
+ if (EMAIL_UID.test(uid)) {
1455
+ removed.push(uid);
1456
+ return false;
1457
+ }
1458
+ kept.push(uid);
1459
+ return true;
1460
+ });
1461
+ if (users.length === 0) return null;
1462
+ key.users = users;
1463
+ return { armored: key.armor(), kept, removed };
1464
+ } catch (e6) {
1465
+ return null;
1466
+ }
1467
+ }
1468
+ async function hasEmailUserID(armoredKey) {
1469
+ try {
1470
+ const { readKey } = await Promise.resolve().then(() => _interopRequireWildcard(require("openpgp")));
1471
+ const key = await readKey({ armoredKey });
1472
+ return key.users.some((u) => EMAIL_UID.test(_nullishCoalesce(_optionalChain([u, 'access', _16 => _16.userID, 'optionalAccess', _17 => _17.userID]), () => ( ""))));
1473
+ } catch (e7) {
1474
+ return false;
1475
+ }
1476
+ }
215
1477
  var KEYSERVER_BASE = "https://keys.openpgp.org/vks/v1";
216
1478
  async function fetchKeyByFingerprint(fingerprint) {
217
1479
  try {
218
1480
  const resp = await fetch(`${KEYSERVER_BASE}/by-fingerprint/${fingerprint}`);
219
1481
  if (!resp.ok) return null;
220
1482
  return await resp.text();
221
- } catch (e5) {
1483
+ } catch (e8) {
222
1484
  return null;
223
1485
  }
224
1486
  }
@@ -227,104 +1489,80 @@ async function fetchKeyByKeyId(keyId) {
227
1489
  const resp = await fetch(`${KEYSERVER_BASE}/by-keyid/${keyId}`);
228
1490
  if (!resp.ok) return null;
229
1491
  return await resp.text();
230
- } catch (e6) {
1492
+ } catch (e9) {
231
1493
  return null;
232
1494
  }
233
1495
  }
234
1496
 
235
- // src/hooks/useSignetClaims.ts
236
- function useSignetClaims(address) {
1497
+ // src/hooks/useAttestations.ts
1498
+ function useAttestations(address) {
237
1499
  const config = useIdentityKitConfig();
238
- const { data: count, isLoading: countLoading } = _wagmi.useReadContract.call(void 0, {
239
- address: REGISTRY_ADDRESS,
1500
+ const registry = getRegistry(config.network, config.registryAddress);
1501
+ const chain = chainFor(config.network);
1502
+ const owner = address;
1503
+ const { data: rows, isLoading: rowsLoading } = _wagmi.useReadContract.call(void 0, {
1504
+ address: registry.address,
240
1505
  abi: REGISTRY_ABI,
241
- functionName: "attestationCount",
242
- args: address ? [address] : void 0,
243
- chainId: _chains.mainnet.id,
244
- query: { enabled: !!address }
1506
+ functionName: "attestationsOf",
1507
+ args: owner ? [owner] : void 0,
1508
+ chainId: chain.id,
1509
+ query: { enabled: !!owner }
245
1510
  });
246
- const attestationCount = count ? Number(count) : 0;
247
- const contracts = address ? Array.from({ length: attestationCount }, (_, i) => ({
248
- address: REGISTRY_ADDRESS,
1511
+ const count = _nullishCoalesce(_optionalChain([rows, 'optionalAccess', _18 => _18.length]), () => ( 0));
1512
+ const contracts = owner && rows ? rows.map((_, i) => ({
1513
+ address: registry.address,
249
1514
  abi: REGISTRY_ABI,
250
- functionName: "getAttestation",
251
- args: [address, BigInt(i)],
252
- chainId: _chains.mainnet.id
1515
+ functionName: "getPayload",
1516
+ args: [owner, BigInt(i)],
1517
+ chainId: chain.id
253
1518
  })) : [];
254
- const { data: attestations, isLoading: attestationsLoading } = _wagmi.useReadContracts.call(void 0, {
1519
+ const { data: payloads, isLoading: payloadsLoading } = _wagmi.useReadContracts.call(void 0, {
255
1520
  contracts,
256
1521
  query: { enabled: contracts.length > 0 }
257
1522
  });
258
- const { data: eventData } = _reactquery.useQuery.call(void 0, {
259
- queryKey: ["signet-logs", address],
260
- queryFn: async () => {
261
- if (!address) return [];
262
- const client = _viem.createPublicClient.call(void 0, {
263
- chain: _chains.mainnet,
264
- transport: _viem.http.call(void 0, config.rpcUrl || "https://ethereum-rpc.publicnode.com")
265
- });
266
- const event = _viem.parseAbiItem.call(void 0,
267
- "event Attested(address indexed ethAddress, string indexed fingerprintHash, string fingerprint, string pgpSignature, string pgpPublicKey, uint256 index, uint256 timestamp)"
268
- );
269
- return getLogsChunked(client, {
270
- address: REGISTRY_ADDRESS,
271
- event,
272
- args: { ethAddress: address },
273
- fromBlock: CONTRACT_DEPLOY_BLOCK,
274
- toBlock: "latest"
275
- });
276
- },
277
- enabled: !!address && attestationCount > 0,
278
- staleTime: 3e5
279
- });
1523
+ const payloadsReady = count === 0 || payloads !== void 0 && payloads.length === count;
280
1524
  const { data: claims, isLoading: verifyLoading } = _reactquery.useQuery.call(void 0, {
281
- queryKey: ["signet-claims", address, attestationCount, !!eventData],
1525
+ queryKey: ["attestations", config.network, registry.address, address, count, payloadsReady],
282
1526
  queryFn: async () => {
283
- if (!attestations || !address) return [];
1527
+ if (!rows || !address) return [];
284
1528
  const results = [];
285
- const logsByIndex = {};
286
- for (const l of eventData || []) logsByIndex[Number(l.args.index)] = l;
287
- for (let i = 0; i < attestations.length; i++) {
288
- const att = attestations[i];
289
- if (att.status !== "success") continue;
290
- const [fingerprint, createdAt, revoked] = att.result;
291
- const log = logsByIndex[i];
292
- const pgpSignature = _nullishCoalesce(_optionalChain([log, 'optionalAccess', _12 => _12.args, 'optionalAccess', _13 => _13.pgpSignature]), () => ( null));
293
- const pgpPublicKey = _nullishCoalesce(_optionalChain([log, 'optionalAccess', _14 => _14.args, 'optionalAccess', _15 => _15.pgpPublicKey]), () => ( null));
294
- const txHash = _nullishCoalesce(_optionalChain([log, 'optionalAccess', _16 => _16.transactionHash]), () => ( null));
295
- let verification = null;
296
- if (pgpPublicKey && pgpSignature) {
297
- verification = await verifyAttestation({
298
- pgpPublicKey,
299
- pgpSignature,
300
- fingerprint,
301
- ethAddress: address
302
- });
1529
+ for (let i = 0; i < rows.length; i++) {
1530
+ const row = rows[i];
1531
+ const payload = _optionalChain([payloads, 'optionalAccess', _19 => _19[i]]);
1532
+ let pgpSignature = null;
1533
+ let pgpPublicKey = null;
1534
+ if (payload && payload.status === "success") {
1535
+ const [sigHex, keyHex] = payload.result;
1536
+ pgpSignature = _viem.hexToString.call(void 0, sigHex);
1537
+ pgpPublicKey = _viem.hexToString.call(void 0, keyHex);
303
1538
  }
1539
+ const fingerprint = bytesToFingerprint(row.fingerprint);
1540
+ const verification = pgpPublicKey && pgpSignature ? await verifyAttestation({ pgpPublicKey, pgpSignature, fingerprint, ethAddress: address }) : null;
1541
+ const revokedAt = Number(row.revokedAt);
304
1542
  results.push({
305
1543
  index: i,
306
1544
  fingerprint,
307
- createdAt: Number(createdAt),
308
- revoked,
1545
+ createdAt: Number(row.createdAt),
1546
+ revoked: revokedAt !== 0,
1547
+ revokedAt: revokedAt === 0 ? null : revokedAt,
1548
+ messageVersion: Number(row.messageVersion),
309
1549
  pgpSignature,
310
1550
  pgpPublicKey,
311
- txHash,
312
1551
  verification
313
1552
  });
314
1553
  }
315
1554
  return results;
316
1555
  },
317
- enabled: !!attestations && attestations.length > 0,
1556
+ enabled: !!rows && payloadsReady,
318
1557
  staleTime: 3e5
319
1558
  });
320
- const eventLogsPending = !!address && attestationCount > 0 && eventData === void 0;
321
- const isLoading = countLoading || attestationsLoading || verifyLoading || eventLogsPending;
1559
+ const isLoading = rowsLoading || payloadsLoading || verifyLoading || !!owner && rows !== void 0 && !payloadsReady;
322
1560
  const activeClaims = (claims || []).filter((c) => !c.revoked);
323
- const verifiedClaims = activeClaims.filter((c) => _optionalChain([c, 'access', _17 => _17.verification, 'optionalAccess', _18 => _18.verified]));
1561
+ const verifiedClaims = activeClaims.filter((c) => _optionalChain([c, 'access', _20 => _20.verification, 'optionalAccess', _21 => _21.verified]));
324
1562
  const currentFingerprint = verifiedClaims.length > 0 ? verifiedClaims[verifiedClaims.length - 1].fingerprint : null;
325
1563
  return {
326
1564
  claims: claims || [],
327
- totalClaims: attestationCount,
1565
+ totalClaims: count,
328
1566
  activeClaims: activeClaims.length,
329
1567
  currentFingerprint,
330
1568
  isLoading
@@ -357,7 +1595,7 @@ async function fetchEFPGraph(address) {
357
1595
  top8: (top8Data.following || []).map((f) => f.data),
358
1596
  hasEfp: true
359
1597
  };
360
- } catch (e7) {
1598
+ } catch (e10) {
361
1599
  return null;
362
1600
  }
363
1601
  }
@@ -462,7 +1700,7 @@ async function verifyGitHub(proof, fingerprint) {
462
1700
  const resp = await fetch(`https://api.github.com/gists/${proof.gistId}`);
463
1701
  if (!resp.ok) return { verified: false, reason: `GitHub API returned ${resp.status}` };
464
1702
  const data = await resp.json();
465
- if (_optionalChain([data, 'access', _19 => _19.owner, 'optionalAccess', _20 => _20.login, 'optionalAccess', _21 => _21.toLowerCase, 'call', _22 => _22()]) !== proof.user.toLowerCase()) {
1703
+ if (_optionalChain([data, 'access', _22 => _22.owner, 'optionalAccess', _23 => _23.login, 'optionalAccess', _24 => _24.toLowerCase, 'call', _25 => _25()]) !== proof.user.toLowerCase()) {
466
1704
  return { verified: false, reason: "Gist owner does not match claimed user" };
467
1705
  }
468
1706
  for (const file of Object.values(data.files || {})) {
@@ -520,7 +1758,7 @@ async function verifyFarcaster(proof, fingerprint, neynarApiKey) {
520
1758
  const data = await resp.json();
521
1759
  for (const msg of data.messages || []) {
522
1760
  if (msg.hash && msg.hash.startsWith(proof.castHash)) {
523
- const text = _optionalChain([msg, 'access', _23 => _23.data, 'optionalAccess', _24 => _24.castAddBody, 'optionalAccess', _25 => _25.text]) || "";
1761
+ const text = _optionalChain([msg, 'access', _26 => _26.data, 'optionalAccess', _27 => _27.castAddBody, 'optionalAccess', _28 => _28.text]) || "";
524
1762
  if (containsFingerprint(text, fingerprint)) {
525
1763
  return { verified: true };
526
1764
  }
@@ -559,7 +1797,7 @@ async function verifyMastodon(proof, fingerprint) {
559
1797
  );
560
1798
  if (!resp.ok) return { verified: false, reason: `Mastodon API returned ${resp.status}` };
561
1799
  const data = await resp.json();
562
- const keyId = fingerprint.slice(-16);
1800
+ const keyId = keyIdHex(fingerprint.replace(/^0x/i, "").replace(/\s+/g, "").toLowerCase());
563
1801
  for (const field of data.fields || []) {
564
1802
  const text = field.value.replace(/<[^>]*>/g, "");
565
1803
  if (containsFingerprintUrl(text, fingerprint) || containsFingerprintUrl(text, keyId)) {
@@ -591,14 +1829,14 @@ async function verifyProof(proof, fingerprint, neynarApiKey) {
591
1829
  }
592
1830
 
593
1831
  // src/hooks/usePGPProofs.ts
594
- function usePGPProofs(fingerprint) {
1832
+ function usePGPProofs(fingerprint, armoredKey) {
595
1833
  const config = useIdentityKitConfig();
596
1834
  const { data } = _reactquery.useQuery.call(void 0, {
597
- queryKey: ["pgp-proofs", fingerprint],
1835
+ // The key is large; key the query on its length + fingerprint, which
1836
+ // changes whenever a different attestation's key is supplied.
1837
+ queryKey: ["pgp-proofs", fingerprint, _nullishCoalesce(_optionalChain([armoredKey, 'optionalAccess', _29 => _29.length]), () => ( 0))],
598
1838
  queryFn: async () => {
599
- if (!fingerprint) return { keyInfo: null, proofs: [] };
600
- const armoredKey = await fetchKeyByFingerprint(fingerprint);
601
- if (!armoredKey) return { keyInfo: null, proofs: [] };
1839
+ if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] };
602
1840
  const keyInfo = await parsePgpKey(armoredKey);
603
1841
  if (!keyInfo) return { keyInfo: null, proofs: [] };
604
1842
  const identified = keyInfo.notations.map((n) => identifyProof(n)).filter((p) => p !== null && p.provider !== "unknown");
@@ -627,49 +1865,50 @@ function usePGPProofs(fingerprint) {
627
1865
  }
628
1866
  return { keyInfo, proofs: [...byAccount.values()] };
629
1867
  },
630
- enabled: !!fingerprint,
1868
+ enabled: !!fingerprint && !!armoredKey,
631
1869
  staleTime: 3e5
632
1870
  });
633
1871
  return {
634
- keyInfo: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _26 => _26.keyInfo]), () => ( null)),
635
- proofs: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _27 => _27.proofs]), () => ( [])),
1872
+ keyInfo: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _30 => _30.keyInfo]), () => ( null)),
1873
+ proofs: _nullishCoalesce(_optionalChain([data, 'optionalAccess', _31 => _31.proofs]), () => ( [])),
636
1874
  // Report loading whenever a fingerprint is set but its proofs haven't
637
1875
  // resolved yet. Using react-query's own isLoading leaves a gap while the
638
1876
  // query is enabling (fingerprint just became known), during which the card
639
1877
  // would briefly paint without proof badges and then pop them in.
640
- isLoading: !!fingerprint && data === void 0
1878
+ isLoading: !!fingerprint && !!armoredKey && data === void 0
641
1879
  };
642
1880
  }
643
1881
 
644
- // src/hooks/useScryIdentity.ts
1882
+ // src/hooks/useThurinIdentity.ts
645
1883
  function isAddress(value) {
646
1884
  return /^0x[0-9a-fA-F]{40}$/.test(value);
647
1885
  }
648
1886
  function safeNormalize(name) {
649
1887
  try {
650
1888
  return _ens.normalize.call(void 0, name);
651
- } catch (e8) {
1889
+ } catch (e11) {
652
1890
  return void 0;
653
1891
  }
654
1892
  }
655
- function useScryIdentity(ensOrAddress) {
1893
+ function useThurinIdentity(ensOrAddress) {
1894
+ const chain = chainFor(useIdentityKitConfig().network);
656
1895
  const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false;
657
1896
  const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : void 0;
658
1897
  const { data: resolvedAddress } = _wagmi.useEnsAddress.call(void 0, {
659
1898
  name: ensInput,
660
- chainId: _chains.mainnet.id,
1899
+ chainId: chain.id,
661
1900
  query: { enabled: !!ensInput }
662
1901
  });
663
1902
  const address = isAddr ? ensOrAddress : _nullishCoalesce(resolvedAddress, () => ( null));
664
1903
  const { data: ensName } = _wagmi.useEnsName.call(void 0, {
665
1904
  address,
666
- chainId: _chains.mainnet.id,
1905
+ chainId: chain.id,
667
1906
  query: { enabled: !!address }
668
1907
  });
669
1908
  const displayName = ensInput || ensName || null;
670
1909
  const { data: ensAvatar } = _wagmi.useEnsAvatar.call(void 0, {
671
1910
  name: displayName ? safeNormalize(displayName) : void 0,
672
- chainId: _chains.mainnet.id,
1911
+ chainId: chain.id,
673
1912
  query: { enabled: !!displayName }
674
1913
  });
675
1914
  const {
@@ -678,12 +1917,15 @@ function useScryIdentity(ensOrAddress) {
678
1917
  activeClaims,
679
1918
  currentFingerprint,
680
1919
  isLoading: claimsLoading
681
- } = useSignetClaims(address);
1920
+ } = useAttestations(address);
1921
+ const currentClaim = [...claims].reverse().find(
1922
+ (c) => !c.revoked && _optionalChain([c, 'access', _32 => _32.verification, 'optionalAccess', _33 => _33.verified]) && c.fingerprint === currentFingerprint
1923
+ );
682
1924
  const {
683
1925
  keyInfo: pgpKeyInfo,
684
1926
  proofs,
685
1927
  isLoading: proofsLoading
686
- } = usePGPProofs(currentFingerprint);
1928
+ } = usePGPProofs(currentFingerprint, _nullishCoalesce(_optionalChain([currentClaim, 'optionalAccess', _34 => _34.pgpPublicKey]), () => ( null)));
687
1929
  const { efp, isLoading: efpLoading } = useEFPGraph(address);
688
1930
  return {
689
1931
  address,
@@ -701,81 +1943,205 @@ function useScryIdentity(ensOrAddress) {
701
1943
  };
702
1944
  }
703
1945
 
704
- // src/components/ScryCard/ScryCard.tsx
1946
+ // src/components/ThurinCard/ThurinCard.tsx
705
1947
 
706
1948
  function ThurinLogo() {
707
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "svg", { className: "scry-card-avatar-placeholder", viewBox: "0 0 100 100", xmlns: "http://www.w3.org/2000/svg", children: [
708
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "circle", { cx: "50", cy: "50", r: "50", fill: "var(--scry-surface-deep)" }),
1949
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "svg", { className: "thurin-card-avatar-placeholder", viewBox: "0 0 100 100", xmlns: "http://www.w3.org/2000/svg", children: [
1950
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "circle", { cx: "50", cy: "50", r: "50", fill: "var(--thurin-surface-deep)" }),
709
1951
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "path", { d: "M25 80 Q25 25 50 25 Q75 25 75 50", fill: "none", stroke: "#7c9a3e", strokeWidth: "4", strokeLinecap: "round" }),
710
1952
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "path", { d: "M33 75 Q33 35 50 35 Q67 35 67 52", fill: "none", stroke: "#7c9a3e", strokeWidth: "4", strokeLinecap: "round" }),
711
1953
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "path", { d: "M41 70 Q41 45 50 45 Q59 45 59 55", fill: "none", stroke: "#c9a227", strokeWidth: "4", strokeLinecap: "round" }),
712
1954
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "path", { d: "M50 65 L50 53", fill: "none", stroke: "#c9a227", strokeWidth: "4", strokeLinecap: "round" })
713
1955
  ] });
714
1956
  }
715
- function ScryCard({ ens, address, theme = "thurin" }) {
1957
+ function ThurinCard({ ens, address, theme = "thurin" }) {
716
1958
  const input = ens || address;
717
- const identity = useScryIdentity(input);
1959
+ const identity = useThurinIdentity(input);
718
1960
  const config = useIdentityKitConfig();
719
- const scryUrl = identity.address ? `${config.scryBaseUrl}/eth/${identity.address}` : ens ? `${config.scryBaseUrl}/ens/${ens}` : null;
1961
+ const profileUrl = identity.address ? `${config.baseUrl}/eth/${identity.address}` : ens ? `${config.baseUrl}/ens/${ens}` : null;
720
1962
  if (identity.isLoading) {
721
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "scry-card", "data-scry-theme": theme, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "scry-card-loading", children: "Loading identity..." }) });
1963
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "thurin-card", "data-thurin-theme": theme, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "thurin-card-loading", children: "Loading identity..." }) });
722
1964
  }
723
1965
  const displayAddress = identity.address || null;
724
1966
  const verifiedProofs = identity.proofs.filter((p) => p.status === "verified").length;
725
- const hasVerifiedPgp = identity.claims.some((c) => _optionalChain([c, 'access', _28 => _28.verification, 'optionalAccess', _29 => _29.verified]) && !c.revoked);
726
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card", "data-scry-theme": theme, children: [
727
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "a", { className: "scry-card-header", href: scryUrl || void 0, target: "_blank", rel: "noopener noreferrer", children: [
1967
+ const hasVerifiedPgp = identity.claims.some((c) => _optionalChain([c, 'access', _35 => _35.verification, 'optionalAccess', _36 => _36.verified]) && !c.revoked);
1968
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card", "data-thurin-theme": theme, children: [
1969
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "a", { className: "thurin-card-header", href: profileUrl || void 0, target: "_blank", rel: "noopener noreferrer", children: [
728
1970
  identity.ensAvatar ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
729
1971
  "img",
730
1972
  {
731
- className: "scry-card-avatar",
1973
+ className: "thurin-card-avatar",
732
1974
  src: identity.ensAvatar,
733
1975
  alt: identity.ensName || ""
734
1976
  }
735
1977
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThurinLogo, {}),
736
1978
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
737
- identity.ensName && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "scry-card-name", children: identity.ensName }),
738
- displayAddress && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "scry-card-address", children: displayAddress })
1979
+ identity.ensName && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "thurin-card-name", children: identity.ensName }),
1980
+ displayAddress && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "thurin-card-address", children: displayAddress })
739
1981
  ] })
740
1982
  ] }),
741
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card-stats", children: [
742
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card-stat", children: [
743
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-value", children: identity.activeClaims }),
744
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-label", children: "Seals" })
1983
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-stats", children: [
1984
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-stat", children: [
1985
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-value", children: identity.activeClaims }),
1986
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-label", children: "Attestations" })
745
1987
  ] }),
746
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card-stat", children: [
747
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-value", children: verifiedProofs }),
748
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-label", children: "Proofs" })
1988
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-stat", children: [
1989
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-value", children: verifiedProofs }),
1990
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-label", children: "Proofs" })
749
1991
  ] }),
750
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card-stat", children: [
751
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-value", children: _nullishCoalesce(_optionalChain([identity, 'access', _30 => _30.efp, 'optionalAccess', _31 => _31.followers]), () => ( 0)) }),
752
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-stat-label", children: "Followers" })
1992
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-stat", children: [
1993
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-value", children: _nullishCoalesce(_optionalChain([identity, 'access', _37 => _37.efp, 'optionalAccess', _38 => _38.followers]), () => ( 0)) }),
1994
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-stat-label", children: "Followers" })
753
1995
  ] })
754
1996
  ] }),
755
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "scry-card-badges", children: [
756
- hasVerifiedPgp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-badge scry-card-badge--verified", children: "PGP Verified" }),
757
- _optionalChain([identity, 'access', _32 => _32.efp, 'optionalAccess', _33 => _33.hasEfp]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "scry-card-badge scry-card-badge--verified", children: "EFP" }),
1997
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "thurin-card-badges", children: [
1998
+ hasVerifiedPgp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-badge thurin-card-badge--verified", children: "PGP Verified" }),
1999
+ _optionalChain([identity, 'access', _39 => _39.efp, 'optionalAccess', _40 => _40.hasEfp]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "thurin-card-badge thurin-card-badge--verified", children: "EFP" }),
758
2000
  identity.proofs.map((p, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
759
2001
  "span",
760
2002
  {
761
- className: `scry-card-badge scry-card-badge--${p.status === "verified" ? "verified" : "unverified"}`,
2003
+ className: `thurin-card-badge thurin-card-badge--${p.status === "verified" ? "verified" : "unverified"}`,
762
2004
  children: p.label
763
2005
  },
764
2006
  i
765
2007
  ))
766
2008
  ] }),
767
- scryUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2009
+ profileUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
768
2010
  "a",
769
2011
  {
770
- className: "scry-card-link",
771
- href: scryUrl,
2012
+ className: "thurin-card-link",
2013
+ href: profileUrl,
772
2014
  target: "_blank",
773
2015
  rel: "noopener noreferrer",
774
- children: "View on Scry"
2016
+ children: "View on Thurin"
775
2017
  }
776
2018
  )
777
2019
  ] });
778
2020
  }
2021
+
2022
+ // src/core/authorization.ts
2023
+
2024
+ var EIP712_NAME = "Thurin PGPRegistry";
2025
+ var EIP712_VERSION = "2";
2026
+ function registryDomain(chainId, verifyingContract) {
2027
+ return { name: EIP712_NAME, version: EIP712_VERSION, chainId, verifyingContract };
2028
+ }
2029
+ var AUTHORIZATION_TYPES = {
2030
+ Attest: [
2031
+ { name: "owner", type: "address" },
2032
+ { name: "fingerprint", type: "bytes" },
2033
+ { name: "pgpSignature", type: "bytes" },
2034
+ { name: "pgpPublicKey", type: "bytes" },
2035
+ { name: "nonce", type: "uint256" },
2036
+ { name: "deadline", type: "uint256" }
2037
+ ],
2038
+ Reattest: [
2039
+ { name: "owner", type: "address" },
2040
+ { name: "revokeIndex", type: "uint256" },
2041
+ { name: "fingerprint", type: "bytes" },
2042
+ { name: "pgpSignature", type: "bytes" },
2043
+ { name: "pgpPublicKey", type: "bytes" },
2044
+ { name: "nonce", type: "uint256" },
2045
+ { name: "deadline", type: "uint256" }
2046
+ ],
2047
+ UpdateKey: [
2048
+ { name: "owner", type: "address" },
2049
+ { name: "index", type: "uint256" },
2050
+ { name: "pgpPublicKey", type: "bytes" },
2051
+ { name: "nonce", type: "uint256" },
2052
+ { name: "deadline", type: "uint256" }
2053
+ ],
2054
+ Revoke: [
2055
+ { name: "owner", type: "address" },
2056
+ { name: "index", type: "uint256" },
2057
+ { name: "nonce", type: "uint256" },
2058
+ { name: "deadline", type: "uint256" }
2059
+ ],
2060
+ SetRecord: [
2061
+ { name: "owner", type: "address" },
2062
+ { name: "index", type: "uint256" },
2063
+ { name: "kind", type: "bytes32" },
2064
+ { name: "value", type: "bytes" },
2065
+ { name: "nonce", type: "uint256" },
2066
+ { name: "deadline", type: "uint256" }
2067
+ ]
2068
+ };
2069
+ function attestTypedData(chainId, registry, a) {
2070
+ return {
2071
+ domain: registryDomain(chainId, registry),
2072
+ types: { Attest: AUTHORIZATION_TYPES.Attest },
2073
+ primaryType: "Attest",
2074
+ message: {
2075
+ owner: a.owner,
2076
+ fingerprint: fingerprintToBytes(a.fingerprint),
2077
+ pgpSignature: _viem.stringToHex.call(void 0, a.pgpSignature),
2078
+ pgpPublicKey: _viem.stringToHex.call(void 0, a.pgpPublicKey),
2079
+ nonce: a.nonce,
2080
+ deadline: a.deadline
2081
+ }
2082
+ };
2083
+ }
2084
+ function reattestTypedData(chainId, registry, a) {
2085
+ const base = attestTypedData(chainId, registry, a);
2086
+ return {
2087
+ domain: base.domain,
2088
+ types: { Reattest: AUTHORIZATION_TYPES.Reattest },
2089
+ primaryType: "Reattest",
2090
+ message: { ...base.message, revokeIndex: a.revokeIndex }
2091
+ };
2092
+ }
2093
+ function updateKeyTypedData(chainId, registry, a) {
2094
+ return {
2095
+ domain: registryDomain(chainId, registry),
2096
+ types: { UpdateKey: AUTHORIZATION_TYPES.UpdateKey },
2097
+ primaryType: "UpdateKey",
2098
+ message: { owner: a.owner, index: a.index, pgpPublicKey: _viem.stringToHex.call(void 0, a.pgpPublicKey), nonce: a.nonce, deadline: a.deadline }
2099
+ };
2100
+ }
2101
+ function revokeTypedData(chainId, registry, a) {
2102
+ return {
2103
+ domain: registryDomain(chainId, registry),
2104
+ types: { Revoke: AUTHORIZATION_TYPES.Revoke },
2105
+ primaryType: "Revoke",
2106
+ message: { owner: a.owner, index: a.index, nonce: a.nonce, deadline: a.deadline }
2107
+ };
2108
+ }
2109
+ function setRecordTypedData(chainId, registry, a) {
2110
+ return {
2111
+ domain: registryDomain(chainId, registry),
2112
+ types: { SetRecord: AUTHORIZATION_TYPES.SetRecord },
2113
+ primaryType: "SetRecord",
2114
+ message: { owner: a.owner, index: a.index, kind: a.kind, value: a.value, nonce: a.nonce, deadline: a.deadline }
2115
+ };
2116
+ }
2117
+ function authorizationDigest(typedData) {
2118
+ return _viem.hashTypedData.call(void 0, typedData);
2119
+ }
2120
+ function recordKind(name) {
2121
+ return _viem.keccak256.call(void 0, _viem.stringToHex.call(void 0, name));
2122
+ }
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
779
2145
 
780
2146
 
781
2147
 
@@ -796,5 +2162,5 @@ function ScryCard({ ens, address, theme = "thurin" }) {
796
2162
 
797
2163
 
798
2164
 
799
- exports.CONTRACT_DEPLOY_BLOCK = CONTRACT_DEPLOY_BLOCK; exports.IdentityKitProvider = IdentityKitProvider; exports.REGISTRY_ABI = REGISTRY_ABI; exports.REGISTRY_ADDRESS = REGISTRY_ADDRESS; exports.ScryCard = ScryCard; exports.displayUrl = displayUrl; exports.fetchEFPGraph = fetchEFPGraph; exports.fetchKeyByFingerprint = fetchKeyByFingerprint; exports.fetchKeyByKeyId = fetchKeyByKeyId; exports.identifyProof = identifyProof; exports.parsePgpKey = parsePgpKey; exports.proofHref = proofHref; exports.proofSecondaryHref = proofSecondaryHref; exports.useEFPGraph = useEFPGraph; exports.usePGPProofs = usePGPProofs; exports.useScryIdentity = useScryIdentity; exports.useSignetClaims = useSignetClaims; exports.verifyAttestation = verifyAttestation; exports.verifyProof = verifyProof;
2165
+ exports.AUTHORIZATION_TYPES = AUTHORIZATION_TYPES; exports.EIP712_NAME = EIP712_NAME; exports.EIP712_VERSION = EIP712_VERSION; exports.IdentityKitProvider = IdentityKitProvider; exports.NETWORKS = NETWORKS; exports.REGISTRY_ABI = REGISTRY_ABI; exports.REGISTRY_ADDRESS = REGISTRY_ADDRESS; exports.ThurinCard = ThurinCard; exports.attestTypedData = attestTypedData; exports.authorizationDigest = authorizationDigest; exports.bytesToFingerprint = bytesToFingerprint; exports.chainFor = chainFor; exports.displayUrl = displayUrl; exports.fetchEFPGraph = fetchEFPGraph; exports.fetchKeyByFingerprint = fetchKeyByFingerprint; exports.fetchKeyByKeyId = fetchKeyByKeyId; exports.fingerprintHash = fingerprintHash; exports.fingerprintToBytes = fingerprintToBytes; exports.getRegistry = getRegistry; exports.hasEmailUserID = hasEmailUserID; exports.identifyProof = identifyProof; exports.isNetworkName = isNetworkName; exports.keyIdOf = keyIdOf; exports.keyIdToBytes = keyIdToBytes; exports.normalizeFingerprint = normalizeFingerprint; exports.parsePgpKey = parsePgpKey; exports.proofHref = proofHref; exports.proofSecondaryHref = proofSecondaryHref; exports.reattestTypedData = reattestTypedData; exports.recordKind = recordKind; exports.registryDomain = registryDomain; exports.revokeTypedData = revokeTypedData; exports.setRecordTypedData = setRecordTypedData; exports.stripEmailUserIDs = stripEmailUserIDs; exports.updateKeyTypedData = updateKeyTypedData; exports.useAttestations = useAttestations; exports.useEFPGraph = useEFPGraph; exports.usePGPProofs = usePGPProofs; exports.useThurinIdentity = useThurinIdentity; exports.verifyAttestation = verifyAttestation; exports.verifyProof = verifyProof;
800
2166
  //# sourceMappingURL=index.cjs.map