@soltracer/nft-staking 0.3.0 → 0.3.1

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 CHANGED
@@ -298,8 +298,140 @@ server. The intended flow:
298
298
  6. **Sign and return.** Sign the resulting `u64` with the pool's `traitAuthority` keypair; return signature + rate to
299
299
  the client.
300
300
 
301
- The SDK ships `computeTraitBonusRate` for steps 4–5. It takes the validated NFT/trait list and a bonus catalog, enforces
302
- mode/field consistency, and returns both the aggregated rate and a per-NFT breakdown (handy for receipts or UI tooltips):
301
+ The SDK ships `computeTraitBonusRate` for steps 4–5 (mode-aware aggregation only) and `prepareTraitProof` for the full
302
+ pipeline (steps 2–5 plus the 80-byte signable message). Pick whichever fits how much of the flow your stack already
303
+ owns.
304
+
305
+ #### Managing the bonus catalog (any DB)
306
+
307
+ The admin UI (Trait Bonuses card) writes a row per `(projectId, poolId, traitType, traitValue)` to your DB. Sample
308
+ Prisma schema used by the reference app:
309
+
310
+ ```prisma
311
+ model TraitBonusConfig {
312
+ id String @id @default(cuid())
313
+ projectId String @map("project_id")
314
+ poolId Int @map("pool_id")
315
+ traitType String @map("trait_type") @db.VarChar(64)
316
+ traitValue String @map("trait_value") @db.VarChar(64)
317
+ bonusAmount Int @map("bonus_amount") // bonusBps (mode 2) or fixedExtra (mode 1)
318
+ imageUrl String? @map("image_url")
319
+ createdAt DateTime @default(now())
320
+ updatedAt DateTime @updatedAt
321
+
322
+ @@unique([projectId, poolId, traitType, traitValue])
323
+ @@map("trait_bonus_configs")
324
+ }
325
+ ```
326
+
327
+ You can model this however you like — Drizzle, raw Postgres, Mongo, KV, Firestore, an in-memory map for testing. The
328
+ SDK only needs a `TraitBonusStore` adapter:
329
+
330
+ ```ts
331
+ import type { TraitBonusStore } from "@soltracer/nft-staking"
332
+
333
+ // Prisma example
334
+ export const prismaTraitBonusStore: TraitBonusStore = {
335
+ async list({ poolId, projectId }) {
336
+ const rows = await prisma.traitBonusConfig.findMany({
337
+ where: { poolId, ...(projectId ? { projectId: String(projectId) } : {}) },
338
+ })
339
+ return rows.map((r) => ({
340
+ traitType: r.traitType,
341
+ value: r.traitValue,
342
+ // Pool in BaseMultiplier mode? use bonusBps. FixedExtra? use fixedExtra.
343
+ bonusBps: r.bonusAmount,
344
+ }))
345
+ },
346
+ }
347
+
348
+ // Drizzle example (drop-in replacement)
349
+ export const drizzleTraitBonusStore: TraitBonusStore = {
350
+ async list({ poolId, projectId }) {
351
+ const rows = await db
352
+ .select()
353
+ .from(traitBonusConfig)
354
+ .where(and(eq(traitBonusConfig.poolId, poolId), projectId ? eq(traitBonusConfig.projectId, String(projectId)) : undefined))
355
+ return rows.map((r) => ({ traitType: r.traitType, value: r.traitValue, bonusBps: r.bonusAmount }))
356
+ },
357
+ }
358
+
359
+ // In-memory (for tests / examples)
360
+ export function makeMemoryStore(seed: TraitBonusCatalogEntry[]): TraitBonusStore {
361
+ return { async list() { return seed } }
362
+ }
363
+ ```
364
+
365
+ Recommended CRUD endpoints (the reference app exposes these as tRPC; HTTP/GraphQL works identically):
366
+
367
+ | Operation | Inputs | Behavior |
368
+ | --- | --- | --- |
369
+ | `list` | `{ projectId, poolId }` | Returns all catalog rows for the pool. Used by the admin UI and by `TraitBonusStore.list`. |
370
+ | `create` | `{ projectId, poolId, traitType, traitValue, bonusAmount, imageUrl? }` | Inserts one row. |
371
+ | `update` | `{ id, bonusAmount?, imageUrl? }` | Updates a single row. |
372
+ | `delete` | `{ id }` | Deletes a row. |
373
+ | `upsert` (bulk) | `{ projectId, poolId, bonuses: [...] }` | Idempotent bulk replace via the unique `(projectId, poolId, traitType, traitValue)` index. |
374
+
375
+ Treat all five as admin-only. Gate them behind a project-authority check (e.g. signed-message session for the
376
+ project's `authority` wallet) so non-admins can't rewrite reward rules.
377
+
378
+ #### Full backend flow with `prepareTraitProof`
379
+
380
+ `prepareTraitProof` wires together ownership validation, trait resolution, the store, and the 80-byte message into a
381
+ single async call. You only supply the four pieces that depend on your infrastructure:
382
+
383
+ ```ts
384
+ import {
385
+ prepareTraitProof,
386
+ ownershipFromClient,
387
+ type NftTraitResolver,
388
+ } from "@soltracer/nft-staking"
389
+ import nacl from "tweetnacl"
390
+
391
+ // One-time wiring:
392
+ const traitBonusStore = prismaTraitBonusStore // from §"Managing the bonus catalog"
393
+ const resolveTraits: NftTraitResolver = async (mint) => {
394
+ // Your trait source: Metaplex metadata, indexer, internal DB, collection JSON, etc.
395
+ const nft = await metadataIndex.getByMint(mint)
396
+ return nft.attributes.map((a) => ({ traitType: a.trait_type, value: a.value }))
397
+ }
398
+ const validateOwnership = ownershipFromClient(client) // or your own stake-state index
399
+
400
+ // ── POST /api/staking/trait-proof
401
+ async function handleProofRequest(req: { wallet: PublicKey; projectId: string; poolId: number; mints: string[] }) {
402
+ const pool = await client.fetchStakePool(undefined, req.poolId)
403
+ const staker = await client.fetchStakerAccount(req.poolId, req.wallet)
404
+
405
+ const prepared = await prepareTraitProof({
406
+ pool: { address: pool.address, rewardConfig: pool.rewardConfig },
407
+ projectId: req.projectId,
408
+ poolId: req.poolId,
409
+ wallet: req.wallet,
410
+ requestedMints: req.mints,
411
+ store: traitBonusStore,
412
+ resolveTraits,
413
+ validateOwnership,
414
+ totalClaimed: staker.totalClaimed,
415
+ })
416
+
417
+ const signature = nacl.sign.detached(prepared.message, traitAuthority.secretKey)
418
+
419
+ return {
420
+ traitBonusRate: prepared.traitBonusRate.toString(),
421
+ signature: Buffer.from(signature).toString("base64"),
422
+ traitAuthority: traitAuthority.publicKey.toBase58(),
423
+ validatedMints: prepared.validatedMints,
424
+ rejectedMints: prepared.rejectedMints,
425
+ perNft: prepared.perNft, // [{ mint, bonus, matchedTraits }] — display in the claim UI
426
+ }
427
+ }
428
+ ```
429
+
430
+ Client side, pass the returned `signature` and `traitBonusRate` (as `BN`) into `client.claimRewards(poolId, { traitBonusRate, fee })`
431
+ and prepend the `Ed25519Program.createInstructionWithPublicKey({ publicKey: traitAuthority, message, signature })`
432
+ instruction to the same transaction.
433
+
434
+ The original lower-level helpers remain available if you want to compose the pipeline yourself:
303
435
 
304
436
  ```ts
305
437
  import {
package/dist/index.d.ts CHANGED
@@ -4,6 +4,6 @@ export { type NftStaking as NftStakingIDLType } from "./idl";
4
4
  export { default as NftStakingIDL } from "./idl.json";
5
5
  export * from "./errors";
6
6
  export * from "./helpers";
7
- export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate, computeTraitBonusRate, type TraitBonusCatalogEntry, type NftTraitInput, type ComputeTraitBonusResult, } from "./traitProof";
7
+ export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate, computeTraitBonusRate, prepareTraitProof, ownershipFromClient, type TraitBonusCatalogEntry, type NftTraitInput, type ComputeTraitBonusResult, type TraitBonusStore, type NftTraitResolver, type StakedOwnershipResolver, type PreparedTraitProof, } from "./traitProof";
8
8
  export { GATE_TYPE_NONE, GATE_TYPE_WALLET, GATE_TYPE_TOKEN_MINT, type GateType, type MerkleTree, hashLeaf, hashPair, buildMerkleTree, getMerkleProof, proofToAnchorArg, rootToAnchorArg, } from "./merkle";
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,UAAU,IAAI,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,UAAU,IAAI,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -3,6 +3,6 @@ export { NFT_STAKING_PROGRAM_ID, getStakeConfigPda, getStakePoolPda, getStakeEnt
3
3
  export { default as NftStakingIDL } from "./idl.json";
4
4
  export * from "./errors";
5
5
  export * from "./helpers";
6
- export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate, computeTraitBonusRate, } from "./traitProof";
6
+ export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate, computeTraitBonusRate, prepareTraitProof, ownershipFromClient, } from "./traitProof";
7
7
  export { GATE_TYPE_NONE, GATE_TYPE_WALLET, GATE_TYPE_TOKEN_MINT, hashLeaf, hashPair, buildMerkleTree, getMerkleProof, proofToAnchorArg, rootToAnchorArg, } from "./merkle";
8
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,GAItB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GAQpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
@@ -155,4 +155,144 @@ export declare function aggregateTraitBonusRate(traits: ReadonlyArray<{
155
155
  bonusBps?: number | bigint;
156
156
  fixedExtra?: number | bigint;
157
157
  }>, traitBonusMode: 0 | 1 | 2): bigint;
158
+ /**
159
+ * Storage adapter for a project's trait-bonus catalog.
160
+ *
161
+ * The SDK does not care where you persist this data — Prisma, Drizzle, raw
162
+ * Postgres, Mongo, KV, in-memory, REST — implement this interface against
163
+ * whatever backs your admin UI. Each `(traitType, value)` row carries the
164
+ * bonus for that pair.
165
+ */
166
+ export interface TraitBonusStore {
167
+ /**
168
+ * Return every catalog entry for a given pool. The orchestrator does not
169
+ * filter by trait — it expects the full set so unmatched traits naturally
170
+ * contribute nothing.
171
+ */
172
+ list(params: {
173
+ poolId: number;
174
+ projectId?: string | number;
175
+ }): Promise<TraitBonusCatalogEntry[]>;
176
+ }
177
+ /**
178
+ * Resolves the on-chain trait list for a given NFT mint.
179
+ *
180
+ * Wire this to whatever your project uses as a source of truth: an indexer,
181
+ * Metaplex on-chain metadata, your own collection JSON, an internal DB, etc.
182
+ * Returning an empty array is fine — that NFT simply contributes no bonus.
183
+ */
184
+ export type NftTraitResolver = (mint: string) => Promise<ReadonlyArray<{
185
+ traitType: string;
186
+ value: string;
187
+ }>>;
188
+ /** Validates which `requestedMints` are actually staked in `poolId` by `wallet`. */
189
+ export type StakedOwnershipResolver = (params: {
190
+ wallet: string;
191
+ poolId: number;
192
+ requestedMints: ReadonlyArray<string>;
193
+ }) => Promise<ReadonlyArray<string>>;
194
+ export type PreparedTraitProof = {
195
+ /** Aggregated u64 rate ready to sign. */
196
+ traitBonusRate: bigint;
197
+ /** Mints the user requested that survived ownership validation. */
198
+ validatedMints: string[];
199
+ /** Mints the user requested that were rejected (not staked). */
200
+ rejectedMints: string[];
201
+ /** Per-NFT contribution breakdown (useful for UI tooltips / audit logs). */
202
+ perNft: ComputeTraitBonusResult["perNft"];
203
+ /** Convenience: the raw 80-byte message to feed into `nacl.sign.detached`. */
204
+ message: Buffer;
205
+ };
206
+ /**
207
+ * End-to-end backend orchestrator for the trait-proof flow.
208
+ *
209
+ * Combines the four user-supplied dependencies — ownership validation, trait
210
+ * resolution, the bonus-catalog store, and the on-chain staker nonce — into
211
+ * the single signable payload the on-chain claim instruction expects.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * import {
216
+ * prepareTraitProof,
217
+ * type TraitBonusStore,
218
+ * } from "@soltracer/nft-staking"
219
+ *
220
+ * // 1) Implement the store against your DB once (any DB works).
221
+ * const traitBonusStore: TraitBonusStore = {
222
+ * async list({ poolId, projectId }) {
223
+ * const rows = await prisma.traitBonusConfig.findMany({
224
+ * where: { poolId, ...(projectId ? { projectId: String(projectId) } : {}) },
225
+ * })
226
+ * return rows.map((r) => ({
227
+ * traitType: r.traitType,
228
+ * value: r.traitValue,
229
+ * // pool is BaseMultiplier? use bonusBps. FixedExtra? use fixedExtra.
230
+ * bonusBps: r.bonusAmount,
231
+ * }))
232
+ * },
233
+ * }
234
+ *
235
+ * // 2) Prepare the proof on each claim request.
236
+ * const prepared = await prepareTraitProof({
237
+ * client, // NftStakingClient
238
+ * pool, // already-fetched StakePool (has rewardConfig + address)
239
+ * wallet: req.wallet,
240
+ * requestedMints: req.mints,
241
+ * store: traitBonusStore,
242
+ * resolveTraits: (mint) => catalog.getTraits(mint),
243
+ * })
244
+ *
245
+ * // 3) Sign and respond.
246
+ * const signature = nacl.sign.detached(prepared.message, traitAuthority.secretKey)
247
+ * return {
248
+ * traitBonusRate: prepared.traitBonusRate.toString(),
249
+ * signature: Buffer.from(signature).toString("base64"),
250
+ * perNft: prepared.perNft,
251
+ * rejectedMints: prepared.rejectedMints,
252
+ * }
253
+ * ```
254
+ */
255
+ export declare function prepareTraitProof(params: {
256
+ /** Pool config — must expose `address` and `rewardConfig.traitBonusMode`. */
257
+ pool: {
258
+ address: PkInput;
259
+ rewardConfig: {
260
+ traitBonusMode: number;
261
+ };
262
+ };
263
+ /** Project ID hint forwarded to the store (DB scoping, optional). */
264
+ projectId?: string | number;
265
+ poolId?: number;
266
+ wallet: PkInput;
267
+ requestedMints: ReadonlyArray<string>;
268
+ /** Storage adapter for the bonus catalog. */
269
+ store: TraitBonusStore;
270
+ /** Resolves trait list for a single mint. */
271
+ resolveTraits: NftTraitResolver;
272
+ /**
273
+ * Validates which `requestedMints` are actually staked in this pool by
274
+ * `wallet`. If omitted, the orchestrator trusts the caller — DO NOT skip
275
+ * this in production. The SDK can drive this for you when you pass a
276
+ * `client` and `poolId` (see `ownershipFromClient`).
277
+ */
278
+ validateOwnership: StakedOwnershipResolver;
279
+ /**
280
+ * Current `StakerAccount.totalClaimed` nonce. MUST be the live value;
281
+ * advance-then-sign in the same request to avoid same-second replay.
282
+ */
283
+ totalClaimed: BnInput;
284
+ }): Promise<PreparedTraitProof>;
285
+ /**
286
+ * Convenience `StakedOwnershipResolver` that uses an `NftStakingClient` to
287
+ * walk the wallet's stake entries and only allow mints currently staked in
288
+ * `poolId`. Wire this into `prepareTraitProof({ validateOwnership })` if you
289
+ * don't already have your own stake index.
290
+ */
291
+ export declare function ownershipFromClient(client: {
292
+ fetchStakeEntriesByOwner: (poolId: number, wallet: PkInput) => Promise<Array<{
293
+ nftMint: {
294
+ toBase58(): string;
295
+ };
296
+ }>>;
297
+ }): StakedOwnershipResolver;
158
298
  //# sourceMappingURL=traitProof.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traitProof.d.ts","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAQ,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAElE,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAcrC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,8DAA8D;IAC9D,YAAY,EAAE,OAAO,CAAA;CACtB,GAAG,MAAM,CAOT;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,gFAAgF;IAChF,MAAM,EAAE,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5D,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,gFAAgF;IAChF,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtE,CAAA;AAiCD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAA;IAC9C,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CACnC,GAAG,uBAAuB,CAuC1B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,EACnF,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GACxB,MAAM,CAmCR"}
1
+ {"version":3,"file":"traitProof.d.ts","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"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"}
@@ -135,4 +135,105 @@ export function aggregateTraitBonusRate(traits, traitBonusMode) {
135
135
  }
136
136
  return sum;
137
137
  }
138
+ /**
139
+ * End-to-end backend orchestrator for the trait-proof flow.
140
+ *
141
+ * Combines the four user-supplied dependencies — ownership validation, trait
142
+ * resolution, the bonus-catalog store, and the on-chain staker nonce — into
143
+ * the single signable payload the on-chain claim instruction expects.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * import {
148
+ * prepareTraitProof,
149
+ * type TraitBonusStore,
150
+ * } from "@soltracer/nft-staking"
151
+ *
152
+ * // 1) Implement the store against your DB once (any DB works).
153
+ * const traitBonusStore: TraitBonusStore = {
154
+ * async list({ poolId, projectId }) {
155
+ * const rows = await prisma.traitBonusConfig.findMany({
156
+ * where: { poolId, ...(projectId ? { projectId: String(projectId) } : {}) },
157
+ * })
158
+ * return rows.map((r) => ({
159
+ * traitType: r.traitType,
160
+ * value: r.traitValue,
161
+ * // pool is BaseMultiplier? use bonusBps. FixedExtra? use fixedExtra.
162
+ * bonusBps: r.bonusAmount,
163
+ * }))
164
+ * },
165
+ * }
166
+ *
167
+ * // 2) Prepare the proof on each claim request.
168
+ * const prepared = await prepareTraitProof({
169
+ * client, // NftStakingClient
170
+ * pool, // already-fetched StakePool (has rewardConfig + address)
171
+ * wallet: req.wallet,
172
+ * requestedMints: req.mints,
173
+ * store: traitBonusStore,
174
+ * resolveTraits: (mint) => catalog.getTraits(mint),
175
+ * })
176
+ *
177
+ * // 3) Sign and respond.
178
+ * const signature = nacl.sign.detached(prepared.message, traitAuthority.secretKey)
179
+ * return {
180
+ * traitBonusRate: prepared.traitBonusRate.toString(),
181
+ * signature: Buffer.from(signature).toString("base64"),
182
+ * perNft: prepared.perNft,
183
+ * rejectedMints: prepared.rejectedMints,
184
+ * }
185
+ * ```
186
+ */
187
+ export async function prepareTraitProof(params) {
188
+ const wallet = toPk(params.wallet);
189
+ const poolPk = toPk(params.pool.address);
190
+ const mode = params.pool.rewardConfig.traitBonusMode;
191
+ // 1. Ownership / stake validation — drop anything the user does not actually have staked.
192
+ const validated = await params.validateOwnership({
193
+ wallet: wallet.toBase58(),
194
+ poolId: params.poolId ?? 0,
195
+ requestedMints: params.requestedMints,
196
+ });
197
+ const validatedSet = new Set(validated);
198
+ const validatedMints = params.requestedMints.filter((m) => validatedSet.has(m));
199
+ const rejectedMints = params.requestedMints.filter((m) => !validatedSet.has(m));
200
+ // 2 + 3. Resolve traits for each validated mint and load the bonus catalog.
201
+ const [nftTraits, catalog] = await Promise.all([
202
+ Promise.all(validatedMints.map(async (mint) => ({
203
+ mint,
204
+ traits: await params.resolveTraits(mint),
205
+ }))),
206
+ params.store.list({
207
+ poolId: params.poolId ?? 0,
208
+ projectId: params.projectId,
209
+ }),
210
+ ]);
211
+ // 4. Mode-aware aggregation.
212
+ const { traitBonusRate, perNft } = computeTraitBonusRate({
213
+ traitBonusMode: mode,
214
+ catalog,
215
+ nfts: nftTraits,
216
+ });
217
+ // 5. Build the signable 80-byte message.
218
+ const message = buildTraitProofMessage({
219
+ pool: poolPk,
220
+ wallet,
221
+ traitBonusRate,
222
+ totalClaimed: params.totalClaimed,
223
+ });
224
+ return { traitBonusRate, validatedMints, rejectedMints, perNft, message };
225
+ }
226
+ /**
227
+ * Convenience `StakedOwnershipResolver` that uses an `NftStakingClient` to
228
+ * walk the wallet's stake entries and only allow mints currently staked in
229
+ * `poolId`. Wire this into `prepareTraitProof({ validateOwnership })` if you
230
+ * don't already have your own stake index.
231
+ */
232
+ export function ownershipFromClient(client) {
233
+ return async ({ wallet, poolId, requestedMints }) => {
234
+ const entries = await client.fetchStakeEntriesByOwner(poolId, wallet);
235
+ const staked = new Set(entries.map((e) => e.nftMint.toBase58()));
236
+ return requestedMints.filter((m) => staked.has(m));
237
+ };
238
+ }
138
239
  //# sourceMappingURL=traitProof.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"traitProof.js","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"traitProof.js","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soltracer/nft-staking",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",