@bananapus/nana-sdk-core 6.4.0 → 6.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.
Files changed (79) hide show
  1. package/dist/cjs/review/decode.d.ts.map +1 -1
  2. package/dist/cjs/review/decode.js +10 -3
  3. package/dist/cjs/review/decode.js.map +1 -1
  4. package/dist/cjs/review/safeSend.d.ts +7 -3
  5. package/dist/cjs/review/safeSend.d.ts.map +1 -1
  6. package/dist/cjs/review/safeSend.js +17 -6
  7. package/dist/cjs/review/safeSend.js.map +1 -1
  8. package/dist/cjs/safeService.d.ts +6 -0
  9. package/dist/cjs/safeService.d.ts.map +1 -1
  10. package/dist/cjs/safeService.js +13 -0
  11. package/dist/cjs/safeService.js.map +1 -1
  12. package/dist/cjs/utils/hook.d.ts +13 -0
  13. package/dist/cjs/utils/hook.d.ts.map +1 -1
  14. package/dist/cjs/utils/hook.js +49 -0
  15. package/dist/cjs/utils/hook.js.map +1 -1
  16. package/dist/cjs/v6/cashOut.d.ts +5 -1
  17. package/dist/cjs/v6/cashOut.d.ts.map +1 -1
  18. package/dist/cjs/v6/cashOut.js +14 -2
  19. package/dist/cjs/v6/cashOut.js.map +1 -1
  20. package/dist/cjs/v6/index.d.ts +1 -0
  21. package/dist/cjs/v6/index.d.ts.map +1 -1
  22. package/dist/cjs/v6/index.js +1 -0
  23. package/dist/cjs/v6/index.js.map +1 -1
  24. package/dist/cjs/v6/permit2.d.ts +106 -1
  25. package/dist/cjs/v6/permit2.d.ts.map +1 -1
  26. package/dist/cjs/v6/permit2.js +150 -1
  27. package/dist/cjs/v6/permit2.js.map +1 -1
  28. package/dist/cjs/v6/projectHooks.d.ts +53 -0
  29. package/dist/cjs/v6/projectHooks.d.ts.map +1 -0
  30. package/dist/cjs/v6/projectHooks.js +203 -0
  31. package/dist/cjs/v6/projectHooks.js.map +1 -0
  32. package/dist/cjs/v6/revnets.d.ts +42 -0
  33. package/dist/cjs/v6/revnets.d.ts.map +1 -1
  34. package/dist/cjs/v6/revnets.js +60 -0
  35. package/dist/cjs/v6/revnets.js.map +1 -1
  36. package/dist/cjs/v6/terminals.d.ts +24 -0
  37. package/dist/cjs/v6/terminals.d.ts.map +1 -1
  38. package/dist/cjs/v6/terminals.js +52 -0
  39. package/dist/cjs/v6/terminals.js.map +1 -1
  40. package/dist/esm/review/decode.d.ts.map +1 -1
  41. package/dist/esm/review/decode.js +10 -3
  42. package/dist/esm/review/decode.js.map +1 -1
  43. package/dist/esm/review/safeSend.d.ts +7 -3
  44. package/dist/esm/review/safeSend.d.ts.map +1 -1
  45. package/dist/esm/review/safeSend.js +18 -7
  46. package/dist/esm/review/safeSend.js.map +1 -1
  47. package/dist/esm/safeService.d.ts +6 -0
  48. package/dist/esm/safeService.d.ts.map +1 -1
  49. package/dist/esm/safeService.js +12 -0
  50. package/dist/esm/safeService.js.map +1 -1
  51. package/dist/esm/utils/hook.d.ts +13 -0
  52. package/dist/esm/utils/hook.d.ts.map +1 -1
  53. package/dist/esm/utils/hook.js +48 -0
  54. package/dist/esm/utils/hook.js.map +1 -1
  55. package/dist/esm/v6/cashOut.d.ts +5 -1
  56. package/dist/esm/v6/cashOut.d.ts.map +1 -1
  57. package/dist/esm/v6/cashOut.js +14 -2
  58. package/dist/esm/v6/cashOut.js.map +1 -1
  59. package/dist/esm/v6/index.d.ts +1 -0
  60. package/dist/esm/v6/index.d.ts.map +1 -1
  61. package/dist/esm/v6/index.js +1 -0
  62. package/dist/esm/v6/index.js.map +1 -1
  63. package/dist/esm/v6/permit2.d.ts +106 -1
  64. package/dist/esm/v6/permit2.d.ts.map +1 -1
  65. package/dist/esm/v6/permit2.js +145 -0
  66. package/dist/esm/v6/permit2.js.map +1 -1
  67. package/dist/esm/v6/projectHooks.d.ts +53 -0
  68. package/dist/esm/v6/projectHooks.d.ts.map +1 -0
  69. package/dist/esm/v6/projectHooks.js +200 -0
  70. package/dist/esm/v6/projectHooks.js.map +1 -0
  71. package/dist/esm/v6/revnets.d.ts +42 -0
  72. package/dist/esm/v6/revnets.d.ts.map +1 -1
  73. package/dist/esm/v6/revnets.js +58 -1
  74. package/dist/esm/v6/revnets.js.map +1 -1
  75. package/dist/esm/v6/terminals.d.ts +24 -0
  76. package/dist/esm/v6/terminals.d.ts.map +1 -1
  77. package/dist/esm/v6/terminals.js +51 -0
  78. package/dist/esm/v6/terminals.js.map +1 -1
  79. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import type { Address, Hex, PublicClient } from "viem";
1
+ import { type Address, type Hex, type PublicClient } from "viem";
2
2
  import type { JBChainId } from "../types.js";
3
3
  /** Canonical Permit2 deployment shared by supported EVM chains. */
4
4
  export declare const PERMIT2_ADDRESS: `0x${string}`;
@@ -166,4 +166,109 @@ export declare function shouldUsePermit2Signature({ needsApproval, walletLookupS
166
166
  }): boolean;
167
167
  /** Fall back only for wallets that cannot sign typed data, never on rejection. */
168
168
  export declare function permit2SignatureNeedsOnchainFallback(error: unknown): boolean;
169
+ /** How long a signed pay authorization stays usable, matching the swap flows. */
170
+ export declare const PERMIT2_PAY_AUTHORIZATION_SECONDS = 1800;
171
+ /** What an ERC-20 payment to a pay entry still needs from the payer. */
172
+ export interface Permit2PayAuthorization {
173
+ /** The entry's own ERC-20 allowance covers the amount: pay with no authorization. */
174
+ direct: boolean;
175
+ /** The token's allowance for Permit2 is short: one approval of Permit2 comes first. */
176
+ needsTokenApproval: boolean;
177
+ /** The exact, expiring allowance to sign with `signReviewed({ kind: "permit2" })`. */
178
+ authorization: Permit2SignatureAuthorization;
179
+ }
180
+ /**
181
+ * Read what paying `amount` of an ERC-20 into a pay entry needs. The entry is
182
+ * the contract the payer calls: JBMultiTerminal, JBRouterTerminal, its registry
183
+ * or its gateway. Each pulls through its own ERC-20 allowance when that covers
184
+ * the amount, and otherwise through Permit2 with the allowance its pay
185
+ * metadata carries (see {@link addPermit2PayMetadata}).
186
+ *
187
+ * The authorization is for exactly `amount`, to `entry` only, and expires
188
+ * {@link PERMIT2_PAY_AUTHORIZATION_SECONDS} after the chain's latest block.
189
+ */
190
+ export declare function readPermit2PayAuthorization(client: PublicClient, { chainId, owner, token, entry, amount, blockNumber, }: {
191
+ chainId: JBChainId;
192
+ owner: Address;
193
+ token: Address;
194
+ entry: Address;
195
+ amount: bigint;
196
+ /** Read allowances at this block, so an approval just mined is seen on a lagging backend. */
197
+ blockNumber?: bigint;
198
+ }): Promise<Permit2PayAuthorization>;
199
+ /**
200
+ * Add a signed Permit2 allowance to pay metadata, keyed to the entry that
201
+ * spends it. The entry decodes one `JBSingleAllowance` tuple
202
+ * (`sigDeadline, amount, expiration, nonce, signature`), so the payload is a
203
+ * single dynamic tuple, not flat fields.
204
+ *
205
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/structs/JBSingleAllowance.sol
206
+ */
207
+ export declare function addPermit2PayMetadata({ metadata, authorization, signature, }: {
208
+ metadata?: Hex;
209
+ authorization: Permit2SignatureAuthorization;
210
+ signature: Hex;
211
+ }): Hex;
212
+ /** A pay authorization the payer signed, kept while its payment retries. */
213
+ export interface SignedPermit2PayAuthorization {
214
+ /** The account that signed. Permit2 checks the signature against the payer. */
215
+ owner: Address;
216
+ authorization: Permit2SignatureAuthorization;
217
+ signature: Hex;
218
+ }
219
+ /**
220
+ * Whether a signature from an earlier attempt still authorizes this exact
221
+ * payment: the same payer, chain, token, entry, amount and Permit2 nonce as a freshly
222
+ * read authorization, with time left. Permit2 moves the nonce on when an
223
+ * allowance is used, so a spent signature is never reused.
224
+ *
225
+ * @param signed The kept signature, if any.
226
+ * @param fresh From {@link readPermit2PayAuthorization} or {@link planErc20PayAuthorization} now.
227
+ * @param owner The account `fresh` was read for, which pays.
228
+ */
229
+ export declare function permit2PayAuthorizationReusable(signed: SignedPermit2PayAuthorization | null | undefined, fresh: Permit2SignatureAuthorization, owner: Address): signed is SignedPermit2PayAuthorization;
230
+ /** How a payer authorizes an ERC-20 payment to a pay entry. */
231
+ export type Erc20PayAuthorizationPlan =
232
+ /** The entry's own allowance already covers the amount. */
233
+ {
234
+ kind: "none";
235
+ }
236
+ /**
237
+ * A contract wallet (a Safe, or any account with code) approves the entry
238
+ * for the exact amount: it cannot produce the signature Permit2 checks, and
239
+ * its signers can outlast the authorization's deadline.
240
+ */
241
+ | {
242
+ kind: "approve";
243
+ spender: Address;
244
+ amount: bigint;
245
+ }
246
+ /**
247
+ * An EOA signs an exact, expiring Permit2 allowance for the entry. When
248
+ * `needsTokenApproval`, one approval of Permit2 itself comes first.
249
+ */
250
+ | {
251
+ kind: "permit2";
252
+ needsTokenApproval: boolean;
253
+ authorization: Permit2SignatureAuthorization;
254
+ };
255
+ /**
256
+ * Decide how `owner` authorizes paying `amount` of an ERC-20 into a pay entry.
257
+ * One rule for every client: nothing when the entry is already approved, an
258
+ * exact approval of the entry for contract wallets, a Permit2 signature for
259
+ * EOAs. The native token needs no authorization and has no plan; do not call
260
+ * this for it.
261
+ *
262
+ * @param args.isSafe The connected wallet is a Safe (a Safe app or a Safe
263
+ * reached through WalletConnect), whatever its code reads as here.
264
+ */
265
+ export declare function planErc20PayAuthorization(client: PublicClient, { isSafe, ...args }: {
266
+ chainId: JBChainId;
267
+ owner: Address;
268
+ token: Address;
269
+ entry: Address;
270
+ amount: bigint;
271
+ blockNumber?: bigint;
272
+ isSafe: boolean;
273
+ }): Promise<Erc20PayAuthorizationPlan>;
169
274
  //# sourceMappingURL=permit2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../../../src/v6/permit2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,mEAAmE;AACnE,eAAO,MAAM,eAAe,eAA0B,CAAC;AAEvD,gFAAgF;AAChF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4Bb,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;CAYhB,CAAC;AAEX,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB5E;AAED,qFAAqF;AACrF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAED,6EAA6E;AAC7E,wBAAgB,4BAA4B,CAAC,EAC3C,SAAS,EACT,MAAM,EACN,GAAmC,EACnC,uBAA+B,GAChC,EAAE;IACD,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG,OAAO,CAQV;AAED,uFAAuF;AACvF,wBAAsB,oBAAoB,CAAC,EACzC,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,EACL,MAAM,EACN,GAAG,EACH,uBAAuB,GACxB,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG,OAAO,CAAC,OAAO,CAAC,CAanB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,MAAM,GACP,EAAE;IACD,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAGV;AAED,kFAAkF;AAClF,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgB5E"}
1
+ {"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../../../src/v6/permit2.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PERMIT2_TYPES = exports.permit2Abi = exports.PERMIT2_ADDRESS = void 0;
3
+ exports.PERMIT2_PAY_AUTHORIZATION_SECONDS = exports.PERMIT2_TYPES = exports.permit2Abi = exports.PERMIT2_ADDRESS = void 0;
4
4
  exports.permit2TypedData = permit2TypedData;
5
5
  exports.readPermit2Allowance = readPermit2Allowance;
6
6
  exports.permit2AllowanceNeedsRefresh = permit2AllowanceNeedsRefresh;
7
7
  exports.needsPermit2Approval = needsPermit2Approval;
8
8
  exports.shouldUsePermit2Signature = shouldUsePermit2Signature;
9
9
  exports.permit2SignatureNeedsOnchainFallback = permit2SignatureNeedsOnchainFallback;
10
+ exports.readPermit2PayAuthorization = readPermit2PayAuthorization;
11
+ exports.addPermit2PayMetadata = addPermit2PayMetadata;
12
+ exports.permit2PayAuthorizationReusable = permit2PayAuthorizationReusable;
13
+ exports.planErc20PayAuthorization = planErc20PayAuthorization;
14
+ const viem_1 = require("viem");
10
15
  const constants_js_1 = require("../constants.js");
16
+ const hook_js_1 = require("../utils/hook.js");
11
17
  const uniswapV4Deployments_js_1 = require("./uniswapV4Deployments.js");
12
18
  /** Canonical Permit2 deployment shared by supported EVM chains. */
13
19
  exports.PERMIT2_ADDRESS = uniswapV4Deployments_js_1.UNISWAP_PERMIT2_ADDRESS;
@@ -142,4 +148,147 @@ function permit2SignatureNeedsOnchainFallback(error) {
142
148
  return false;
143
149
  return /(^|\s)-32602(\s|$)|(^|\s)-32601(\s|$)|(^|\s)4200(\s|$)|invalid parameters|method .*not supported|unsupported method|typed data.*not supported/.test(text);
144
150
  }
151
+ /** How long a signed pay authorization stays usable, matching the swap flows. */
152
+ exports.PERMIT2_PAY_AUTHORIZATION_SECONDS = 1_800;
153
+ const MAX_UINT160 = (1n << 160n) - 1n;
154
+ /**
155
+ * Read what paying `amount` of an ERC-20 into a pay entry needs. The entry is
156
+ * the contract the payer calls: JBMultiTerminal, JBRouterTerminal, its registry
157
+ * or its gateway. Each pulls through its own ERC-20 allowance when that covers
158
+ * the amount, and otherwise through Permit2 with the allowance its pay
159
+ * metadata carries (see {@link addPermit2PayMetadata}).
160
+ *
161
+ * The authorization is for exactly `amount`, to `entry` only, and expires
162
+ * {@link PERMIT2_PAY_AUTHORIZATION_SECONDS} after the chain's latest block.
163
+ */
164
+ async function readPermit2PayAuthorization(client, { chainId, owner, token, entry, amount, blockNumber, }) {
165
+ if (amount <= 0n || amount > MAX_UINT160) {
166
+ throw new Error("The payment amount is outside Permit2's uint160 range.");
167
+ }
168
+ const allowanceFor = (spender) => client.readContract({
169
+ address: token,
170
+ abi: viem_1.erc20Abi,
171
+ functionName: "allowance",
172
+ args: [owner, spender],
173
+ blockNumber,
174
+ });
175
+ const [direct, permit2Token, [, , nonce], block] = await Promise.all([
176
+ allowanceFor(entry),
177
+ allowanceFor(exports.PERMIT2_ADDRESS),
178
+ client.readContract({
179
+ address: exports.PERMIT2_ADDRESS,
180
+ abi: exports.permit2Abi,
181
+ functionName: "allowance",
182
+ args: [owner, token, entry],
183
+ blockNumber,
184
+ }),
185
+ client.getBlock({ blockTag: "latest" }),
186
+ ]);
187
+ const now = Number(block.timestamp);
188
+ if (!Number.isSafeInteger(now) || now <= 0) {
189
+ throw new Error("Could not read the chain's time for the authorization.");
190
+ }
191
+ const deadline = now + exports.PERMIT2_PAY_AUTHORIZATION_SECONDS;
192
+ return {
193
+ direct: direct >= amount,
194
+ needsTokenApproval: permit2Token < amount,
195
+ authorization: {
196
+ chainId,
197
+ token,
198
+ spender: entry,
199
+ amount,
200
+ expiration: deadline,
201
+ nonce,
202
+ sigDeadline: BigInt(deadline),
203
+ },
204
+ };
205
+ }
206
+ /**
207
+ * Add a signed Permit2 allowance to pay metadata, keyed to the entry that
208
+ * spends it. The entry decodes one `JBSingleAllowance` tuple
209
+ * (`sigDeadline, amount, expiration, nonce, signature`), so the payload is a
210
+ * single dynamic tuple, not flat fields.
211
+ *
212
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/structs/JBSingleAllowance.sol
213
+ */
214
+ function addPermit2PayMetadata({ metadata, authorization, signature, }) {
215
+ return (0, hook_js_1.addToHookMetadata)(metadata, (0, hook_js_1.hookMetadataId)(authorization.spender, "permit2"), (0, viem_1.encodeAbiParameters)([
216
+ {
217
+ type: "tuple",
218
+ components: [
219
+ { name: "sigDeadline", type: "uint256" },
220
+ { name: "amount", type: "uint160" },
221
+ { name: "expiration", type: "uint48" },
222
+ { name: "nonce", type: "uint48" },
223
+ { name: "signature", type: "bytes" },
224
+ ],
225
+ },
226
+ ], [
227
+ {
228
+ sigDeadline: authorization.sigDeadline,
229
+ amount: authorization.amount,
230
+ expiration: authorization.expiration,
231
+ nonce: authorization.nonce,
232
+ signature,
233
+ },
234
+ ]));
235
+ }
236
+ /** A signed pay authorization this close to its deadline is signed again. */
237
+ const PERMIT2_PAY_REUSE_MARGIN_SECONDS = 120;
238
+ /**
239
+ * Whether a signature from an earlier attempt still authorizes this exact
240
+ * payment: the same payer, chain, token, entry, amount and Permit2 nonce as a freshly
241
+ * read authorization, with time left. Permit2 moves the nonce on when an
242
+ * allowance is used, so a spent signature is never reused.
243
+ *
244
+ * @param signed The kept signature, if any.
245
+ * @param fresh From {@link readPermit2PayAuthorization} or {@link planErc20PayAuthorization} now.
246
+ * @param owner The account `fresh` was read for, which pays.
247
+ */
248
+ function permit2PayAuthorizationReusable(signed, fresh, owner) {
249
+ if (!signed)
250
+ return false;
251
+ const was = signed.authorization;
252
+ return (signed.owner.toLowerCase() === owner.toLowerCase() &&
253
+ was.chainId === fresh.chainId &&
254
+ was.token.toLowerCase() === fresh.token.toLowerCase() &&
255
+ was.spender.toLowerCase() === fresh.spender.toLowerCase() &&
256
+ was.amount === fresh.amount &&
257
+ was.nonce === fresh.nonce &&
258
+ // A fresh authorization expires a fixed time after the chain's latest
259
+ // block, so this compares against chain time.
260
+ was.sigDeadline >=
261
+ fresh.sigDeadline -
262
+ BigInt(exports.PERMIT2_PAY_AUTHORIZATION_SECONDS - PERMIT2_PAY_REUSE_MARGIN_SECONDS));
263
+ }
264
+ /**
265
+ * Decide how `owner` authorizes paying `amount` of an ERC-20 into a pay entry.
266
+ * One rule for every client: nothing when the entry is already approved, an
267
+ * exact approval of the entry for contract wallets, a Permit2 signature for
268
+ * EOAs. The native token needs no authorization and has no plan; do not call
269
+ * this for it.
270
+ *
271
+ * @param args.isSafe The connected wallet is a Safe (a Safe app or a Safe
272
+ * reached through WalletConnect), whatever its code reads as here.
273
+ */
274
+ async function planErc20PayAuthorization(client, { isSafe, ...args }) {
275
+ const [read, walletBytecode] = await Promise.all([
276
+ readPermit2PayAuthorization(client, args),
277
+ client.getCode({ address: args.owner }),
278
+ ]);
279
+ if (read.direct)
280
+ return { kind: "none" };
281
+ return shouldUsePermit2Signature({
282
+ needsApproval: true,
283
+ walletLookupSettled: true,
284
+ walletBytecode,
285
+ isSafe,
286
+ })
287
+ ? {
288
+ kind: "permit2",
289
+ needsTokenApproval: read.needsTokenApproval,
290
+ authorization: read.authorization,
291
+ }
292
+ : { kind: "approve", spender: args.entry, amount: args.amount };
293
+ }
145
294
  //# sourceMappingURL=permit2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permit2.js","sourceRoot":"","sources":["../../../src/v6/permit2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permit2.js","sourceRoot":"","sources":["../../../src/v6/permit2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type Address, type PublicClient } from "viem";
2
+ import type { JBChainId } from "../types.js";
3
+ /** Where a project's buyback hook was found. */
4
+ export type ProjectBuybackHookSource =
5
+ /** The ruleset's data hook is the buyback registry. */
6
+ "registry"
7
+ /** The data hook is a revnet's owner contract, which forwards to its registry. */
8
+ | "revnet"
9
+ /** The data hook is the omnichain deployer, which forwards to the project's extra hook. */
10
+ | "omnichain"
11
+ /** The data hook is a buyback hook itself. */
12
+ | "direct"
13
+ /** The ruleset calls no buyback hook in this direction. */
14
+ | "none";
15
+ export interface ResolvedProjectBuybackHook {
16
+ /** The buyback hook the project's current ruleset reaches, or null. */
17
+ hook: Address | null;
18
+ via: ProjectBuybackHookSource;
19
+ /** The current ruleset's data hook, or the zero address. */
20
+ dataHook: Address;
21
+ rulesetId: bigint;
22
+ /** The registry that resolved `hook`, when one did. */
23
+ registry: Address | null;
24
+ }
25
+ /**
26
+ * The buyback hook a project's current ruleset actually calls when it is paid
27
+ * or cashed out, found the way the contracts find it: through the ruleset's
28
+ * data hook.
29
+ *
30
+ * `JBBuybackHookRegistry.hookOf` answers for every project, with a cohort
31
+ * default when nothing is pinned, so reading it alone names a hook for
32
+ * projects whose rulesets never call one. This follows the data hook instead:
33
+ *
34
+ * - the registry itself: its `hookOf`;
35
+ * - a revnet's `REVOwner`: its own `BUYBACK_HOOK()` registry, then `hookOf`;
36
+ * - `JBOmnichainDeployer`: the project's extra data hook for this ruleset,
37
+ * when it is used in this direction, resolved by the rules above. On cash
38
+ * out the deployer skips the extra hook when the project's 721 hook handles
39
+ * cash outs;
40
+ * - a buyback hook of any generation: that hook;
41
+ * - anything else, no data hook, or the direction's use flag off: none.
42
+ *
43
+ * A failed read throws: "no hook" is an answer, never a guess.
44
+ *
45
+ * @link https://github.com/Bananapus/nana-omnichain-deployers-v6/blob/main/src/JBOmnichainDeployer.sol
46
+ * @link https://github.com/rev-net/revnet-core-v6/blob/main/src/REVOwner.sol
47
+ */
48
+ export declare function resolveProjectBuybackHook(client: PublicClient, { chainId, projectId, direction, }: {
49
+ chainId: JBChainId;
50
+ projectId: bigint;
51
+ direction?: "pay" | "cashOut";
52
+ }): Promise<ResolvedProjectBuybackHook>;
53
+ //# sourceMappingURL=projectHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectHooks.d.ts","sourceRoot":"","sources":["../../../src/v6/projectHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAA2B,MAAM,MAAM,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwG7C,gDAAgD;AAChD,MAAM,MAAM,wBAAwB;AAClC,uDAAuD;AACrD,UAAU;AACZ,kFAAkF;GAChF,QAAQ;AACV,2FAA2F;GACzF,WAAW;AACb,8CAA8C;GAC5C,QAAQ;AACV,2DAA2D;GACzD,MAAM,CAAC;AAEX,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,wBAAwB,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,SAAS,EACT,SAAiB,GAClB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CAC/B,GACA,OAAO,CAAC,0BAA0B,CAAC,CAwGrC"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveProjectBuybackHook = resolveProjectBuybackHook;
4
+ const viem_1 = require("viem");
5
+ const types_js_1 = require("./types.js");
6
+ // Only the reads below: the full ABIs would weigh on every card that asks.
7
+ const hookConfig = [
8
+ { name: "dataHook", type: "address" },
9
+ { name: "useDataHookForPay", type: "bool" },
10
+ { name: "useDataHookForCashOut", type: "bool" },
11
+ ];
12
+ const projectHooksAbi = [
13
+ {
14
+ type: "function",
15
+ name: "controllerOf",
16
+ stateMutability: "view",
17
+ inputs: [{ name: "projectId", type: "uint256" }],
18
+ outputs: [{ name: "", type: "address" }],
19
+ },
20
+ {
21
+ type: "function",
22
+ name: "currentRulesetOf",
23
+ stateMutability: "view",
24
+ inputs: [{ name: "projectId", type: "uint256" }],
25
+ outputs: [
26
+ {
27
+ name: "ruleset",
28
+ type: "tuple",
29
+ components: [
30
+ { name: "cycleNumber", type: "uint48" },
31
+ { name: "id", type: "uint48" },
32
+ { name: "basedOnId", type: "uint48" },
33
+ { name: "start", type: "uint48" },
34
+ { name: "duration", type: "uint32" },
35
+ { name: "weight", type: "uint112" },
36
+ { name: "weightCutPercent", type: "uint32" },
37
+ { name: "approvalHook", type: "address" },
38
+ { name: "metadata", type: "uint256" },
39
+ ],
40
+ },
41
+ {
42
+ name: "metadata",
43
+ type: "tuple",
44
+ components: [
45
+ { name: "reservedPercent", type: "uint16" },
46
+ { name: "cashOutTaxRate", type: "uint16" },
47
+ { name: "baseCurrency", type: "uint32" },
48
+ { name: "pausePay", type: "bool" },
49
+ { name: "pauseCreditTransfers", type: "bool" },
50
+ { name: "allowOwnerMinting", type: "bool" },
51
+ { name: "allowSetCustomToken", type: "bool" },
52
+ { name: "allowTerminalMigration", type: "bool" },
53
+ { name: "allowSetTerminals", type: "bool" },
54
+ { name: "allowSetController", type: "bool" },
55
+ { name: "allowAddAccountingContext", type: "bool" },
56
+ { name: "allowAddPriceFeed", type: "bool" },
57
+ { name: "ownerMustSendPayouts", type: "bool" },
58
+ { name: "holdFees", type: "bool" },
59
+ { name: "scopeCashOutsToLocalBalances", type: "bool" },
60
+ { name: "useDataHookForPay", type: "bool" },
61
+ { name: "useDataHookForCashOut", type: "bool" },
62
+ { name: "dataHook", type: "address" },
63
+ { name: "metadata", type: "uint16" },
64
+ ],
65
+ },
66
+ ],
67
+ },
68
+ {
69
+ type: "function",
70
+ name: "extraDataHookOf",
71
+ stateMutability: "view",
72
+ inputs: [
73
+ { name: "projectId", type: "uint256" },
74
+ { name: "rulesetId", type: "uint256" },
75
+ ],
76
+ outputs: [{ name: "hook", type: "tuple", components: hookConfig }],
77
+ },
78
+ {
79
+ type: "function",
80
+ name: "tiered721HookOf",
81
+ stateMutability: "view",
82
+ inputs: [
83
+ { name: "projectId", type: "uint256" },
84
+ { name: "rulesetId", type: "uint256" },
85
+ ],
86
+ outputs: [
87
+ { name: "hook", type: "address" },
88
+ { name: "useDataHookForCashOut", type: "bool" },
89
+ ],
90
+ },
91
+ {
92
+ type: "function",
93
+ name: "BUYBACK_HOOK",
94
+ stateMutability: "view",
95
+ inputs: [],
96
+ outputs: [{ name: "", type: "address" }],
97
+ },
98
+ {
99
+ type: "function",
100
+ name: "hookOf",
101
+ stateMutability: "view",
102
+ inputs: [{ name: "projectId", type: "uint256" }],
103
+ outputs: [{ name: "", type: "address" }],
104
+ },
105
+ ];
106
+ /**
107
+ * The buyback hook a project's current ruleset actually calls when it is paid
108
+ * or cashed out, found the way the contracts find it: through the ruleset's
109
+ * data hook.
110
+ *
111
+ * `JBBuybackHookRegistry.hookOf` answers for every project, with a cohort
112
+ * default when nothing is pinned, so reading it alone names a hook for
113
+ * projects whose rulesets never call one. This follows the data hook instead:
114
+ *
115
+ * - the registry itself: its `hookOf`;
116
+ * - a revnet's `REVOwner`: its own `BUYBACK_HOOK()` registry, then `hookOf`;
117
+ * - `JBOmnichainDeployer`: the project's extra data hook for this ruleset,
118
+ * when it is used in this direction, resolved by the rules above. On cash
119
+ * out the deployer skips the extra hook when the project's 721 hook handles
120
+ * cash outs;
121
+ * - a buyback hook of any generation: that hook;
122
+ * - anything else, no data hook, or the direction's use flag off: none.
123
+ *
124
+ * A failed read throws: "no hook" is an answer, never a guess.
125
+ *
126
+ * @link https://github.com/Bananapus/nana-omnichain-deployers-v6/blob/main/src/JBOmnichainDeployer.sol
127
+ * @link https://github.com/rev-net/revnet-core-v6/blob/main/src/REVOwner.sol
128
+ */
129
+ async function resolveProjectBuybackHook(client, { chainId, projectId, direction = "pay", }) {
130
+ const read = (address, functionName, args = []) => client.readContract({
131
+ address,
132
+ abi: projectHooksAbi,
133
+ functionName,
134
+ args,
135
+ });
136
+ const used = (hook) => direction === "pay" ? hook.useDataHookForPay : hook.useDataHookForCashOut;
137
+ const is = (address, contract) => (0, types_js_1.isV6Deployment)(address, contract, chainId);
138
+ const controller = (await read((0, types_js_1.v6Address)("JBDirectory", chainId), "controllerOf", [projectId]));
139
+ const none = (dataHook, rulesetId) => ({
140
+ hook: null,
141
+ via: "none",
142
+ dataHook,
143
+ rulesetId,
144
+ registry: null,
145
+ });
146
+ if (controller === viem_1.zeroAddress)
147
+ return none(viem_1.zeroAddress, 0n);
148
+ const [ruleset, metadata] = (await read(controller, "currentRulesetOf", [
149
+ projectId,
150
+ ]));
151
+ const rulesetId = BigInt(ruleset.id);
152
+ const dataHook = (0, viem_1.getAddress)(metadata.dataHook);
153
+ /** The buyback hook behind one data hook, without unwrapping the omnichain deployer. */
154
+ const behind = async (hook) => {
155
+ if (is(hook, "JBBuybackHook")) {
156
+ return { hook, via: "direct", registry: null };
157
+ }
158
+ const revnet = is(hook, "REVOwner");
159
+ if (!revnet && !is(hook, "JBBuybackHookRegistry")) {
160
+ return { hook: null, via: "none", registry: null };
161
+ }
162
+ const registry = revnet
163
+ ? (0, viem_1.getAddress)((await read(hook, "BUYBACK_HOOK")))
164
+ : hook;
165
+ const resolved = (await read(registry, "hookOf", [projectId]));
166
+ return {
167
+ hook: resolved === viem_1.zeroAddress ? null : (0, viem_1.getAddress)(resolved),
168
+ via: revnet ? "revnet" : "registry",
169
+ registry,
170
+ };
171
+ };
172
+ if (dataHook === viem_1.zeroAddress || !used(metadata)) {
173
+ return none(dataHook, rulesetId);
174
+ }
175
+ if (!is(dataHook, "JBOmnichainDeployer")) {
176
+ return { ...(await behind(dataHook)), dataHook, rulesetId };
177
+ }
178
+ if (direction === "cashOut") {
179
+ const [hook721, handlesCashOut] = (await read(dataHook, "tiered721HookOf", [
180
+ projectId,
181
+ rulesetId,
182
+ ]));
183
+ if (hook721 !== viem_1.zeroAddress && handlesCashOut) {
184
+ return none(dataHook, rulesetId);
185
+ }
186
+ }
187
+ const extra = (await read(dataHook, "extraDataHookOf", [
188
+ projectId,
189
+ rulesetId,
190
+ ]));
191
+ if (extra.dataHook === viem_1.zeroAddress || !used(extra)) {
192
+ return none(dataHook, rulesetId);
193
+ }
194
+ const found = await behind((0, viem_1.getAddress)(extra.dataHook));
195
+ return {
196
+ ...found,
197
+ // The deployer is how the hook is reached; the registry field still names what resolved it.
198
+ via: found.hook ? "omnichain" : "none",
199
+ dataHook,
200
+ rulesetId,
201
+ };
202
+ }
203
+ //# sourceMappingURL=projectHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectHooks.js","sourceRoot":"","sources":["../../../src/v6/projectHooks.ts"],"names":[],"mappings":"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"}
@@ -4483,5 +4483,47 @@ export declare function getRevnetTiered721Hook(client: PublicClient, args: {
4483
4483
  chainId: JBChainId;
4484
4484
  revnetId: bigint;
4485
4485
  }): Promise<Address>;
4486
+ /**
4487
+ * Whether a revnet takes its 2.5% fee from a cash out, as
4488
+ * `REVOwner.beforeCashOutRecordedWith` decides it. The fee is skipped when the
4489
+ * ruleset's cash out tax rate is zero, when the fee revnet has no primary
4490
+ * terminal for the reclaimed token, when the beneficiary is feeless, and for a
4491
+ * sucker moving tokens between chains.
4492
+ *
4493
+ * `undefined` while the tax rate is unknown: an unknown fee is not shown as
4494
+ * either extreme. This answers for revnets only; a project whose data hook is
4495
+ * not a `REVOwner` pays no such fee.
4496
+ *
4497
+ * @param args.feeTerminalExists From {@link revnetCashOutFeeTerminalExists}.
4498
+ * Defaults to true, the deployed fee revnet's state for the tokens it accepts.
4499
+ * @link https://github.com/rev-net/revnet-core-v6/blob/main/src/REVOwner.sol (`beforeCashOutRecordedWith`)
4500
+ */
4501
+ export declare function revnetCashOutFeeApplies({ cashOutTaxRate, feeTerminalExists, beneficiaryIsFeeless, holderIsSucker, }: {
4502
+ cashOutTaxRate: bigint | number | undefined;
4503
+ feeTerminalExists?: boolean;
4504
+ beneficiaryIsFeeless?: boolean;
4505
+ holderIsSucker?: boolean;
4506
+ }): boolean | undefined;
4507
+ /**
4508
+ * The token count a revnet cash out reclaims against once its fee is taken:
4509
+ * `count - count / 40`, the contract's own rounding. The other fortieth is
4510
+ * cashed out for the fee revnet. The terminal's protocol fee then comes out of
4511
+ * what this count reclaims (see `cashOutProtocolFee`).
4512
+ *
4513
+ * @param applies From {@link revnetCashOutFeeApplies}, once it is known; false returns the count unchanged.
4514
+ */
4515
+ export declare function cashOutCountAfterRevnetFee(cashOutCount: bigint, applies: boolean): bigint;
4516
+ /**
4517
+ * Whether the fee revnet can be paid in `token`: `REVOwner` charges its cash
4518
+ * out fee only when `JBDirectory.primaryTerminalOf(FEE_REVNET_ID, token)` is set.
4519
+ *
4520
+ * @param args.revOwner The revnet's data hook. Defaults to the current `REVOwner`.
4521
+ * @param args.token The token the cash out reclaims.
4522
+ */
4523
+ export declare function revnetCashOutFeeTerminalExists(client: PublicClient, args: {
4524
+ chainId: JBChainId;
4525
+ token: Address;
4526
+ revOwner?: Address;
4527
+ }): Promise<boolean>;
4486
4528
  export {};
4487
4529
  //# sourceMappingURL=revnets.d.ts.map