@soltracer/nft-staking 0.3.0 → 0.4.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.
@@ -1,21 +1,36 @@
1
1
  /**
2
2
  * Trait-bonus proof builder for NFT-staking `claim_rewards`.
3
3
  *
4
- * The on-chain Ed25519 message embeds `staker.total_claimed` (a strictly
5
- * monotonic nonce). Callers MUST read the live `StakerAccount.totalClaimed`
6
- * immediately before signing.
4
+ * Design summary
5
+ * --------------
6
+ * The on-chain `claim_rewards` instruction accepts a SINGLE u64
7
+ * `traitBonusRate` per claim. When `pool.reward_config.trait_bonus_enabled`
8
+ * is `true`, that rate is added directly to the staker's effective rate for
9
+ * the accrual window. The chain has zero per-NFT or per-trait awareness —
10
+ * ALL bonus math (trait lookups, per-NFT multipliers, caps, etc.) happens
11
+ * off-chain in the project's trait-authority server, which signs the final
12
+ * aggregated rate.
7
13
  *
8
- * Message layout 80 bytes, little-endian where applicable:
14
+ * Why per-NFT (not per-staker) multipliers
15
+ * ----------------------------------------
16
+ * An older design exposed a `BaseMultiplier` mode on-chain that multiplied
17
+ * the staker's ENTIRE effective rate (all NFTs combined). That meant a
18
+ * single "Mythic 2x" NFT doubled rewards for every plain NFT in the same
19
+ * claim — cross-contamination across NFTs. The new model evaluates each
20
+ * NFT's bonuses independently, applies its own optional multiplier to its
21
+ * own bonus sum, then sums those isolated per-NFT bonuses into the single
22
+ * signed `u64`. One NFT's multiplier never touches another NFT's reward.
23
+ *
24
+ * Ed25519 message layout — 80 bytes (LE where applicable):
9
25
  *
10
26
  * [0..32] pool (PublicKey bytes)
11
27
  * [32..64] staker wallet (PublicKey bytes)
12
- * [64..72] trait_bonus_rate u64 (LE)
13
- * [72..80] total_claimed u64 (LE)
28
+ * [64..72] traitBonusRate u64 (LE)
29
+ * [72..80] totalClaimed u64 (LE — strictly monotonic replay nonce)
14
30
  *
15
- * Sign this byte payload with the pool's trait-authority Ed25519 keypair
16
- * (or the global trait authority) and prepend an Ed25519 instruction with
17
- * the signature, expected pubkey, and message to the same transaction that
18
- * invokes `claimRewards(..., traitBonusRate)`.
31
+ * Sign with the pool's trait-authority Ed25519 keypair (or the global
32
+ * `stakeConfig.authority` when the pool has no override) and prepend the
33
+ * Ed25519 precompile instruction in the same transaction as `claimRewards`.
19
34
  */
20
35
  import { toPk } from "@soltracer/core";
21
36
  /** Fixed message length consumed by the on-chain Ed25519 verifier. */
@@ -33,8 +48,8 @@ function u64LE(value) {
33
48
  /**
34
49
  * Build the 80-byte trait-proof message exactly as the on-chain handler
35
50
  * reconstructs it. `totalClaimed` must be the LIVE value of
36
- * `StakerAccount.totalClaimed` (i.e. fetched within the same client tx
37
- * preparation window — otherwise the signature will be rejected).
51
+ * `StakerAccount.totalClaimed` (fetched within the same tx prep window —
52
+ * otherwise the signature is rejected once the nonce advances).
38
53
  */
39
54
  export function buildTraitProofMessage(params) {
40
55
  const msg = Buffer.alloc(TRAIT_PROOF_MSG_LEN);
@@ -44,95 +59,115 @@ export function buildTraitProofMessage(params) {
44
59
  u64LE(params.totalClaimed).copy(msg, 72);
45
60
  return msg;
46
61
  }
47
- function normalizeKey(s) {
48
- return s.trim().toLowerCase();
49
- }
50
- function bonusFromCatalogEntry(entry, traitBonusMode) {
51
- const bps = BigInt(entry.bonusBps ?? 0);
52
- const extra = BigInt(entry.fixedExtra ?? 0);
53
- if (bps !== 0n && extra !== 0n) {
54
- throw new Error(`computeTraitBonusRate: catalog entry "${entry.traitType}=${entry.value}" sets both bonusBps and fixedExtra; pick one.`);
62
+ /**
63
+ * In-memory catalog suitable for tests and small static configurations.
64
+ * Keys are collection mints (base58).
65
+ */
66
+ export class InMemoryTraitBonusStore {
67
+ entriesByCollection;
68
+ constructor(entriesByCollection) {
69
+ this.entriesByCollection = entriesByCollection;
55
70
  }
56
- if (traitBonusMode === 1) {
57
- if (bps !== 0n) {
58
- throw new Error(`computeTraitBonusRate: traitBonusMode = FixedExtra but catalog entry "${entry.traitType}=${entry.value}" uses bonusBps. Use fixedExtra (raw reward per interval).`);
59
- }
60
- return extra;
71
+ static from(entries) {
72
+ const map = new Map();
73
+ for (const [k, v] of Object.entries(entries))
74
+ map.set(k, v);
75
+ return new InMemoryTraitBonusStore(map);
61
76
  }
62
- if (extra !== 0n) {
63
- throw new Error(`computeTraitBonusRate: traitBonusMode = BaseMultiplier but catalog entry "${entry.traitType}=${entry.value}" uses fixedExtra. Use bonusBps (10_000 = +100%).`);
77
+ async listForCollection(collectionMint) {
78
+ return this.entriesByCollection.get(collectionMint) ?? [];
64
79
  }
65
- return bps;
66
80
  }
81
+ /**
82
+ * Aggregate trait bonuses into a single absolute `u64` rate.
83
+ *
84
+ * Algorithm (per NFT, independently):
85
+ * 1. For every `(traitType, value)` on the NFT, look it up in `catalog`.
86
+ * 2. Sum every matched `bonus`. Unmatched traits contribute 0.
87
+ * 3. If `multiplierBps` is set, multiply the NFT's bonus sum by it / 10_000.
88
+ * (Floor division — bonuses are integer raw units.)
89
+ *
90
+ * Final result = sum of per-NFT bonuses. A multiplier on one NFT cannot
91
+ * touch another NFT's contribution, eliminating the cross-contamination bug
92
+ * present in the old on-chain `BaseMultiplier` mode.
93
+ */
67
94
  export function computeTraitBonusRate(params) {
68
- if (params.traitBonusMode === 0) {
69
- return { traitBonusRate: 0n, perNft: [] };
70
- }
71
- const mode = params.traitBonusMode;
72
- // Build a lookup keyed by normalized "type::value".
73
- // Validates every catalog entry up-front so misconfigured entries are
74
- // surfaced even if no NFT references them.
95
+ // Build an O(1) lookup map.
75
96
  const lookup = new Map();
76
- for (const entry of params.catalog) {
77
- const key = `${normalizeKey(entry.traitType)}::${normalizeKey(entry.value)}`;
78
- if (lookup.has(key)) {
79
- throw new Error(`computeTraitBonusRate: duplicate catalog entry for "${entry.traitType}=${entry.value}".`);
80
- }
81
- lookup.set(key, bonusFromCatalogEntry(entry, mode));
97
+ for (const e of params.catalog) {
98
+ lookup.set(`${e.traitType}\u0000${e.value}`, e.bonus);
82
99
  }
83
- let total = 0n;
84
100
  const perNft = [];
101
+ let total = 0n;
85
102
  for (const nft of params.nfts) {
86
103
  let nftBonus = 0n;
87
- let matched = 0;
88
- for (const trait of nft.traits) {
89
- const hit = lookup.get(`${normalizeKey(trait.traitType)}::${normalizeKey(trait.value)}`);
90
- if (hit === undefined || hit === 0n)
91
- continue;
92
- nftBonus += hit;
93
- matched += 1;
104
+ for (const t of nft.traits) {
105
+ const hit = lookup.get(`${t.traitType}\u0000${t.value}`);
106
+ if (hit !== undefined)
107
+ nftBonus += hit;
108
+ }
109
+ if (nft.multiplierBps !== undefined && nft.multiplierBps !== 10_000) {
110
+ if (nft.multiplierBps < 0) {
111
+ throw new Error(`multiplierBps must be >= 0 for mint ${nft.mint}`);
112
+ }
113
+ nftBonus = (nftBonus * BigInt(nft.multiplierBps)) / 10000n;
94
114
  }
115
+ perNft.push({ mint: nft.mint, bonus: nftBonus });
95
116
  total += nftBonus;
96
- perNft.push({
97
- mint: typeof nft.mint === "string" ? nft.mint : toPk(nft.mint).toBase58(),
98
- bonus: nftBonus,
99
- matchedTraits: matched,
100
- });
117
+ }
118
+ // Guard the u64 upper bound the on-chain field is `u64` and Anchor will
119
+ // reject anything that does not fit.
120
+ const U64_MAX = 18446744073709551615n;
121
+ if (total > U64_MAX) {
122
+ throw new Error(`aggregated trait bonus rate ${total} exceeds u64::MAX — cap your catalog or multipliers`);
101
123
  }
102
124
  return { traitBonusRate: total, perNft };
103
125
  }
104
126
  /**
105
- * @deprecated Use `computeTraitBonusRate` instead it accepts the real per-NFT
106
- * trait input and a bonus catalog, mirroring the backend flow. Retained for
107
- * call sites that already pre-resolved a flat bonus array.
127
+ * Full backend orchestration: ownership-verify each mint, resolve traits,
128
+ * aggregate via `computeTraitBonusRate`, and build the signed message.
129
+ *
130
+ * The server is expected to sign `result.message` with the trait-authority
131
+ * Ed25519 keypair, return both the signature and `traitBonusRate` to the
132
+ * client, and the client forwards both into the `claimRewards` tx.
108
133
  */
109
- export function aggregateTraitBonusRate(traits, traitBonusMode) {
110
- if (traitBonusMode === 0) {
111
- if (traits.some((t) => (t.bonusBps ?? 0) !== 0 || (t.fixedExtra ?? 0) !== 0)) {
112
- throw new Error("aggregateTraitBonusRate: pool.traitBonusMode === None — non-zero trait bonuses are rejected on-chain.");
113
- }
114
- return 0n;
115
- }
116
- let sum = 0n;
117
- for (const t of traits) {
118
- const bps = BigInt(t.bonusBps ?? 0);
119
- const extra = BigInt(t.fixedExtra ?? 0);
120
- if (bps !== 0n && extra !== 0n) {
121
- throw new Error("aggregateTraitBonusRate: a single trait must set bonusBps OR fixedExtra, not both.");
122
- }
123
- if (traitBonusMode === 1) {
124
- if (bps !== 0n) {
125
- throw new Error("aggregateTraitBonusRate: traitBonusMode = FixedExtra expects fixedExtra (per-interval reward), not bonusBps.");
126
- }
127
- sum += extra;
128
- }
129
- else {
130
- if (extra !== 0n) {
131
- throw new Error("aggregateTraitBonusRate: traitBonusMode = BaseMultiplier expects bonusBps (10_000 = +100%), not fixedExtra.");
132
- }
133
- sum += bps;
134
- }
135
- }
136
- return sum;
134
+ export async function prepareTraitProof(input) {
135
+ const walletStr = toPk(input.wallet).toBase58();
136
+ const ownershipChecks = await Promise.all(input.mints.map(async (mint) => ({
137
+ mint,
138
+ owned: await input.isStakedBy({ wallet: walletStr, poolId: input.poolId, mint }),
139
+ })));
140
+ const ownedMints = ownershipChecks.filter((c) => c.owned).map((c) => c.mint);
141
+ const rejectedMints = ownershipChecks.filter((c) => !c.owned).map((c) => c.mint);
142
+ const traitsByMint = await Promise.all(ownedMints.map(async (mint) => {
143
+ const r = await input.resolveTraits(mint);
144
+ return { mint, traits: r.traits, multiplierBps: r.multiplierBps };
145
+ }));
146
+ const catalog = await input.store.listForCollection(input.collectionMint);
147
+ const { traitBonusRate, perNft } = computeTraitBonusRate({
148
+ catalog,
149
+ nfts: traitsByMint,
150
+ });
151
+ const message = buildTraitProofMessage({
152
+ pool: input.pool,
153
+ wallet: input.wallet,
154
+ traitBonusRate,
155
+ totalClaimed: input.totalClaimed,
156
+ });
157
+ return { message, traitBonusRate, perNft, rejectedMints };
158
+ }
159
+ /**
160
+ * Adapter — turn an `NftStakingClient.fetchStakeEntriesByOwner` style call
161
+ * into a `StakedOwnershipResolver`. Pass in your already-constructed client.
162
+ *
163
+ * ```ts
164
+ * const isStakedBy = ownershipFromClient(client)
165
+ * ```
166
+ */
167
+ export function ownershipFromClient(client) {
168
+ return async ({ wallet, poolId, mint }) => {
169
+ const entries = await client.fetchStakeEntriesByOwner(wallet, Number(poolId));
170
+ return entries.some((e) => Number(e.poolId) === Number(poolId) && e.nftMint.toBase58() === mint);
171
+ };
137
172
  }
138
173
  //# 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.4.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@noble/hashes": "^1.8.0",
15
- "@soltracer/core": "0.3.1",
15
+ "@soltracer/core": "0.4.0",
16
16
  "@soltracer/cpi-accounts": "0.1.0"
17
17
  },
18
18
  "devDependencies": {