@soltracer/nft-staking 0.2.7 → 0.2.9
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 +69 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -9
- package/dist/client.js.map +1 -1
- package/dist/idl.d.ts +6 -6
- package/dist/idl.d.ts.map +1 -1
- package/dist/idl.json +6 -6
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/traitProof.d.ts +42 -4
- package/dist/traitProof.d.ts.map +1 -1
- package/dist/traitProof.js +69 -4
- package/dist/traitProof.js.map +1 -1
- package/package.json +1 -1
package/dist/idl.json
CHANGED
|
@@ -6193,7 +6193,7 @@
|
|
|
6193
6193
|
{
|
|
6194
6194
|
"name": "sync_stake_entry_secondary",
|
|
6195
6195
|
"docs": [
|
|
6196
|
-
"
|
|
6196
|
+
"re-sync one StakeEntry's contribution to",
|
|
6197
6197
|
"`pool_secondary.rewards[secondary_index]`. Permissionless. Lets",
|
|
6198
6198
|
"existing stakers begin accruing on a secondary that was added",
|
|
6199
6199
|
"post-stake (or pick up a rate-update) without unstaking."
|
|
@@ -9025,7 +9025,7 @@
|
|
|
9025
9025
|
{
|
|
9026
9026
|
"name": "retired_at",
|
|
9027
9027
|
"docs": [
|
|
9028
|
-
"
|
|
9028
|
+
"unix timestamp at which the slot was",
|
|
9029
9029
|
"retired. `0` while active. Used by `accrue_secondary` /",
|
|
9030
9030
|
"`accrue_and_sub_secondary` to cap per-staker accrual at the moment of",
|
|
9031
9031
|
"retirement so the time window between a staker's last interaction and",
|
|
@@ -9131,7 +9131,7 @@
|
|
|
9131
9131
|
{
|
|
9132
9132
|
"name": "early_unstake_penalty_bps",
|
|
9133
9133
|
"docs": [
|
|
9134
|
-
"
|
|
9134
|
+
"early-unstake penalty (bps) captured at",
|
|
9135
9135
|
"stake time. Read at unstake instead of `pool.lock_configs[tier].early_unstake_penalty_bps`",
|
|
9136
9136
|
"so the authority cannot retroactively raise the penalty after the",
|
|
9137
9137
|
"staker has committed. Zero when the entry has no lock."
|
|
@@ -9144,7 +9144,7 @@
|
|
|
9144
9144
|
{
|
|
9145
9145
|
"name": "StakeEntrySecondarySynced",
|
|
9146
9146
|
"docs": [
|
|
9147
|
-
"
|
|
9147
|
+
"emitted when a StakeEntry's",
|
|
9148
9148
|
"secondary_rate_contributions[index] is re-synced to the pool's current",
|
|
9149
9149
|
"config (e.g. after an admin added a new secondary slot post-stake)."
|
|
9150
9150
|
],
|
|
@@ -9309,7 +9309,7 @@
|
|
|
9309
9309
|
{
|
|
9310
9310
|
"name": "total_effective_rate",
|
|
9311
9311
|
"docs": [
|
|
9312
|
-
"
|
|
9312
|
+
"aggregate of every active staker's",
|
|
9313
9313
|
"`effective_rate`. Maintained at every stake/unstake/burn site.",
|
|
9314
9314
|
"Used by [`pool_settle`] to advance obligation for stakers who have",
|
|
9315
9315
|
"not yet visited the pool since `last_pool_accrual_ts`."
|
|
@@ -9319,7 +9319,7 @@
|
|
|
9319
9319
|
{
|
|
9320
9320
|
"name": "last_pool_accrual_ts",
|
|
9321
9321
|
"docs": [
|
|
9322
|
-
"
|
|
9322
|
+
"unix timestamp at which the pool's",
|
|
9323
9323
|
"total obligation was last advanced. Bumped by every handler that",
|
|
9324
9324
|
"touches the pool (via [`pool_settle`])."
|
|
9325
9325
|
],
|
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 } from "./traitProof";
|
|
7
|
+
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate } 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,cAAc,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,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACnG,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 } from "./traitProof";
|
|
6
|
+
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, aggregateTraitBonusRate } 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,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,cAAc,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,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
|
package/dist/traitProof.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trait-bonus proof builder for NFT-staking `claim_rewards`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `StakerAccount.totalClaimed` immediately before signing.
|
|
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.
|
|
8
7
|
*
|
|
9
8
|
* Message layout — 80 bytes, little-endian where applicable:
|
|
10
9
|
*
|
|
@@ -58,4 +57,43 @@ export declare function buildTraitProofMessage(params: {
|
|
|
58
57
|
* await provider.sendAndConfirm(new Transaction().add(ed25519Ix, claimIx))
|
|
59
58
|
* ```
|
|
60
59
|
*/
|
|
60
|
+
/**
|
|
61
|
+
* Mode-aware trait-bonus rate aggregator.
|
|
62
|
+
*
|
|
63
|
+
* The on-chain `claim_rewards` instruction accepts a **single** `u64`
|
|
64
|
+
* `traitBonusRate` per claim — the chain knows nothing about per-trait
|
|
65
|
+
* granularity. Aggregation across N staked NFTs (each with M traits) is the
|
|
66
|
+
* caller's responsibility, and the math depends on the pool's
|
|
67
|
+
* `rewardConfig.traitBonusMode`:
|
|
68
|
+
*
|
|
69
|
+
* - `0` / `None` — proofs disabled. Any non-zero rate is rejected.
|
|
70
|
+
* - `1` / `FixedExtra` — `traitBonusRate` is **absolute extra reward per
|
|
71
|
+
* `rateInterval`** added to the staker's effective rate for the claim
|
|
72
|
+
* accrual window. Sum per-trait fixed bonuses across every active staked
|
|
73
|
+
* NFT (and every bonus-bearing trait on each).
|
|
74
|
+
* - `2` / `BaseMultiplier` — `traitBonusRate` is **bonus BPS** applied to the
|
|
75
|
+
* staker's CURRENT `effective_rate` (already includes lock-tier rates).
|
|
76
|
+
* `10_000` = +100% (2x base for the window). Sum per-trait BPS bonuses the
|
|
77
|
+
* same way — the bonus is a scalar over the whole staker rate.
|
|
78
|
+
*
|
|
79
|
+
* `bonusBps` and `fixedExtra` fields are mutually exclusive; mixing both in
|
|
80
|
+
* one trait entry throws. Traits without bonuses can be omitted.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* // Pool is in BaseMultiplier mode. Each staked NFT exposes its trait list.
|
|
85
|
+
* const traits = [
|
|
86
|
+
* // NFT 1 — "Gold" head (+5%), "Laser Eyes" (+10%)
|
|
87
|
+
* { bonusBps: 500 }, { bonusBps: 1000 },
|
|
88
|
+
* // NFT 2 — "Mythic Background" (+25%)
|
|
89
|
+
* { bonusBps: 2500 },
|
|
90
|
+
* ]
|
|
91
|
+
* const rate = aggregateTraitBonusRate(traits, 2) // → 4000 (i.e. +40% for the window)
|
|
92
|
+
* const message = buildTraitProofMessage({ pool, wallet, traitBonusRate: rate, totalClaimed })
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function aggregateTraitBonusRate(traits: ReadonlyArray<{
|
|
96
|
+
bonusBps?: number | bigint;
|
|
97
|
+
fixedExtra?: number | bigint;
|
|
98
|
+
}>, traitBonusMode: 0 | 1 | 2): bigint;
|
|
61
99
|
//# sourceMappingURL=traitProof.d.ts.map
|
package/dist/traitProof.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traitProof.d.ts","sourceRoot":"","sources":["../src/traitProof.ts"],"names":[],"mappings":"AAAA
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;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,CAqCR"}
|
package/dist/traitProof.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trait-bonus proof builder for NFT-staking `claim_rewards`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `StakerAccount.totalClaimed` immediately before signing.
|
|
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.
|
|
8
7
|
*
|
|
9
8
|
* Message layout — 80 bytes, little-endian where applicable:
|
|
10
9
|
*
|
|
@@ -69,4 +68,70 @@ export function buildTraitProofMessage(params) {
|
|
|
69
68
|
* await provider.sendAndConfirm(new Transaction().add(ed25519Ix, claimIx))
|
|
70
69
|
* ```
|
|
71
70
|
*/
|
|
71
|
+
/**
|
|
72
|
+
* Mode-aware trait-bonus rate aggregator.
|
|
73
|
+
*
|
|
74
|
+
* The on-chain `claim_rewards` instruction accepts a **single** `u64`
|
|
75
|
+
* `traitBonusRate` per claim — the chain knows nothing about per-trait
|
|
76
|
+
* granularity. Aggregation across N staked NFTs (each with M traits) is the
|
|
77
|
+
* caller's responsibility, and the math depends on the pool's
|
|
78
|
+
* `rewardConfig.traitBonusMode`:
|
|
79
|
+
*
|
|
80
|
+
* - `0` / `None` — proofs disabled. Any non-zero rate is rejected.
|
|
81
|
+
* - `1` / `FixedExtra` — `traitBonusRate` is **absolute extra reward per
|
|
82
|
+
* `rateInterval`** added to the staker's effective rate for the claim
|
|
83
|
+
* accrual window. Sum per-trait fixed bonuses across every active staked
|
|
84
|
+
* NFT (and every bonus-bearing trait on each).
|
|
85
|
+
* - `2` / `BaseMultiplier` — `traitBonusRate` is **bonus BPS** applied to the
|
|
86
|
+
* staker's CURRENT `effective_rate` (already includes lock-tier rates).
|
|
87
|
+
* `10_000` = +100% (2x base for the window). Sum per-trait BPS bonuses the
|
|
88
|
+
* same way — the bonus is a scalar over the whole staker rate.
|
|
89
|
+
*
|
|
90
|
+
* `bonusBps` and `fixedExtra` fields are mutually exclusive; mixing both in
|
|
91
|
+
* one trait entry throws. Traits without bonuses can be omitted.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* // Pool is in BaseMultiplier mode. Each staked NFT exposes its trait list.
|
|
96
|
+
* const traits = [
|
|
97
|
+
* // NFT 1 — "Gold" head (+5%), "Laser Eyes" (+10%)
|
|
98
|
+
* { bonusBps: 500 }, { bonusBps: 1000 },
|
|
99
|
+
* // NFT 2 — "Mythic Background" (+25%)
|
|
100
|
+
* { bonusBps: 2500 },
|
|
101
|
+
* ]
|
|
102
|
+
* const rate = aggregateTraitBonusRate(traits, 2) // → 4000 (i.e. +40% for the window)
|
|
103
|
+
* const message = buildTraitProofMessage({ pool, wallet, traitBonusRate: rate, totalClaimed })
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export function aggregateTraitBonusRate(traits, traitBonusMode) {
|
|
107
|
+
if (traitBonusMode === 0) {
|
|
108
|
+
if (traits.some((t) => (t.bonusBps ?? 0) !== 0 || (t.fixedExtra ?? 0) !== 0)) {
|
|
109
|
+
throw new Error("aggregateTraitBonusRate: pool.traitBonusMode === None — non-zero trait bonuses are rejected on-chain.");
|
|
110
|
+
}
|
|
111
|
+
return 0n;
|
|
112
|
+
}
|
|
113
|
+
let sum = 0n;
|
|
114
|
+
for (const t of traits) {
|
|
115
|
+
const bps = BigInt(t.bonusBps ?? 0);
|
|
116
|
+
const extra = BigInt(t.fixedExtra ?? 0);
|
|
117
|
+
if (bps !== 0n && extra !== 0n) {
|
|
118
|
+
throw new Error("aggregateTraitBonusRate: a single trait must set bonusBps OR fixedExtra, not both.");
|
|
119
|
+
}
|
|
120
|
+
if (traitBonusMode === 1) {
|
|
121
|
+
// FixedExtra — sum absolute per-interval bonuses.
|
|
122
|
+
if (bps !== 0n) {
|
|
123
|
+
throw new Error("aggregateTraitBonusRate: traitBonusMode = FixedExtra expects fixedExtra (per-interval reward), not bonusBps.");
|
|
124
|
+
}
|
|
125
|
+
sum += extra;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// BaseMultiplier — sum BPS bonuses.
|
|
129
|
+
if (extra !== 0n) {
|
|
130
|
+
throw new Error("aggregateTraitBonusRate: traitBonusMode = BaseMultiplier expects bonusBps (10_000 = +100%), not fixedExtra.");
|
|
131
|
+
}
|
|
132
|
+
sum += bps;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return sum;
|
|
136
|
+
}
|
|
72
137
|
//# 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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"}
|