@soltracer/nft-staking 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/INTEGRATION.md ADDED
@@ -0,0 +1,237 @@
1
+ # @soltracer/nft-staking
2
+
3
+ SDK client for the solTracer NFT Staking program. Supports Legacy, pNFT, Core, and cNFT staking with escrow or wallet-lock modes, primary and secondary rewards, trait bonuses, lock tiers, and permanent burn mechanics.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @soltracer/nft-staking @soltracer/core @coral-xyz/anchor @solana/web3.js
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```ts
14
+ import { NftStakingClient } from "@soltracer/nft-staking";
15
+ import { AnchorProvider } from "@coral-xyz/anchor";
16
+
17
+ const provider = AnchorProvider.env();
18
+ const client = NftStakingClient.create(provider);
19
+
20
+ // Fetch a staking pool
21
+ const pool = await client.fetchStakePool(projectId, poolId);
22
+
23
+ // Stake an NFT
24
+ const ix = await client.stakeNft(projectId, poolId, nftMint, 0, null, fee);
25
+ ```
26
+
27
+ ## Client Setup
28
+
29
+ ```ts
30
+ // From bundled IDL (recommended)
31
+ const client = NftStakingClient.create(provider);
32
+
33
+ // From custom IDL
34
+ const client = NftStakingClient.fromIdl(customIdl, provider);
35
+ ```
36
+
37
+ ## Fee Parameters
38
+
39
+ Many instructions require a `FeeParams` object for platform fee CPI:
40
+
41
+ ```ts
42
+ interface FeeParams {
43
+ feeConfig: PublicKey;
44
+ treasury: PublicKey;
45
+ referralAccount?: string;
46
+ solUsdPriceFeed: PublicKey;
47
+ adminProgram: PublicKey;
48
+ }
49
+ ```
50
+
51
+ ## Read Methods
52
+
53
+ ### Pool & Config
54
+
55
+ ```ts
56
+ const config = await client.fetchStakeConfig(projectId);
57
+ const pool = await client.fetchStakePool(projectId, poolId);
58
+ const pools = await client.fetchAllPools(projectId);
59
+ ```
60
+
61
+ ### Stake Entries
62
+
63
+ ```ts
64
+ const entry = await client.fetchStakeEntry(poolId, nftMint);
65
+ const entries = await client.fetchStakeEntriesByOwner(poolId, owner);
66
+ const batch = await client.fetchStakeEntriesForMints(poolId, [mint1, mint2]);
67
+ const all = await client.fetchAllStakeEntriesByPool(projectId, poolId);
68
+ const cross = await client.fetchStakeEntriesAcrossPools([poolId1, poolId2], [mint1, mint2]);
69
+ ```
70
+
71
+ ### Staker Accounts
72
+
73
+ ```ts
74
+ const staker = await client.fetchStakerAccount(poolId, wallet);
75
+ const stakers = await client.fetchAllStakersByPool(projectId, poolId);
76
+ ```
77
+
78
+ ### Secondary Rewards
79
+
80
+ ```ts
81
+ const poolSecondary = await client.fetchPoolSecondaryRewards(poolId);
82
+ const stakerSecondary = await client.fetchStakerSecondaryRewards(poolId, wallet);
83
+ ```
84
+
85
+ ## Admin Instructions
86
+
87
+ ### Initialize & Create Pools
88
+
89
+ ```ts
90
+ // Initialize staking config for a project
91
+ const ix = await client.initializeStakeConfig(projectId);
92
+
93
+ // Create a staking pool
94
+ const ix = await client.createStakePool(
95
+ projectId,
96
+ 0, // stakingMode: 0 = Escrow, 1 = WalletLock
97
+ {
98
+ rewardType: 0, // 0 = Token, 1 = Points
99
+ rewardMint: mintPubkey,
100
+ baseRate: 100,
101
+ rateInterval: 86400, // daily
102
+ traitBonusMode: 0,
103
+ quantityThresholds: [],
104
+ },
105
+ [{ lockDuration: 0, rewardRate: 100, earlyUnstakePenaltyBps: 0 }],
106
+ collectionMint,
107
+ rewardEndAt, // optional unix timestamp
108
+ maxStaked // optional max NFTs
109
+ );
110
+ ```
111
+
112
+ ### Update Pool
113
+
114
+ ```ts
115
+ const ix = await client.updateStakePool(
116
+ projectId, poolId,
117
+ rewardConfig, // or null to keep existing
118
+ lockConfigs, // or null to keep existing
119
+ isActive, // or null to keep existing
120
+ traitAuthority, canBurn, merkleRoot, gateType, rewardEndAt, maxStaked
121
+ );
122
+ ```
123
+
124
+ ### Fund & Withdraw Reward Vault
125
+
126
+ ```ts
127
+ const fund = await client.fundRewardVault(projectId, poolId, amount, rewardMint);
128
+ const withdraw = await client.withdrawRewardVault(projectId, poolId, amount, rewardMint);
129
+ ```
130
+
131
+ ### Close Pool
132
+
133
+ ```ts
134
+ const ix = await client.closeStakePool(projectId, poolId);
135
+ ```
136
+
137
+ ### Secondary Rewards Management
138
+
139
+ ```ts
140
+ const add = await client.addPoolSecondaryReward(projectId, poolId, rewardMint, baseRate, lockTierRates);
141
+ const remove = await client.removePoolSecondaryReward(projectId, poolId, rewardIndex);
142
+ const fund = await client.fundSecondaryVault(projectId, poolId, rewardIndex, amount, rewardMint);
143
+ const withdraw = await client.withdrawSecondaryVault(projectId, poolId, rewardIndex, amount, rewardMint);
144
+ ```
145
+
146
+ ## User Instructions
147
+
148
+ ### Staking Legacy/pNFT
149
+
150
+ ```ts
151
+ const stake = await client.stakeNft(projectId, poolId, nftMint, stakingMode, lockTierIndex, fee, gateProof);
152
+ const unstake = await client.unstakeNft(projectId, poolId, nftMint, rewardMint, stakingMode, fee);
153
+ ```
154
+
155
+ ### Staking Core NFTs
156
+
157
+ ```ts
158
+ const stake = await client.stakeCoreNft(projectId, poolId, nftAsset, collection, lockTierIndex, fee, gateProof);
159
+ const unstake = await client.unstakeCoreNft(projectId, poolId, nftAsset, collection, rewardMint, fee);
160
+ ```
161
+
162
+ ### Staking cNFTs
163
+
164
+ ```ts
165
+ const stake = await client.stakeCnft(
166
+ projectId, poolId, nftAssetId, merkleTree,
167
+ cnftRoot, cnftDataHash, cnftCreatorHash, cnftNonce, cnftIndex,
168
+ proofNodes, fee, gateProof
169
+ );
170
+ const unstake = await client.unstakeCnft(
171
+ projectId, poolId, nftAssetId, merkleTree, rewardMint,
172
+ cnftRoot, cnftDataHash, cnftCreatorHash, cnftNonce, cnftIndex,
173
+ proofNodes, fee
174
+ );
175
+ ```
176
+
177
+ ### Claiming Rewards
178
+
179
+ ```ts
180
+ const claim = await client.claimRewards(projectId, poolId, rewardMint, traitBonusRate, fee);
181
+ ```
182
+
183
+ ### Secondary Reward Claims
184
+
185
+ ```ts
186
+ const init = await client.initStakerSecondary(projectId, poolId);
187
+ const claim = await client.claimSecondaryRewards(projectId, poolId, secondaryRewards, fee);
188
+ ```
189
+
190
+ ### Burn Permanently-Locked Assets
191
+
192
+ ```ts
193
+ const burnNft = await client.burnStakedNft(projectId, poolId, nftMint, stakingMode, fee);
194
+ const burnCore = await client.burnStakedCoreNft(projectId, poolId, nftAsset, collection, fee);
195
+ ```
196
+
197
+ ### Spend Points
198
+
199
+ ```ts
200
+ const spend = await client.spendPoints(projectId, poolId, amount, fee);
201
+ ```
202
+
203
+ ## Integration Example
204
+
205
+ ```ts
206
+ import { NftStakingClient } from "@soltracer/nft-staking";
207
+ import { NFT_STAKING_PROGRAM_ID, getFeeConfigPda, getTreasuryPda } from "@soltracer/core";
208
+ import { AnchorProvider } from "@coral-xyz/anchor";
209
+ import { PublicKey, Transaction } from "@solana/web3.js";
210
+
211
+ const provider = AnchorProvider.env();
212
+ const client = NftStakingClient.create(provider);
213
+
214
+ const [feeConfig] = getFeeConfigPda(NFT_STAKING_PROGRAM_ID);
215
+ const [treasury] = getTreasuryPda();
216
+
217
+ const fee = {
218
+ feeConfig,
219
+ treasury,
220
+ solUsdPriceFeed: new PublicKey("..."),
221
+ adminProgram: new PublicKey("H5ApgCLSTnvdFTmZCf9t2kEiz1nzji7iEivBPoPbDfS4"),
222
+ };
223
+
224
+ const stakeIx = await client.stakeNft(1, 0, nftMint, 0, null, fee);
225
+ const tx = new Transaction().add(stakeIx);
226
+ await provider.sendAndConfirm(tx);
227
+ ```
228
+
229
+ ## Exports
230
+
231
+ | Export | Type |
232
+ |---|---|
233
+ | `NftStakingClient` | Class |
234
+ | `FeeParams` | TypeScript interface |
235
+ | `NFT_STAKING_PROGRAM_ID` | `PublicKey` (re-exported from `@soltracer/core`) |
236
+ | `NftStakingIDLType` | IDL type |
237
+ | `NftStakingIDL` | IDL JSON |
@@ -0,0 +1,112 @@
1
+ import { BN, Program, type AnchorProvider } from "@coral-xyz/anchor";
2
+ import { PublicKey, type TransactionInstruction } from "@solana/web3.js";
3
+ import { type StakePoolConfig, type StakePool, type StakeEntry, type StakerAccount, type PoolSecondaryRewards, type StakerSecondaryRewards } from "@soltracer/core";
4
+ import type { NftStaking } from "./idl";
5
+ /** Optional referral account for fee distribution. */
6
+ export interface FeeParams {
7
+ /** Referral account PDA (Pubkey as base58). Omit if no referral. */
8
+ referralAccount?: string;
9
+ }
10
+ export declare class NftStakingClient {
11
+ readonly program: Program<NftStaking>;
12
+ readonly provider: AnchorProvider;
13
+ private tokenProgramCache;
14
+ private mintDecimalsCache;
15
+ constructor(program: Program<NftStaking>, provider: AnchorProvider);
16
+ static create(provider: AnchorProvider): NftStakingClient;
17
+ static fromIdl(idl: NftStaking, provider: AnchorProvider): NftStakingClient;
18
+ /** Detect whether a mint is Token-2022 or SPL Token (cached). */
19
+ private resolveTokenProgram;
20
+ /** Fetch the decimal precision of a token mint (cached). */
21
+ getMintDecimals(mint: PublicKey): Promise<number>;
22
+ /** Convert raw token amounts in a decoded StakePool to human-readable values. */
23
+ private applyPoolDecimals;
24
+ /** Hardcoded Pyth SOL/USD push oracle address (PriceUpdateV2). */
25
+ private static readonly PYTH_SOL_USD_FEED;
26
+ /** Resolve fee PDA accounts for fee CPI. */
27
+ private resolveFeeAccounts;
28
+ fetchStakeConfig(projectId: number): Promise<StakePoolConfig | null>;
29
+ fetchStakePool(projectId: number, poolId: number): Promise<StakePool | null>;
30
+ fetchStakeEntry(poolId: number, nftMint: PublicKey): Promise<StakeEntry | null>;
31
+ fetchStakerAccount(poolId: number, wallet: PublicKey, rewardDecimals?: number): Promise<StakerAccount | null>;
32
+ /** Fetch all stake pools for a project by scanning pool IDs 0..totalPools-1. */
33
+ fetchAllPools(projectId: number): Promise<StakePool[]>;
34
+ /** Fetch all active stake entries for a wallet in a specific pool via gPA. */
35
+ fetchStakeEntriesByOwner(_poolId: number, owner: PublicKey): Promise<StakeEntry[]>;
36
+ /**
37
+ * Fetch active stake entries for specific NFT mints by deriving their PDAs.
38
+ * More reliable than gPA in browser environments.
39
+ */
40
+ fetchStakeEntriesForMints(poolId: number, nftMints: PublicKey[]): Promise<StakeEntry[]>;
41
+ /** Fetch all stake entries for a pool via gPA with memcmp on pool pubkey. */
42
+ fetchAllStakeEntriesByPool(projectId: number, poolId: number): Promise<StakeEntry[]>;
43
+ /**
44
+ * Fetch active stake entries for given mints across multiple pools.
45
+ * Uses PDA derivation + fetchMultiple (reliable in browser).
46
+ */
47
+ fetchStakeEntriesAcrossPools(poolIds: number[], nftMints: PublicKey[]): Promise<StakeEntry[]>;
48
+ /** Fetch all staker accounts for a pool via gPA with memcmp on pool pubkey. */
49
+ fetchAllStakersByPool(projectId: number, poolId: number): Promise<StakerAccount[]>;
50
+ closeLegacyCollection(projectId: number, collectionMint: PublicKey): Promise<TransactionInstruction>;
51
+ initializeStakeConfig(projectId: number): Promise<TransactionInstruction>;
52
+ createStakePool(projectId: number, stakingMode: number, rewardConfig: {
53
+ rewardType: number;
54
+ rewardMint: PublicKey;
55
+ baseRate: number;
56
+ rateInterval: number;
57
+ traitBonusMode: number;
58
+ quantityThresholds: {
59
+ minCount: number;
60
+ bonusBps: number;
61
+ }[];
62
+ }, lockConfigs: {
63
+ lockDuration: number;
64
+ rewardRate: number;
65
+ earlyUnstakePenaltyBps: number;
66
+ }[], collectionMint: PublicKey, rewardEndAt?: number, maxStaked?: number): Promise<TransactionInstruction>;
67
+ updateStakePool(projectId: number, poolId: number, rewardConfig: {
68
+ rewardType: number;
69
+ rewardMint: PublicKey;
70
+ baseRate: number;
71
+ rateInterval: number;
72
+ traitBonusMode: number;
73
+ quantityThresholds: {
74
+ minCount: number;
75
+ bonusBps: number;
76
+ }[];
77
+ } | null, lockConfigs: {
78
+ lockDuration: number;
79
+ rewardRate: number;
80
+ earlyUnstakePenaltyBps: number;
81
+ }[] | null, isActive: boolean | null, traitAuthority?: PublicKey | null, canBurn?: boolean | null, merkleRoot?: number[] | null, gateType?: number | null, rewardEndAt?: BN | null, maxStaked?: BN | null): Promise<TransactionInstruction>;
82
+ fundRewardVault(projectId: number, poolId: number, amount: BN, rewardMint: PublicKey, funderTokenAccount?: PublicKey): Promise<TransactionInstruction>;
83
+ withdrawRewardVault(projectId: number, poolId: number, amount: BN, rewardMint: PublicKey, destinationTokenAccount?: PublicKey): Promise<TransactionInstruction>;
84
+ closeStakePool(projectId: number, poolId: number): Promise<TransactionInstruction>;
85
+ stakeNft(projectId: number, poolId: number, nftMint: PublicKey, stakingMode: number, lockTierIndex: number | null, fee?: FeeParams, gateProof?: number[][]): Promise<TransactionInstruction>;
86
+ unstakeNft(projectId: number, poolId: number, nftMint: PublicKey, rewardMint: PublicKey, stakingMode: number, fee?: FeeParams): Promise<TransactionInstruction>;
87
+ claimRewards(projectId: number, poolId: number, rewardMint: PublicKey, traitBonusRate?: BN | null, fee?: FeeParams): Promise<TransactionInstruction>;
88
+ stakeCoreNft(projectId: number, poolId: number, nftAsset: PublicKey, collection: PublicKey, lockTierIndex: number | null, fee?: FeeParams, gateProof?: number[][]): Promise<TransactionInstruction>;
89
+ unstakeCoreNft(projectId: number, poolId: number, nftAsset: PublicKey, collection: PublicKey, rewardMint: PublicKey, fee?: FeeParams): Promise<TransactionInstruction>;
90
+ /** Stake a compressed NFT (cNFT). All address/hash params accepted as strings. */
91
+ stakeCnft(projectId: number, poolId: number, nftAssetId: string, merkleTree: string, cnftRoot: string, cnftDataHash: string, cnftCreatorHash: string, cnftNonce: number, cnftIndex: number, proofNodes: string[], fee?: FeeParams, gateProof?: number[][]): Promise<TransactionInstruction>;
92
+ /** Unstake a compressed NFT (cNFT). Derives tree config and program IDs internally. */
93
+ unstakeCnft(projectId: number, poolId: number, nftAssetId: string, merkleTree: string, rewardMint: string, cnftRoot: string, cnftDataHash: string, cnftCreatorHash: string, cnftNonce: number, cnftIndex: number, proofNodes: string[], fee?: FeeParams): Promise<TransactionInstruction>;
94
+ /** Burn a permanently-locked legacy/pNFT. Destroys the NFT and closes the stake entry.
95
+ * For Escrow mode, burns from escrow. For WalletLock, unfreezes then burns from wallet. */
96
+ burnStakedNft(projectId: number, poolId: number, nftMint: PublicKey, stakingMode: number, fee?: FeeParams): Promise<TransactionInstruction>;
97
+ /** Burn a permanently-locked Core NFT. Destroys the asset and closes the stake entry. */
98
+ burnStakedCoreNft(projectId: number, poolId: number, nftAsset: PublicKey, collection: PublicKey, fee?: FeeParams): Promise<TransactionInstruction>;
99
+ /** Spend accrued points from a Points reward type pool. */
100
+ spendPoints(projectId: number, poolId: number, amount: BN, fee?: FeeParams): Promise<TransactionInstruction>;
101
+ fetchPoolSecondaryRewards(poolId: number): Promise<PoolSecondaryRewards | null>;
102
+ fetchStakerSecondaryRewards(poolId: number, wallet: PublicKey): Promise<StakerSecondaryRewards | null>;
103
+ addPoolSecondaryReward(projectId: number, poolId: number, rewardMint: PublicKey, baseRate: BN, lockTierRates: BN[]): Promise<TransactionInstruction>;
104
+ removePoolSecondaryReward(projectId: number, poolId: number, rewardIndex: number): Promise<TransactionInstruction>;
105
+ fundSecondaryVault(projectId: number, poolId: number, rewardIndex: number, amount: BN, rewardMint: PublicKey, funderTokenAccount?: PublicKey): Promise<TransactionInstruction>;
106
+ withdrawSecondaryVault(projectId: number, poolId: number, rewardIndex: number, amount: BN, rewardMint: PublicKey, destinationTokenAccount?: PublicKey): Promise<TransactionInstruction>;
107
+ initStakerSecondary(projectId: number, poolId: number): Promise<TransactionInstruction>;
108
+ claimSecondaryRewards(projectId: number, poolId: number, secondaryRewards: {
109
+ mint: PublicKey;
110
+ }[], fee?: FeeParams): Promise<TransactionInstruction>;
111
+ }
112
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}