@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.
- package/INTEGRATION.md +278 -55
- package/dist/client.d.ts +15 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +28 -4
- package/dist/client.js.map +1 -1
- package/dist/idl.d.ts +23 -14
- package/dist/idl.d.ts.map +1 -1
- package/dist/idl.json +42 -33
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/traitProof.d.ts +186 -120
- package/dist/traitProof.d.ts.map +1 -1
- package/dist/traitProof.js +120 -85
- package/dist/traitProof.js.map +1 -1
- package/package.json +2 -2
package/dist/traitProof.js
CHANGED
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trait-bonus proof builder for NFT-staking `claim_rewards`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
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]
|
|
13
|
-
* [72..80]
|
|
28
|
+
* [64..72] traitBonusRate u64 (LE)
|
|
29
|
+
* [72..80] totalClaimed u64 (LE — strictly monotonic replay nonce)
|
|
14
30
|
*
|
|
15
|
-
* Sign
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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` (
|
|
37
|
-
*
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
|
77
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
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
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
package/dist/traitProof.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traitProof.js","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"AAAA
|
|
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
|
+
"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.
|
|
15
|
+
"@soltracer/core": "0.4.0",
|
|
16
16
|
"@soltracer/cpi-accounts": "0.1.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|