@bananapus/nana-sdk-core 1.9.3 → 1.10.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.
Files changed (49) hide show
  1. package/dist/cjs/v6/cashOut.d.ts +109 -2
  2. package/dist/cjs/v6/cashOut.d.ts.map +1 -1
  3. package/dist/cjs/v6/cashOut.js +324 -49
  4. package/dist/cjs/v6/cashOut.js.map +1 -1
  5. package/dist/cjs/v6/directPay.d.ts +69 -0
  6. package/dist/cjs/v6/directPay.d.ts.map +1 -0
  7. package/dist/cjs/v6/directPay.js +391 -0
  8. package/dist/cjs/v6/directPay.js.map +1 -0
  9. package/dist/cjs/v6/index.d.ts +2 -0
  10. package/dist/cjs/v6/index.d.ts.map +1 -1
  11. package/dist/cjs/v6/index.js +2 -0
  12. package/dist/cjs/v6/index.js.map +1 -1
  13. package/dist/cjs/v6/loans.d.ts +25 -0
  14. package/dist/cjs/v6/loans.d.ts.map +1 -1
  15. package/dist/cjs/v6/loans.js +42 -1
  16. package/dist/cjs/v6/loans.js.map +1 -1
  17. package/dist/cjs/v6/permit2.d.ts +169 -0
  18. package/dist/cjs/v6/permit2.d.ts.map +1 -0
  19. package/dist/cjs/v6/permit2.js +145 -0
  20. package/dist/cjs/v6/permit2.js.map +1 -0
  21. package/dist/cjs/v6/uniswapV4.d.ts +27 -0
  22. package/dist/cjs/v6/uniswapV4.d.ts.map +1 -1
  23. package/dist/cjs/v6/uniswapV4.js +66 -0
  24. package/dist/cjs/v6/uniswapV4.js.map +1 -1
  25. package/dist/esm/v6/cashOut.d.ts +109 -2
  26. package/dist/esm/v6/cashOut.d.ts.map +1 -1
  27. package/dist/esm/v6/cashOut.js +316 -48
  28. package/dist/esm/v6/cashOut.js.map +1 -1
  29. package/dist/esm/v6/directPay.d.ts +69 -0
  30. package/dist/esm/v6/directPay.d.ts.map +1 -0
  31. package/dist/esm/v6/directPay.js +385 -0
  32. package/dist/esm/v6/directPay.js.map +1 -0
  33. package/dist/esm/v6/index.d.ts +2 -0
  34. package/dist/esm/v6/index.d.ts.map +1 -1
  35. package/dist/esm/v6/index.js +2 -0
  36. package/dist/esm/v6/index.js.map +1 -1
  37. package/dist/esm/v6/loans.d.ts +25 -0
  38. package/dist/esm/v6/loans.d.ts.map +1 -1
  39. package/dist/esm/v6/loans.js +39 -0
  40. package/dist/esm/v6/loans.js.map +1 -1
  41. package/dist/esm/v6/permit2.d.ts +169 -0
  42. package/dist/esm/v6/permit2.d.ts.map +1 -0
  43. package/dist/esm/v6/permit2.js +136 -0
  44. package/dist/esm/v6/permit2.js.map +1 -0
  45. package/dist/esm/v6/uniswapV4.d.ts +27 -0
  46. package/dist/esm/v6/uniswapV4.d.ts.map +1 -1
  47. package/dist/esm/v6/uniswapV4.js +61 -0
  48. package/dist/esm/v6/uniswapV4.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,69 @@
1
+ import type { Address, Hex, PublicClient } from "viem";
2
+ import type { JBChainId } from "../types.js";
3
+ import { type PayPreview, type PaySettlement } from "./pay.js";
4
+ import type { Permit2SignatureAuthorization } from "./permit2.js";
5
+ import { type UniswapV4PoolKey } from "./uniswapV4.js";
6
+ export interface NativeSwapConfig {
7
+ wrappedNative: Address;
8
+ bridgeToken: Address;
9
+ v3Quoter: Address;
10
+ }
11
+ /** Canonical WETH/USDC V3 bridge used by direct-pay swaps on all v6 mainnets. */
12
+ export declare const NATIVE_SWAP_BY_CHAIN: Readonly<Partial<Record<JBChainId, NativeSwapConfig>>>;
13
+ export type DirectPayInputRoute = {
14
+ kind: "single-v4";
15
+ } | {
16
+ kind: "native-v3-v4";
17
+ wrappedNative: Address;
18
+ bridgeToken: Address;
19
+ bridgeTokenSymbol: "USDC";
20
+ bridgeTokenDecimals: 6;
21
+ v3Fee: number;
22
+ quotedBridgeAmount: bigint;
23
+ } | {
24
+ kind: "erc20-v3-native-v4";
25
+ inputToken: Address;
26
+ wrappedNative: Address;
27
+ bridgeTokenSymbol: "ETH";
28
+ bridgeTokenDecimals: 18;
29
+ v3Fee: number;
30
+ quotedBridgeAmount: bigint;
31
+ };
32
+ export interface DirectPaySwapQuote {
33
+ kind: "direct-swap";
34
+ poolKey: UniswapV4PoolKey;
35
+ zeroForOne: boolean;
36
+ quotedTokenCount: bigint;
37
+ /** Protected minimum and the beneficiary's direct-swap token count. */
38
+ minimumTokenCount: bigint;
39
+ beneficiaryTokenCount: bigint;
40
+ reservedTokenCount: 0n;
41
+ inputRoute: DirectPayInputRoute;
42
+ }
43
+ /**
44
+ * Quote the best direct pool purchase, including the atomic ETH/USDC V3 bridge
45
+ * when the user's payment currency differs from the hooked V4 pool currency.
46
+ * Returns null unless its slippage-protected minimum beats terminal payment.
47
+ */
48
+ export declare function quoteDirectPaySwap({ client, chainId, poolKey, pairIsCurrency0, paymentToken, amount, payPreview, paySettlement, slippageBps, }: {
49
+ client: PublicClient;
50
+ chainId: JBChainId;
51
+ poolKey: UniswapV4PoolKey;
52
+ pairIsCurrency0: boolean;
53
+ paymentToken: Address;
54
+ amount: bigint;
55
+ payPreview: PayPreview;
56
+ paySettlement?: PaySettlement;
57
+ slippageBps?: bigint;
58
+ }): Promise<DirectPaySwapQuote | null>;
59
+ /** Build the atomic Universal Router transaction for a direct-pay quote. */
60
+ export declare function buildDirectPaySwapTx({ chainId, quote, amount, recipient, deadline, }: {
61
+ chainId: JBChainId;
62
+ quote: DirectPaySwapQuote;
63
+ amount: bigint;
64
+ recipient: Address;
65
+ deadline: bigint;
66
+ }): import("./uniswapV4.js").UniswapV4SwapTxRequest;
67
+ /** Prepend Universal Router's PERMIT2_PERMIT command to a reviewed swap. */
68
+ export declare function addPermit2SignatureToDirectPaySwap(request: ReturnType<typeof buildDirectPaySwapTx>, authorization: Permit2SignatureAuthorization, signature: Hex): ReturnType<typeof buildDirectPaySwapTx>;
69
+ //# sourceMappingURL=directPay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directPay.d.ts","sourceRoot":"","sources":["../../../src/v6/directPay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,385 @@
1
+ import { decodeFunctionResult, encodeAbiParameters, encodeFunctionData, encodePacked, zeroAddress, } from "viem";
2
+ import { NATIVE_TOKEN } from "../constants.js";
3
+ import { chooseBestPayRoute, } from "./pay.js";
4
+ import { buildUniswapV4ExactInputSwapTx, quoteUniswapV4ExactInputSingle, uniswapV4Deployment, } from "./uniswapV4.js";
5
+ /** Canonical WETH/USDC V3 bridge used by direct-pay swaps on all v6 mainnets. */
6
+ export const NATIVE_SWAP_BY_CHAIN = {
7
+ 1: {
8
+ wrappedNative: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
9
+ bridgeToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
10
+ v3Quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
11
+ },
12
+ 10: {
13
+ wrappedNative: "0x4200000000000000000000000000000000000006",
14
+ bridgeToken: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
15
+ v3Quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
16
+ },
17
+ 8453: {
18
+ wrappedNative: "0x4200000000000000000000000000000000000006",
19
+ bridgeToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
20
+ v3Quoter: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
21
+ },
22
+ 42161: {
23
+ wrappedNative: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
24
+ bridgeToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
25
+ v3Quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
26
+ },
27
+ };
28
+ const V3_FEES = [100, 500, 3_000, 10_000];
29
+ const ADDRESS_THIS = "0x0000000000000000000000000000000000000002";
30
+ const CONTRACT_BALANCE = 1n << 255n;
31
+ const UINT128_MAX = (1n << 128n) - 1n;
32
+ const v3QuoterAbi = [
33
+ {
34
+ type: "function",
35
+ name: "quoteExactInputSingle",
36
+ stateMutability: "nonpayable",
37
+ inputs: [
38
+ {
39
+ name: "params",
40
+ type: "tuple",
41
+ components: [
42
+ { name: "tokenIn", type: "address" },
43
+ { name: "tokenOut", type: "address" },
44
+ { name: "amountIn", type: "uint256" },
45
+ { name: "fee", type: "uint24" },
46
+ { name: "sqrtPriceLimitX96", type: "uint160" },
47
+ ],
48
+ },
49
+ ],
50
+ outputs: [
51
+ { name: "amountOut", type: "uint256" },
52
+ { name: "sqrtPriceX96After", type: "uint160" },
53
+ { name: "initializedTicksCrossed", type: "uint32" },
54
+ { name: "gasEstimate", type: "uint256" },
55
+ ],
56
+ },
57
+ ];
58
+ const universalRouterAbi = [
59
+ {
60
+ type: "function",
61
+ name: "execute",
62
+ stateMutability: "payable",
63
+ inputs: [
64
+ { name: "commands", type: "bytes" },
65
+ { name: "inputs", type: "bytes[]" },
66
+ { name: "deadline", type: "uint256" },
67
+ ],
68
+ outputs: [],
69
+ },
70
+ ];
71
+ function isNative(token) {
72
+ return token.toLowerCase() === NATIVE_TOKEN.toLowerCase();
73
+ }
74
+ async function quoteV3ExactInput({ client, config, tokenIn, tokenOut, amountIn, }) {
75
+ const quotes = await Promise.all(V3_FEES.map(async (fee) => {
76
+ try {
77
+ const call = await client.call({
78
+ to: config.v3Quoter,
79
+ data: encodeFunctionData({
80
+ abi: v3QuoterAbi,
81
+ functionName: "quoteExactInputSingle",
82
+ args: [
83
+ {
84
+ tokenIn,
85
+ tokenOut,
86
+ amountIn,
87
+ fee,
88
+ sqrtPriceLimitX96: 0n,
89
+ },
90
+ ],
91
+ }),
92
+ });
93
+ if (!call.data)
94
+ return null;
95
+ const [amountOut] = decodeFunctionResult({
96
+ abi: v3QuoterAbi,
97
+ functionName: "quoteExactInputSingle",
98
+ data: call.data,
99
+ });
100
+ return amountOut > 0n ? { fee, amountOut } : null;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }));
106
+ return quotes.reduce((best, quote) => !quote || (best && best.amountOut >= quote.amountOut) ? best : quote, null);
107
+ }
108
+ /**
109
+ * Quote the best direct pool purchase, including the atomic ETH/USDC V3 bridge
110
+ * when the user's payment currency differs from the hooked V4 pool currency.
111
+ * Returns null unless its slippage-protected minimum beats terminal payment.
112
+ */
113
+ export async function quoteDirectPaySwap({ client, chainId, poolKey, pairIsCurrency0, paymentToken, amount, payPreview, paySettlement = "issuance", slippageBps = 100n, }) {
114
+ if (!uniswapV4Deployment(chainId)?.universalRouter || amount <= 0n) {
115
+ return null;
116
+ }
117
+ const currencyIn = pairIsCurrency0 ? poolKey.currency0 : poolKey.currency1;
118
+ const normalizedPayment = isNative(paymentToken)
119
+ ? zeroAddress
120
+ : paymentToken.toLowerCase();
121
+ let v4AmountIn = amount;
122
+ let inputRoute = { kind: "single-v4" };
123
+ if (currencyIn.toLowerCase() !== normalizedPayment) {
124
+ const config = NATIVE_SWAP_BY_CHAIN[chainId];
125
+ const canBridgeNative = !!config &&
126
+ isNative(paymentToken) &&
127
+ currencyIn.toLowerCase() === config.bridgeToken.toLowerCase();
128
+ const canBridgeUsdcToNative = !!config &&
129
+ paymentToken.toLowerCase() === config.bridgeToken.toLowerCase() &&
130
+ currencyIn.toLowerCase() === zeroAddress;
131
+ if (!config || (!canBridgeNative && !canBridgeUsdcToNative))
132
+ return null;
133
+ const bridgeQuote = await quoteV3ExactInput({
134
+ client,
135
+ config,
136
+ tokenIn: canBridgeNative ? config.wrappedNative : config.bridgeToken,
137
+ tokenOut: canBridgeNative ? config.bridgeToken : config.wrappedNative,
138
+ amountIn: amount,
139
+ });
140
+ if (!bridgeQuote)
141
+ return null;
142
+ v4AmountIn = bridgeQuote.amountOut;
143
+ inputRoute = canBridgeNative
144
+ ? {
145
+ kind: "native-v3-v4",
146
+ wrappedNative: config.wrappedNative,
147
+ bridgeToken: config.bridgeToken,
148
+ bridgeTokenSymbol: "USDC",
149
+ bridgeTokenDecimals: 6,
150
+ v3Fee: bridgeQuote.fee,
151
+ quotedBridgeAmount: bridgeQuote.amountOut,
152
+ }
153
+ : {
154
+ kind: "erc20-v3-native-v4",
155
+ inputToken: config.bridgeToken,
156
+ wrappedNative: config.wrappedNative,
157
+ bridgeTokenSymbol: "ETH",
158
+ bridgeTokenDecimals: 18,
159
+ v3Fee: bridgeQuote.fee,
160
+ quotedBridgeAmount: bridgeQuote.amountOut,
161
+ };
162
+ }
163
+ const quotedTokenCount = await quoteUniswapV4ExactInputSingle(client, {
164
+ chainId,
165
+ poolKey,
166
+ zeroForOne: pairIsCurrency0,
167
+ amountIn: v4AmountIn,
168
+ });
169
+ const best = chooseBestPayRoute({
170
+ pay: payPreview,
171
+ paySettlement,
172
+ directSwapQuote: quotedTokenCount,
173
+ slippageBps,
174
+ });
175
+ if (best.kind !== "direct-swap")
176
+ return null;
177
+ return {
178
+ kind: "direct-swap",
179
+ poolKey,
180
+ zeroForOne: pairIsCurrency0,
181
+ quotedTokenCount,
182
+ minimumTokenCount: best.beneficiaryTokenCount,
183
+ beneficiaryTokenCount: best.beneficiaryTokenCount,
184
+ reservedTokenCount: 0n,
185
+ inputRoute,
186
+ };
187
+ }
188
+ function encodeV4SwapFromRouterBalance({ quote, recipient, currencyIn, }) {
189
+ const swap = encodeAbiParameters([
190
+ {
191
+ type: "tuple",
192
+ components: [
193
+ {
194
+ type: "tuple",
195
+ components: [
196
+ { type: "address" },
197
+ { type: "address" },
198
+ { type: "uint24" },
199
+ { type: "int24" },
200
+ { type: "address" },
201
+ ],
202
+ },
203
+ { type: "bool" },
204
+ { type: "uint128" },
205
+ { type: "uint128" },
206
+ { type: "bytes" },
207
+ ],
208
+ },
209
+ ], [
210
+ [
211
+ [
212
+ quote.poolKey.currency0,
213
+ quote.poolKey.currency1,
214
+ quote.poolKey.fee,
215
+ quote.poolKey.tickSpacing,
216
+ quote.poolKey.hooks,
217
+ ],
218
+ quote.zeroForOne,
219
+ 0n,
220
+ quote.minimumTokenCount,
221
+ "0x",
222
+ ],
223
+ ]);
224
+ const settle = encodeAbiParameters([{ type: "address" }, { type: "uint256" }, { type: "bool" }], [currencyIn, CONTRACT_BALANCE, false]);
225
+ const currencyOut = quote.zeroForOne
226
+ ? quote.poolKey.currency1
227
+ : quote.poolKey.currency0;
228
+ const take = encodeAbiParameters([{ type: "address" }, { type: "address" }, { type: "uint256" }], [currencyOut, recipient, 0n]);
229
+ return encodeAbiParameters([{ type: "bytes" }, { type: "bytes[]" }], ["0x0b060e", [settle, swap, take]]);
230
+ }
231
+ /** Build the atomic Universal Router transaction for a direct-pay quote. */
232
+ export function buildDirectPaySwapTx({ chainId, quote, amount, recipient, deadline, }) {
233
+ if (quote.inputRoute.kind === "single-v4") {
234
+ return buildUniswapV4ExactInputSwapTx({
235
+ chainId,
236
+ poolKey: quote.poolKey,
237
+ zeroForOne: quote.zeroForOne,
238
+ amountIn: amount,
239
+ minimumAmountOut: quote.minimumTokenCount,
240
+ recipient,
241
+ deadline,
242
+ });
243
+ }
244
+ if (amount <= 0n || amount > UINT128_MAX || quote.minimumTokenCount <= 0n) {
245
+ throw new Error("Swap amounts are outside the supported range.");
246
+ }
247
+ const config = NATIVE_SWAP_BY_CHAIN[chainId];
248
+ const router = uniswapV4Deployment(chainId)?.universalRouter;
249
+ if (!config || !router) {
250
+ throw new Error("No supported native bridge route on this chain.");
251
+ }
252
+ if (quote.inputRoute.kind === "erc20-v3-native-v4") {
253
+ if (quote.inputRoute.inputToken.toLowerCase() !==
254
+ config.bridgeToken.toLowerCase() ||
255
+ quote.inputRoute.wrappedNative.toLowerCase() !==
256
+ config.wrappedNative.toLowerCase()) {
257
+ throw new Error("This ERC-20 bridge route is not supported on this chain.");
258
+ }
259
+ const v3Input = encodeAbiParameters([
260
+ { type: "address" },
261
+ { type: "uint256" },
262
+ { type: "uint256" },
263
+ { type: "bytes" },
264
+ { type: "bool" },
265
+ ], [
266
+ ADDRESS_THIS,
267
+ amount,
268
+ 0n,
269
+ encodePacked(["address", "uint24", "address"], [
270
+ quote.inputRoute.inputToken,
271
+ quote.inputRoute.v3Fee,
272
+ quote.inputRoute.wrappedNative,
273
+ ]),
274
+ true,
275
+ ]);
276
+ const unwrapInput = encodeAbiParameters([{ type: "address" }, { type: "uint256" }], [ADDRESS_THIS, 0n]);
277
+ const v4Input = encodeV4SwapFromRouterBalance({
278
+ quote,
279
+ recipient,
280
+ currencyIn: zeroAddress,
281
+ });
282
+ return {
283
+ chainId,
284
+ address: router,
285
+ abi: universalRouterAbi,
286
+ functionName: "execute",
287
+ args: [
288
+ "0x000c10",
289
+ [v3Input, unwrapInput, v4Input],
290
+ deadline,
291
+ ],
292
+ value: 0n,
293
+ };
294
+ }
295
+ if (quote.inputRoute.bridgeToken.toLowerCase() !==
296
+ config.bridgeToken.toLowerCase() ||
297
+ quote.inputRoute.wrappedNative.toLowerCase() !==
298
+ config.wrappedNative.toLowerCase()) {
299
+ throw new Error("This native bridge route is not supported on this chain.");
300
+ }
301
+ const wrapInput = encodeAbiParameters([{ type: "address" }, { type: "uint256" }], [ADDRESS_THIS, amount]);
302
+ const v3Input = encodeAbiParameters([
303
+ { type: "address" },
304
+ { type: "uint256" },
305
+ { type: "uint256" },
306
+ { type: "bytes" },
307
+ { type: "bool" },
308
+ ], [
309
+ ADDRESS_THIS,
310
+ amount,
311
+ 0n,
312
+ encodePacked(["address", "uint24", "address"], [
313
+ quote.inputRoute.wrappedNative,
314
+ quote.inputRoute.v3Fee,
315
+ quote.inputRoute.bridgeToken,
316
+ ]),
317
+ false,
318
+ ]);
319
+ const v4Input = encodeV4SwapFromRouterBalance({
320
+ quote,
321
+ recipient,
322
+ currencyIn: quote.inputRoute.bridgeToken,
323
+ });
324
+ return {
325
+ chainId,
326
+ address: router,
327
+ abi: universalRouterAbi,
328
+ functionName: "execute",
329
+ args: ["0x0b0010", [wrapInput, v3Input, v4Input], deadline],
330
+ value: amount,
331
+ };
332
+ }
333
+ /** Prepend Universal Router's PERMIT2_PERMIT command to a reviewed swap. */
334
+ export function addPermit2SignatureToDirectPaySwap(request, authorization, signature) {
335
+ if (request.address.toLowerCase() !== authorization.spender.toLowerCase()) {
336
+ throw new Error("The reviewed Permit2 authorization does not match the swap.");
337
+ }
338
+ const [commands, inputs, deadline] = request.args;
339
+ const commandShape = commands.toLowerCase();
340
+ const supportedShape = (commandShape === "0x10" && inputs.length === 1) ||
341
+ (commandShape === "0x000c10" && inputs.length === 3);
342
+ if (!supportedShape) {
343
+ throw new Error("The reviewed swap has an unsupported Universal Router shape.");
344
+ }
345
+ const permitInput = encodeAbiParameters([
346
+ {
347
+ type: "tuple",
348
+ components: [
349
+ {
350
+ type: "tuple",
351
+ components: [
352
+ { type: "address" },
353
+ { type: "uint160" },
354
+ { type: "uint48" },
355
+ { type: "uint48" },
356
+ ],
357
+ },
358
+ { type: "address" },
359
+ { type: "uint256" },
360
+ ],
361
+ },
362
+ { type: "bytes" },
363
+ ], [
364
+ [
365
+ [
366
+ authorization.token,
367
+ authorization.amount,
368
+ authorization.expiration,
369
+ authorization.nonce,
370
+ ],
371
+ authorization.spender,
372
+ authorization.sigDeadline,
373
+ ],
374
+ signature,
375
+ ]);
376
+ return {
377
+ ...request,
378
+ args: [
379
+ `0x0a${commands.slice(2)}`,
380
+ [permitInput, ...inputs],
381
+ deadline,
382
+ ],
383
+ };
384
+ }
385
+ //# sourceMappingURL=directPay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directPay.js","sourceRoot":"","sources":["../../../src/v6/directPay.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export * from "./splits.js";
8
8
  export * from "./revnets.js";
9
9
  export * from "./terminals.js";
10
10
  export * from "./pay.js";
11
+ export * from "./directPay.js";
12
+ export * from "./permit2.js";
11
13
  export * from "./projectPayers.js";
12
14
  export * from "./cashOut.js";
13
15
  export * from "./nft.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/v6/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/v6/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -8,6 +8,8 @@ export * from "./splits.js";
8
8
  export * from "./revnets.js";
9
9
  export * from "./terminals.js";
10
10
  export * from "./pay.js";
11
+ export * from "./directPay.js";
12
+ export * from "./permit2.js";
11
13
  export * from "./projectPayers.js";
12
14
  export * from "./cashOut.js";
13
15
  export * from "./nft.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v6/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v6/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -13,11 +13,36 @@ export declare const LOANS_MAX_FEE = 1000n;
13
13
  * linearly until the loan liquidates at 10 years.
14
14
  */
15
15
  export declare const MIN_PREPAID_FEE_PERCENT = 25n;
16
+ /** The largest prepaid source fee REVLoans accepts: 500 / 1000 = 50%. */
17
+ export declare const MAX_PREPAID_FEE_PERCENT = 500n;
16
18
  /**
17
19
  * The upfront fee REVLoans routes to the $REV revnet on every borrow: 10 of
18
20
  * {@link LOANS_MAX_FEE} (1%), taken in addition to the prepaid fee.
19
21
  */
20
22
  export declare const REV_PREPAID_FEE_PERCENT = 10n;
23
+ export interface LoanOpeningAmounts {
24
+ grossBorrowAmount: bigint;
25
+ protocolFee: bigint;
26
+ revFee: bigint;
27
+ sourceFee: bigint;
28
+ netBorrowAmount: bigint;
29
+ }
30
+ /**
31
+ * Calculate a borrower's spendable proceeds using the same floor-rounded fee
32
+ * arithmetic as REVLoans, JBMultiTerminal, and JBFees.
33
+ *
34
+ * `grossBorrowAmount` is the principal recorded on the loan. The terminal's
35
+ * standard 2.5% allowance fee is deducted first, followed by REVLoans' 1% REV
36
+ * fee and the selected prepaid source fee (2.5% minimum).
37
+ */
38
+ export declare function loanOpeningAmounts({ grossBorrowAmount, prepaidSourceFeePercent, protocolFeeApplies, revFeeApplies, }: {
39
+ grossBorrowAmount: bigint;
40
+ prepaidSourceFeePercent?: bigint;
41
+ protocolFeeApplies?: boolean;
42
+ revFeeApplies?: boolean;
43
+ }): LoanOpeningAmounts;
44
+ /** Convenience accessor for {@link loanOpeningAmounts}. */
45
+ export declare function netLoanProceeds(grossBorrowAmount: bigint, prepaidSourceFeePercent?: bigint): bigint;
21
46
  /**
22
47
  * The JBPermissions permission id apps grant to the REVLoans contract before borrowing
23
48
  * against a holder's tokens (v6 ROOT permission id 1). REVLoans needs it to manage the
@@ -1 +1 @@
1
- {"version":3,"file":"loans.d.ts","sourceRoot":"","sources":["../../../src/v6/loans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,iBAMpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,KAAK,EACL,eAAoB,EACpB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,MAAM,GACP,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG;IACF,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,WAAW,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5E,CAgBA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EACX,SAAkC,EAClC,KAAU,GACX,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG;IACF,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,WAAW,CAAC;IACxB,YAAY,EAAE,WAAW,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;CACf,CAeA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,OAAO,EACP,MAAM,EACN,yBAAyB,EACzB,KAAK,EACL,eAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB,EAAE,MAAM,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG;IACF,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,WAAW,CAAC;IACxB,YAAY,EAAE,8BAA8B,CAAC;IAC7C,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;CAC3E,CAgBA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAShE"}
1
+ {"version":3,"file":"loans.d.ts","sourceRoot":"","sources":["../../../src/v6/loans.ts"],"names":[],"mappings":"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"}
@@ -12,11 +12,50 @@ export const LOANS_MAX_FEE = 1000n;
12
12
  * linearly until the loan liquidates at 10 years.
13
13
  */
14
14
  export const MIN_PREPAID_FEE_PERCENT = 25n;
15
+ /** The largest prepaid source fee REVLoans accepts: 500 / 1000 = 50%. */
16
+ export const MAX_PREPAID_FEE_PERCENT = 500n;
15
17
  /**
16
18
  * The upfront fee REVLoans routes to the $REV revnet on every borrow: 10 of
17
19
  * {@link LOANS_MAX_FEE} (1%), taken in addition to the prepaid fee.
18
20
  */
19
21
  export const REV_PREPAID_FEE_PERCENT = 10n;
22
+ /**
23
+ * Calculate a borrower's spendable proceeds using the same floor-rounded fee
24
+ * arithmetic as REVLoans, JBMultiTerminal, and JBFees.
25
+ *
26
+ * `grossBorrowAmount` is the principal recorded on the loan. The terminal's
27
+ * standard 2.5% allowance fee is deducted first, followed by REVLoans' 1% REV
28
+ * fee and the selected prepaid source fee (2.5% minimum).
29
+ */
30
+ export function loanOpeningAmounts({ grossBorrowAmount, prepaidSourceFeePercent = MIN_PREPAID_FEE_PERCENT, protocolFeeApplies = true, revFeeApplies = true, }) {
31
+ if (grossBorrowAmount < 0n) {
32
+ throw new Error("grossBorrowAmount cannot be negative.");
33
+ }
34
+ if (prepaidSourceFeePercent < MIN_PREPAID_FEE_PERCENT ||
35
+ prepaidSourceFeePercent > MAX_PREPAID_FEE_PERCENT) {
36
+ throw new Error(`prepaidSourceFeePercent must be between ${MIN_PREPAID_FEE_PERCENT} and ${MAX_PREPAID_FEE_PERCENT}.`);
37
+ }
38
+ const protocolFee = protocolFeeApplies ? grossBorrowAmount / 40n : 0n;
39
+ const revFee = revFeeApplies
40
+ ? (grossBorrowAmount * REV_PREPAID_FEE_PERCENT) / LOANS_MAX_FEE
41
+ : 0n;
42
+ const sourceFee = (grossBorrowAmount * prepaidSourceFeePercent) / LOANS_MAX_FEE;
43
+ const totalFees = protocolFee + revFee + sourceFee;
44
+ return {
45
+ grossBorrowAmount,
46
+ protocolFee,
47
+ revFee,
48
+ sourceFee,
49
+ netBorrowAmount: grossBorrowAmount > totalFees ? grossBorrowAmount - totalFees : 0n,
50
+ };
51
+ }
52
+ /** Convenience accessor for {@link loanOpeningAmounts}. */
53
+ export function netLoanProceeds(grossBorrowAmount, prepaidSourceFeePercent = MIN_PREPAID_FEE_PERCENT) {
54
+ return loanOpeningAmounts({
55
+ grossBorrowAmount,
56
+ prepaidSourceFeePercent,
57
+ }).netBorrowAmount;
58
+ }
20
59
  /**
21
60
  * The JBPermissions permission id apps grant to the REVLoans contract before borrowing
22
61
  * against a holder's tokens (v6 ROOT permission id 1). REVLoans needs it to manage the
@@ -1 +1 @@
1
- {"version":3,"file":"loans.js","sourceRoot":"","sources":["../../../src/v6/loans.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loans.js","sourceRoot":"","sources":["../../../src/v6/loans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAU3C;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,uBAAuB,GAAG,uBAAuB,EACjD,kBAAkB,GAAG,IAAI,EACzB,aAAa,GAAG,IAAI,GAMrB;IACC,IAAI,iBAAiB,GAAG,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IACE,uBAAuB,GAAG,uBAAuB;QACjD,uBAAuB,GAAG,uBAAuB,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,2CAA2C,uBAAuB,QAAQ,uBAAuB,GAAG,CACrG,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,CAAC,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,aAAa;QAC/D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GACb,CAAC,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,aAAa,CAAC;IAChE,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,OAAO;QACL,iBAAiB;QACjB,WAAW;QACX,MAAM;QACN,SAAS;QACT,eAAe,EACb,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAC7B,iBAAyB,EACzB,uBAAuB,GAAG,uBAAuB;IAEjD,OAAO,kBAAkB,CAAC;QACxB,iBAAiB;QACjB,uBAAuB;KACxB,CAAC,CAAC,eAAe,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAexC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,KAAK,EACL,eAAe,GAAG,EAAE,EACpB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,MAAM,GAUP;IAOC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,YAAY;QAC1B,IAAI,EAAE;YACJ,QAAQ;YACR,KAAK;YACL,eAAe;YACf,eAAe;YACf,WAAW;YACX,iBAAiB;YACjB,MAAM;SACP;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EACX,SAAS,GAAG,sBAAsB,EAClC,KAAK,GAAG,EAAE,GASX;IAQC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE;YACJ,MAAM;YACN,oBAAoB;YACpB,uBAAuB;YACvB,WAAW;YACX,SAAS;SACV;QACD,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAC1C,OAAO,EACP,MAAM,EACN,yBAAyB,EACzB,KAAK,EACL,eAAe,GAAG,EAAE,EACpB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,GAUlB;IAOC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,8BAA8B;QAC5C,IAAI,EAAE;YACJ,MAAM;YACN,yBAAyB;YACzB,KAAK;YACL,eAAe;YACf,oBAAoB;YACpB,WAAW;YACX,iBAAiB;SAClB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,EACE,OAAO,EACP,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,GAOT;IAED,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QACpE,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,sBAAsB;QACpC,IAAI,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;AAC/C,CAAC"}