@bananapus/nana-sdk-core 1.5.0 → 1.6.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.
@@ -30,17 +30,19 @@ async function getProjectCreationFee(client, chainId) {
30
30
  /**
31
31
  * Build a `JBAccountingContext` for a token.
32
32
  *
33
- * The context currency is ALWAYS token-keyed: `uint32(uint160(token))`
34
- * (native token → 61166). This is distinct from a ruleset's `baseCurrency`,
35
- * which must be a standard currency id (ETH=1, USD=2) — never use a
36
- * token-keyed currency as a base currency to "skip the price feed".
33
+ * By default the context currency is token-keyed: `uint32(uint160(token))`
34
+ * (native token → 61166). Pass an explicit shared currency such as ETH=1 or
35
+ * USD=2 when the terminal should convert this token through a protocol price
36
+ * feed. A ruleset's `baseCurrency` is the denomination used to interpret its
37
+ * issuance weight.
37
38
  *
38
39
  * @param token The token address. Defaults to the native token sentinel
39
40
  * (`0x…EEEe`).
40
41
  * @param decimals The token's decimals. Defaults to 18 for the native token;
41
42
  * REQUIRED for any other token (there is no safe default).
43
+ * @param currency The context's currency id. Defaults to the token-keyed id.
42
44
  */
43
- function buildAccountingContext(token = constants_js_1.NATIVE_TOKEN, decimals) {
45
+ function buildAccountingContext(token = constants_js_1.NATIVE_TOKEN, decimals, currency = (0, currency_js_1.tokenCurrencyId)(token)) {
44
46
  const isNative = token.toLowerCase() === constants_js_1.NATIVE_TOKEN.toLowerCase();
45
47
  if (decimals === undefined && !isNative) {
46
48
  throw new Error(`decimals is required for non-native token ${token} (there is no safe default)`);
@@ -48,7 +50,7 @@ function buildAccountingContext(token = constants_js_1.NATIVE_TOKEN, decimals) {
48
50
  return {
49
51
  token,
50
52
  decimals: decimals ?? constants_js_1.NATIVE_TOKEN_DECIMALS,
51
- currency: (0, currency_js_1.tokenCurrencyId)(token),
53
+ currency,
52
54
  };
53
55
  }
54
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/v6/launch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/v6/launch.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,8 @@ type RevDeployArgs4 = Extract<RevDeployArgs, readonly [unknown, unknown, unknown
8
8
  /**
9
9
  * A revnet's full configuration: its token description (name/ticker/uri and
10
10
  * the salt that fixes the ERC-20's deterministic address), base currency
11
- * (ETH=1 or USD=2 — a standard `JBCurrencyIds` id, never a token-keyed
12
- * currency), operator, and stage configurations.
11
+ * (either a token-keyed currency or a well-known `JBCurrencyIds` id such as
12
+ * ETH=1 or USD=2), operator, and stage configurations.
13
13
  */
14
14
  export type REVConfig = RevDeployArgs4[1];
15
15
  /**
@@ -108,4 +108,191 @@ export declare function getCashOutQuote(client: PublicClient, { chainId, project
108
108
  decimals?: bigint;
109
109
  currency?: bigint;
110
110
  }): Promise<CashOutQuote>;
111
+ /**
112
+ * The default cash-out slippage tolerance, in basis points (1%).
113
+ *
114
+ * Quotes from {@link getHookAwareCashOutQuote} are exact against current state;
115
+ * this tolerance only absorbs quote-to-inclusion drift (payments, other cash
116
+ * outs, sucker snapshot syncs, or pool moves that land first).
117
+ */
118
+ export declare const DEFAULT_CASH_OUT_SLIPPAGE_BPS = 100n;
119
+ /**
120
+ * Apply a slippage tolerance to a quoted output, flooring toward zero but
121
+ * never below 1 for a positive quote (a zero minimum disables protection).
122
+ *
123
+ * @param quoted The quoted output amount.
124
+ * @param slippageBps The tolerance in basis points. Defaults to
125
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
126
+ * @returns The minimum acceptable output.
127
+ */
128
+ export declare function slippageFloor(quoted: bigint, slippageBps?: bigint): bigint;
129
+ /**
130
+ * The exact protocol fee `JBMultiTerminal` deducts from a cash-out reclaim:
131
+ * `reclaimAmount / 40` (2.5%, floor division — NOT `× 975 / 1000`, which can
132
+ * differ by 1 wei and break an exact minimum).
133
+ *
134
+ * With a non-zero cash-out tax rate the fee applies to the full reclaim. With
135
+ * a zero tax rate it applies only up to the project's fee-free surplus
136
+ * (round-trip prevention). Feeless beneficiaries pay no fee.
137
+ *
138
+ * @param args.reclaimAmount The gross reclaim amount, before the terminal fee.
139
+ * @param args.cashOutTaxRate The ruleset's cash-out tax rate.
140
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
141
+ * @param args.feeFreeSurplus The project's `feeFreeSurplusOf` counter for the
142
+ * reclaimed token. Only consulted when the tax rate is zero.
143
+ * @returns The fee amount the terminal will deduct.
144
+ */
145
+ export declare function cashOutProtocolFee({ reclaimAmount, cashOutTaxRate, beneficiaryIsFeeless, feeFreeSurplus, }: {
146
+ reclaimAmount: bigint;
147
+ cashOutTaxRate: bigint;
148
+ beneficiaryIsFeeless?: boolean;
149
+ feeFreeSurplus?: bigint;
150
+ }): bigint;
151
+ /**
152
+ * The diagnostic payload the buyback hook packs into its cash-out hook
153
+ * specification — the protocol's public preview API for the sell-side routing
154
+ * decision (returned by `previewCashOutFrom` whether or not the pool route
155
+ * wins).
156
+ */
157
+ export interface BuybackCashOutSpec {
158
+ minimumSwapAmountOut: bigint;
159
+ cashOutCountToSell: bigint;
160
+ netDirectCashOutAmount: bigint;
161
+ twapTick: number;
162
+ twapLiquidity: bigint;
163
+ poolId: Hex;
164
+ rawSwapQuote: bigint;
165
+ hasUserSpecifiedMinimumSwapAmountOut: boolean;
166
+ }
167
+ /**
168
+ * Decode the buyback hook's cash-out specification metadata (see
169
+ * {@link BuybackCashOutSpec}).
170
+ */
171
+ export declare function decodeBuybackCashOutSpec(metadata: Hex): BuybackCashOutSpec;
172
+ /**
173
+ * Build the buyback hook's `cashOut` metadata entry:
174
+ * `(uint256 minimumSwapAmountOut, bool skip)`.
175
+ *
176
+ * `minimumSwapAmountOut` is a hard floor on the net terminal-token output,
177
+ * enforced by the hook on BOTH the pool route and the direct bonding-curve
178
+ * fallback. Note an explicit non-zero minimum skips the hook's TWAP lookup:
179
+ * a minimum at or below the direct net keeps execution on the terminal path,
180
+ * a minimum above it routes through the pool. `skip: true` forces the
181
+ * terminal path outright (the floor still applies).
182
+ *
183
+ * @param args.hook The hook address the terminal consults (from the preview's
184
+ * hook specification).
185
+ * @param args.minimumSwapAmountOut The net-output floor.
186
+ * @param args.skip Force the direct terminal path. Defaults to false.
187
+ * @returns The metadata to pass as `cashOutTokensOf`'s `metadata` argument.
188
+ */
189
+ export declare function buildBuybackCashOutMetadata({ hook, minimumSwapAmountOut, skip, }: {
190
+ hook: Address;
191
+ minimumSwapAmountOut: bigint;
192
+ skip?: boolean;
193
+ }): Hex;
194
+ /** A hook specification tuple as returned by the terminal preview functions. */
195
+ export interface CashOutHookSpecification {
196
+ hook: Address;
197
+ noop: boolean;
198
+ amount: bigint;
199
+ metadata: Hex;
200
+ }
201
+ /**
202
+ * A slippage-protected cash-out route: which venue the transaction should
203
+ * expect, and the exact `minTokensReclaimed`/`metadata` pair to submit.
204
+ */
205
+ export interface CashOutRoute {
206
+ /** "treasury" = direct bonding-curve reclaim; "amm" = buyback pool sell. */
207
+ route: "treasury" | "amm";
208
+ /** The quoted net output on the chosen route. */
209
+ expectedReturn: bigint;
210
+ /** The slippage-floored minimum net output. */
211
+ minimumReturn: bigint;
212
+ /**
213
+ * The `minTokensReclaimed` to pass to `cashOutTokensOf`. Non-zero only on
214
+ * the treasury route — on the pool route the terminal itself reclaims
215
+ * nothing (the hook pays the beneficiary), so the floor lives in
216
+ * {@link CashOutRoute.metadata} instead.
217
+ */
218
+ terminalMinimum: bigint;
219
+ /** The `metadata` to pass to `cashOutTokensOf`. */
220
+ metadata: Hex;
221
+ /** The gross direct reclaim, before the terminal fee. */
222
+ treasuryGross: bigint;
223
+ /** The terminal fee on the direct reclaim. */
224
+ treasuryProtocolFee: bigint;
225
+ /** The net direct reclaim after the terminal fee. */
226
+ treasuryNet: bigint;
227
+ /** The decoded buyback diagnostics, when the hook was consulted. */
228
+ buyback: (BuybackCashOutSpec & {
229
+ hook: Address;
230
+ }) | null;
231
+ }
232
+ /**
233
+ * Interpret a hook-aware `previewCashOutFrom` result and prepare a
234
+ * slippage-protected route.
235
+ *
236
+ * On the treasury route the floor is enforced via `minTokensReclaimed`; if the
237
+ * routing flips to the pool between quote and inclusion, the transaction
238
+ * reverts rather than executing a stale path — re-quote and retry. On the pool
239
+ * route the floor is moved into the hook's `cashOut` metadata (the terminal
240
+ * minimum must be zero there), and if the floored pool quote no longer beats
241
+ * the direct net, the route falls back to the treasury path.
242
+ *
243
+ * @param args.reclaimAmount `previewCashOutFrom`'s gross reclaim amount.
244
+ * @param args.cashOutTaxRate `previewCashOutFrom`'s cash-out tax rate.
245
+ * @param args.hookSpecifications `previewCashOutFrom`'s hook specifications.
246
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
247
+ * Defaults to false (conservative: assumes the fee applies).
248
+ * @param args.feeFreeSurplus The terminal's `feeFreeSurplusOf` for the token.
249
+ * Only consulted when the tax rate is zero. Defaults to 0.
250
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
251
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
252
+ * @returns The protected route.
253
+ */
254
+ export declare function resolveCashOutRoute({ reclaimAmount, cashOutTaxRate, hookSpecifications, beneficiaryIsFeeless, feeFreeSurplus, slippageBps, }: {
255
+ reclaimAmount: bigint;
256
+ cashOutTaxRate: bigint;
257
+ hookSpecifications: readonly CashOutHookSpecification[];
258
+ beneficiaryIsFeeless?: boolean;
259
+ feeFreeSurplus?: bigint;
260
+ slippageBps?: bigint;
261
+ }): CashOutRoute;
262
+ /**
263
+ * Quote a cash out through `JBMultiTerminal.previewCashOutFrom` — the
264
+ * hook-aware simulation of the REAL cash-out path (data hook, buyback
265
+ * routing, cross-chain terms) — and prepare a slippage-protected route.
266
+ *
267
+ * Prefer this over {@link getCashOutQuote} for building transactions:
268
+ * `currentReclaimableSurplusOf` skips the data hook entirely, so its result
269
+ * can diverge from what `cashOutTokensOf` pays and is unsafe to use as a
270
+ * minimum.
271
+ *
272
+ * @param client A viem public client on the given chain.
273
+ * @param args.chainId The chain to quote on.
274
+ * @param args.projectId The project's id.
275
+ * @param args.holder The address whose tokens would be cashed out.
276
+ * @param args.cashOutCount The number of project tokens to cash out.
277
+ * @param args.tokenToReclaim The terminal token to reclaim.
278
+ * @param args.beneficiary The reclaim beneficiary. Defaults to the holder.
279
+ * @param args.terminal The terminal to quote against. Defaults to the chain's
280
+ * canonical `JBMultiTerminal`.
281
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
282
+ * Defaults to false.
283
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
284
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
285
+ * @returns The protected route (see {@link CashOutRoute}).
286
+ */
287
+ export declare function getHookAwareCashOutQuote(client: PublicClient, { chainId, projectId, holder, cashOutCount, tokenToReclaim, beneficiary, terminal, beneficiaryIsFeeless, slippageBps, }: {
288
+ chainId: JBChainId;
289
+ projectId: bigint;
290
+ holder: Address;
291
+ cashOutCount: bigint;
292
+ tokenToReclaim: Address;
293
+ beneficiary?: Address;
294
+ terminal?: Address;
295
+ beneficiaryIsFeeless?: boolean;
296
+ slippageBps?: bigint;
297
+ }): Promise<CashOutRoute>;
111
298
  //# sourceMappingURL=cashOut.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cashOut.d.ts","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AACvE,OAAO,EACL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxC;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,kBAAkB,CAAC;IAC/B,YAAY,EAAE,iBAAiB,CAAC;IAChC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;CACzE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,kBAAuB,EACvB,WAAW,EACX,QAAe,GAChB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB,GAAG,kBAAkB,CAgBrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,gBAAgB,EAChB,QAAQ,GACT,EAAE;IACD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,GAAG,CAiBN;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAc,EACd,QAA2C,GAC5C,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,YAAY,CAAC,CAYvB"}
1
+ {"version":3,"file":"cashOut.d.ts","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { encodeAbiParameters } from "viem";
1
+ import { decodeAbiParameters, encodeAbiParameters, } from "viem";
2
2
  import { jbMultiTerminalAbi, jbTerminalStoreAbi, } from "../generated/juicebox.js";
3
3
  import { applyJbDaoCashOutFee } from "../utils/fee.js";
4
4
  import { createHookMetadata, hookMetadataId } from "../utils/hook.js";
@@ -104,4 +104,248 @@ export async function getCashOutQuote(client, { chainId, projectId, cashOutCount
104
104
  reclaimAmountAfterFee: applyJbDaoCashOutFee(reclaimAmount),
105
105
  };
106
106
  }
107
+ /**
108
+ * The default cash-out slippage tolerance, in basis points (1%).
109
+ *
110
+ * Quotes from {@link getHookAwareCashOutQuote} are exact against current state;
111
+ * this tolerance only absorbs quote-to-inclusion drift (payments, other cash
112
+ * outs, sucker snapshot syncs, or pool moves that land first).
113
+ */
114
+ export const DEFAULT_CASH_OUT_SLIPPAGE_BPS = 100n;
115
+ const MAX_BPS = 10000n;
116
+ function requireBps(slippageBps) {
117
+ if (slippageBps < 0n || slippageBps >= MAX_BPS) {
118
+ throw new Error("Slippage basis points must be in [0, 10000)");
119
+ }
120
+ return slippageBps;
121
+ }
122
+ /**
123
+ * Apply a slippage tolerance to a quoted output, flooring toward zero but
124
+ * never below 1 for a positive quote (a zero minimum disables protection).
125
+ *
126
+ * @param quoted The quoted output amount.
127
+ * @param slippageBps The tolerance in basis points. Defaults to
128
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
129
+ * @returns The minimum acceptable output.
130
+ */
131
+ export function slippageFloor(quoted, slippageBps = DEFAULT_CASH_OUT_SLIPPAGE_BPS) {
132
+ requireBps(slippageBps);
133
+ if (quoted <= 0n)
134
+ return 0n;
135
+ const floor = (quoted * (MAX_BPS - slippageBps)) / MAX_BPS;
136
+ return floor > 0n ? floor : 1n;
137
+ }
138
+ /**
139
+ * The exact protocol fee `JBMultiTerminal` deducts from a cash-out reclaim:
140
+ * `reclaimAmount / 40` (2.5%, floor division — NOT `× 975 / 1000`, which can
141
+ * differ by 1 wei and break an exact minimum).
142
+ *
143
+ * With a non-zero cash-out tax rate the fee applies to the full reclaim. With
144
+ * a zero tax rate it applies only up to the project's fee-free surplus
145
+ * (round-trip prevention). Feeless beneficiaries pay no fee.
146
+ *
147
+ * @param args.reclaimAmount The gross reclaim amount, before the terminal fee.
148
+ * @param args.cashOutTaxRate The ruleset's cash-out tax rate.
149
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
150
+ * @param args.feeFreeSurplus The project's `feeFreeSurplusOf` counter for the
151
+ * reclaimed token. Only consulted when the tax rate is zero.
152
+ * @returns The fee amount the terminal will deduct.
153
+ */
154
+ export function cashOutProtocolFee({ reclaimAmount, cashOutTaxRate, beneficiaryIsFeeless = false, feeFreeSurplus = 0n, }) {
155
+ if (reclaimAmount <= 0n || beneficiaryIsFeeless)
156
+ return 0n;
157
+ if (cashOutTaxRate > 0n)
158
+ return reclaimAmount / 40n;
159
+ const feeable = reclaimAmount < feeFreeSurplus ? reclaimAmount : feeFreeSurplus;
160
+ return feeable / 40n;
161
+ }
162
+ const BUYBACK_CASH_OUT_SPEC_ABI = [
163
+ { name: "minimumSwapAmountOut", type: "uint256" },
164
+ { name: "cashOutCountToSell", type: "uint256" },
165
+ { name: "netDirectCashOutAmount", type: "uint256" },
166
+ { name: "twapTick", type: "int24" },
167
+ { name: "twapLiquidity", type: "uint128" },
168
+ { name: "poolId", type: "bytes32" },
169
+ { name: "rawSwapQuote", type: "uint256" },
170
+ { name: "hasUserSpecifiedMinimumSwapAmountOut", type: "bool" },
171
+ ];
172
+ /**
173
+ * Decode the buyback hook's cash-out specification metadata (see
174
+ * {@link BuybackCashOutSpec}).
175
+ */
176
+ export function decodeBuybackCashOutSpec(metadata) {
177
+ const [minimumSwapAmountOut, cashOutCountToSell, netDirectCashOutAmount, twapTick, twapLiquidity, poolId, rawSwapQuote, hasUserSpecifiedMinimumSwapAmountOut,] = decodeAbiParameters(BUYBACK_CASH_OUT_SPEC_ABI, metadata);
178
+ return {
179
+ minimumSwapAmountOut,
180
+ cashOutCountToSell,
181
+ netDirectCashOutAmount,
182
+ twapTick,
183
+ twapLiquidity,
184
+ poolId,
185
+ rawSwapQuote,
186
+ hasUserSpecifiedMinimumSwapAmountOut,
187
+ };
188
+ }
189
+ /**
190
+ * Build the buyback hook's `cashOut` metadata entry:
191
+ * `(uint256 minimumSwapAmountOut, bool skip)`.
192
+ *
193
+ * `minimumSwapAmountOut` is a hard floor on the net terminal-token output,
194
+ * enforced by the hook on BOTH the pool route and the direct bonding-curve
195
+ * fallback. Note an explicit non-zero minimum skips the hook's TWAP lookup:
196
+ * a minimum at or below the direct net keeps execution on the terminal path,
197
+ * a minimum above it routes through the pool. `skip: true` forces the
198
+ * terminal path outright (the floor still applies).
199
+ *
200
+ * @param args.hook The hook address the terminal consults (from the preview's
201
+ * hook specification).
202
+ * @param args.minimumSwapAmountOut The net-output floor.
203
+ * @param args.skip Force the direct terminal path. Defaults to false.
204
+ * @returns The metadata to pass as `cashOutTokensOf`'s `metadata` argument.
205
+ */
206
+ export function buildBuybackCashOutMetadata({ hook, minimumSwapAmountOut, skip = false, }) {
207
+ if (minimumSwapAmountOut < 0n) {
208
+ throw new Error("Cash out minimum cannot be negative");
209
+ }
210
+ const payload = encodeAbiParameters([{ type: "uint256" }, { type: "bool" }], [minimumSwapAmountOut, skip]);
211
+ return createHookMetadata([hookMetadataId(hook, "cashOut")], [payload]);
212
+ }
213
+ /**
214
+ * Interpret a hook-aware `previewCashOutFrom` result and prepare a
215
+ * slippage-protected route.
216
+ *
217
+ * On the treasury route the floor is enforced via `minTokensReclaimed`; if the
218
+ * routing flips to the pool between quote and inclusion, the transaction
219
+ * reverts rather than executing a stale path — re-quote and retry. On the pool
220
+ * route the floor is moved into the hook's `cashOut` metadata (the terminal
221
+ * minimum must be zero there), and if the floored pool quote no longer beats
222
+ * the direct net, the route falls back to the treasury path.
223
+ *
224
+ * @param args.reclaimAmount `previewCashOutFrom`'s gross reclaim amount.
225
+ * @param args.cashOutTaxRate `previewCashOutFrom`'s cash-out tax rate.
226
+ * @param args.hookSpecifications `previewCashOutFrom`'s hook specifications.
227
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
228
+ * Defaults to false (conservative: assumes the fee applies).
229
+ * @param args.feeFreeSurplus The terminal's `feeFreeSurplusOf` for the token.
230
+ * Only consulted when the tax rate is zero. Defaults to 0.
231
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
232
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
233
+ * @returns The protected route.
234
+ */
235
+ export function resolveCashOutRoute({ reclaimAmount, cashOutTaxRate, hookSpecifications, beneficiaryIsFeeless = false, feeFreeSurplus = 0n, slippageBps = DEFAULT_CASH_OUT_SLIPPAGE_BPS, }) {
236
+ requireBps(slippageBps);
237
+ const treasuryProtocolFee = cashOutProtocolFee({
238
+ reclaimAmount,
239
+ cashOutTaxRate,
240
+ beneficiaryIsFeeless,
241
+ feeFreeSurplus,
242
+ });
243
+ const treasuryNet = reclaimAmount - treasuryProtocolFee;
244
+ const specification = hookSpecifications.find((spec) => spec.metadata !== "0x") ?? null;
245
+ const buyback = specification
246
+ ? {
247
+ hook: specification.hook,
248
+ ...decodeBuybackCashOutSpec(specification.metadata),
249
+ }
250
+ : null;
251
+ const treasuryRoute = {
252
+ route: "treasury",
253
+ expectedReturn: treasuryNet,
254
+ minimumReturn: slippageFloor(treasuryNet, slippageBps),
255
+ terminalMinimum: slippageFloor(treasuryNet, slippageBps),
256
+ metadata: "0x",
257
+ treasuryGross: reclaimAmount,
258
+ treasuryProtocolFee,
259
+ treasuryNet,
260
+ buyback,
261
+ };
262
+ if (!specification || specification.noop || !buyback)
263
+ return treasuryRoute;
264
+ // The pool route won the preview. Re-previews with an explicit metadata
265
+ // minimum report that already-protected floor and no raw quote — preserve
266
+ // it instead of discounting a second time.
267
+ const quote = buyback.rawSwapQuote > 0n
268
+ ? buyback.rawSwapQuote
269
+ : buyback.minimumSwapAmountOut;
270
+ const minimumReturn = buyback.rawSwapQuote > 0n && !buyback.hasUserSpecifiedMinimumSwapAmountOut
271
+ ? slippageFloor(quote, slippageBps)
272
+ : buyback.minimumSwapAmountOut;
273
+ // An explicit metadata minimum at or below the direct net routes execution
274
+ // back to the terminal path anyway; take the deterministic treasury route.
275
+ if (quote <= 0n || minimumReturn <= buyback.netDirectCashOutAmount) {
276
+ return treasuryRoute;
277
+ }
278
+ return {
279
+ route: "amm",
280
+ expectedReturn: quote,
281
+ minimumReturn,
282
+ terminalMinimum: 0n,
283
+ metadata: buildBuybackCashOutMetadata({
284
+ hook: specification.hook,
285
+ minimumSwapAmountOut: minimumReturn,
286
+ }),
287
+ treasuryGross: reclaimAmount,
288
+ treasuryProtocolFee,
289
+ treasuryNet,
290
+ buyback,
291
+ };
292
+ }
293
+ /**
294
+ * Quote a cash out through `JBMultiTerminal.previewCashOutFrom` — the
295
+ * hook-aware simulation of the REAL cash-out path (data hook, buyback
296
+ * routing, cross-chain terms) — and prepare a slippage-protected route.
297
+ *
298
+ * Prefer this over {@link getCashOutQuote} for building transactions:
299
+ * `currentReclaimableSurplusOf` skips the data hook entirely, so its result
300
+ * can diverge from what `cashOutTokensOf` pays and is unsafe to use as a
301
+ * minimum.
302
+ *
303
+ * @param client A viem public client on the given chain.
304
+ * @param args.chainId The chain to quote on.
305
+ * @param args.projectId The project's id.
306
+ * @param args.holder The address whose tokens would be cashed out.
307
+ * @param args.cashOutCount The number of project tokens to cash out.
308
+ * @param args.tokenToReclaim The terminal token to reclaim.
309
+ * @param args.beneficiary The reclaim beneficiary. Defaults to the holder.
310
+ * @param args.terminal The terminal to quote against. Defaults to the chain's
311
+ * canonical `JBMultiTerminal`.
312
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
313
+ * Defaults to false.
314
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
315
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
316
+ * @returns The protected route (see {@link CashOutRoute}).
317
+ */
318
+ export async function getHookAwareCashOutQuote(client, { chainId, projectId, holder, cashOutCount, tokenToReclaim, beneficiary, terminal, beneficiaryIsFeeless = false, slippageBps = DEFAULT_CASH_OUT_SLIPPAGE_BPS, }) {
319
+ const terminalAddress = terminal ?? v6Address("JBMultiTerminal", chainId);
320
+ const [, reclaimAmount, cashOutTaxRate, hookSpecifications] = await client.readContract({
321
+ address: terminalAddress,
322
+ abi: jbMultiTerminalAbi,
323
+ functionName: "previewCashOutFrom",
324
+ args: [
325
+ holder,
326
+ projectId,
327
+ cashOutCount,
328
+ tokenToReclaim,
329
+ beneficiary ?? holder,
330
+ "0x",
331
+ ],
332
+ });
333
+ // The fee-free surplus counter only matters on zero-tax rulesets.
334
+ const feeFreeSurplus = cashOutTaxRate === 0n
335
+ ? await client.readContract({
336
+ address: terminalAddress,
337
+ abi: jbMultiTerminalAbi,
338
+ functionName: "feeFreeSurplusOf",
339
+ args: [projectId, tokenToReclaim],
340
+ })
341
+ : 0n;
342
+ return resolveCashOutRoute({
343
+ reclaimAmount,
344
+ cashOutTaxRate,
345
+ hookSpecifications,
346
+ beneficiaryIsFeeless,
347
+ feeFreeSurplus,
348
+ slippageBps,
349
+ });
350
+ }
107
351
  //# sourceMappingURL=cashOut.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,mBAAmB,EAAE,MAAM,MAAM,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAcvC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,kBAAkB,GAAG,EAAE,EACvB,WAAW,EACX,QAAQ,GAAG,IAAI,GAWhB;IACC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,QAAQ;QACjB,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE;YACJ,MAAM;YACN,SAAS;YACT,YAAY;YACZ,cAAc;YACd,kBAAkB;YAClB,WAAW;YACX,QAAQ;SACT;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,gBAAgB,EAChB,QAAQ,GAIT;IACC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzE,OAAO,kBAAkB,CACvB,CAAC,cAAc,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAC7C,CAAC,OAAO,CAAC,CACH,CAAC;AACX,CAAC;AAmBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAO5C;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC9C,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,6BAA6B;QAC3C,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC5D,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,qBAAqB,EAAE,oBAAoB,CAAC,aAAa,CAAC;KAC3D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,10 @@ import { Address } from "viem";
2
2
  /**
3
3
  * The v6 base currency id for ETH (JBCurrencyIds.ETH).
4
4
  *
5
- * Base currencies are the small standard ids (ETH = 1, USD = 2) used to denominate a
6
- * ruleset's `baseCurrency` and fund access limits. They are NOT the same as
7
- * accounting-context currencies, which are derived from a token's address via
8
- * {@link tokenCurrencyId}. Never use an accounting-context currency (e.g. 61166 for the
9
- * native token) as a ruleset `baseCurrency` to "skip the price feed" — base currency
10
- * must be 1 or 2.
5
+ * ETH = 1 and USD = 2 are well-known shared denominations used by protocol price
6
+ * feeds. A ruleset's `baseCurrency` may instead be a token-keyed currency from
7
+ * {@link tokenCurrencyId} when its issuance weight is denominated directly in that
8
+ * token.
11
9
  *
12
10
  * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
13
11
  */
@@ -32,9 +30,11 @@ export declare const NATIVE_TOKEN_CURRENCY_ID = 61166;
32
30
  * The v6 accounting-context currency id for a token: `uint32(uint160(tokenAddress))`,
33
31
  * i.e. the lowest 4 bytes of the token's address.
34
32
  *
35
- * Use this for terminal accounting contexts (`{ token, decimals, currency }`) — NOT for
36
- * a ruleset's `baseCurrency`, which must be a base currency id
37
- * ({@link BASE_CURRENCY_ETH} or {@link BASE_CURRENCY_USD}).
33
+ * Use this for terminal accounting contexts (`{ token, decimals, currency }`). It may
34
+ * also be used as a ruleset's `baseCurrency` when issuance is denominated directly in
35
+ * that token. Use a shared denomination such as {@link BASE_CURRENCY_ETH} or
36
+ * {@link BASE_CURRENCY_USD} when multiple accepted tokens must be converted through
37
+ * price feeds.
38
38
  *
39
39
  * @param token The token address to derive a currency id from.
40
40
  * @returns The token's accounting-context currency id (fits in a uint32).
@@ -1 +1 @@
1
- {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
1
+ {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
@@ -1,12 +1,10 @@
1
1
  /**
2
2
  * The v6 base currency id for ETH (JBCurrencyIds.ETH).
3
3
  *
4
- * Base currencies are the small standard ids (ETH = 1, USD = 2) used to denominate a
5
- * ruleset's `baseCurrency` and fund access limits. They are NOT the same as
6
- * accounting-context currencies, which are derived from a token's address via
7
- * {@link tokenCurrencyId}. Never use an accounting-context currency (e.g. 61166 for the
8
- * native token) as a ruleset `baseCurrency` to "skip the price feed" — base currency
9
- * must be 1 or 2.
4
+ * ETH = 1 and USD = 2 are well-known shared denominations used by protocol price
5
+ * feeds. A ruleset's `baseCurrency` may instead be a token-keyed currency from
6
+ * {@link tokenCurrencyId} when its issuance weight is denominated directly in that
7
+ * token.
10
8
  *
11
9
  * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
12
10
  */
@@ -31,9 +29,11 @@ export const NATIVE_TOKEN_CURRENCY_ID = 61166;
31
29
  * The v6 accounting-context currency id for a token: `uint32(uint160(tokenAddress))`,
32
30
  * i.e. the lowest 4 bytes of the token's address.
33
31
  *
34
- * Use this for terminal accounting contexts (`{ token, decimals, currency }`) — NOT for
35
- * a ruleset's `baseCurrency`, which must be a base currency id
36
- * ({@link BASE_CURRENCY_ETH} or {@link BASE_CURRENCY_USD}).
32
+ * Use this for terminal accounting contexts (`{ token, decimals, currency }`). It may
33
+ * also be used as a ruleset's `baseCurrency` when issuance is denominated directly in
34
+ * that token. Use a shared denomination such as {@link BASE_CURRENCY_ETH} or
35
+ * {@link BASE_CURRENCY_USD} when multiple accepted tokens must be converted through
36
+ * price feeds.
37
37
  *
38
38
  * @param token The token address to derive a currency id from.
39
39
  * @returns The token's accounting-context currency id (fits in a uint32).
@@ -1 +1 @@
1
- {"version":3,"file":"currency.js","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"currency.js","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC;AAC7C,CAAC"}
@@ -25,17 +25,19 @@ export declare function getProjectCreationFee(client: PublicClient, chainId: JBC
25
25
  /**
26
26
  * Build a `JBAccountingContext` for a token.
27
27
  *
28
- * The context currency is ALWAYS token-keyed: `uint32(uint160(token))`
29
- * (native token → 61166). This is distinct from a ruleset's `baseCurrency`,
30
- * which must be a standard currency id (ETH=1, USD=2) — never use a
31
- * token-keyed currency as a base currency to "skip the price feed".
28
+ * By default the context currency is token-keyed: `uint32(uint160(token))`
29
+ * (native token → 61166). Pass an explicit shared currency such as ETH=1 or
30
+ * USD=2 when the terminal should convert this token through a protocol price
31
+ * feed. A ruleset's `baseCurrency` is the denomination used to interpret its
32
+ * issuance weight.
32
33
  *
33
34
  * @param token The token address. Defaults to the native token sentinel
34
35
  * (`0x…EEEe`).
35
36
  * @param decimals The token's decimals. Defaults to 18 for the native token;
36
37
  * REQUIRED for any other token (there is no safe default).
38
+ * @param currency The context's currency id. Defaults to the token-keyed id.
37
39
  */
38
- export declare function buildAccountingContext(token?: Address, decimals?: number): JBAccountingContext;
40
+ export declare function buildAccountingContext(token?: Address, decimals?: number, currency?: number): JBAccountingContext;
39
41
  /**
40
42
  * Build the standard terminal configurations for a launch:
41
43
  *