@bananapus/nana-sdk-core 1.5.1 → 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.
@@ -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,8 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CASH_OUT_SLIPPAGE_BPS = void 0;
3
4
  exports.buildCashOutTx = buildCashOutTx;
4
5
  exports.build721CashOutMetadata = build721CashOutMetadata;
5
6
  exports.getCashOutQuote = getCashOutQuote;
7
+ exports.slippageFloor = slippageFloor;
8
+ exports.cashOutProtocolFee = cashOutProtocolFee;
9
+ exports.decodeBuybackCashOutSpec = decodeBuybackCashOutSpec;
10
+ exports.buildBuybackCashOutMetadata = buildBuybackCashOutMetadata;
11
+ exports.resolveCashOutRoute = resolveCashOutRoute;
12
+ exports.getHookAwareCashOutQuote = getHookAwareCashOutQuote;
6
13
  const viem_1 = require("viem");
7
14
  const juicebox_js_1 = require("../generated/juicebox.js");
8
15
  const fee_js_1 = require("../utils/fee.js");
@@ -109,4 +116,248 @@ async function getCashOutQuote(client, { chainId, projectId, cashOutCount, decim
109
116
  reclaimAmountAfterFee: (0, fee_js_1.applyJbDaoCashOutFee)(reclaimAmount),
110
117
  };
111
118
  }
119
+ /**
120
+ * The default cash-out slippage tolerance, in basis points (1%).
121
+ *
122
+ * Quotes from {@link getHookAwareCashOutQuote} are exact against current state;
123
+ * this tolerance only absorbs quote-to-inclusion drift (payments, other cash
124
+ * outs, sucker snapshot syncs, or pool moves that land first).
125
+ */
126
+ exports.DEFAULT_CASH_OUT_SLIPPAGE_BPS = 100n;
127
+ const MAX_BPS = 10000n;
128
+ function requireBps(slippageBps) {
129
+ if (slippageBps < 0n || slippageBps >= MAX_BPS) {
130
+ throw new Error("Slippage basis points must be in [0, 10000)");
131
+ }
132
+ return slippageBps;
133
+ }
134
+ /**
135
+ * Apply a slippage tolerance to a quoted output, flooring toward zero but
136
+ * never below 1 for a positive quote (a zero minimum disables protection).
137
+ *
138
+ * @param quoted The quoted output amount.
139
+ * @param slippageBps The tolerance in basis points. Defaults to
140
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
141
+ * @returns The minimum acceptable output.
142
+ */
143
+ function slippageFloor(quoted, slippageBps = exports.DEFAULT_CASH_OUT_SLIPPAGE_BPS) {
144
+ requireBps(slippageBps);
145
+ if (quoted <= 0n)
146
+ return 0n;
147
+ const floor = (quoted * (MAX_BPS - slippageBps)) / MAX_BPS;
148
+ return floor > 0n ? floor : 1n;
149
+ }
150
+ /**
151
+ * The exact protocol fee `JBMultiTerminal` deducts from a cash-out reclaim:
152
+ * `reclaimAmount / 40` (2.5%, floor division — NOT `× 975 / 1000`, which can
153
+ * differ by 1 wei and break an exact minimum).
154
+ *
155
+ * With a non-zero cash-out tax rate the fee applies to the full reclaim. With
156
+ * a zero tax rate it applies only up to the project's fee-free surplus
157
+ * (round-trip prevention). Feeless beneficiaries pay no fee.
158
+ *
159
+ * @param args.reclaimAmount The gross reclaim amount, before the terminal fee.
160
+ * @param args.cashOutTaxRate The ruleset's cash-out tax rate.
161
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
162
+ * @param args.feeFreeSurplus The project's `feeFreeSurplusOf` counter for the
163
+ * reclaimed token. Only consulted when the tax rate is zero.
164
+ * @returns The fee amount the terminal will deduct.
165
+ */
166
+ function cashOutProtocolFee({ reclaimAmount, cashOutTaxRate, beneficiaryIsFeeless = false, feeFreeSurplus = 0n, }) {
167
+ if (reclaimAmount <= 0n || beneficiaryIsFeeless)
168
+ return 0n;
169
+ if (cashOutTaxRate > 0n)
170
+ return reclaimAmount / 40n;
171
+ const feeable = reclaimAmount < feeFreeSurplus ? reclaimAmount : feeFreeSurplus;
172
+ return feeable / 40n;
173
+ }
174
+ const BUYBACK_CASH_OUT_SPEC_ABI = [
175
+ { name: "minimumSwapAmountOut", type: "uint256" },
176
+ { name: "cashOutCountToSell", type: "uint256" },
177
+ { name: "netDirectCashOutAmount", type: "uint256" },
178
+ { name: "twapTick", type: "int24" },
179
+ { name: "twapLiquidity", type: "uint128" },
180
+ { name: "poolId", type: "bytes32" },
181
+ { name: "rawSwapQuote", type: "uint256" },
182
+ { name: "hasUserSpecifiedMinimumSwapAmountOut", type: "bool" },
183
+ ];
184
+ /**
185
+ * Decode the buyback hook's cash-out specification metadata (see
186
+ * {@link BuybackCashOutSpec}).
187
+ */
188
+ function decodeBuybackCashOutSpec(metadata) {
189
+ const [minimumSwapAmountOut, cashOutCountToSell, netDirectCashOutAmount, twapTick, twapLiquidity, poolId, rawSwapQuote, hasUserSpecifiedMinimumSwapAmountOut,] = (0, viem_1.decodeAbiParameters)(BUYBACK_CASH_OUT_SPEC_ABI, metadata);
190
+ return {
191
+ minimumSwapAmountOut,
192
+ cashOutCountToSell,
193
+ netDirectCashOutAmount,
194
+ twapTick,
195
+ twapLiquidity,
196
+ poolId,
197
+ rawSwapQuote,
198
+ hasUserSpecifiedMinimumSwapAmountOut,
199
+ };
200
+ }
201
+ /**
202
+ * Build the buyback hook's `cashOut` metadata entry:
203
+ * `(uint256 minimumSwapAmountOut, bool skip)`.
204
+ *
205
+ * `minimumSwapAmountOut` is a hard floor on the net terminal-token output,
206
+ * enforced by the hook on BOTH the pool route and the direct bonding-curve
207
+ * fallback. Note an explicit non-zero minimum skips the hook's TWAP lookup:
208
+ * a minimum at or below the direct net keeps execution on the terminal path,
209
+ * a minimum above it routes through the pool. `skip: true` forces the
210
+ * terminal path outright (the floor still applies).
211
+ *
212
+ * @param args.hook The hook address the terminal consults (from the preview's
213
+ * hook specification).
214
+ * @param args.minimumSwapAmountOut The net-output floor.
215
+ * @param args.skip Force the direct terminal path. Defaults to false.
216
+ * @returns The metadata to pass as `cashOutTokensOf`'s `metadata` argument.
217
+ */
218
+ function buildBuybackCashOutMetadata({ hook, minimumSwapAmountOut, skip = false, }) {
219
+ if (minimumSwapAmountOut < 0n) {
220
+ throw new Error("Cash out minimum cannot be negative");
221
+ }
222
+ const payload = (0, viem_1.encodeAbiParameters)([{ type: "uint256" }, { type: "bool" }], [minimumSwapAmountOut, skip]);
223
+ return (0, hook_js_1.createHookMetadata)([(0, hook_js_1.hookMetadataId)(hook, "cashOut")], [payload]);
224
+ }
225
+ /**
226
+ * Interpret a hook-aware `previewCashOutFrom` result and prepare a
227
+ * slippage-protected route.
228
+ *
229
+ * On the treasury route the floor is enforced via `minTokensReclaimed`; if the
230
+ * routing flips to the pool between quote and inclusion, the transaction
231
+ * reverts rather than executing a stale path — re-quote and retry. On the pool
232
+ * route the floor is moved into the hook's `cashOut` metadata (the terminal
233
+ * minimum must be zero there), and if the floored pool quote no longer beats
234
+ * the direct net, the route falls back to the treasury path.
235
+ *
236
+ * @param args.reclaimAmount `previewCashOutFrom`'s gross reclaim amount.
237
+ * @param args.cashOutTaxRate `previewCashOutFrom`'s cash-out tax rate.
238
+ * @param args.hookSpecifications `previewCashOutFrom`'s hook specifications.
239
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
240
+ * Defaults to false (conservative: assumes the fee applies).
241
+ * @param args.feeFreeSurplus The terminal's `feeFreeSurplusOf` for the token.
242
+ * Only consulted when the tax rate is zero. Defaults to 0.
243
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
244
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
245
+ * @returns The protected route.
246
+ */
247
+ function resolveCashOutRoute({ reclaimAmount, cashOutTaxRate, hookSpecifications, beneficiaryIsFeeless = false, feeFreeSurplus = 0n, slippageBps = exports.DEFAULT_CASH_OUT_SLIPPAGE_BPS, }) {
248
+ requireBps(slippageBps);
249
+ const treasuryProtocolFee = cashOutProtocolFee({
250
+ reclaimAmount,
251
+ cashOutTaxRate,
252
+ beneficiaryIsFeeless,
253
+ feeFreeSurplus,
254
+ });
255
+ const treasuryNet = reclaimAmount - treasuryProtocolFee;
256
+ const specification = hookSpecifications.find((spec) => spec.metadata !== "0x") ?? null;
257
+ const buyback = specification
258
+ ? {
259
+ hook: specification.hook,
260
+ ...decodeBuybackCashOutSpec(specification.metadata),
261
+ }
262
+ : null;
263
+ const treasuryRoute = {
264
+ route: "treasury",
265
+ expectedReturn: treasuryNet,
266
+ minimumReturn: slippageFloor(treasuryNet, slippageBps),
267
+ terminalMinimum: slippageFloor(treasuryNet, slippageBps),
268
+ metadata: "0x",
269
+ treasuryGross: reclaimAmount,
270
+ treasuryProtocolFee,
271
+ treasuryNet,
272
+ buyback,
273
+ };
274
+ if (!specification || specification.noop || !buyback)
275
+ return treasuryRoute;
276
+ // The pool route won the preview. Re-previews with an explicit metadata
277
+ // minimum report that already-protected floor and no raw quote — preserve
278
+ // it instead of discounting a second time.
279
+ const quote = buyback.rawSwapQuote > 0n
280
+ ? buyback.rawSwapQuote
281
+ : buyback.minimumSwapAmountOut;
282
+ const minimumReturn = buyback.rawSwapQuote > 0n && !buyback.hasUserSpecifiedMinimumSwapAmountOut
283
+ ? slippageFloor(quote, slippageBps)
284
+ : buyback.minimumSwapAmountOut;
285
+ // An explicit metadata minimum at or below the direct net routes execution
286
+ // back to the terminal path anyway; take the deterministic treasury route.
287
+ if (quote <= 0n || minimumReturn <= buyback.netDirectCashOutAmount) {
288
+ return treasuryRoute;
289
+ }
290
+ return {
291
+ route: "amm",
292
+ expectedReturn: quote,
293
+ minimumReturn,
294
+ terminalMinimum: 0n,
295
+ metadata: buildBuybackCashOutMetadata({
296
+ hook: specification.hook,
297
+ minimumSwapAmountOut: minimumReturn,
298
+ }),
299
+ treasuryGross: reclaimAmount,
300
+ treasuryProtocolFee,
301
+ treasuryNet,
302
+ buyback,
303
+ };
304
+ }
305
+ /**
306
+ * Quote a cash out through `JBMultiTerminal.previewCashOutFrom` — the
307
+ * hook-aware simulation of the REAL cash-out path (data hook, buyback
308
+ * routing, cross-chain terms) — and prepare a slippage-protected route.
309
+ *
310
+ * Prefer this over {@link getCashOutQuote} for building transactions:
311
+ * `currentReclaimableSurplusOf` skips the data hook entirely, so its result
312
+ * can diverge from what `cashOutTokensOf` pays and is unsafe to use as a
313
+ * minimum.
314
+ *
315
+ * @param client A viem public client on the given chain.
316
+ * @param args.chainId The chain to quote on.
317
+ * @param args.projectId The project's id.
318
+ * @param args.holder The address whose tokens would be cashed out.
319
+ * @param args.cashOutCount The number of project tokens to cash out.
320
+ * @param args.tokenToReclaim The terminal token to reclaim.
321
+ * @param args.beneficiary The reclaim beneficiary. Defaults to the holder.
322
+ * @param args.terminal The terminal to quote against. Defaults to the chain's
323
+ * canonical `JBMultiTerminal`.
324
+ * @param args.beneficiaryIsFeeless Whether the beneficiary is feeless.
325
+ * Defaults to false.
326
+ * @param args.slippageBps Tolerance for quote-to-inclusion drift. Defaults to
327
+ * {@link DEFAULT_CASH_OUT_SLIPPAGE_BPS}.
328
+ * @returns The protected route (see {@link CashOutRoute}).
329
+ */
330
+ async function getHookAwareCashOutQuote(client, { chainId, projectId, holder, cashOutCount, tokenToReclaim, beneficiary, terminal, beneficiaryIsFeeless = false, slippageBps = exports.DEFAULT_CASH_OUT_SLIPPAGE_BPS, }) {
331
+ const terminalAddress = terminal ?? (0, types_js_1.v6Address)("JBMultiTerminal", chainId);
332
+ const [, reclaimAmount, cashOutTaxRate, hookSpecifications] = await client.readContract({
333
+ address: terminalAddress,
334
+ abi: juicebox_js_1.jbMultiTerminalAbi,
335
+ functionName: "previewCashOutFrom",
336
+ args: [
337
+ holder,
338
+ projectId,
339
+ cashOutCount,
340
+ tokenToReclaim,
341
+ beneficiary ?? holder,
342
+ "0x",
343
+ ],
344
+ });
345
+ // The fee-free surplus counter only matters on zero-tax rulesets.
346
+ const feeFreeSurplus = cashOutTaxRate === 0n
347
+ ? await client.readContract({
348
+ address: terminalAddress,
349
+ abi: juicebox_js_1.jbMultiTerminalAbi,
350
+ functionName: "feeFreeSurplusOf",
351
+ args: [projectId, tokenToReclaim],
352
+ })
353
+ : 0n;
354
+ return resolveCashOutRoute({
355
+ reclaimAmount,
356
+ cashOutTaxRate,
357
+ hookSpecifications,
358
+ beneficiaryIsFeeless,
359
+ feeFreeSurplus,
360
+ slippageBps,
361
+ });
362
+ }
112
363
  //# sourceMappingURL=cashOut.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":";;AAwCA,wCAoCC;AAqBD,0DAuBC;AAyCD,0CA2BC;AA5LD,+BAAuE;AACvE,0DAGkC;AAElC,4CAAuD;AACvD,8CAAsE;AACtE,+CAAyD;AACzD,yCAAuC;AAcvC;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,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,gCAAkB;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,SAAgB,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,IAAA,0BAAmB,EAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzE,OAAO,IAAA,4BAAkB,EACvB,CAAC,IAAA,wBAAc,EAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAC7C,CAAC,OAAO,CAAC,CACH,CAAC;AACX,CAAC;AAmBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,MAAM,CAAC,sCAAwB,CAAC,GAO5C;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC9C,OAAO,EAAE,IAAA,oBAAS,EAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,GAAG,EAAE,gCAAkB;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,IAAA,6BAAoB,EAAC,aAAa,CAAC;KAC3D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"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"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bananapus/nana-sdk-core",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",