jito-distributor-sdk
Version:
TypeScript SDK for JITO Merkle Distributor with production-ready versioning and double-hashing support
148 lines (147 loc) • 5.32 kB
TypeScript
import { Connection, PublicKey } from '@solana/web3.js';
import BigNumber from 'bignumber.js';
/**
* Constants for the versioning system
*/
export declare const VERSIONING_CONSTANTS: {
readonly MAX_DEPLOYMENTS_PER_USER: 65536;
readonly USER_FINGERPRINT_BITS: 48;
readonly SEQUENCE_BITS: 16;
readonly MERKLE_DISTRIBUTOR_DISCRIMINATOR: "MerkleDistributor";
readonly MERKLE_DISTRIBUTOR_ACCOUNT_SIZE: 177;
readonly MAX_RETRY_ATTEMPTS: 3;
readonly RETRY_DELAY_MS: 500;
};
/**
* Custom error types for versioning system
*/
export declare class VersioningError extends Error {
code: string;
constructor(message: string, code: string);
}
export declare class DeploymentLimitExceededError extends VersioningError {
constructor(currentCount: number, maxAllowed: number);
}
export declare class RaceConditionError extends VersioningError {
constructor(version: string);
}
/**
* Result type for version generation
*/
export interface VersionGenerationResult {
version: BigNumber;
sequence: number;
userFingerprint: BigNumber;
deploymentCount: number;
}
/**
* Configuration for the versioning system
*/
export interface VersioningConfig {
connection: Connection;
programId: PublicKey;
mintAddress: PublicKey;
}
/**
* Deployment result with retry information
*/
export interface DeploymentAttemptResult extends VersionGenerationResult {
attempt: number;
retried: boolean;
}
/**
* Main versioning system class for JITO Merkle Distributor
*/
export declare class DeterministicVersioning {
private connection;
private programId;
private mintAddress;
constructor(config: VersioningConfig);
/**
* Generates a deterministic user fingerprint from wallet public key
* Takes the first 48 bits of SHA-256 hash of the wallet pubkey
*/
private generateUserFingerprint;
/**
* Queries the blockchain to count existing distributor accounts for a user
* This gives us the reliable sequence number for next deployment
*/
getUserDeploymentCount(walletPubkey: PublicKey): Promise<number>;
/**
* Generates a deterministic, collision-free version number
* Format: [48-bit user fingerprint][16-bit sequence number]
*/
private generateVersionNumber;
/**
* Main function: Get the next version number for a user's deployment
* Combines on-chain sequence tracking with deterministic generation
*/
getNextVersion(walletPubkey: PublicKey): Promise<VersionGenerationResult>;
/**
* Race-condition safe deployment version generation with auto-retry
* This is the recommended method for UI usage
*/
getNextVersionWithRetry(walletPubkey: PublicKey): Promise<DeploymentAttemptResult>;
/**
* Utility: Verify a version number was generated correctly
* Useful for debugging and validation
*/
verifyVersion(walletPubkey: PublicKey, version: BigNumber): Promise<boolean>;
/**
* Utility: Decode a version number back to its components
* Useful for debugging and analytics
*/
static decodeVersion(version: BigNumber): {
userFingerprint: BigNumber;
sequence: number;
};
/**
* Utility: Convert version to little-endian Buffer for Solana
* Ensures proper endianness for PDA derivation
*/
static versionToLEBuffer(version: BigNumber): Buffer;
/**
* Utility: Get deployment history for a user
* Returns all versions this user has deployed
*/
getUserDeploymentHistory(walletPubkey: PublicKey): Promise<BigNumber[]>;
/**
* Utility: Estimate collision probability for given user count
* Returns probability as percentage for easier monitoring
*/
static estimateCollisionProbability(userCount: number, deploymentsPerUser?: number): {
probability: number;
probabilityPercent: string;
isAcceptable: boolean;
};
}
/**
* Simple deterministic versioning utilities (from legacy deterministic-version.ts)
* Kept for backwards compatibility and simple use cases
*/
/**
* Generate a simple deterministic version number unique to the deployer's wallet
* This ensures no collisions with other deployers while being reproducible
*/
export declare function getDeterministicVersion(deployerPubkey: PublicKey, salt?: string): bigint;
/**
* Generate a deterministic version with custom salt for multiple distributions
*/
export declare function getDistributionVersion(deployerPubkey: PublicKey, distributionName: string): bigint;
/**
* Generate a time-based deterministic version (changes daily)
*/
export declare function getDailyVersion(deployerPubkey: PublicKey, date?: Date): bigint;
/**
* Generate a sequential version for the same deployer
*/
export declare function getSequentialVersion(deployerPubkey: PublicKey, sequence: number): bigint;
/**
* Convenience function for quick version generation with race protection
* Recommended for React UI usage with JITO Merkle Distributor
*/
export declare function generateNextVersionSafe(connection: Connection, programId: PublicKey, mintAddress: PublicKey, walletPubkey: PublicKey): Promise<DeploymentAttemptResult>;
/**
* Utility to detect if error is from account collision
*/
export declare function isAccountCollisionError(error: any): boolean;