@grapenpm/gpass-sdk 0.1.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/src/idl.ts ADDED
@@ -0,0 +1,531 @@
1
+ export type GrapeGatingProtocol = {
2
+ version: "0.1.0";
3
+ name: "grape_gating_protocol";
4
+ instructions: [
5
+ {
6
+ name: "initializeGate";
7
+ accounts: [
8
+ { name: "gate"; isMut: true; isSigner: false },
9
+ { name: "authority"; isMut: false; isSigner: true },
10
+ { name: "payer"; isMut: true; isSigner: true },
11
+ { name: "systemProgram"; isMut: false; isSigner: false }
12
+ ];
13
+ args: [
14
+ { name: "gateId"; type: "publicKey" },
15
+ { name: "criteria"; type: { defined: "GateCriteria" } },
16
+ { name: "gateType"; type: { defined: "GateType" } }
17
+ ];
18
+ },
19
+ {
20
+ name: "setGateAuthority";
21
+ accounts: [
22
+ { name: "gate"; isMut: true; isSigner: false },
23
+ { name: "authority"; isMut: false; isSigner: true }
24
+ ];
25
+ args: [
26
+ { name: "gateId"; type: "publicKey" },
27
+ { name: "newAuthority"; type: "publicKey" }
28
+ ];
29
+ },
30
+ {
31
+ name: "updateGateCriteria";
32
+ accounts: [
33
+ { name: "gate"; isMut: true; isSigner: false },
34
+ { name: "authority"; isMut: false; isSigner: true }
35
+ ];
36
+ args: [
37
+ { name: "gateId"; type: "publicKey" },
38
+ { name: "newCriteria"; type: { defined: "GateCriteria" } }
39
+ ];
40
+ },
41
+ {
42
+ name: "setGateActive";
43
+ accounts: [
44
+ { name: "gate"; isMut: true; isSigner: false },
45
+ { name: "authority"; isMut: false; isSigner: true }
46
+ ];
47
+ args: [
48
+ { name: "gateId"; type: "publicKey" },
49
+ { name: "isActive"; type: "bool" }
50
+ ];
51
+ },
52
+ {
53
+ name: "checkGate";
54
+ accounts: [
55
+ { name: "gate"; isMut: true; isSigner: false },
56
+ { name: "user"; isMut: false; isSigner: false },
57
+ { name: "reputationAccount"; isMut: true; isSigner: false; isOptional: true },
58
+ { name: "identityAccount"; isMut: false; isSigner: false; isOptional: true },
59
+ { name: "linkAccount"; isMut: false; isSigner: false; isOptional: true },
60
+ { name: "tokenAccount"; isMut: false; isSigner: false; isOptional: true },
61
+ { name: "checkRecord"; isMut: true; isSigner: false; isOptional: true },
62
+ { name: "payer"; isMut: true; isSigner: true },
63
+ { name: "systemProgram"; isMut: false; isSigner: false }
64
+ ];
65
+ args: [{ name: "gateId"; type: "publicKey" }];
66
+ },
67
+ {
68
+ name: "createCheckRecord";
69
+ accounts: [
70
+ { name: "gate"; isMut: false; isSigner: false },
71
+ { name: "user"; isMut: false; isSigner: false },
72
+ { name: "checkRecord"; isMut: true; isSigner: false },
73
+ { name: "payer"; isMut: true; isSigner: true },
74
+ { name: "systemProgram"; isMut: false; isSigner: false }
75
+ ];
76
+ args: [{ name: "gateId"; type: "publicKey" }];
77
+ },
78
+ {
79
+ name: "closeGate";
80
+ accounts: [
81
+ { name: "gate"; isMut: true; isSigner: false },
82
+ { name: "authority"; isMut: false; isSigner: true },
83
+ { name: "recipient"; isMut: true; isSigner: false }
84
+ ];
85
+ args: [{ name: "gateId"; type: "publicKey" }];
86
+ },
87
+ {
88
+ name: "closeCheckRecord";
89
+ accounts: [
90
+ { name: "gate"; isMut: false; isSigner: false },
91
+ { name: "user"; isMut: false; isSigner: false },
92
+ { name: "checkRecord"; isMut: true; isSigner: false },
93
+ { name: "authority"; isMut: false; isSigner: true },
94
+ { name: "recipient"; isMut: true; isSigner: false }
95
+ ];
96
+ args: [{ name: "gateId"; type: "publicKey" }];
97
+ },
98
+ {
99
+ name: "adminCloseAny";
100
+ accounts: [
101
+ { name: "authority"; isMut: false; isSigner: true },
102
+ { name: "target"; isMut: true; isSigner: false },
103
+ { name: "recipient"; isMut: true; isSigner: false }
104
+ ];
105
+ args: [];
106
+ }
107
+ ];
108
+ accounts: [
109
+ {
110
+ name: "Gate";
111
+ type: {
112
+ kind: "struct";
113
+ fields: [
114
+ { name: "version"; type: "u8" },
115
+ { name: "gateId"; type: "publicKey" },
116
+ { name: "authority"; type: "publicKey" },
117
+ { name: "criteria"; type: { defined: "GateCriteria" } },
118
+ { name: "gateType"; type: { defined: "GateType" } },
119
+ { name: "isActive"; type: "bool" },
120
+ { name: "createdAt"; type: "i64" },
121
+ { name: "totalChecks"; type: "u64" },
122
+ { name: "successfulChecks"; type: "u64" },
123
+ { name: "bump"; type: "u8" }
124
+ ];
125
+ };
126
+ },
127
+ {
128
+ name: "GateCheckRecord";
129
+ type: {
130
+ kind: "struct";
131
+ fields: [
132
+ { name: "version"; type: "u8" },
133
+ { name: "gate"; type: "publicKey" },
134
+ { name: "user"; type: "publicKey" },
135
+ { name: "passed"; type: "bool" },
136
+ { name: "checkedAt"; type: "i64" },
137
+ { name: "bump"; type: "u8" }
138
+ ];
139
+ };
140
+ }
141
+ ];
142
+ types: [
143
+ {
144
+ name: "GateType";
145
+ type: {
146
+ kind: "enum";
147
+ variants: [
148
+ { name: "SingleUse" },
149
+ { name: "Reusable" },
150
+ { name: "TimeLimited"; fields: [{ name: "durationSeconds"; type: "i64" }] },
151
+ { name: "Subscription"; fields: [{ name: "intervalSeconds"; type: "i64" }] }
152
+ ];
153
+ };
154
+ },
155
+ {
156
+ name: "GateCriteria";
157
+ type: {
158
+ kind: "enum";
159
+ variants: [
160
+ {
161
+ name: "MinReputation";
162
+ fields: [
163
+ { name: "vineConfig"; type: "publicKey" },
164
+ { name: "minPoints"; type: "u64" },
165
+ { name: "season"; type: "u16" }
166
+ ];
167
+ },
168
+ {
169
+ name: "VerifiedIdentity";
170
+ fields: [
171
+ { name: "grapeSpace"; type: "publicKey" },
172
+ { name: "platforms"; type: "bytes" }
173
+ ];
174
+ },
175
+ {
176
+ name: "VerifiedWithWallet";
177
+ fields: [
178
+ { name: "grapeSpace"; type: "publicKey" },
179
+ { name: "platforms"; type: "bytes" }
180
+ ];
181
+ },
182
+ {
183
+ name: "Combined";
184
+ fields: [
185
+ { name: "vineConfig"; type: "publicKey" },
186
+ { name: "minPoints"; type: "u64" },
187
+ { name: "season"; type: "u16" },
188
+ { name: "grapeSpace"; type: "publicKey" },
189
+ { name: "platforms"; type: "bytes" },
190
+ { name: "requireWalletLink"; type: "bool" }
191
+ ];
192
+ },
193
+ {
194
+ name: "TimeLockedReputation";
195
+ fields: [
196
+ { name: "vineConfig"; type: "publicKey" },
197
+ { name: "minPoints"; type: "u64" },
198
+ { name: "season"; type: "u16" },
199
+ { name: "minHoldDurationSeconds"; type: "u64" }
200
+ ];
201
+ },
202
+ {
203
+ name: "MultiDao";
204
+ fields: [
205
+ { name: "requiredGates"; type: { vec: "publicKey" } },
206
+ { name: "requireAll"; type: "bool" }
207
+ ];
208
+ },
209
+ {
210
+ name: "TokenHolding";
211
+ fields: [
212
+ { name: "mint"; type: "publicKey" },
213
+ { name: "minAmount"; type: "u64" },
214
+ { name: "checkAta"; type: "bool" }
215
+ ];
216
+ },
217
+ {
218
+ name: "NftCollection";
219
+ fields: [
220
+ { name: "collectionMint"; type: "publicKey" },
221
+ { name: "minCount"; type: "u16" }
222
+ ];
223
+ },
224
+ {
225
+ name: "CustomProgram";
226
+ fields: [
227
+ { name: "programId"; type: "publicKey" },
228
+ { name: "instructionData"; type: "bytes" }
229
+ ];
230
+ }
231
+ ];
232
+ };
233
+ }
234
+ ];
235
+ errors: [
236
+ { code: 6000; name: "Unauthorized"; msg: "Unauthorized" },
237
+ { code: 6001; name: "GateInactive"; msg: "Gate is inactive" },
238
+ { code: 6002; name: "GateCheckFailed"; msg: "Gate check failed" },
239
+ { code: 6003; name: "ReputationAccountRequired"; msg: "Reputation account required" },
240
+ { code: 6004; name: "IdentityAccountRequired"; msg: "Identity account required" },
241
+ { code: 6005; name: "LinkAccountRequired"; msg: "Link account required" },
242
+ { code: 6006; name: "TokenAccountRequired"; msg: "Token account required" },
243
+ { code: 6007; name: "InvalidReputationAccount"; msg: "Invalid reputation account" },
244
+ { code: 6008; name: "InvalidIdentityAccount"; msg: "Invalid identity account" },
245
+ { code: 6009; name: "InvalidLinkAccount"; msg: "Invalid link account" },
246
+ { code: 6010; name: "InvalidPda"; msg: "Invalid PDA derivation" },
247
+ { code: 6011; name: "WrongUser"; msg: "Wrong user" },
248
+ { code: 6012; name: "SeasonMismatch"; msg: "Season mismatch" },
249
+ { code: 6013; name: "WrongSpace"; msg: "Wrong space" },
250
+ { code: 6014; name: "WrongIdentity"; msg: "Wrong identity" },
251
+ { code: 6015; name: "IdentityNotVerified"; msg: "Identity not verified" },
252
+ { code: 6016; name: "IdentityExpired"; msg: "Identity expired" },
253
+ { code: 6017; name: "InsufficientGateChecks"; msg: "Insufficient gate checks" },
254
+ { code: 6018; name: "InvalidCheckRecord"; msg: "Invalid check record" },
255
+ { code: 6019; name: "CheckRecordExpired"; msg: "Check record expired" },
256
+ { code: 6020; name: "WrongMint"; msg: "Wrong mint" },
257
+ { code: 6021; name: "WrongTokenOwner"; msg: "Wrong token owner" },
258
+ { code: 6022; name: "InsufficientNfts"; msg: "Insufficient NFTs" },
259
+ { code: 6023; name: "CustomProgramAccountRequired"; msg: "Custom program account required" },
260
+ { code: 6024; name: "InvalidCustomProgram"; msg: "Invalid custom program" },
261
+ { code: 6025; name: "CustomValidationFailed"; msg: "Custom validation failed" },
262
+ { code: 6026; name: "TargetNotProgramOwned"; msg: "Target not program owned" },
263
+ { code: 6027; name: "Overflow"; msg: "Overflow" }
264
+ ];
265
+ };
266
+
267
+ export const IDL: GrapeGatingProtocol = {
268
+ version: "0.1.0",
269
+ name: "grape_gating_protocol",
270
+ instructions: [
271
+ {
272
+ name: "initializeGate",
273
+ accounts: [
274
+ { name: "gate", isMut: true, isSigner: false },
275
+ { name: "authority", isMut: false, isSigner: true },
276
+ { name: "payer", isMut: true, isSigner: true },
277
+ { name: "systemProgram", isMut: false, isSigner: false },
278
+ ],
279
+ args: [
280
+ { name: "gateId", type: "publicKey" },
281
+ { name: "criteria", type: { defined: "GateCriteria" } },
282
+ { name: "gateType", type: { defined: "GateType" } },
283
+ ],
284
+ },
285
+ {
286
+ name: "setGateAuthority",
287
+ accounts: [
288
+ { name: "gate", isMut: true, isSigner: false },
289
+ { name: "authority", isMut: false, isSigner: true },
290
+ ],
291
+ args: [
292
+ { name: "gateId", type: "publicKey" },
293
+ { name: "newAuthority", type: "publicKey" },
294
+ ],
295
+ },
296
+ {
297
+ name: "updateGateCriteria",
298
+ accounts: [
299
+ { name: "gate", isMut: true, isSigner: false },
300
+ { name: "authority", isMut: false, isSigner: true },
301
+ ],
302
+ args: [
303
+ { name: "gateId", type: "publicKey" },
304
+ { name: "newCriteria", type: { defined: "GateCriteria" } },
305
+ ],
306
+ },
307
+ {
308
+ name: "setGateActive",
309
+ accounts: [
310
+ { name: "gate", isMut: true, isSigner: false },
311
+ { name: "authority", isMut: false, isSigner: true },
312
+ ],
313
+ args: [
314
+ { name: "gateId", type: "publicKey" },
315
+ { name: "isActive", type: "bool" },
316
+ ],
317
+ },
318
+ {
319
+ name: "checkGate",
320
+ accounts: [
321
+ { name: "gate", isMut: true, isSigner: false },
322
+ { name: "user", isMut: false, isSigner: false },
323
+ { name: "reputationAccount", isMut: true, isSigner: false, isOptional: true },
324
+ { name: "identityAccount", isMut: false, isSigner: false, isOptional: true },
325
+ { name: "linkAccount", isMut: false, isSigner: false, isOptional: true },
326
+ { name: "tokenAccount", isMut: false, isSigner: false, isOptional: true },
327
+ { name: "checkRecord", isMut: true, isSigner: false, isOptional: true },
328
+ { name: "payer", isMut: true, isSigner: true },
329
+ { name: "systemProgram", isMut: false, isSigner: false },
330
+ ],
331
+ args: [{ name: "gateId", type: "publicKey" }],
332
+ },
333
+ {
334
+ name: "createCheckRecord",
335
+ accounts: [
336
+ { name: "gate", isMut: false, isSigner: false },
337
+ { name: "user", isMut: false, isSigner: false },
338
+ { name: "checkRecord", isMut: true, isSigner: false },
339
+ { name: "payer", isMut: true, isSigner: true },
340
+ { name: "systemProgram", isMut: false, isSigner: false },
341
+ ],
342
+ args: [{ name: "gateId", type: "publicKey" }],
343
+ },
344
+ {
345
+ name: "closeGate",
346
+ accounts: [
347
+ { name: "gate", isMut: true, isSigner: false },
348
+ { name: "authority", isMut: false, isSigner: true },
349
+ { name: "recipient", isMut: true, isSigner: false },
350
+ ],
351
+ args: [{ name: "gateId", type: "publicKey" }],
352
+ },
353
+ {
354
+ name: "closeCheckRecord",
355
+ accounts: [
356
+ { name: "gate", isMut: false, isSigner: false },
357
+ { name: "user", isMut: false, isSigner: false },
358
+ { name: "checkRecord", isMut: true, isSigner: false },
359
+ { name: "authority", isMut: false, isSigner: true },
360
+ { name: "recipient", isMut: true, isSigner: false },
361
+ ],
362
+ args: [{ name: "gateId", type: "publicKey" }],
363
+ },
364
+ {
365
+ name: "adminCloseAny",
366
+ accounts: [
367
+ { name: "authority", isMut: false, isSigner: true },
368
+ { name: "target", isMut: true, isSigner: false },
369
+ { name: "recipient", isMut: true, isSigner: false },
370
+ ],
371
+ args: [],
372
+ },
373
+ ],
374
+ accounts: [
375
+ {
376
+ name: "Gate",
377
+ type: {
378
+ kind: "struct",
379
+ fields: [
380
+ { name: "version", type: "u8" },
381
+ { name: "gateId", type: "publicKey" },
382
+ { name: "authority", type: "publicKey" },
383
+ { name: "criteria", type: { defined: "GateCriteria" } },
384
+ { name: "gateType", type: { defined: "GateType" } },
385
+ { name: "isActive", type: "bool" },
386
+ { name: "createdAt", type: "i64" },
387
+ { name: "totalChecks", type: "u64" },
388
+ { name: "successfulChecks", type: "u64" },
389
+ { name: "bump", type: "u8" },
390
+ ],
391
+ },
392
+ },
393
+ {
394
+ name: "GateCheckRecord",
395
+ type: {
396
+ kind: "struct",
397
+ fields: [
398
+ { name: "version", type: "u8" },
399
+ { name: "gate", type: "publicKey" },
400
+ { name: "user", type: "publicKey" },
401
+ { name: "passed", type: "bool" },
402
+ { name: "checkedAt", type: "i64" },
403
+ { name: "bump", type: "u8" },
404
+ ],
405
+ },
406
+ },
407
+ ],
408
+ types: [
409
+ {
410
+ name: "GateType",
411
+ type: {
412
+ kind: "enum",
413
+ variants: [
414
+ { name: "SingleUse" },
415
+ { name: "Reusable" },
416
+ { name: "TimeLimited", fields: [{ name: "durationSeconds", type: "i64" }] },
417
+ { name: "Subscription", fields: [{ name: "intervalSeconds", type: "i64" }] },
418
+ ],
419
+ },
420
+ },
421
+ {
422
+ name: "GateCriteria",
423
+ type: {
424
+ kind: "enum",
425
+ variants: [
426
+ {
427
+ name: "MinReputation",
428
+ fields: [
429
+ { name: "vineConfig", type: "publicKey" },
430
+ { name: "minPoints", type: "u64" },
431
+ { name: "season", type: "u16" },
432
+ ],
433
+ },
434
+ {
435
+ name: "VerifiedIdentity",
436
+ fields: [
437
+ { name: "grapeSpace", type: "publicKey" },
438
+ { name: "platforms", type: "bytes" },
439
+ ],
440
+ },
441
+ {
442
+ name: "VerifiedWithWallet",
443
+ fields: [
444
+ { name: "grapeSpace", type: "publicKey" },
445
+ { name: "platforms", type: "bytes" },
446
+ ],
447
+ },
448
+ {
449
+ name: "Combined",
450
+ fields: [
451
+ { name: "vineConfig", type: "publicKey" },
452
+ { name: "minPoints", type: "u64" },
453
+ { name: "season", type: "u16" },
454
+ { name: "grapeSpace", type: "publicKey" },
455
+ { name: "platforms", type: "bytes" },
456
+ { name: "requireWalletLink", type: "bool" },
457
+ ],
458
+ },
459
+ {
460
+ name: "TimeLockedReputation",
461
+ fields: [
462
+ { name: "vineConfig", type: "publicKey" },
463
+ { name: "minPoints", type: "u64" },
464
+ { name: "season", type: "u16" },
465
+ { name: "minHoldDurationSeconds", type: "u64" },
466
+ ],
467
+ },
468
+ {
469
+ name: "MultiDao",
470
+ fields: [
471
+ { name: "requiredGates", type: { vec: "publicKey" } },
472
+ { name: "requireAll", type: "bool" },
473
+ ],
474
+ },
475
+ {
476
+ name: "TokenHolding",
477
+ fields: [
478
+ { name: "mint", type: "publicKey" },
479
+ { name: "minAmount", type: "u64" },
480
+ { name: "checkAta", type: "bool" },
481
+ ],
482
+ },
483
+ {
484
+ name: "NftCollection",
485
+ fields: [
486
+ { name: "collectionMint", type: "publicKey" },
487
+ { name: "minCount", type: "u16" },
488
+ ],
489
+ },
490
+ {
491
+ name: "CustomProgram",
492
+ fields: [
493
+ { name: "programId", type: "publicKey" },
494
+ { name: "instructionData", type: "bytes" },
495
+ ],
496
+ },
497
+ ],
498
+ },
499
+ },
500
+ ],
501
+ errors: [
502
+ { code: 6000, name: "Unauthorized", msg: "Unauthorized" },
503
+ { code: 6001, name: "GateInactive", msg: "Gate is inactive" },
504
+ { code: 6002, name: "GateCheckFailed", msg: "Gate check failed" },
505
+ { code: 6003, name: "ReputationAccountRequired", msg: "Reputation account required" },
506
+ { code: 6004, name: "IdentityAccountRequired", msg: "Identity account required" },
507
+ { code: 6005, name: "LinkAccountRequired", msg: "Link account required" },
508
+ { code: 6006, name: "TokenAccountRequired", msg: "Token account required" },
509
+ { code: 6007, name: "InvalidReputationAccount", msg: "Invalid reputation account" },
510
+ { code: 6008, name: "InvalidIdentityAccount", msg: "Invalid identity account" },
511
+ { code: 6009, name: "InvalidLinkAccount", msg: "Invalid link account" },
512
+ { code: 6010, name: "InvalidPda", msg: "Invalid PDA derivation" },
513
+ { code: 6011, name: "WrongUser", msg: "Wrong user" },
514
+ { code: 6012, name: "SeasonMismatch", msg: "Season mismatch" },
515
+ { code: 6013, name: "WrongSpace", msg: "Wrong space" },
516
+ { code: 6014, name: "WrongIdentity", msg: "Wrong identity" },
517
+ { code: 6015, name: "IdentityNotVerified", msg: "Identity not verified" },
518
+ { code: 6016, name: "IdentityExpired", msg: "Identity expired" },
519
+ { code: 6017, name: "InsufficientGateChecks", msg: "Insufficient gate checks" },
520
+ { code: 6018, name: "InvalidCheckRecord", msg: "Invalid check record" },
521
+ { code: 6019, name: "CheckRecordExpired", msg: "Check record expired" },
522
+ { code: 6020, name: "WrongMint", msg: "Wrong mint" },
523
+ { code: 6021, name: "WrongTokenOwner", msg: "Wrong token owner" },
524
+ { code: 6022, name: "InsufficientNfts", msg: "Insufficient NFTs" },
525
+ { code: 6023, name: "CustomProgramAccountRequired", msg: "Custom program account required" },
526
+ { code: 6024, name: "InvalidCustomProgram", msg: "Invalid custom program" },
527
+ { code: 6025, name: "CustomValidationFailed", msg: "Custom validation failed" },
528
+ { code: 6026, name: "TargetNotProgramOwned", msg: "Target not program owned" },
529
+ { code: 6027, name: "Overflow", msg: "Overflow" },
530
+ ],
531
+ };
package/src/index.ts ADDED
@@ -0,0 +1,44 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // @grape-protocol/gpass-sdk
3
+ // Grape Gating Protocol SDK
4
+ // Program: GPASSzQQF1H8cdj5pUwFkeYEE4VdMQtCrYtUaMXvPz48
5
+ // ─────────────────────────────────────────────────────────────────────────────
6
+
7
+ // Client
8
+ export { GpassClient } from "./client";
9
+
10
+ // IDL
11
+ export { IDL, GrapeGatingProtocol } from "./idl";
12
+
13
+ // PDA helpers
14
+ export {
15
+ findGatePda,
16
+ findCheckRecordPda,
17
+ findVineConfigPda,
18
+ findVineReputationPda,
19
+ findGrapeSpacePda,
20
+ findGrapeIdentityPda,
21
+ findGrapeLinkPda,
22
+ } from "./pda";
23
+
24
+ // Types & constants
25
+ export {
26
+ GPASS_PROGRAM_ID,
27
+ VINE_REPUTATION_PROGRAM_ID,
28
+ GRAPE_VERIFICATION_PROGRAM_ID,
29
+ VerificationPlatform,
30
+ GateTypeFactory,
31
+ GateCriteriaFactory,
32
+ } from "./types";
33
+
34
+ export type {
35
+ Gate,
36
+ GateCheckRecord,
37
+ GateCriteria,
38
+ GateType,
39
+ InitializeGateParams,
40
+ CheckGateParams,
41
+ UpdateGateCriteriaParams,
42
+ SetGateActiveParams,
43
+ CloseGateParams,
44
+ } from "./types";
package/src/pda.ts ADDED
@@ -0,0 +1,125 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { GPASS_PROGRAM_ID, VINE_REPUTATION_PROGRAM_ID, GRAPE_VERIFICATION_PROGRAM_ID } from "./types";
3
+
4
+ // ─────────────────────────────────────────────────────────
5
+ // GPASS PDAs
6
+ // ─────────────────────────────────────────────────────────
7
+
8
+ /**
9
+ * Derives the Gate PDA for a given gate_id.
10
+ * seeds = ["gate", gate_id]
11
+ */
12
+ export async function findGatePda(
13
+ gateId: PublicKey,
14
+ programId: PublicKey = GPASS_PROGRAM_ID
15
+ ): Promise<[PublicKey, number]> {
16
+ return PublicKey.findProgramAddress(
17
+ [Buffer.from("gate"), gateId.toBuffer()],
18
+ programId
19
+ );
20
+ }
21
+
22
+ /**
23
+ * Derives the GateCheckRecord PDA for a gate + user.
24
+ * seeds = ["check", gate, user]
25
+ */
26
+ export async function findCheckRecordPda(
27
+ gate: PublicKey,
28
+ user: PublicKey,
29
+ programId: PublicKey = GPASS_PROGRAM_ID
30
+ ): Promise<[PublicKey, number]> {
31
+ return PublicKey.findProgramAddress(
32
+ [Buffer.from("check"), gate.toBuffer(), user.toBuffer()],
33
+ programId
34
+ );
35
+ }
36
+
37
+ // ─────────────────────────────────────────────────────────
38
+ // VINE REPUTATION PDAs
39
+ // ─────────────────────────────────────────────────────────
40
+
41
+ /**
42
+ * Derives the Vine ReputationConfig PDA.
43
+ * seeds = ["config", dao_id]
44
+ */
45
+ export async function findVineConfigPda(
46
+ daoId: PublicKey,
47
+ programId: PublicKey = VINE_REPUTATION_PROGRAM_ID
48
+ ): Promise<[PublicKey, number]> {
49
+ return PublicKey.findProgramAddress(
50
+ [Buffer.from("config"), daoId.toBuffer()],
51
+ programId
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Derives the Vine Reputation PDA for a user in a config+season.
57
+ * seeds = ["reputation", config, user, season_le_bytes]
58
+ */
59
+ export async function findVineReputationPda(
60
+ config: PublicKey,
61
+ user: PublicKey,
62
+ season: number,
63
+ programId: PublicKey = VINE_REPUTATION_PROGRAM_ID
64
+ ): Promise<[PublicKey, number]> {
65
+ const seasonBuf = Buffer.alloc(2);
66
+ seasonBuf.writeUInt16LE(season, 0);
67
+ return PublicKey.findProgramAddress(
68
+ [Buffer.from("reputation"), config.toBuffer(), user.toBuffer(), seasonBuf],
69
+ programId
70
+ );
71
+ }
72
+
73
+ // ─────────────────────────────────────────────────────────
74
+ // GRAPE VERIFICATION PDAs
75
+ // ─────────────────────────────────────────────────────────
76
+
77
+ /**
78
+ * Derives the Grape VerificationSpace PDA.
79
+ * seeds = ["space", dao_id]
80
+ */
81
+ export async function findGrapeSpacePda(
82
+ daoId: PublicKey,
83
+ programId: PublicKey = GRAPE_VERIFICATION_PROGRAM_ID
84
+ ): Promise<[PublicKey, number]> {
85
+ return PublicKey.findProgramAddress(
86
+ [Buffer.from("space"), daoId.toBuffer()],
87
+ programId
88
+ );
89
+ }
90
+
91
+ /**
92
+ * Derives the Grape Identity PDA.
93
+ * seeds = ["identity", space, platform_seed, id_hash]
94
+ */
95
+ export async function findGrapeIdentityPda(
96
+ space: PublicKey,
97
+ platformSeed: number,
98
+ idHash: Uint8Array,
99
+ programId: PublicKey = GRAPE_VERIFICATION_PROGRAM_ID
100
+ ): Promise<[PublicKey, number]> {
101
+ return PublicKey.findProgramAddress(
102
+ [
103
+ Buffer.from("identity"),
104
+ space.toBuffer(),
105
+ Buffer.from([platformSeed]),
106
+ Buffer.from(idHash),
107
+ ],
108
+ programId
109
+ );
110
+ }
111
+
112
+ /**
113
+ * Derives the Grape Link PDA.
114
+ * seeds = ["link", identity, wallet_hash]
115
+ */
116
+ export async function findGrapeLinkPda(
117
+ identity: PublicKey,
118
+ walletHash: Uint8Array,
119
+ programId: PublicKey = GRAPE_VERIFICATION_PROGRAM_ID
120
+ ): Promise<[PublicKey, number]> {
121
+ return PublicKey.findProgramAddress(
122
+ [Buffer.from("link"), identity.toBuffer(), Buffer.from(walletHash)],
123
+ programId
124
+ );
125
+ }