@grapenpm/grape-access-sdk
v0.2.0
Published
SDK for the Grape Access Protocol (GPASS) - composable access control for Solana DAOs
Maintainers
Readme
@grapenpm/grape-access-sdk
TypeScript SDK for the Grape Access Protocol on Solana.
Program ID: GPASSzQQF1H8cdj5pUwFkeYEE4VdMQtCrYtUaMXvPz48
Install
npm install @grapenpm/grape-access-sdk
# peer deps
npm install @coral-xyz/anchor @solana/web3.jsQuick Start (UI)
import {
GrapeAccessClient,
AccessCriteriaFactory,
AccessTypeFactory,
VerificationPlatform,
} from "@grapenpm/grape-access-sdk";
import { AnchorProvider } from "@coral-xyz/anchor";
import { Keypair } from "@solana/web3.js";
const provider = AnchorProvider.env();
const client = new GrapeAccessClient(provider);
const accessId = Keypair.generate().publicKey;
const { tx, access } = await client.initializeAccess({
accessId,
criteria: AccessCriteriaFactory.combined({
vineConfig: myVineConfigPda,
minPoints: 500,
season: 1,
grapeSpace: myGrapeSpacePda,
platforms: [VerificationPlatform.Discord],
requireWalletLink: true,
}),
accessType: AccessTypeFactory.reusable(),
metadataUri: "https://example.com/access/metadata.json",
});
await client.checkAccess({
accessId,
user: userWallet,
reputationAccount: vineRepPda,
identityAccount: grapeIdentityPda,
linkAccount: grapeLinkPda,
storeRecord: true,
});
const passes = await client.simulateCheckAccess({
accessId,
user: userWallet,
reputationAccount: vineRepPda,
identityAccount: grapeIdentityPda,
});
console.log({ tx, access: access.toBase58(), passes });If authority differs from provider wallet, include authoritySigner:
await client.initializeAccess({
accessId,
criteria,
accessType,
authority: externalAuthority.publicKey,
authoritySigner: externalAuthority,
});Access Criteria
MinReputation
AccessCriteriaFactory.minReputation({
vineConfig,
minPoints: 1000,
season: 2,
});VerifiedIdentity
AccessCriteriaFactory.verifiedIdentity({
grapeSpace,
platforms: [VerificationPlatform.Discord, VerificationPlatform.Twitter],
});VerifiedWithWallet
AccessCriteriaFactory.verifiedWithWallet({
grapeSpace,
platforms: [VerificationPlatform.Discord],
});Combined
AccessCriteriaFactory.combined({
vineConfig,
minPoints: 500,
season: 1,
grapeSpace,
platforms: [VerificationPlatform.Discord],
requireWalletLink: true,
});TimeLockedReputation
AccessCriteriaFactory.timeLockedReputation({
vineConfig,
minPoints: 100,
season: 1,
minHoldDurationSeconds: 30 * 24 * 60 * 60,
});MultiDao
Use requiredAccessSpaces (new naming):
AccessCriteriaFactory.multiDao({
requiredAccessSpaces: [accessA, accessB, accessC],
requireAll: true,
});When checking, pass check records via remainingAccounts:
await client.checkAccess({
accessId,
user: userWallet,
remainingAccounts: [
{ pubkey: checkRecordA, isWritable: false, isSigner: false },
{ pubkey: checkRecordB, isWritable: false, isSigner: false },
],
});TokenHolding
AccessCriteriaFactory.tokenHolding({
mint: tokenMint,
minAmount: 100_000_000,
checkAta: true,
});NftCollection
AccessCriteriaFactory.nftCollection({
collectionMint,
minCount: 1,
});CustomProgram
instructionDataHash must be a 32-byte hash.
import { createHash } from "crypto";
const instructionDataHash = createHash("sha256")
.update(myInstructionBytes)
.digest();
AccessCriteriaFactory.customProgram({
programId: myProgramId,
instructionDataHash,
});Access Types
| Type | Description |
|------|-------------|
| AccessTypeFactory.singleUse() | One-time check |
| AccessTypeFactory.reusable() | Reusable checks |
| AccessTypeFactory.timeLimited(86400) | Time-limited pass |
| AccessTypeFactory.subscription(604800) | Periodic re-check |
PDA Helpers
import {
findAccessPda,
findAccessCheckRecordPda,
findVineReputationPda,
findGrapeIdentityPda,
findGrapeLinkPda,
} from "@grapenpm/grape-access-sdk";
const [accessPda] = await findAccessPda(accessId);
const [checkRecordPda] = await findAccessCheckRecordPda(accessPda, userWallet);Core Methods for UI
initializeAccesscheckAccesssimulateCheckAccessupdateAccessCriteriaupdateMetadataUrisetAccessActivesetAccessAuthorityfetchAccessfetchAccessCheckRecordfetchAccessesByAuthoritybuildCheckAccessInstructionbuildAccessTransaction
Backward Compatibility
Old gate naming is still exported as aliases:
- Client class:
GpassClient(alias ofGrapeAccessClient) - Types/factories:
Gate*aliases toAccess* - PDA helpers:
findGatePdaandfindCheckRecordPdaalias new access PDA derivations - Methods like
initializeGate/checkGate/fetchGatestill work as wrappers
License
MIT — Grape Protocol
